pydb-1.26/0000777000175000017500000000000011167772526007423 500000000000000pydb-1.26/configure.ac0000644000175000017500000001522611167754506011631 00000000000000# Copyright (C) 2006, 2007, 2008, 2009 Rocky Bernstein # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. ## Note: the version number (the 2nd parameter in AC_INIT) ## is picked up inside the Python debugger script. AC_REVISION([$Id: configure.ac,v 1.84 2009/04/10 23:41:58 rockyb Exp $])dnl AC_INIT([pydb],[1.26],[bashdb-pydb-devel@lists.sourceforge.net]) AC_DEFINE([PACKAGE], [pydb], [Python Extended Debugger]) MIN_VERSION='2.4.0' AC_SUBST(MIN_VERSION) ## ## Find out where to install the debugger emacs lisp files ## AM_PATH_LISPDIR AC_PATH_PROG(EMACS, emacs, no) if test x$EMACS != xno ; then $EMACS -batch -q -no-site-file -eval \ '(if (<= emacs-major-version 21) (progn (error "You need GNU Emacs 22 or better for GNU Emacs support.") (kill-emacs 1) ))' if test $? -ne 0 ; then EMACS=no fi fi AM_CONDITIONAL(INSTALL_EMACS_LISP, [test "x$lispdir" != "x" -a "x$EMACS" != "xno"]) ## ## AM_PATH_PYTHON seems to use PACKAGE and AC_INIT sets PACKAGE_NAME. if test -z "$PACKAGE" ; then PACKAGE=$PACKAGE_NAME fi ## ## Get user-specified Python site-packages location. This should ## come before getting user-specified Python or looking for that. ## find_pythondir=yes AC_ARG_WITH(site-packages, AC_HELP_STRING([--with-site-packages], [place to install module]), [pythondir=$withval; pkgpythondir=${pythondir}/$PACKAGE_NAME find_pythondir=no]) if test "$find_pythondir" != yes; then am_cv_python_pythondir=$pythondir fi READLINE=readline AC_ARG_ENABLE(pyreadline, AC_HELP_STRING([--enable-pyreadline], [Use pyreadline instead of readline]), [ if test "${enable_readline}" = "yes"; then READLINE=pyreadline fi ]) AC_SUBST(READLINE) ## ## Get user-specified Python location ## AM_PATH_LISPDIR AC_ARG_WITH(python, AC_HELP_STRING([--with-python], [set path to Python]), PYTHON=$withval) ## ## Check for Python interpreter and make we have a recent version. ## AM_PATH_PYTHON($MIN_VERSION,, [AC_MSG_ERROR(Debugger known only to work with Python $MIN_VERSION or greater)]) ## Automake doesn't get Python's install path correct. So we ## figure it out and set it ourself. ## This must come after looking for Python since we use that below. if test "$find_pythondir" = yes; then AC_MSG_NOTICE([Trying to reset site-packages a the default often gets this wrong]) pythondir=`$PYTHON ${srcdir}/site-packages-path.py` if test $? != 0 ; then AC_MSG_ERROR([Didn't get Python site packages install path. Set it with --with-site-packages]) fi pkgpythondir=\${pythondir}/$PACKAGE_NAME fi ## ## ## In maintainer mode we produce a ChangeLog ## AM_MAINTAINER_MODE ## ## make sure we are using a recent autoconf version ## AC_PREREQ(2.53) AC_ARG_PROGRAM AM_INIT_AUTOMAKE ## ## cvs2cl is used to create the ChangeLog when we create a distribution ## AM_MISSING_PROG(CVS2CL, cvs2cl, $missing_dir) ## ## A symbolic links is used to link a name in users PATH to the python ## script. ## AC_PROG_LN_S ## ## Produced derived files. ## AC_CONFIG_FILES([Doc/Makefile]) AC_CONFIG_FILES([Doc/pydb.1]) AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([emacs/Makefile]) AC_CONFIG_FILES([emacs/pydb-test.el]) AC_CONFIG_FILES([pydb/__init__.py]) AC_CONFIG_FILES([pydb/gdb.py]) AC_CONFIG_FILES([pydb/pydb.py],[chmod +x pydb/pydb.py]) AC_CONFIG_FILES([setup.py],[chmod +x setup.py]) AC_CONFIG_FILES([test/.pydbrc]) # Just to get this into builddir AC_CONFIG_FILES([test/Makefile]) AC_CONFIG_FILES([test/data/Makefile]) AC_CONFIG_FILES([test/unit/Makefile]) AC_CONFIG_FILES([test/brkpt3.cmd]) AC_CONFIG_FILES([test/brkpt3.right]) AC_CONFIG_FILES([test/brkpt3t.right]) AC_CONFIG_FILES([test/except.py],[chmod +x test/except.py]) AC_CONFIG_FILES([test/exceptbug.py],[chmod +x test/exceptbug.py]) AC_CONFIG_FILES([test/file-2.5.right]) AC_CONFIG_FILES([test/file.cmd]) AC_CONFIG_FILES([test/file.right]) AC_CONFIG_FILES([test/settrace.py],[chmod +x test/settrace.py]) AC_CONFIG_FILES([test/test-complete.py],[chmod +x test/test-complete.py]) AC_CONFIG_FILES([test/test-connect.py],[chmod +x test/test-connect.py]) AC_CONFIG_FILES([test/test-contbug.py],[chmod +x test/test-contbug.py]) AC_CONFIG_FILES([test/test-disassem.py],[chmod +x test/test-disassem.py]) AC_CONFIG_FILES([test/test-dbgcall.py],[chmod +x test/test-dbgcall.py]) AC_CONFIG_FILES([test/test-fifo-connect.py],[chmod +x test/test-fifo-connect.py]) AC_CONFIG_FILES([test/test-file.py],[chmod +x test/test-file.py]) AC_CONFIG_FILES([test/test-fns.py],[chmod +x test/test-fns.py]) AC_CONFIG_FILES([test/test-help.py],[chmod +x test/test-help.py]) AC_CONFIG_FILES([test/test-import.py],[chmod +x test/test-import.py]) AC_CONFIG_FILES([test/test-linetrace.py],[chmod +x test/test-linetrace.py]) AC_CONFIG_FILES([test/test-pm.py],[chmod +x test/test-pm.py]) AC_CONFIG_FILES([test/test-run.py],[chmod +x test/test-run.py]) AC_CONFIG_FILES([test/test-save.py], [chmod +x test/test-save.py]) AC_CONFIG_FILES([test/test-setshow.py], [chmod +x test/test-setshow.py]) AC_CONFIG_FILES([test/test-sig.py], [chmod +x test/test-sig.py]) AC_CONFIG_FILES([test/test-sighandle.py], [chmod +x test/test-sighandle.py]) AC_CONFIG_FILES([test/test-skip.py],[chmod +x test/test-skip.py]) AC_CONFIG_FILES([test/test-step.py], [chmod +x test/test-step.py]) AC_CONFIG_FILES([test/test-tcp-connect.py],[chmod +x test/test-tcp-connect.py]) AC_CONFIG_FILES([test/test-trace.py],[chmod +x test/test-trace.py]) AC_CONFIG_FILES([test/test-with.py],[chmod +x test/test-with.py]) AC_CONFIG_FILES([test/test.py],[chmod +x test/test.py]) AC_CONFIG_FILES([test/unit/bytecode.py], [chmod +x test/unit/bytecode.py]) AC_CONFIG_FILES([test/unit/checkline.py], [chmod +x test/unit/checkline.py]) AC_CONFIG_FILES([test/unit/fns.py], [chmod +x test/unit/fns.py]) AC_CONFIG_FILES([test/unit/listsize.py], [chmod +x test/unit/listsize.py]) AC_CONFIG_FILES([test/unit/pydbcmd.py], [chmod +x test/unit/pydbcmd.py]) AC_CONFIG_FILES([test/unit/sighandler.py], [chmod +x test/unit/sighandler.py]) AC_OUTPUT pydb-1.26/Doc/0000777000175000017500000000000011167772525010127 500000000000000pydb-1.26/Doc/lib/0000777000175000017500000000000011167772525010675 500000000000000pydb-1.26/Doc/lib/lib.tex0000664000175000017500000000273710367374075012113 00000000000000\documentclass{manual} % NOTE: this file controls which chapters/sections of the library % manual are actually printed. It is easy to customize your manual % by commenting out sections that you're not interested in. \title{Python Library Reference for the Extended Python Debugger} \input{boilerplate} \makeindex % tell \index to actually write the % .idx file \makemodindex % ... and the module index as well. \begin{document} \maketitle \ifhtml \chapter*{Front Matter\label{front}} \fi \input{copyright} \begin{abstract} \noindent Python is an extensible, interpreted, object-oriented programming language. It supports a wide range of applications, from simple text processing scripts to interactive Web browsers. We describe here only the Extended Python Debugger. The rest of the The \ulink{\module{Python Reference Manual}} {http://docs.python.org/lib/lib.html} should be consulted for other standard Python modules including the original \ulink{\module{Python Debugger}}{http://docs.python.org/lib/module-pdb.html} (\tt{pdb.py}). \end{abstract} \tableofcontents % Chapter title: % ============= % DEVELOPMENT TOOLS % ============= % % Software development support \input{libpydb} % The Python Debugger %begin{latexonly} \renewcommand{\indexname}{Index} %end{latexonly} \input{lib.ind} % Index \end{document} pydb-1.26/Doc/lib/libpydb.tex0000644000175000017500000032337311167754512012767 00000000000000% $Id: libpydb.tex,v 1.142 2009/04/10 23:42:02 rockyb Exp $ % A note on labels. First, labels get used has HTML names if they don't % have colons in them. Second, the last label inside a (sub)section will % get used as a (sub)section head. Consequently we use colons for % labels that aren't sections head and don't use colons if they are % in a section head. \chapter{The Extended Python Debugger \label{chapter-pydb}} \declaremodule{standard}{pydb} \modulesynopsis{The Extended Python debugger for interactive interpreters.} The extended Python debugger builds on work done in the standard \ulink{\module{Python Debugger}}{http://docs.python.org/lib/module-pdb.html} ({\tt pdb.py}). However unless there is reason not to, we follow the \ulink{the GNU debugger}{http://www.gnu.org/software/gdb} ({\tt gdb}) command set and semantics rather than {\tt pdb}'s. In some cases where semantics differ, e.g for {\tt clear} and noted in below in context, the {\tt gdb} semantics is used. {\bf On \emph{not} inventing yet another interface}:\\ In extending the command set and functionality, we've used \ulink{the GNU debugger}{http://www.gnu.org/software/gdb} ({\tt gdb}) as a guide for many reasons. Because of gdb's longevity and pervasiveness, the command set is likely to be complete and it is likely to be familiar. (I also base my \ulink{GNU Bash debugger}{http://bashdb.sourceforge.net} {\tt bashdb} on this command set and to some extent my \ulink{GNU Make debugger}{http://bashdb.sourceforge.net/remake}). Thus the learning curve is reduced for people familiar with one of these, and they are less likely to get confused when switching between debuggers. But it may make it easier to teach \emph{programs} as well. I digress for a little history. When I first thought about adding the bash debugger into the GUI interface, I looked around and saw the GNU/GPL program \ulink{\code{ddd}}{http://www.ddd.org} which already supported a number of debuggers already, such as \code{gdb}, and the debugger for Perl, and even one for Python! (In fact this debugger's name comes from that debugger). To instruct \code{ddd} for a new debugger, there are a myriad of little details \code{ddd} needs to know about. Basically you need tell \code{ddd} how to issue a ``step'' command, or how to set a breakpoint and how find out if the command it issued worked. Since I copied \code{gdb}, I basically told \code{ddd} to handle a number of these constructs (e.g., stepping) like \code{gdb}, which it already knew about. There were a few places where I told \code{ddd} not to follow \code{gdb} but Perl instead because the paradigm was more like a scripting language than a compiled language. But in the end, adding support for the bash debugger inside \code{ddd} was much more straightforward and required much less thought than if I had invented my own debugger command set. After this was done and I fired up \code{ddd}, I noticed that, when my cursor was hovering over some of the buttons, short descriptions for the command were given. Furthermore it created a button called ``customize bash'' which when clicked would pop up a window to set various debugger parameters! But I hadn't added a box widget for customization or modified any code for using tool tips. How did \code{ddd} do this? Because I had copied the output format of \code{gdb}'s \code{info}, \code{set} and \code{show} commands, \code{ddd} ran these commands on its own and parsed the output; it then used that output to form tool tips and create customization boxes. In responses to a preliminary posting to \code{comp.lang.python} asking why the Python debugger was different from other debuggers, a number of people indicated that it didn't matter since they did not use the standard Python debugger, or did not use it much. To some extent, I wonder if this is not a chicken-and-egg problem: is the debugger lacking in usefulness because people don't use it much or do people not use the debugger because it is lacking in usefulness? I'm not sure, but if the standard Python debugger is little used, keeping compatibility is not important. So, in cases where the standard Python debugger was incompatible with \code{gdb}, the \code{gdb} commands have been used. {\bf Least action: a design principle for debuggers in general}:\\ By necessity, debuggers change the operation of the program they are debugging. And this can lead to unexpected and unwanted differences. It has happened so often that the term \ulink{http://en.wikipedia.org/wiki/Heisenbug}{``Heisenbugs'} was coined to describe the situation where the adding the use of a the debugger (among other possibilities) changes behavior of the program so that the bug doesn't manifest itself anymore. Of course a debugger, and this one in particular, tries hard to make itself transparent when not asked to do its thing. But there can be unavoidable differences. One such noticeable difference, mentioned in conjunction with \code{debugger()} (see \ref{debugger}), is the speed at which the debugger runs. Another difference involves name-space issues since some of the debugger may live inside the debugged program. Consequently, a general principle as a debugger writer (and a principle used in this debugger) is: \emph{bring in services only when needed or requested.} For example, in out-of-process debugging some sort of communication mechanism is needed, e.g. a socket. However there are many programs that one might want to debug which might not use sockets and might not need out-of-process debugging. For those, a debugger should therefore not add a requirement on sockets. And even then, perhaps not \emph{until} the service which uses it (remote debugging) is requested. \section{Invoking the Debugger \label{pydb-invocation}} It should be noted that in various situations and for various reasons you might not be able to call the debugger directly from a command line or at the outset of the program. That's okay. See section \ref{subsection-calling-pydb-inside-program} for how to invoke the debugger from inside your running Python program. Also, see section \ref{subsection-post-mortem} for how to invoke after an error is encountered and you have a traceback. The debugger traps all exceptions. So if the program raises an exception that it doesn't handle you will be left inside the debugger. The debugger also installs some default signal handlers---see \ref{subsection-signal}. If the program is running indefinitely, you may be able to go back into the debugger by sending an \code{INT} (interrupt) signal. After normal exit of the program or post-mortem debugging, the debugger will give a message that the program has ended. After soliciting input, the program will restart the program unless directed otherwise. Restarting preserves debugger state such as breakpoints. Of the many additions to the standard Python debugger, \ulink{\module{pdb}}{http://docs.python.org/lib/module-pdb.html} three will be mentioned here. First, this debugger should install itself somewhere in your command path, usually as \code{pydb} so you don't have to invoke it as an argument to the \code{python} command.\footnote{However there \emph{is} one special case where you may want to invoke via Python. If you want warnings to appear as errors, one way to do this is to run the \code{pydb.py} program passing the \code{-Werror} option to Python. See also \ref{command:warnopts}.} Second the extended debugger supports command switches courtesy of \ulink{\module{optparse}}{http://docs.python.org/lib/module-optparse.html}. In particular \code{pydb} has the two very common options \samp{--help} to show what options are available and \samp{--version} to report the version that is installed. Third, you need not supply a script name to debug at the outset. Usually though you will want to give the name of a script to debug and after that you may want to pass options for this script. Thus the general form of invoking the debugger is: \code{pydb} \optional{\var{debugger-options}\ldots} \optional{\var{python-script} \optional{\var{script-options}\ldots}} \var{python-script} should be the Python source (usually has extension \code{.py} if any), and not a compiled or optimized Python program. If \var{python-script} doesn't contain path elements, then path searching is performed on \var{python-script} if the file isn't in the current working directory. (This is exactly the same behavior as {\tt gdb}.) However the location of the Python interpreter used for the script will not necessarily be the one specified in the magic field (the first line of the Python script to be debugged), but will be the Python interpreter that the debugger, \code{pydb}, specifies. (In most cases they'll be the same and/or it won't matter.) If you are familiar with the stock debugger \code{pdb}, you may feel the urge to write a wrapper script. As indicated above, you shouldn't have to if \code{pydb} got installed properly and a symbolic link was inserted. That said, if installation didn't work or you want to create a shell wrapper script, sure, you can. Here's an example from a SUSE GNU/Linux box. Looking at the output from \code{make install} I see \code{pydb} was installed in \code{/usr/lib/python2.4/site-packages}. Therefore save the following in a script and put it somewhere in your \code{PATH} (and make it executable): \begin{verbatim} #!/bin/sh export PYTHONPATH="/usr/lib/python2.4/site-packages/:$PYTHONPATH:" /usr/lib/python2.4/site-packages/pydb/pydb.py $* \end{verbatim} A detailed list of options is given next. \subsection{Debugger Command Options ({\tt --trace}, {\tt --output}, {\tt --command}, {\tt --nx}, \ldots)\label{subsection-switches}} Many options have both a short and a long version. For example, \samp{-x} is the short version while \samp{--command} is the long version. \begin{description} \item[--{}--annotate=\var{level}]] This option sets the "annotation level" inside the debugger. Its effect is identical to using \samp{set annotate \var{level}}. The annotation \var{level}L controls how much information the debugger prints together with its prompt, values of expressions, source lines, and other types of output. Level 0 is the normal, level 1 is for use when GDB is run as a subprocess of GNU Emacs. \item[--{}--basename] Report file locations as only the base filename, and omit the directory name. This is useful in running regression tests. \item[--{}--batch] Normally the debugger is entered before the debugged script is executed. The user sets breakpoints or starts interactively stepping through the program. However, if you want to start the script running without any interactive behavior from the debugger, use this option for example, if you know that a script will terminate with an exception which causes the debugger to be entered at that point. The \code{--trace} option implicitly sets this option. \item[--{}--cd \var{directory}] Run \code{pydb} using \var{directory} as its working directory, instead of the current directory. \item[--{}--command=\var{filename}\code{\Large{|}}--x \var{filename}]\label{switch:command} Run debugger script \var{filename}. This script is run after the user's \code{.pydbrc} file. \item[--{}--exec=\var{command-list}\code{\Large{|}}--e \var{command-list}]\label{exec:command} Run debugger commands \var{command-list}. Commands should be separated by ``\code{;;}''---the same as you would do inside the debugger. You may need to quote this option to prevent command shell interpretation, e.g. \code{--exec "break 20;; continue"}. \item[--{}--n\code{\Large{|}} --nx]\label{switch:nx} Before execution is started, a debugger configuration file \code{.pydbrc} is run. In some situations, for example regression testing the debugger, you want to make sure that such configuration files are not run and this option will do that. \item[--{}--output=\var{filename}] Write the normal output (\samp{stdout}) to the file \var{filename}. Useful when running a Python script without access to a terminal. \item[--{}--error=\var{filename}] Write the error output (\samp{stderr}) to file \var{filename}. Useful in running a Python script without access to a terminal. \item[--{}--threading]\label{switch:threading} Allow thread debugging. See \ref{subsection-thread}. \item[--{}--trace \code{\Large{|}}--X]\label{switch:trace} POSIX-style line tracing is available. In POSIX shells the short option for this is \code{-x}; however since we follow \code{gdb} conventions \code{-x} is used as a short option for \code{--command}. When line tracing is turned on, each location (file name and line number) is printed before the command is executed. This option can be used in conjunction with the \code{--output} and \code{--error} options described above when a terminal is not available or when not running interactively. The corresponding debugger command is \samp{set linetrace on}. See \ref{command:linetrace} for an example of output from such a trace. \item[--{}--fntrace \code{\Large{|}}--F]\label{switch:fntrace} If line tracing produces too much output, there is also function call/return tracing. When function tracing is turned on, each call and return are printed with the nesting level. On a return we show a return type and/or return value if it is a scalar or string. See \ref{command:fntrace} for an example of such a trace. \end{description} \subsection{Startup files ({\tt .pydbrc})\label{subsection-startup-files}} If a file \code{.pydbrc} \indexii{.pydbrc}{file}\indexiii{debugger}{configuration}{file} exists in the user's home directory or in the current directory, it is read in and executed as if it had been typed at the debugger prompt. This is particularly useful for aliases. If two files exist, the one in the home directory is read first and aliases defined there can be overridden by the local file. Finally you can specify a command file to be read when invoking \code{pydb} and this is run last. See \ref{switch:command} for information on how to run a command file. Sometimes you may not want to run a startup file. For example, you may have a special installation script that uses the debugger and want to make sure a user's profile doesn't get in the way. See the \samp{--nx} command option, \ref{switch:nx}. For tracking down problems with command files, see the \samp{set trace-commands on} debugger command, \ref{command:trace-commands}. To run a debugger command script inside the debugger see the \samp{source} command, \ref{command:source}. \section{Debugger Commands\label{pydb-commands}} In this section we describe debugger commands which can be used when the debugger is run as a standalone program. Most commands can be abbreviated to one or two letters; e.g., \samp{h(elp)} means that either \samp{h} or \samp{help} can be used to enter the help command (but not \samp{he}, \samp{hel}, \samp{H}, \samp{Help}, or \samp{HELP}). Arguments to commands must be separated by white space (spaces or tabs). Optional arguments are enclosed in square brackets (\samp{[]}) in the command syntax; the square brackets must not be typed. Alternatives in the command syntax are separated by a vertical bar (\samp{|}). Entering a blank line repeats the last command entered. Exception: if the last command was a \samp{list} command, the next 11 lines are listed. Commands that the debugger doesn't recognize are assumed to be Python statements and are executed in the context of the program being debugged. Python statements can also be prefixed with an exclamation point (\samp{!}). This may be a good way to inspect the program being debugged; it is even possible to change a variable or call a function. When an exception occurs in such a statement, the exception name is printed but the debugger's state is not changed. The debugger supports aliases. Aliases can have parameters which allow a certain level of adaptability to the context under examination. See \ref{command:aliases}. \subsection{Debugger Prompt}\label{debugger:prompt} By default the debugger's prompt string is \samp{(Pydb) } with a trailing blank. Recursive invocations using the \samp{debug} command strip off the trailing blanks, add a layer of parenthesis around the string, and add a trailing blank. For example, for the default prompt the first debug invocation will be \samp{((Pydb)) }. \emph{There's currently a bug in the code where specified trailing blanks are chopped. Furthermore the prompt may change in the future to add a history number. It is generally not advisable to change the prompt.} If you do need to change the prompt see \ref{command:prompt}. \subsection{Command Parsing} Parameters to commands are separated by white space. No sophisticated parsing to figure out parameter boundaries is done. Multiple commands may be entered on a single line, separated by \samp{;;}. (A single \samp{;} is not used because it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first \samp{;;} pair, even if it is in the middle of a quoted string. Many commands take an integer parameter. In most cases a Python expression which evaluates to an integer expression can be used. For example the \code{6}, \code{0x6} and \code{2+4}, or \code{int(2*3.1)} (among many others) represent the same value, six. You can even use values from variables in your program if you want -- although I'm not sure why this would be a good thing to do. However again be mindful of using white space since that is used to separate parameters. So \code{2 + 4} is not read the same as \code{2+4}. \subsection{Status and Debugger Settings ({\tt info}, {\tt set}, {\tt show})\label{subsection-status}} An {\tt info} command shows things about the program being debugged. A {\tt set} command modifies parts of the debugger environment. You can see these environment settings with the {\tt show} command. The subobptions to \code{info}, or \code{set} (or \code{show}) don't can be abbreviated to any prefix that uniquely specifies them. For example \code{info li} is a valid abbreviation for \code{info line} while \code{info l} is not since there is another subcommand (\code{locals}) which also starts with an `l'. In all of the set options that take ``on'' or ``off'' parameters, you can also use 1 for ``on'' and 0 for ``off.'' Each command has a corresponding {\tt show} command to show the current value. See \ref{subsubsection-show} for these counterparts. If a \ulink{\module{readline}}{http://docs.python.org/lib/module-readline.html} module is available, \code{pydb} can keep track of the commands you type during your debugging sessions, so that you can be certain of precisely what happened. The \code{set history} commands to manage the command history facility. POSIX-style line tracing is available and the \code{set linetrace} commands can be used to control that. Call return tracing is available via \code{set fntrace}. You may want to save the output of \code{pydb} commands to a file. See the \code{set logging} commands to control \code{pydb}'s logging. \subsubsection{Info ({\tt info})\label{subsubsection-info}} Running this command without parameters will print the list of available info commands. Below is a description of the individual commands. \begin{description} \item[info args] Show function/method parameters. See \ref{command:info-args}. \item[info breakpoints] Show the status of user-settable breakpoints. Without argument, list info about all breakpoints. With an integer argument, list info on that breakpoint. The short command for this is \code{L}. \item[info globals] Show the global variables. See \ref{command:info-globals}. \item[info handle] Show the signal handling status. See \ref{command:info-handle}. \item[info line] Show the current line number in source file. If a function name is given, the starting line of the function is reported. \item[info locals] Show the local variables. See \ref{command:info-locals}. \item[info program] Show the execution status of the program. The possible status is that the program is not running (e.g. in post-mortem dump), or the program is ``stopped'' and if stopped at a breakpoint that is shown as well. \item[info signal] Alias for \code{info handle}. See \ref{command:info-handle}. \item[info source] Information about the current Python file. \end{description} \subsubsection{Set ({\tt set})\label{subsubsection-set}} As with subobptions to \code{info}, or \code{set}, \code{show} subcommands can be abbreviated to any prefix that uniquely specifies them. For example \code{set lis 5} is a valid abbreviation for \code{info listsize 5} while \code{set li} is not since there is another subcommand (\code{linetrace}) which also starts with `li'. \begin{description} \item[set basename on\code{\Large{|}}off]\label{command:basename} When showing filenames print only the basename. This option is useful in regression testing where the base file names are the same on different installations even though the directory path may be different. You may want to use this in other situations as well, like showing a debugger session in a manual such as this one. \item[set deftrace on\code{\Large{|}}off]\label{command:deftrace} In contrast to the stock python debugger, we don't show or stop at `def' (method creation) lines by default, because this makes stepping more cumbersome. However should you want to change this, you can set this off. \item[set trace-commands on\code{\Large{|}}off]\label{command:trace-commands} Show lines as they are read from the debugger command file (or \samp{source} debugger command). This is useful in running regression tests, but it may be helpful in tracking down a problem in your \code{.pydbrc} file. \item[set debug-pydb on\code{\Large{|}}off]\label{command:debug-pydb} Set whether we allow tracing the debugger. This is used for debugging pydb and getting access to some of its object variables. When \code{debug-pydb} is ``on'', the most recent side of the stack frame will be located somewhere in the debugger; you'll need to adjust the frame ``up'' to get where the program was before entering the debugger. (In some versions this and some situations \code{frame 6} gets you out of the debugger and into the debugged program. \item[set fntrace on\code{\Large{|}}off]\label{command:fntrace} If this is set on, every call and return of a function or method will be indicated with the nesting level. Return show the return type and/or value if the value is a scalar or string. By default this is off. Using the command-line option \samp{--fntrace} when invoking \code{pydb} implicitly sets this on. For information on \samp{--fntrace}, see \ref{switch:fntrace}. \begin{verbatim} $ pydb --basename --fntrace gcd.py 4 10 --Call level 0 check_args() (gcd.py:13): check_args + 13 def check_args(): --Return from level 0 () --Call level 0 gcd(a=4, b=10) (gcd.py:24): gcd + 24 def gcd(a,b): ----Call level 1 gcd(a=6, b=4) (gcd.py:24): gcd + 24 def gcd(a,b): ------Call level 2 gcd(a=2, b=4) (gcd.py:24): gcd + 24 def gcd(a,b): --------Call level 3 gcd(a=2, b=2) (gcd.py:24): gcd + 24 def gcd(a,b): --------Return from level 3 => 2 () ------Return from level 2 => 2 () ----Return from level 1 => 2 () --Return from level 0 => 2 () The GCD of 4 and 10 is 2 \end{verbatim} Adding function tracing output will slow down your program. Unless single stepping through a program, normally the debugger is called only at breakpoints or at the call and return of a function or method. However when line tracing is turned on, the debugger is called on execution of every statement. \item[set history filename \var{filename}]\label{command:hist-filename} Set the filename in which to record the command history. (the list of previous commands of which a record is kept). The default file is \verb|~/.pydbhist|. \item[set history save on\code{\Large{|}}off] Set saving of the history record on exit. Use ``on'' to enable the saving, and ``off'' to disable it. Without an argument, saving is enabled. \item[set history size \var{number}] Set the size of the command history, i.e.\ the number of previous commands to keep a record of. This defaults to the value of the environment variable \code{HISTSIZE}, or to 256 if this variable is not set. \item[set linetrace on\code{\Large{|}}off]\label{command:linetrace} If this is set on, the position (file and line number) is shown before executing a statement. By default this is off. Using the command-line option \samp{--trace} when invoking \code{pydb} implicitly sets this on. For information on \samp{--trace}, see \ref{switch:trace}. \begin{verbatim} $ pydb --basename --trace hanoi.py 2 (hanoi.py:2): + 2 """Towers of Hanoi""" (hanoi.py:3): + 3 import sys (hanoi.py:5): + 5 def hanoi(n,a,b,c): (hanoi.py:12): + 12 if __name__=='__main__': (hanoi.py:13): + 13 i_args=len(sys.argv) (hanoi.py:14): + 14 if i_args != 1 and i_args != 2: (hanoi.py:18): + 18 n=3 (hanoi.py:20): + 20 if i_args > 1: (hanoi.py:21): + 21 try: (hanoi.py:22): + 22 n = int(sys.argv[1]) (hanoi.py:27): + 27 if n < 1 or n > 100: (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") --Call level 0 hanoi(n=2, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ----Call level 1 hanoi(n=1, a='a', b='c', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) Move disk a to c (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) Move disk a to b (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ----Call level 1 hanoi(n=1, a='c', b='b', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) Move disk c to b (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:9): hanoi + 9 if n-1 > 0: --Return from level 0 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") (:1): + \end{verbatim} Adding linetracing output will slow down your program. Unless single stepping through a program, normally the debugger is called only at breakpoints or at the call and return of a function or method. However when line tracing is turned on, the debugger is called on execution of every statement. That said, execution may still be pretty fast. If you want to slow down execution further, see the following option. \item[set linetrace delay \var{time}]\label{command:linetrace-delay} One of the useful things you can do with this debugger if you run it via a front-end GUI is watch your program as it executes. To do this, use \samp{set linetrace on} which prints the location before each Python statement is run. Many front-end GUIs like the one in GNU Emacs and \code{ddd} will read the location and update the display accordingly. There is however one catch---Python runs too fast. So by using this option you can set a delay after each statement is run in order for GNU and your eyes to catch up with Python. Specify a floating point indicating the number of seconds to wait. For example: \begin{verbatim} set linetrace delay 0.5 # 1/2 a second \end{verbatim} In my experience half a second is about right. \item[set listsize \var{lines}]\label{command:listsize} Sets how many lines are shown by the \code{list} command. See \ref{command:list}. \item[set logging]\label{command:logging} Prints \code{set logging} usage. \item[set logging on\code{\Large{|}}off]\label{command:logging} Enable or disable logging. \item[set logging file \var{filename}]\label{command:log-redirect} By default, \code{pydb} output will go to both the terminal and the logfile. Set \code{redirect} if you want output to go only to the log file. \item[set logging overwrite on\code{\Large{|}}off]\label{command:log-overwrite} By default, \code{pydb} will append to the logfile. Set \code{overwrite} if you want \code{set logging on} to overwrite the logfile instead. \item[set logging redirect on\code{\Large{|}}off]\label{command:log-redirect} By default, \code{pydb} output will go to both the terminal and the logfile. Set \code{redirect} if you want output to go only to the log file. \item[set prompt \var{prompt-string}]\label{command:prompt} Set debugger's prompt string. By default it is \samp{(Pydb) } with a trailing space. For information on how the prompt changes, see \ref{debugger:prompt}. \emph{There's currently a bug in the code where specified trailing blanks specified. Furthermore the prompt may change in the future to add a history number. It is generally not advisable to change the prompt.} \item[set sigcheck on\code{\Large{|}}off]\label{command:sigwatch} Turning this on causes the debugger to check after every statement whether a signal handler has changed from one of those that is to be handled by the debugger. Because this may add a bit of overhead to the running of the debugged program, by default it is set off. However if you want to ensure that the debugger takes control when a particular signal is encountered you should set this on. %\item[set target-address \var{target_addr}]\label{command:target} % %This sets up an address so that remote processes can connect this %process and debug it. See also \code{attach}, \code{target} and %\code{show target-address}. \item[set warnoptions \optional{\var{warnoption \ldots}}]\label{command:warnopts} Set the Python warning options that are in effect when a program is started or restarted. On the command line, these are the \code{-W} options, e.g. \code{-Werror}, or \code{-We::Deprecation}. However the list should not contain the leading \code{-W} and options should be separated with white space only, e.g. don't use commas. Examples: \begin{verbatim} (Pydb) set warn error e::Deprecation Warning options used in running a Python program: -Werror, -We::Deprecation (Pydb) set warnoptions No warning options have been set. (Pydb) \end{verbatim} \item[set width {\var{columns}}]\label{command:width} Set number of characters the debugger thinks are in a line. We also change OS environment variable COLUMNS. \end{description} \subsubsection{Show ({\tt show}) \label{subsubsection-show}} All of the ``show'' commands report some sort of status and all have a corresponding ``set'' command to change the value. See \ref{subsubsection-set} for the ``set'' counterparts. \begin{description} \item[show args] Show the argument list that was given the program being debugged or it is restarted \item[show basename] Show short or long filenames \item[show deftrace] Show whither we should step/stop at ``def'' (method creation) commands. \item[show trace-commands] Show the debugger commands before running \item[show commands] Show the history of commands you typed. You can supply a command number to start with, or a `+' to start after the previous command number shown. A negative number starts from the end. This command is available only if a \ulink{\module{readline}}{http://docs.python.org/lib/module-readline.html} module is available and supports the history saving. \item[show debug-pydb] Show whether the debugging the debugger is set. See also \ref{command:debug-pydb} \item[show history] Generic command for showing command history parameters. The command history filename, saving of history on exit and size of history file are shown. \item[show linetrace] Show the line tracing status. \item[show linetrace delay] Show the delay after tracing each line. \item[show listsize] Show the number of source lines \code{pydb} will list by default. \item[show logging] Show summary information of logging variables which can be set via \code{set logging}. \item[show logging file] Show the current logging file. \item[show logging overwrite] Show whether logging overwrites or appends to the log file. \item[show prompt] Show the current debugger prompt. \item[show sigcheck] Show whether the debugger checks for reassignment of signal handlers. See also \ref{command:sigwatch} and \ref{subsection-signal}. %\item[show target-address] % %If you are debugging a remote program, this command can be used to %show the connection parameters. This command doesn't make sense if %you are not debugging a remote program. See also \code{set target-address} %and \code{attach}. \item[show version] \item[show warnoptions] Show the Warning options that are in effect when a program is started or restarted. On the command-line these are the \code{-W} options, e.g. \code{-Werror}, or \code{-We::Deprecation}. \item[show width] Show number of characters the debugger thinks are in a line. \end{description} \subsection{Breakpoints ({\tt break}, {\tt tbreak}, {\tt clear}, {\tt commands}, {\tt delete}, {\tt disable}, {\tt condition}, {\tt ignore})\label{subsubsection-brkpts}} \index{breakpoints} A breakpoint makes your program stop at that point. You can set breakpoints with the \code{break} command and its variants. You can specify the place where your program should stop by file and line number or by function name. The debugger assigns a number to each breakpoint when you create it; these numbers are successive integers starting with 1. In many of the commands for controlling various features of breakpoints you use this number. Each breakpoint may be enabled or disabled; if disabled, it has no effect on your program until you enable it again. The debugger allows you to set any number of breakpoints at the same place in your program. There is nothing unusual about this because different breakpoints can have different conditions associated with them. The simplest sort of breakpoint breaks every time your program reaches a specified place. You can also specify a \emph{condition} for a breakpoint. A condition is just a Boolean expression in your programming language. A breakpoint with a condition evaluates the expression each time your program reaches it, and your program stops only if the condition is \emph{true}. This is the converse of using assertions for program validation; in that situation, you want to stop when the assertion is violated--that is, when the condition is \emph{false}. Break conditions can have side effects, and may even call functions in your program. This can be useful, for example, to activate functions that log program progress, or to use your own print functions to format special data structures. The effects are completely predictable unless there is another enabled breakpoint at the same address. (In that case, \code{pydb} might see the other breakpoint first and stop your program without checking the condition of this one.) Note that breakpoint commands are usually more convenient and flexible than break conditions for the purpose of performing side effects when a breakpoint is reached. Break conditions can be specified when a breakpoint is set, by adding a comma in the arguments to the \code{break} command. They can also be changed at any time with the \code{condition} command. \begin{description} \item[b(reak) \optional{\optional{\var{filename}:}\var{lineno}\code{\Large{|}}\var{function}\optional{, \var{condition}}}]\label{command:break} With a \var{lineno} argument, set a break at that line number in the current file. With a \var{function} argument, set a break at the first executable statement within that function. The line number may be prefixed with a filename and a colon to specify a breakpoint in another file (probably one that hasn't been loaded yet). The file is searched on \code{sys.path}. Note that each breakpoint is assigned a number to which all the other breakpoint commands refer. If a second argument is present, it is an expression which must evaluate to true before the breakpoint is honored. Without an argument, a breakpoint is set at the current location. Note that this is a different behavior from \code{pdb} (but the same behavior as \code{gdb}). If threading is enabled, you can also specify a thread name. See \ref{command:thread-extensions}. \item[tbreak \optional{\optional{\var{filename}:}\var{lineno}\code{\Large{|}}\var{function}\optional{, \var{condition}}}]\label{command:tbreak} Temporary breakpoint, which is removed automatically when it is first hit. The arguments are the same as those for \code{break}. If threading is enabled, you can also specify a thread name. See \ref{command:thread-extensions}. \item[cl(ear) \optional{\optional{\var{filename}:}\var{lineno}\code{\Large{|}}\var{function}}] Clear breakpoint at specified line or function. Argument may be line number, function name, or `*' and an address. If a line number is specified, all breakpoints in that line are cleared. If a function is specified, the breakpoints at the beginning of the function are cleared. If an address is specified, breakpoints at that address are cleared. With no argument, clears all breakpoints in the line where the selected frame is executing. See also the \code{delete} command below which clears breakpoints by number. Note that \code{delete} handles some cases that were previously handled by \code{pdb}'s \code{clear} command. \item[commands \optional{\optional{\var{bpnumber}}}] Set commands to be executed when a breakpoint is hit. Give breakpoint number as the argument after "commands". With no bpnumber argument, commands refers to the last one set. The commands themselves follow starting on the next line. Type a line containing "end" to terminate the commands. Here's an example: \begin{verbatim} (Pydb) break gcd Breakpoint 1 set in file gcd.py, line 24. (Pydb) commands Type commands for when breakpoint 1 is hit, one per line. End with a line saying just "end". >info locals >end (Pydb) c a = 3 b = 5 (gcd.py:28): gcd 28 if a > b: (Pydb) c a = 2 b = 3 (gcd.py:28): gcd 28 if a > b: (Pydb) \end{verbatim} To remove all commands from a breakpoint, type commands and follow it immediately with \code{end}; that is, give no commands. Specifying any command resuming execution (currently \code{continue}, \code{step}, \code{next}, \code{return}, \code{jump}, \code{skip}, and \code{quit}) terminates the command list as if that command was immediately followed by \code{end}. This is because any time you resume execution (even with a simple next or step), you may encounter another breakpoint---which could have its own command list, leading to ambiguities about which list to execute. If you use the \code{silent} command in the command list, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If none of the other commands print anything, you see no sign that the breakpoint was reached. \item[delete \optional{\var{bpnumber} \optional{\var{bpnumber \ldots}}}] With a space-separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation). \item[disable \optional{\var{bpnumber} \optional{\var{bpnumber \ldots}}}] Disable the breakpoints given as a space-separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled. \item[enable \optional{\var{bpnumber} \optional{\var{bpnumber \ldots}}}] Enable the breakpoints specified. \item[ignore \var{bpnumber} \optional{\var{count}}] Set the ignore count for the given breakpoint number. If count is omitted, the ignore count is set to 0. A breakpoint becomes active when the ignore count is zero. When non-zero, the count is decremented each time the breakpoint is reached, the breakpoint is not disabled, and any associated condition evaluates to true. \item[condition \var{bpnumber} \optional{\var{condition}}] Condition is an expression which must evaluate to true before the breakpoint is honored. If condition is absent, any existing condition is removed; i.e., the breakpoint is made unconditional. \end{description} \subsection{Resuming Execution ({\tt step}, {\tt next}, {\tt finish}, {\tt return}, {\tt continue}, {\tt jump}, {\tt skip})\label{subsubsection-resume}} ``Continuing'' means resuming program execution until the program completes normally. In contrast, ``stepping'' means executing just one statement of the program. When continuing or stepping, the program may stop even sooner, due to a breakpoint or an exception. \begin{description} \item[s(tep) \optional{\var{count}}]\label{command:step} Execute the current line, stop at the first possible occasion (either in a function that is called or on the next line in the current function). Note that if thread debugging is enabled, the next statement may be in a different thread. \item[n(ext) \optional{\var{count}}]\label{command:next} Continue execution until the next line in the current function is reached or the function returns. The difference between \samp{next} and \samp{step} is that \samp{step} stops inside a called function, while \samp{next} executes called functions at (nearly) full speed, stopping only at the next line in the current function. Note that if thread debugging is enabled, the next statement may be in a different thread. There currently is a bug only in thread debugging where \code{next} can act like \code{step}. \item[finish]\label{command:finish} Continue execution until the current function returns. See also \ref{command:return}. \item[return]\label{command:return} Make selected stack frame return to its caller. Control remains in the debugger, but when you continue execution will resume at the return statement found inside the subroutine or method. At present we are only able to perform this if we are in a subroutine that has a \code{return} statement in it. See also \ref{command:finish} \item[c(ontinue) \optional{\optional{\var{filename}:}\var{lineno}\code{\Large{|}}\var{function}}] Continue execution; only stop when a breakpoint is encountered. If a line position is given, continue until that line is reached. This is exactly the same thing as setting a temporary breakpoint at that position before running an (unconditional) \code{continue}. \item[jump \var{lineno}] Set the next line that will be executed. available only in the bottom-most frame. This lets you jump back and execute code again, or jump forward to skip code that you don't want to run. Not all jumps are allowed---for instance it is not possible to jump into the middle of a \keyword{for} loop, into a \keyword{try} block or out of a \keyword{finally} clause. One common use for the \code{jump} statement is to get out of a loop. Sometimes the bounds of loops are computed in advance so you can't leave a loop early by say setting the value of the loop variable Here's an example demonstrating this: \begin{verbatim} pydb ptest.py (ptest.py:2): (Pydb) list 1 #!/bin/python 2 -> for i in range(1,10): 3 print i 4 print "tired of this" [EOF] (Pydb) step (ptest.py:3): (Pydb) i=1000 (Pydb) step 1000 (ptest.py:2): (Pydb) jump 4 (ptest.py:4): (Pydb) step tired of this --Return-- --Return-- The program finished and will be restarted (ptest.py:2): (Pydb) \end{verbatim} Note that the assignment of 1,000 to \code{i} took effect, although it had no effect on terminating the \code{for} loop; \code{jump} was needed to get out of the loop early. \item[skip \optional{\var{count}}]\label{command:skip} Set the next line that will be executed to be the line number which is \emph{count} line boundaries away from the current line. By default, \emph{count} is one which will skip the current line about to be executed. This command works by disassembling instructions from the current line until a new line number boundary is found and does in effect a \code{jump} to that line. So beware, we \emph{are not} statement boundaries. Since this works underneath the same as \code{jump}, the same caveats mentioned apply wiht respect to where you cannot jump to. \end{description} \subsection{Examining Call Frames ({\tt info args}, {\tt info locals}, {\tt down}, {\tt frame}, {\tt up})\label{subsection-frames}} Each line in the backtrace shows the frame number and the function name, if it exists and the place in a file where the statement is located. Here is an example of a backtrace from a sample Towers of Hanoi program that is used in regression testing: \begin{verbatim} ## 0 hanoi() called from file '/tmp/pydb/test/hanoi.py' at line 5 -> 1 hanoi() called from file '/tmp/pydb/test/hanoi.py' at line 6 ## 2 in file '/tmp/pydb/test/hanoi.py' at line 29 ## 3 in file '' at line 1 ## 4 run() called from file '/usr/lib/python2.4/bdb.py' at line 366 \end{verbatim} The {\tt->} arrow indicates the focus. In the example, I issued an \samp{up} command which is why the focus is on 1 rather than 0 as it would normally be after a stop. There are two ``hanoi'' frames listed because this is a hanoi called itself recursively. In frame 2 and 3 we don't have a function name listed. That's because there is none. Furthermore in frame 3 there is a funny ``in file {\tt ''} at line 1.'' That's because there isn't even a file associated with the command. The command issued: \begin{verbatim} exec cmd in globals, locals \end{verbatim} This statement can be seen in frame 4. This is a bug which I hope to fix with a more informative message. Finally, note that frames 2 and 3 really are not part of the program to be debugged but are part of the internal workings of the debugger. It's possible to hide this, but in the open spirit of Python for now it hasn't been hidden. \begin{description} \item[info args]\label{command:info-args} Show the method or function parameters and their values. Here is an example of the output for the backtrace of the hanoi program shown at the beginning of this section: \begin{verbatim} (Pydb) info args n= 3 a= a b= b c= c (Pydb) \end{verbatim} \item[info locals]\label{command:info-locals} Show all local variables for the given stack frame. This will include the variables that would be shown by \samp{info args}. \item[where\code{\Large{|}}T\code{\Large{|}}bt \optional{\var{count}}] Print a backtrace, with the most recent frame at the top. An arrow indicates the current frame, which determines the context of most commands. With a positive number \var{count}, print at most many entries. An example of a backtrace is given at the beginning of this section. \item[down \optional{\var{count}}] Move the current frame one level down in the stack trace (to a newer frame). With a count, which can be positive or negative, move that many positions. Note this is the opposite of how \code{pdb}'s \code{down} command works. \item[up \optional{\var{count}}] Move the current frame one level up in the stack trace (to an older frame). With a count, which can be positive or negative, move that many positions. Note this is the opposite of how \code{pdb}'s \code{up} command works. \item[frame \optional{\var{position}}] Move the current frame to the specified frame number. A negative number indicates position from the end, so \code{frame -1} moves to the newest frame, and \code{frame 0} moves to the oldest frame. If threading is enabled, you can also specify a thread name. See \ref{command:thread-extensions}. \end{description} \subsection{Examining Data ({\tt print}, {\tt pprint}, {\tt examine}, {\tt info globals})\label{subsection-data}} \begin{description} \item[display \optional{\var{format}} \var{expression}] Print value of expression \var{expression} each time the program stops. \var{format} may be used before \var{expression} as in the "print" command. \var{format} "i" or "s" or including a size-letter is allowed, and then \var{expression} is used to get the address to examine. With no argument, display all currently requested auto-display expressions. Use "undisplay" to cancel display requests previously made. \item[undisplay \optional{\var{format}} \var{expression}] Evaluate the \var{expression} in the current context and print its value. \note{\samp{print} can also be used, but is not a debugger command---it executes the Python \keyword{print} statement.} \item[p \var{expression}] Evaluate the \var{expression} in the current context and print its value. One can also often have an expression printed by just typing the expression. If the first token doesn't conflict with a debugger built-in command Python will, by default, print the result same as if you did this inside a Python interpreter shell. To make things even more confused, a special case of running an arbitrary Python command is the \samp{print} command. But note that the debugger command is just \samp{p}. So what's the difference? The debugger's print command encloses everything in a \samp{repr()}, to ensure the resulting output is not too long. \emph{\note{Should add info as to how to customize what ``too long'' means}}. So if you want abbreviated output, or are not sure if the expression may have an arbitrarily long (or infinite) representation, then use \samp{p}. If you want the output as Python would print it, just give the expression or possibly use python's \samp{print} command. \item[pp \var{expression}] Like the \samp{p} command, except the value of the expression is pretty-printed using the \ulink{\module{pprint}}{http://docs.python.org/lib/module-pprint.html} module. \item[examine \var{expression}]\label{command:examine} Print the type of the expression, pretty-print its value and print it's class members value. For functions, methods, classes, and modules print out the documentation string if any. For functions also show the argument list. The examine debugger command in Perl is the model here. Note that \samp{x} is a short name for ``expression'' as it is in Perl's debugger. \item[whatis \var{expression}]\label{command:whatis} Print just the type name of the expression. \item[info globals]\label{command:info-globals} Show all global variables. These variables are not just the variables that a programs sees via a \code{global} statement, but all of them that can be accessible. \end{description} \subsection{Running Arbitrary Python Commands ({\tt debug}, {\tt !}, {\tt ipython}, {\tt python})\label{subsection-commands}} You can run arbitrary commands that change state. However there are some caveats. An assignment to a local variable doesn't have an effect, although changes to instance variables and globals do. This seems to be an artifact of how the interpreter is written to speed up name look-up for access to local variables. As a result, the locals dictionary seen may be created on the fly. (I could very well have the reason wrong, but net effect is the same---modifying a local variable doesn't still does not change the value after the command is finished.) \begin{verbatim} (Pydb) list 23 24 def gcd(a,b): 25 """ GCD. We assume positive numbers""" 26 27 # Make: a <= b 28 -> if a > b: 29 (a, b) = (b, a) 30 31 if a <= 0: 32 return None (Pydb) p a 3 (Pydb) a=5; print a 5 (Pydb) p a 3 \end{verbatim} Another thing to keep in mind is the scope of setting \emph{new} local variables. They persist as long as the debugger stays inside the same scope. Furthermore you \emph{can} change these. Continuing from above: \begin{verbatim} (Pydb) d = 5 (Pydb) p d 5 (Pydb) n 31 if a <= 0: (Pydb) p d 5 (Pydb) d = 6 (Pydb) p d 6 finish --Return from level 4 => 1 () 35 return gcd(b-a, a) (Pydb) p d 6 (Pydb) n 34 return a (Pydb) p d *** NameError: d \end{verbatim} \begin{description} \item[\optional{!}\var{statement}] Execute the (one-line) \var{statement} in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To set a global variable, you can prefix the assignment command with a \samp{global} command on the same line, e.g.: \begin{verbatim} (Pydb) global list_options; list_options = ['-l'] (Pydb) \end{verbatim} \item[debug \var{statement}] Enter a recursive debugger that steps through the code argument (which is an arbitrary expression or statement to be executed in the current environment). The prompt is changed to indicate nested behavior. See \ref{debugger:prompt} \item[ipython \var{options...}]\label{command:ipython} Run ipython as a subshell. You need to have ipython (\ulink{IPython}{http://ipython.scipy.org/moin/ipython}) installed for this command. \var{options} are the options passed to ipython. If not are given the following options are passed: \begin{verbatim} -noconfirm_exit -prompt_in1 'Pydb In [\#]: ' \end{verbatim} \item[python]\label{command:python} Run python as a subshell. \end{description} \subsection{Starting/Restarting a Python Script ({\tt restart}, {\tt run})\label{subsection-restart}} \begin{description} \item[file \optional{\var{filename}}\label{command:file}] Use \var{filename} as the Python program to be debugged. It is compiled and becomes is the program executed when you use the `run' command. If no filename is given, this means to set things so there is no Python file. \item[restart \var{args...}]\label{command:restart} Restart debugger and program via an \code{exec} call. All state is lost, and new copy of the debugger is used. Sometimes in debugging it is necessary to modify module code when one finds a bugs in them. Python will not notice dynamically that a module has changed and thus not reimport it (which also means that module initialization code is not rerun either). So in such a situation one must use \code{restart} rather than \code{run}.\footnote{It may be possible to unimport by removing a the module from a namespace, but if there are shared dynamically loaded objects those don't get unloaded.} \item[run \var{args...}]\label{command:run} Run or ``soft'' restart the debugged Python program. If a string is supplied, it is split with \code{shlex} but preserving embedded quotes. The result is used as the new \code{sys.argv}. History, breakpoints, actions and debugger options are preserved. \code{R} is a short command alias for \code{run}. You may notice that the sometimes you can \code{step} into modules included via an \code{import} statement, but after a \code{run} this stepping skips over the import rather than goes into it. A similar situation is that you may have a breakpoint set inside class \code{__init__} code, but after issuing \code{run} this doesn't seem to get called---and in fact it isn't run again! That's because in Python the \code{import} occurs only once. In fact, if the module was imported \emph{before\/} invoking the program, you might not be able to step inside an \code{import} the first time as well. In such a situation or other situations where \code{run} doesn't seem to have the effect of getting module initialization code executed, you might try using \code{restart} rather than \code{run}. \end{description} \subsection{Interfacing to the OS ({\tt cd}, {\tt pwd}, {\tt shell})\label{subsection-os}} \begin{description} \item[cd \var{directory}]\label{command:cd} Set working directory to \var{directory} for debugger and program being debugged. \item[pwd]\label{command:pwd} Print working directory. \item[shell \var{statement}]\label{command:shell} Execute the rest of the line as a shell command. \end{description} \subsection{Listing Program Code ({\tt list}, {\tt disassemble})\label{subsection-listing}} \begin{description} \item[disassemble \optional{object-or-class} \optional{\var{starting-line-number} \optional{\var{ending-line-number}}}] With no argument, disassemble the current frame. With one integer argument, the disassembly is narrowed to not show lines before that line number. With a second integer argument, disassembly ends as soon a the the line number exceeds the ending line number. With a class, method, function, code or string argument disassemble that. \item[l(ist) \optional{- \code{\Large{|}} \var{first}\optional{, \var{last}}}]\label{command:list} List source code. Without arguments, list \emph{n} lines centered around the current line or continue the previous listing, where \emph{n} is the value set by \samp{set listsize} or shown by \samp{show listsize}. The default value is 10. \samp{list -} lists \emph{n} lines before a previous listing. With one argument other than `-', list \emph{n} lines centered around the specified position. With two arguments, list the given range; if the second argument is less than the first, it is a count. \var{first} and \var{last} can be either a function name, a line number, or \var{filename}:\var{line-number}. \end{description} \subsection{Interfacing to the debugger ({\tt alias}, {\tt complete}, {\tt help}, {\tt quit}, {\tt kill}, {\tt save}, {\tt source}, {\tt unalias})\label{subsection-misc}} \begin{description} \item[alias \optional{\var{name} \optional{command}}]\label{command:aliases} Create an alias called \var{name} that executes \var{command}. The command must not be enclosed in quotes. Replaceable parameters can be indicated by \samp{\%1}, \samp{\%2}, and so on, while \samp{\%*} is replaced by all the parameters. If no command is given, the current alias for \var{name} is shown. If no arguments are given, all aliases are listed. Aliases may be nested and can contain anything that can be legally typed at the \code{pydb} prompt. Note that internal \code{pydb} commands can be overridden by aliases. Such a command is then hidden until the alias is removed. Aliasing is recursively applied to the first word of the command line; all other words in the line are left alone. As an example, here are two useful aliases (especially when placed in the \code{.pydbrc} file): \begin{verbatim} (Pydb) list 23 24 def gcd(a,b): 25 """ GCD. We assume positive numbers""" 26 27 # Make: a <= b 28 -> if a > b: 29 (a, b) = (b, a) 30 31 if a <= 0: 32 return None (Pydb) p a 3 (Pydb) a=5; print a 5 (Pydb) p a 3 \end{verbatim} So inside the command the value of \code{a} is changed. After the command finishes the value reverts back to its old value. \item[complete \var{command-prefix}]\label{command:complete} If \ulink{\module{readline}}{http://docs.python.org/lib/module-readline.html} or one of readline-compatible interfaces such as \ulink{\module{pyreadline}}{http://projects.scipy.org/ipython/ipython/wiki/PyReadline/Intro} are available on your OS, the \code{complete} command will print a list of command names that start with \var{command-prefix}. \code{complete} will also work on \code{info}, \code{set}, and \code{show} sub-command. In addition the command-completion key (usually the tab key) can be used to complete command names, or \code{info}, \code{set}, and \code{show} subcommands. \item[h(elp) \optional{\var{command} \optional{\var{subcommand}}\code{\Large{|}}\var{expression}}] Without argument, print the list of available debugger commands. When an argument is given, it is first checked to see if it is command name; \samp{help exec} gives help on the \samp{!} command. With the argument is an expression or object name, you get the same help that you would get inside a Python shell running the built-in help() command. If the environment variable \envvar{PAGER} is defined, the file is piped through that command. You'll notice this only for long help output. Without argument, print the list of available commands. With \var{command} as argument, print help about that command. \samp{help pydb} displays the full documentation file; if the environment variable \envvar{PAGER} is defined, the file is piped through that command. Since the \var{command} argument must be an identifier, \samp{help exec} must be entered to get help on the \samp{!} command. Some commands, \code{info}, \code{set}, and \code{show} can accept an additional subcommand to give help just about that particular subcommand. For example \code{help info line} give help about the \code{info line} command. See also \ref{command:examine} and \ref{command:whatis}. \item[q(uit)]\label{command:quit} Quit the debugger. The program being executed is aborted. \item[kill \optional{unconditional}]\label{command:kill} A non-maskable or ``hard'' kill. Basically, the program sends itself \code{kill -9}. This may be needed to get out of the debugger when doing thread debugging. Since this is drastic, normally we prompt in interactive sessions whether this is really what you want to do. If however ``unconditional'' is added, no questions are asked. \item[save \optional{\var{all} \code{\Large{|}} \var{break} \code{\Large{|}} \var{settings}} \optional{\var{filename}}]\label{command:save} Save the breakpoint settings to a file which can be read back in another session using \code{source}. If \var{filename} is given the commands are saved that file. Otherwise they are saved to \verb|~/pydb-restart.txt|. \item[source \optional{-v} \var{filename}]\label{command:source} Read debugger commands from a file named \var{filename}. Note that the file \code{.pydbrc} is read automatically this way when \code{pydb} is started. `-v', for verbose mode, is given then \code{pydb} displays each command as it is executed. The option must be given before \var{filename}, and is interpreted as part of the filename anywhere else. An error in any command terminates execution of the command and control is returned to the console. For tracking down problems with command files, see the \samp{set trace-commands on} debugger command. See \ref{command:trace-commands}. A command file for \code{pydb} is a text file made of lines that are \code{pydb} commands. Comments (lines starting with \code{\#} may also be included. An empty line in a command file does nothing; it does not mean to repeat the last command, as it would from the terminal. \item[unalias \var{name}]\label{command:unalias} Delete the specified alias. \end{description} \subsection{Signal handling ({\tt handle}, {\tt info handle}, {\tt signal})\label{subsection-signal}} Partly as a result of the Matthew Fleming's Google 2006 Summer of Code project, \code{pydb} contains signal handling similar to \code{gdb}. A signal is an asynchronous event that can happen in a program. Note: only the main thread can intercept a signal, so if the main thread is blocked, handling of the signal will be delayed. The operating system defines the possible kinds of signals, and gives each kind a name and a number. For example, in Unix \code{SIGINT} is the signal a program gets when you type an interrupt character (often \code{C-c}); \code{SIGALRM} occurs when the alarm clock timer goes off (which happens only if your program has requested an alarm). When \code{pydb} changes signal handlers, it saves any value that the debugged script might have installed. The debugger also installs an interrupt handler \code{SIGINT} so that errant programs can be interrupted and you can find out where the program was when you interrupted it. Some signals, including \code{SIGALRM}, are a normal part of the functioning of your program. Others, such as \code{SIGSEGV}, indicate errors; these signals are fatal--they kill your program immediately if the program has not specified in advance some other way to handle the signal. \code{SIGINT} does not indicate an error in your program, but it is normally fatal so it can carry out the purpose of the interrupt: to kill the program. \code{pydb} has the ability to detect any occurrence of a signal in your program. You tell \code{pydb} in advance what to do for each kind of signal. In the course of running the program, signal handlers may be changed, and the debugger has the ability to watch for this possibility and act accordingly. However since this adds a bit of overhead it is turned off by default. \code{set sigcheck} and \code{show sigcheck} can be used to set/show whether this checking is done. Normally, \code{pydb} is set up to let the non-erroneous signals like \code{SIGALRM} be silently passed to your program (so as not to interfere with their role in the program's functioning) but to stop your program immediately whenever an error signal happens. You can change these settings with the \code{handle} command. \subsubsection{Intercepting Signals ({\tt handle})}\label{subsubsection-handle} \begin{description} \item[handle \var{signal} \var{keywords}\ldots] Change the way the debugger handles signal \var{signal}. \var{signal} can be the number of a signal or its name (with or without the \code{SIG} at the beginning); The \var{keywords} say what change to make. \end{description} The keywords allowed by the \code{handle} command can be abbreviated. Their full names are: \begin{description} \item[stop] The debugger should stop your program when this signal happens. This implies the \code{print} keyword as well. \item[nostop] The debugger should not stop your program when this signal happens. It may still print a message telling you that the signal has come in. \item[print] The debugger should print a message when this signal happens. \item[noprint] The debugger should not mention the occurrence of the signal at all. \item[pass] The debugger should allow your program to see this signal; your program can handle the signal, or else it may terminate if the signal is fatal and not handled. \code{pass} and \code{noignore} are synonyms. \item[nopass] The debugger should not allow your program to see this signal. \code{nopass} and \code{ignore} are synonyms. \item[stack] The debugger should print a stack trace when it receives the signal. When used with ``nostop'', this can be useful if you've got a program that seems ``hung'' and you want to find out where it is, but continue after showing this information. \item[nostack] The debugger should not print a stack trace when it receives the signal. \end{description} \subsubsection{Showing Signal-handling status ({\tt info handle}, {\tt info signals})}\label{command:info-handle} \begin{description} \item[info handle \optional{\var{signal-name}\code{\Large{|}}\var{signal-number}}] If a signal name or number is given just the information regarding that signal is shown. Here's an example: \begin{verbatim} (Pydb) info handle INT Signal Stop Print Print Stack Pass to program SIGINT True True False False \end{verbatim} If no signal name or number is given, print a table of all the kinds of signals and how the debugger has been told to handle each one. You can use this to see the signal numbers of all the defined types of signals. \code{info signal} is an alias for \code{info handle}. \end{description} \subsubsection{Sending your program a signal ({\tt signal})} \begin{description} \item[signal \{\var{signal-name} \code{\Large{|}} \var{signal-number}\}] You can use the \code{signal} command send a signal to your program. Supply either the signal name, e.g. \code{SIGINT}, or \code{INT} or the signal number, e.g. \code{15}. \end{description} \subsection{Thread debugging ({\tt thread}, {\tt info thread}, {\tt qt}, {\tt frame}, {\tt break})\label{subsection-thread}} Thread debugging is a bit experimental. By default it is not turned on, since it adds a bit of additional complexity. To turn thread debugging on, pass the \code{--threading} option on the \code{pydb} invocation. Tests have shown that one can easily cause a deadlock in trying to change the behavior if one is not careful. At present we don't have a way to issue a \code{run} command, although the hard \code{restart} works. See \ref{subsection-restart}. Also, to quit we haven't worked out a sure-fire method to terminate gracefully like you can do when there are no threads. We have however added a \code{kill} command. See \ref{command:kill} for information on \code{kill}. This is a little brutal, but at present it is about the best that can be done. One will get the most information using Python 2.5 or having \ulink{\module{threadframe}}{http://www.majid.info/mylos/stories/2004/06/10/threadframe.html} installed with versions prior to 2.5. However since the debugger keeps its own information about threads, one can still get some information when this is not the case. The debugger also relies on the \ulink{\module{threading}}{http://docs.python.org/lib/module-threading.html} module, especially to assist in tracing. If the program uses the lower-level \ulink{\module{thread}}{http://docs.python.org/lib/module-thread.html} routines, some debugging can be done but it will be much more limited. \subsubsection{Showing thread information ({\tt info thread})\label{command:info-thread}} \begin{description} \item[info thread \optional{\var{thread-name}\Large{|}\var{thread-number}}\optional{verbose\Large{|}terse}] List all currently-known thread name(s). If no thread name or thread number is given, we list info for all threads. Unless a terse listing, for each thread we give: \begin{itemize} \item the class, thread name, and status as \code{} \item the top-most call-stack information for that thread. Generally the top-most calls into the debugger and dispatcher are omitted unless \code{set debug-pydb} is set to \code{True}. \end{itemize} The specific output you get depends on whether you are using Python 2.5 or later or (when not) have the \ulink{\module{threadframe}}{http://www.majid.info/mylos/stories/2004/06/10/threadframe.html} module installed. Here is an example assuming Python 2.5 is installed: \begin{verbatim} (Pydb) info thread ---------------------------------------- <_MainThread(MainThread, started)> () called from file '/src/external-cvs/pydb/test/thread/q.py' at line 52 ---------------------------------------- run(self=) called from file '/src/external-cvs/pydb/test/thread/q.py' at line 19 ---------------------------------------- -> run(self=) called from file '/src/external-cvs/pydb/test/thread/q.py' at line 39 ---------------------------------------- run(self=) called from file '/src/external-cvs/pydb/test/thread/q.py' at line 38 \end{verbatim} The arrow \code{->} indicates which thread is current. Here it is Thread-2. If \code{terse} is appended, we just list the thread name and thread id. Here's an example: \begin{verbatim} (Pydb) info thread terse MainThread: -1210480976 Thread-3: -1231336544 -> Thread-2: -1222943840 Thread-1: -1214551136 \end{verbatim} The arrow indicates the current thread; again it is Thread-2. This listing is available on all Python versions and without threadframe installed. To get the full stack trace for a specific thread pass in the thread name (assuming Python 2.5 or threadframe). Here's an example: \begin{verbatim} (Pydb) info thread Thread-3 trace_dispatch_gdb(self= x=5 (/tmp/hardtodebug.py:9): (Pydb) restart Re exec'ing ['pydb', 'hardtodebug.py', 'a', 'b', 'c'] (/tmp/hardtodebug.py:1): (Pydb) \end{verbatim} The first \code{--Return--} line printed is a result of the \code{debugger()} exiting. But note that we stopped \emph{after\/} the return from \code{test()}, which explains the \emph{second\/} \code{--Return--} line. Because the next executable statement is after the implicit return. If you want to stop inside \code{test()} put a statement after the \code{debugger()}, such as a \code{return} statement. Furthermore, if the program had ended at line 8, then \emph{no\/} stopping would have occurred because the end of the program is reached first.\footnote{Perhaps this is a deficiency of the debugger. I'm not sure what the right way to address though. One could have another routine to stop at a return which would then skip intervening statements. Another possibility is to add a routine to have debugger stop inside the call, e.g. \code{debugger} above. This is not hard to code and I've done so, but I'm not sure that doesn't just confuse things more.} Also note that we can issue a \code{restart} which involves some hackery. But at least in this case it gets things right. There is one final advantage of using \code{debugger()}. When one is stepping code or has put a breakpoint in code, the interpreter has to be involved and calls debugger-checking code written in Python for every statement that he debugged program runs. And this has a noticeable effect. With \code{debugger()} there is absolutely no overhead (provided there are no other breakpoints set in the program). \subsubsection{Turning the debugger on an off and using {\tt Pdb.precmd}}\label{subsubsection-precmd} Since the debugger slows things down looking for stoppoing points. If you want to remove this overhead and have Python run closer to full speed, here's how you can remove the debugger hook: \begin{verbatim} sys.settrace(None) \end{verbatim} If you need to turn it on subsequently: \begin{verbatim} pydb.debugger(status='continue') \end{verbatim} If there's something you want to run before stepping you can do that by monkey-patching \code{Pdb.precmd}: \begin{verbatim} import pydb def myprecmd(obj, debug_cmd): """Hook method executed just after a command dispatch is finished.""" global _pydb_trace obj.do_list('') obj.do_where('10') # limit stack to at most 10 entries return obj.old_precmd(debug_cmd) # is always string 's' in example below _pydb_trace = pydb.Pdb() pydb.Pdb.old_precmd = pydb.Pdb.precmd pydb.Pdb.precmd = myprecmd pydb.debugger(dbg_cmds=['s'] * 30) \end{verbatim} \subsubsection{Line tracing}\label{subsubsection-linetracing} Rather than trace the entire program, if there is a specific portion that you want traced that can be done too, passing a list of debugger commands to \code{debugger}. \begin{verbatim} import pydb # some code here ... pydb.debugger(["set linetrace on", "continue"]) # This and subsequent lines will be traced # more code ... pydb.debugger(["set linetrace off", "continue"]) \end{verbatim} \subsection{Calling the Debugger after a Crash: Post-Mortem Debugging ({\tt pydb.post_mortem}, {\tt pydb.pm}, {\tt pydb.exception_hook})}\label{subsection-post-mortem} It is also to possible enter the debugger after a crash or traceback even though the program was not started via \code{pydb}. This is called \emph{post-mortem debugging}. In this state many of the debugger commands for examining variables and moving around in the stack will still work. However some commands such as those which imply a continuation of running code will no longer work. There are in fact three possibilities. The first way does not require modification to your program but it does require that the program be run from the Python interpreter shell. The second possibility doesn't require one to be inside the Python interpreter shell, but does require modification to your program. The third possibility is if you had started using \code{pydb}. \subsubsection{Post-Mortem Debugging within a Python Interpreter Shell ({\tt pydb.post_mortem}, {\tt pydb.pm()})} Here, all you do is \code{import pydb} (if that hasn't been done already), and call \code{pydb.pm()} or \code{pydb.post_mortem} if you have a specific traceback object you want to use. To make this more concrete we will give an example. We have the following text \code{mymodule.py} \begin{verbatim} def test(): print spam \end{verbatim} Now here's a sample session \begin{verbatim} >>> import mymodule >>> mymodule.test() Traceback (most recent call last): File "", line 1, in ? File "mymodule.py", line 2, in test print spam NameError: global name 'spam' is not defined >>> import pydb >>> pydb.pm() (/home/src/external-cvs/pydb/test/mymodule.py:2): test (Pydb) where -> 0 test() called from file '/tmp/mymodule.py' at line 2 ## 1 in file '' at line 1 (Pydb) list 1 def test(): 2 -> print spam [EOF] (Pydb) quit >>> \end{verbatim} At present if you are using \code{ipython}, that captures the exception and \code{sys.last_traceback} will not be defined. If you have a traceback stored say in variable \code{t}, instead of \code{pydb.pm()} above, use \code{pydb.post_mortem(t)}. \subsubsection{Post-Mortem Debugging arranged within a Python Script ({\tt pydb.exception_hook})} If you didn't start your program inside a Python interpreter shell, there you can still get into the debugger when an exception occurs. Here you need to arrange for this possibility adding to the script these lines: \begin{verbatim} import pydb, sys sys.excepthook = pydb.exception_hook \end{verbatim} \subsubsection{Post-Mortem Debugging within {\tt pydb}} When invoked as a script, \code{pydb} will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post-mortem debugging (or after normal exit of the program), \code{pydb} will restart the program. Automatic restarting preserves \code{pydb}'s state (such as breakpoints) and in most cases is more useful than quitting the debugger upon the program's exit. \subsection{Entering the Debugger from Outside the Program} It's possible to set things up so that when you send a signal to your program you enter the debugger. Up until that point though there will be no overhead associated with the debugger. To do this, you need to create an instance of the \class{SignalManager} object and call that object's \code{action} method passing a string exactly like you would for the debugger's \code{handle} command. Here's an example: \begin{verbatim} ... from pydb.sighandler import SignalManager ... h = SignalManager() h.action('SIGUSR1 stack print stop') ... \end{verbatim} In the above example, a signal handler is set up so that when the \code{SIGUSR1} signal is sent, we will print a message, show the stack trace and then stop inside the debugger. If you don't want to stop inside the debugger bug just see where you are omit the ``stop'' keyword or change it it ``nostop''. See \ref{subsubsection-handle} for information parameters names used in the string and their meanings. \subsection{Entering the Debugger from Python or a Python Shell}\label{subsection-entering-pydb-from-python} If you want to debug a Python script from inside another Python program (often a Python shell program such as \ulink{IPython}{http://ipython.scipy.org/moin/ipython}), the \code{runl()}, and \code{runv()} function calls can be of help. See \ref{entry-fns} for information about these calls. The 'l', and 'v' suffixes have meanings analogous that used in \code{os.spawnv()}, \code{os.execv()}, \code{os.spawnl()}, or \code{os.execl()} (and other Python library functions). \subsection{Yet Another Method of Invocation} With the caveat mentioned in \ref{subsection-calling-pydb-inside-program} about problems with using \code{pydb} initially to run a script, I think most people will probably use the \code{pydb} command described in \ref{pydb-invocation}. However for completeness here we give another alternative. Here's another way run a program under control of the debugger: \begin{verbatim} >>> import pydb >>> import mymodule >>> pydb.run('mymodule.test()') (:1): (/usr/lib/python2.4/bdb.py:366): run (Pydb) continue \end{verbatim} One difference between this kind of invocation that of Section \ref{pydb-invocation} is that statements may get executed in the import of \code{mymodule} will not be debugged. For example if \code{mymodule} implements a standalone program and/or has a \code{__name__ = '__main__' } clause, you probably don't want to use this method. \subsection{Inheritance from class \class{Cmd}} Because \class{Pdb} inherits from \class{Cmd}, the following conventions are used. All of the debugger commands listed in \ref{command:debugger} are methods of a \class{Pdb} object. The method names are the command name prefixed by \code{do_}. For example the method handling the \samp{step} command is \code{do_step}, and the command handling the \samp{frame} command is \code{do_frame}. If you have a \class{Pdb} object, it is possible to call any of the commands listed in \ref{pydb-commands} directly. Parameters needed by the methods (for example breakpoint numbers for the \code{enable} command), are passed as a single string argument. The string contains the values of the parameters and multiple parameters are separated by spaces. Each method parses out parameters and performs needed conversions. For example, a \class{Pdb} object, \code{p}, can enable breakpoint numbers 3, 5, and 10 like this: \code{p.do_enable("3 5 10")}, and this has the same effect as if \code{"enable 3 5 10"} were issued as a debugger command. String parameters should not have additional quotes in the string. For example to set the filename where history commands are to be saved (\ref{command:hist-filename}), the method call would be \code{p.do_set("history filename /tmp/myhistfile")} without any quotes around \code{/tmp/myhistfile}. Also inherited \class{Cmd}, is the help mechanism, although some customization has been made to allow for subcommand help. See the \ulink{Python cmd module}{http://docs.python.org/lib/module-cmd.html} for more information. If readline support is available on your OS, \class{Cmd} will use that and both command history and command completion will be available. In addition, the debugger \code{complete} command is defined (see \ref{command:complete}). The \code{complete} command for example is used internally by GNU Emacs debugger \code{gud}. \subsection{Debugger Entry Functions}\label{entry-fns} The \code{pydb} module defines the following functions, and each enters the debugger in a slightly different way: \begin{funcdesc}{debugger}{\optional{dbg_cmds=None, add_exception_hook=True, add_threaddbg=False, status='start'}}\label{debugger} Enter the debugger at the statement which follows (in execution) the \code{debugger()} statement. This hard-codes a call to the debugger at a given point in a program, even if the code is not otherwise being debugged. For example you might want to do this when an assertion fails. It is useful in a couple of other situations. First, there may be some problem in getting the debugger to stop at this particular place for whatever reason (like flakiness in the debugger). Alternatively, using the debugger and setting a breakpoint can slow down a program a bit. But if you use this instead, the code will run as though the debugger is not present. When the debugger is quitting, this causes the program to be terminated. If you want the program to continue instead, use the \code{debugger} function. You can run debugger commands by passing this as a list in parameter \code{dbg_cmds}. Unless \code{add_exception_hook} is set to \code{False}, we install an exception hook to enter the debugger on any otherwise not handled exception. If you want experimental thread debugging support, set \code{add_threaddbg} to \code{True}. Setting the parameter \code{status} to the string 'new' will cause a new instance to be created which might wiping out other instances which might contain information like breakpoints or debugger settings. If instead \code{status} is set to 'continue', an existing instance will resume. Omitting status or setting it to 'start' will start the debugger which might be a 'new' depending on whether or not an instance has been created. \end{funcdesc} If instead `status' is set to 'continue', an existing instance will resume. Omitting status or setting it to 'start' will start the debugger which might be a 'new' depending on whether or not an instance has been created. \begin{funcdesc}{exception_hook}{type, value, tb, dbg_cmds=None, cmdfile=None} An exception hook to call \code{pydb}'s post-mortem debugger. \code{cmdfile} is an optional debugger command file you want to \code{source} commands on. \code{dbg_cmds} is a list of debugger commands you want to run. To use add this to your Python program: \begin{verbatim} import sys sys.excepthook = pydb.exception_hook \end{verbatim} \end{funcdesc} \begin{funcdesc}{pm}{\optional{dbg_cmds=None}} Enter post-mortem debugging of the traceback found in \code{sys.last_traceback}. Note you may need to have \code{sys} imported prior to having the error raised to have sys.last_traceback set. You can run debugger commands by passing this as a list as parameter \code{dbg_cmds}. For example if you want the display listsize to be 20 by default on entry pass \code{["set listsize 20",]}. \end{funcdesc} \begin{funcdesc}{post_mortem}{traceback \optional{, dbg_cmds=None, cmdfile=None}}\label{post-mortem} Enter post-mortem debugging of the given \var{traceback} object. You can run debugger commands by passing this as a list as parameter \code{dbg_cmds}. For example if you want the display listsize to be 20 by default on entry pass \code{["set listsize 20",]}. \end{funcdesc} \begin{funcdesc}{run}{statement\optional{, globals\optional{, locals}}} Execute the \var{statement} (given as a string) under debugger control starting with the statement subsequent to the place that the this appears in your program. The debugger prompt appears before any code is executed; you can set breakpoints and type \samp{continue}, or you can step through the statement using \samp{step} or \samp{next} See \ref{command:step} and \ref{command:next} for explanations of these commands. The optional \var{globals} and \var{locals} arguments specify the environment in which the code is executed; by default the dictionary of the module \refmodule[main]{__main__} is used. (See the explanation of the \keyword{exec} statement or the \function{eval()} built-in function.) Note that this is not at all like pydb's (or GDB's) \code{run} (see \ref{command:run}) debugger command. This function should be called from inside the program you are trying to debug. \end{funcdesc} \begin{funcdesc}{runcall}{function\optional{, argument, ...}} Call the \var{function} (a function or method object, not a string) with the given arguments starting with the statement subsequent to the place that the this appears in your program.. When \function{runcall()} returns, it returns whatever the function call returned. The debugger prompt appears as soon as the function is entered. \end{funcdesc} \begin{funcdesc}{runeval}{expression\optional{, globals\optional{, locals}}} Evaluate the \var{expression} (given as a string) under debugger control starting with the statement subsequent to the place that the this appears in your program. When \function{runeval()} returns, it returns the value of the expression. Otherwise this function is similar to \function{run()}. \end{funcdesc} \begin{funcdesc}{runl}{\var{arg1} \optional{, \var{arg2}\ldots}} This is a way to call the debugger on a Python script (usually not the same one as is currently running) from inside Python. In particular this is useful inside Python shells. The parameters form the options to the debugger as well as the Python script to debug and options to pass to that. For example: \begin{verbatim} import pydb pydb.runl("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") \end{verbatim} Here \code{--threading} and \code{--nx} go to the debugger and \code{myscript} is the name of the Python program to run which gets the remaining parameters, \code{--my-first-option} and \code{myfirstarg}. The 'l', suffix to indicate a list parameter is analogous to the use in \code{os.spawnl()}, or \code{os.execl()}. If you want to debug the current Python script, use \code{debugger()} described below. \end{funcdesc} \begin{funcdesc}{runv}{\var{args}} This is a way to call the debugger on a Python script (usually not the same one as is currently running) from inside Python. In particular this is useful inside Python shells. The single parameter is a list of the options to the debugger as well as the Python script to debug and options to pass to that. \code{runl(*args)} is also the same as \code{runv((args))}. For example: \begin{verbatim} import pydb args=("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") pydb.runv(args) \end{verbatim} Here \code{--threading} and \code{--nx} go to the debugger and \code{myscript} is the name of the Python program to run which gets the remaining parameters, \code{--my-first-option} and \code{myfirstarg}. The 'v', suffix to indicate a variable number of parameters is analogous to the use in \code{os.spawnv()}, or \code{os.execv()}. If you want to debug the current Python script, use \code{debugger()} described below. \end{funcdesc} \begin{funcdesc}{set_trace}{\optional{dbg_cmds=None, add_exception_hook=True, add_threaddbg=False, new_instance=False}}\label{debugger} Another name for debugger. This is the older name and is kept for backward compatibility with pdb. Also it is analogous to the underlying command used in the \ulink{\module{sys}}{http://docs.python.org/lib/module-sys.html} of the same name. \end{funcdesc} \section{The ``Basic'' Debugger module (\module{bdb}) and Classes \class{Bdb} and \class{Breakpoint}\label{bdb-module-class}} As mentioned in the previous section the \class{Pdb} class is really an inheritance of two other classes, \class{Cmd} and \class{Bdb}. While the \class{Cmd} class handles command-like interaction, the \class{Bdb} handles basic debugger functions. It is the meat of this debugger or any debugger. Thus, you will find other debuggers such as \ulink{Eric}{http://www.die-offenbachs.de/detlev/eric.html} or Idle using the \module{bdb} module (not \module{pdb} or \class{pydb}). The module defines an exception used for quitting the debugger \class{BdbQuit}. It defines two other classes: \class{Bdb}, basic debugger routines, and \class{Breakpoint} a class for handling debugger breakpoints. \begin{classdesc}{Bdb}{}\label{Bdb} \begin{methoddesc}{canonic}{filename} Regularizes or canonicalizes filename in some sort of standard form. This may involve regularizing the case of letters, using the absolute pathname \end{methoddesc} \begin{methoddesc}{reset}{} The debugger keeps track of frames it needs to stop at. This routine resets this information so that no frames are recorded as places to enter the debugger. \end{methoddesc} \begin{methoddesc}{trace_dispatch}{} This gets called on every debugger event and reroutes or dispatches the call based on the event. Events are described in the next section \ref{debugger-hooks}. \end{methoddesc} \begin{methoddesc}{dispatch_exception}{} Called from trace_dispatch on an ``exception'' event. Generally you don't change this but instead override \method{user_exception}. \end{methoddesc} \begin{methoddesc}{dispatch_line}{} Called from trace_dispatch on an ``line'' event. Generally you don't change this but instead override \method{user_line}. \end{methoddesc} \begin{methoddesc}{dispatch_return}{} Called from trace_dispatch on an ``return event. Generally you don't change this but instead override \method{user_return}. \end{methoddesc} \begin{methoddesc}{user_exception}{} Called on an ``exception'' event. Debuggers may override this method. \end{methoddesc} \begin{methoddesc}{user_line}{} Called on a ``line'' event. Debuggers may override this method. \end{methoddesc} \begin{methoddesc}{user_return}{} Called on a ``return'' event. Debuggers may override this method. \end{methoddesc} \end{classdesc} \section{How the Debugger Works \label{debugger-hooks}} Some changes were made to the interpreter: \begin{itemize} \item \code{sys.settrace(\var{func})} sets the global trace function \item there can also be a local trace function (see below) \end{itemize} Trace functions have three arguments: \var{frame}, \var{event}, and \var{arg}. \var{frame} is the current stack frame. \var{event} is a string: \code{'call'}, \code{'line'}, \code{'return'}, \code{'exception'}, \code{'c_call'}, \code{'c_return'}, or \code{'c_exception'}. \var{arg} depends on the event type. The global trace function is invoked (with \var{event} set to \code{'call'}) whenever a new local scope is entered; it returns a reference to the local trace function to be used in that scope, or \code{None} if the scope couldn't be traced. The local trace function returns a reference to itself (or to another function for further tracing in that scope), or \code{None} to turn off tracing in that scope. Instance methods are accepted (and very useful) as trace functions. The events have the following meanings: \begin{description} \item[\code{'call'}] A function is called (or some other code block entered). The global trace function is called; \var{arg} is \code{None}; the return value specifies the local trace function. \item[\code{'line'}] The interpreter is about to execute a new line of code (sometimes multiple line events on one line). The local trace function is called; \var{arg} is \code{None};\ the return value specifies the new local trace function. \item[\code{'return'}] A function (or other code block) is about to return. The local trace function is called; \var{arg} is the value that will be returned. The trace function's return value is ignored. \item[\code{'exception'}] An exception has occurred. The local trace function is called; \var{arg} is a triple \code{(\var{exception}, \var{value}, \var{traceback})};\ the return value specifies the new local trace function. \item[\code{'c_call'}] A C function is about to be called. This may be an extension function or a built-in function. \var{arg} is the C function object. \item[\code{'c_return'}] A C function has returned. \var{arg} is \code{None}. \item[\code{'c_exception'}] A C function has thrown an exception. \var{arg} is \code{None}. \end{description} Since an exception is propagated down the chain of callers, an \code{'exception'} event is generated at each level. For more information on code and frame objects, see to the \ulink{Python Reference Manual}{http://docs.python.org/ref/ref.html}. \section{Files making up the Debugger \label{debugger-files}} Here are the files making up the debugger and what is in them. Currently we use GNU automake in the build process, and this allows for substitution to take place in the files and Python programs which get installed. In particular the path to the Python interpreter is used that the debugger configured and tested with. A file with a \code{.in} suffix is a file that is the input for the substitution. The corresponding output file has the \code{.in} stripped off. For example {\tt pydb.py.in} becomes \code{pydb.py} after a Python interpreter and package name (pydb) is substituted inside it. \begin{description} \item[pydb.py.in] Python debugger. Contains user-callable routines, e.g. \code{run}, \code{debugger}, \code{runeval}. \item[display.py] Classes to support gdb-like display/undisplay for pydb, the Extended Python debugger. Class Display and DisplayNode are defined. \item[fns.py] Functions to support the Debugger. \item[gdb.py.in] Handles gdb-like command processing. \item[info.py] Info subcommands. (Well, most of them). \item[pydbbdb.py] Routines here have to do with the subclassing of bdb. Defines Python debugger Basic Debugger (Bdb) class. This file could/should probably get merged into bdb.py \item[pydbcmd.py] Routines here have to do with parsing or processing commands, generally (but not always) they are not specific to pydb. They are sort of more oriented towards any gdb-like debugger. Also routines that need to be changed from cmd are here. \item[set.py] Set subcommands. (Well, most of them). \item[show.py] Show subcommands. (Well, most of them). \item[sighandler.py] Classes and routines which help in signal handling. Of the classes there is a signal handler manager class, \code{SignalManager}, and a class that is used by the signal handler that the program sees, \code{SigHandler}. \item[subcmd.py] Implements a sub-command class for handling \code{info}, \code{set}, and \code{show} subcommand processing. \item[threaddbg.py] Implements thread debugging. \end{description} \section{Installation} The Python code is available from the \ulink{pydb files section on sourceforge.net}{http://sourceforge.net/project/showfiles.php?group_id=61395&package_id=175827}. \emph{If you have made an OS package and would like you're URL listed here, let me know}. \subsection{Installation options} The program is not configured using \code{setup.py} yet, but \code{configure}. Some configuration options that may be of interest. \begin{description} \item[--{}--with--{}--python] Normally the \code{configure} uses your execution search-path variable (\code{PATH}) to find the python interpreter. However it is possible that you might now have python or the right python in your \code{PATH}. Some installations may have several versions of Python may be installed or may have Python installed in an unusual place. Use this configuration in such cases. \item[--{}--with--{}--lispdir] This option overrides where to put files which can be used by GNU Emacs. It should be a place that GNU Emacs users will have listed in the \code{load-path} inside GNU Emacs. \item[--{}--with--{}--site-packages] This option overrides where to put files the \code{pydb} package. It should be a place that python searches when modules are \code{import}'ed. \item[--{}--enable--{}--pyreadline] If you don't have readline but have \code{pyreadline} or prefer to use that, use this option. \end{description} pydb-1.26/Doc/lib/Makefile0000644000175000017500000000051110366646174012246 00000000000000#============================================================= # $Id: Makefile,v 1.1 2006/01/28 10:50:36 rockyb Exp $ #============================================================= # Whatever it is you want to do, it should be handled by the # by the main (parent) Makefile. So reissue make from there. all %: $(MAKE) -C .. $@ pydb-1.26/Doc/perl/0000777000175000017500000000000011167772525011071 500000000000000pydb-1.26/Doc/perl/l2hinit.perl0000664000175000017500000006643410366626716013261 00000000000000# LaTeX2HTML support base for use with Python documentation. package main; use L2hos; $HTML_VERSION = 4.0; $MAX_LINK_DEPTH = 2; $ADDRESS = ''; $NO_FOOTNODE = 1; $NUMBERED_FOOTNOTES = 1; # Python documentation uses section numbers to support references to match # in the printed and online versions. # $SHOW_SECTION_NUMBERS = 1; $ICONSERVER = '.'; $IMAGE_TYPE = 'gif'; # Control where the navigation bars should show up: $TOP_NAVIGATION = 1; $BOTTOM_NAVIGATION = 1; $AUTO_NAVIGATION = 0; $BODYTEXT = ''; $CHILDLINE = "\n



\n"; $VERBOSITY = 0; # default # of columns for the indexes $INDEX_COLUMNS = 2; $MODULE_INDEX_COLUMNS = 4; $HAVE_MODULE_INDEX = 0; $HAVE_GENERAL_INDEX = 0; $HAVE_TABLE_OF_CONTENTS = 0; $AESOP_META_TYPE = 'information'; # A little painful, but lets us clean up the top level directory a little, # and not be tied to the current directory (as far as I can tell). Testing # an existing definition of $mydir is needed since it cannot be computed when # run under mkhowto with recent versions of LaTeX2HTML, since this file is # not read directly by LaTeX2HTML any more. mkhowto is required to prepend # the required definition at the top of the actual input file. # if (!defined $mydir) { use Cwd; use File::Basename; ($myname, $mydir, $myext) = fileparse(__FILE__, '\..*'); chop $mydir; # remove trailing '/' $mydir = getcwd() . "$dd$mydir" unless $mydir =~ s|^/|/|; } $LATEX2HTMLSTYLES = "$mydir$envkey$LATEX2HTMLSTYLES"; push (@INC, $mydir); ($myrootname, $myrootdir, $myext) = fileparse($mydir, '\..*'); chop $myrootdir; # Hackish way to get the appropriate paper-*/ directory into $TEXINPUTS; # pass in the paper size (a4 or letter) as the environment variable PAPER # to add the right directory. If not given, the current directory is # added instead for use with HOWTO processing. # if (defined $ENV{'PAPER'}) { $mytexinputs = "$myrootdir${dd}paper-$ENV{'PAPER'}$envkey"; } else { $mytexinputs = getcwd() . $envkey; } $mytexinputs .= "$myrootdir${dd}texinputs"; # Change this variable to change the text added in "About this document..."; # this should be an absolute pathname to get it right. # $ABOUT_FILE = "$myrootdir${dd}html${dd}stdabout.dat"; sub custom_driver_hook { # # This adds the directory of the main input file to $TEXINPUTS; it # seems to be sufficiently general that it should be fine for HOWTO # processing. # # XXX This still isn't quite right; we should actually be inserting # $mytexinputs just before any empty entry in TEXINPUTS is one # exists instead of just concatenating the pieces like we do here. # my $file = $_[0]; my($jobname, $dir, $ext) = fileparse($file, '\..*'); $dir = L2hos->Make_directory_absolute($dir); $dir =~ s/$dd$//; $TEXINPUTS = "$dir$envkey$mytexinputs"; # Push everything into $TEXINPUTS since LaTeX2HTML doesn't pick # this up on its own; we clear $ENV{'TEXINPUTS'} so the value set # for this by the main LaTeX2HTML script doesn't contain duplicate # directories. if ($ENV{'TEXINPUTS'}) { $TEXINPUTS .= "$envkey$ENV{'TEXINPUTS'}"; $ENV{'TEXINPUTS'} = undef; } print "\nSetting \$TEXINPUTS to $TEXINPUTS\n"; } # $CUSTOM_BUTTONS is only used for the module index link. $CUSTOM_BUTTONS = ''; sub make_nav_sectref($$$) { my($label, $linktype, $title) = @_; if ($title) { if ($title =~ /\<[aA] /) { $title =~ s/\<[aA] /$title"; } return "$label:\n$title\n"; } return ''; } @my_icon_tags = (); $my_icon_tags{'next'} = 'Next Page'; $my_icon_tags{'next_page'} = 'Next Page'; $my_icon_tags{'previous'} = 'Previous Page'; $my_icon_tags{'previous_page'} = 'Previous Page'; $my_icon_tags{'up'} = 'Up One Level'; $my_icon_tags{'contents'} = 'Contents'; $my_icon_tags{'index'} = 'Index'; $my_icon_tags{'modules'} = 'Module Index'; @my_icon_names = (); $my_icon_names{'previous_page'} = 'previous'; $my_icon_names{'next_page'} = 'next'; sub get_my_icon($) { my $name = $_[0]; my $text = $my_icon_tags{$name}; if ($my_icon_names{$name}) { $name = $my_icon_names{$name}; } if ($text eq '') { $name = 'blank'; } my $iconserver = ($ICONSERVER eq '.') ? '' : "$ICONSERVER/"; return "$text"; } sub unlinkify($) { my $text = "$_[0]"; $text =~ s|||; $text =~ s|]*>||i; return $text; } sub use_icon($$$) { my($rel,$str,$title) = @_; if ($str) { my $s = "$str"; if ($s =~ /\/) { my $r = get_my_icon($1); $s =~ s/\/$r/; } $s =~ s/<[aA] /' . "\n" # left-hand side . "\n$previous" . "\n$up" . "\n$next" # title box . "\n$t_title" # right-hand side . "\n$contents" # module index . "\n$CUSTOM_BUTTONS" . "\n$index" . "\n\n" # textual navigation . "
\n" . make_nav_sectref("Previous", "prev", $PREVIOUS_TITLE) . make_nav_sectref("Up", "parent", $UP_TITLE) . make_nav_sectref("Next", "next", $NEXT_TITLE) . "
\n" ); # remove these; they are unnecessary and cause errors from validation $s =~ s/ NAME="tex2html\d+"\n */ /g; return $s; } sub add_child_links { my $toc = add_real_child_links(@_); $toc =~ s|\s*|
|g; $toc =~ s/ NAME=\"tex2html\d+\"\s*href=/ href=/gi; $toc =~ s|(\s*)?||gi; if ($toc =~ / NAME=["']CHILD_LINKS["']/) { return "
\n$toc
\n"; } return $toc; } sub get_version_text() { if ($PACKAGE_VERSION ne '' && $t_date) { return ("" . "Release $PACKAGE_VERSION$RELEASE_INFO," . " documentation updated on $t_date."); } if ($PACKAGE_VERSION ne '') { return ("" . "Release $PACKAGE_VERSION$RELEASE_INFO."); } if ($t_date) { return ("Documentation released on " . "$t_date."); } return ''; } sub top_navigation_panel() { return "\n
\n" . make_nav_panel() . "
\n"; } sub bot_navigation_panel() { return "\n
\n" . "


\n" . make_nav_panel() . "
\n" . "
\n" . get_version_text() . "\n"; } sub add_link { # Returns a pair (iconic link, textual link) my($icon, $current_file, @link) = @_; my($dummy, $file, $title) = split($delim, $section_info{join(' ',@link)}); if ($icon =~ /\/) { my $r = get_my_icon($1); $icon =~ s/\/$r/; } if ($title && ($file ne $current_file)) { $title = purify($title); $title = get_first_words($title, $WORDS_IN_NAVIGATION_PANEL_TITLES); return (make_href($file, $icon), make_href($file, "$title")) } elsif ($icon eq get_my_icon('up') && $EXTERNAL_UP_LINK) { return (make_href($EXTERNAL_UP_LINK, $icon), make_href($EXTERNAL_UP_LINK, "$EXTERNAL_UP_TITLE")) } elsif ($icon eq get_my_icon('previous') && $EXTERNAL_PREV_LINK && $EXTERNAL_PREV_TITLE) { return (make_href($EXTERNAL_PREV_LINK, $icon), make_href($EXTERNAL_PREV_LINK, "$EXTERNAL_PREV_TITLE")) } elsif ($icon eq get_my_icon('next') && $EXTERNAL_DOWN_LINK && $EXTERNAL_DOWN_TITLE) { return (make_href($EXTERNAL_DOWN_LINK, $icon), make_href($EXTERNAL_DOWN_LINK, "$EXTERNAL_DOWN_TITLE")) } return (&inactive_img($icon), ""); } sub add_special_link($$$) { my($icon, $file, $current_file) = @_; if ($icon =~ /\/) { my $r = get_my_icon($1); $icon =~ s/\/$r/; } return (($file && ($file ne $current_file)) ? make_href($file, $icon) : undef) } # The img_tag() function seems only to be called with the parameter # 'anchor_invisible_mark', which we want to turn into ''. Since # replace_icon_marks() is the only interesting caller, and all it really # does is call img_tag(), we can just define the hook alternative to be # a no-op instead. # sub replace_icons_hook {} sub do_cmd_arabic { # get rid of that nasty ... my($ctr, $val, $id, $text) = &read_counter_value($_[0]); return ($val ? farabic($val) : "0") . $text; } sub gen_index_id($$) { # this is used to ensure common index key generation and a stable sort my($str, $extra) = @_; sprintf('%s###%s%010d', $str, $extra, ++$global{'max_id'}); } sub insert_index($$$$$) { my($mark, $datafile, $columns, $letters, $prefix) = @_; my $prog = "$myrootdir/tools/buildindex.py"; my $index; if ($letters) { $index = `$prog --columns $columns --letters $datafile`; } else { $index = `$prog --columns $columns $datafile`; } if (!s/$mark/$prefix$index/) { print "\nCould not locate index mark: $mark"; } } sub add_idx() { print "\nBuilding HTML for the index ..."; close(IDXFILE); insert_index($idx_mark, 'index.dat', $INDEX_COLUMNS, 1, ''); } $idx_module_mark = ''; $idx_module_title = 'Module Index'; sub add_module_idx() { print "\nBuilding HTML for the module index ..."; my $key; my $first = 1; my $prevplat = ''; my $allthesame = 1; my $prefix = ''; foreach $key (keys %Modules) { $key =~ s/([a-zA-Z0-9._]*)<\/tt>/$1/; my $plat = "$ModulePlatforms{$key}"; $plat = '' if ($plat eq $IGNORE_PLATFORM_ANNOTATION); if (!$first) { $allthesame = 0 if ($prevplat ne $plat); } else { $first = 0; } $prevplat = $plat; } open(MODIDXFILE, '>modindex.dat') || die "\n$!\n"; foreach $key (keys %Modules) { # dump the line in the data file; just use a dummy seqno field my $nkey = $1; my $moditem = "$Modules{$key}"; my $plat = ''; $key =~ s/([a-zA-Z0-9._]*)<\/tt>/$1/; if ($ModulePlatforms{$key} && !$allthesame) { $plat = (" ($ModulePlatforms{$key}" . ')'); } print MODIDXFILE $moditem . $IDXFILE_FIELD_SEP . "$key$plat###\n"; } close(MODIDXFILE); if ($GLOBAL_MODULE_INDEX) { $prefix = < This index only lists modules documented in this manual. The Global Module Index lists all modules that are documented in this set of manuals.

MODULE_INDEX_PREFIX } if (!$allthesame) { $prefix .= < Some module names are followed by an annotation indicating what platform they are available on.

PLAT_DISCUSS } insert_index($idx_module_mark, 'modindex.dat', $MODULE_INDEX_COLUMNS, 0, $prefix); } # replace both indexes as needed: sub add_idx_hook { add_idx() if (/$idx_mark/); process_python_state(); if ($MODULE_INDEX_FILE) { local ($_); open(MYFILE, "<$MODULE_INDEX_FILE"); sysread(MYFILE, $_, 1024*1024); close(MYFILE); add_module_idx(); open(MYFILE,">$MODULE_INDEX_FILE"); print MYFILE $_; close(MYFILE); } } # In addition to the standard stuff, add label to allow named node files and # support suppression of the page complete (for HTML Help use). $MY_CONTENTS_PAGE = ''; sub do_cmd_tableofcontents { local($_) = @_; $TITLE = $toc_title; $tocfile = $CURRENT_FILE; my($closures, $reopens) = preserve_open_tags(); anchor_label('contents', $CURRENT_FILE, $_); # this is added $MY_CONTENTS_PAGE = "$CURRENT_FILE"; join('', "\\tableofchildlinks[off]", $closures , make_section_heading($toc_title, 'h2'), $toc_mark , $reopens, $_); } # In addition to the standard stuff, add label to allow named node files. sub do_cmd_listoffigures { local($_) = @_; $TITLE = $lof_title; $loffile = $CURRENT_FILE; my($closures, $reopens) = preserve_open_tags(); anchor_label('lof', $CURRENT_FILE, $_); # this is added join('', "
\n", $closures , make_section_heading($lof_title, 'h2'), $lof_mark , $reopens, $_); } # In addition to the standard stuff, add label to allow named node files. sub do_cmd_listoftables { local($_) = @_; $TITLE = $lot_title; $lotfile = $CURRENT_FILE; my($closures, $reopens) = preserve_open_tags(); anchor_label('lot', $CURRENT_FILE, $_); # this is added join('', "
\n", $closures , make_section_heading($lot_title, 'h2'), $lot_mark , $reopens, $_); } # In addition to the standard stuff, add label to allow named node files. sub do_cmd_textohtmlinfopage { local($_) = @_; if ($INFO) { # anchor_label("about",$CURRENT_FILE,$_); # this is added } # my $the_version = ''; # and the rest is if ($t_date) { # mostly ours $the_version = ",\n$t_date"; if ($PACKAGE_VERSION) { $the_version .= ", Release $PACKAGE_VERSION$RELEASE_INFO"; } } my $about; open(ABOUT, "<$ABOUT_FILE") || die "\n$!\n"; sysread(ABOUT, $about, 1024*1024); close(ABOUT); $_ = (($INFO == 1) ? join('', $close_all, "$t_title$the_version\n", $about, $open_all, $_) : join('', $close_all, $INFO,"\n", $open_all, $_)); $_; } $GENERAL_INDEX_FILE = ''; $MODULE_INDEX_FILE = ''; # $idx_mark will be replaced with the real index at the end sub do_cmd_textohtmlindex { local($_) = @_; $TITLE = $idx_title; $idxfile = $CURRENT_FILE; $GENERAL_INDEX_FILE = "$CURRENT_FILE"; if (%index_labels) { make_index_labels(); } if (($SHORT_INDEX) && (%index_segment)) { make_preindex(); } else { $preindex = ''; } my $heading = make_section_heading($idx_title, 'h2') . $idx_mark; my($pre, $post) = minimize_open_tags($heading); anchor_label('genindex',$CURRENT_FILE,$_); # this is added return "
\n" . $pre . $_; } # $idx_module_mark will be replaced with the real index at the end sub do_cmd_textohtmlmoduleindex { local($_) = @_; $TITLE = $idx_module_title; anchor_label('modindex', $CURRENT_FILE, $_); $MODULE_INDEX_FILE = "$CURRENT_FILE"; $_ = ('

' . make_section_heading($idx_module_title, 'h2') . $idx_module_mark . $_); return $_; } # The bibliography and the index should be treated as separate # sections in their own HTML files. The \bibliography{} command acts # as a sectioning command that has the desired effect. But when the # bibliography is constructed manually using the thebibliography # environment, or when using the theindex environment it is not # possible to use the normal sectioning mechanism. This subroutine # inserts a \bibliography{} or a dummy \textohtmlindex command just # before the appropriate environments to force sectioning. # XXX This *assumes* that if there are two {theindex} environments, # the first is the module index and the second is the standard # index. This is sufficient for the current Python documentation, # but that's about it. sub add_bbl_and_idx_dummy_commands { my $id = $global{'max_id'}; if (/[\\]tableofcontents/) { $HAVE_TABLE_OF_CONTENTS = 1; } s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg; s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo; my(@parts) = split(/\\begin\s*$O\d+$C\s*theindex/); if (scalar(@parts) == 3) { # Be careful to re-write the string in place, since $_ is *not* # returned explicity; *** nasty side-effect dependency! *** print "\nadd_bbl_and_idx_dummy_commands ==> adding general index"; print "\nadd_bbl_and_idx_dummy_commands ==> adding module index"; my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex[\\s\\S]*)" . "([\\\\]begin\\s*$O\\d+$C\\s*theindex)"; s/$rx/\\textohtmlmoduleindex $1 \\textohtmlindex $2/o; # Add a button to the navigation areas: $CUSTOM_BUTTONS .= ('' . get_my_icon('modules') . ''); $HAVE_MODULE_INDEX = 1; $HAVE_GENERAL_INDEX = 1; } elsif (scalar(@parts) == 2) { print "\nadd_bbl_and_idx_dummy_commands ==> adding general index"; my $rx = "([\\\\]begin\\s*$O\\d+$C\\s*theindex)"; s/$rx/\\textohtmlindex $1/o; $HAVE_GENERAL_INDEX = 1; } elsif (scalar(@parts) == 1) { print "\nadd_bbl_and_idx_dummy_commands ==> no index found"; $CUSTOM_BUTTONS .= get_my_icon('blank'); $global{'max_id'} = $id; # not sure why.... s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o; s/[\\]printindex/\\textohtmlindex /o; } else { die "\n\nBad number of index environments!\n\n"; } #---------------------------------------------------------------------- lib_add_bbl_and_idx_dummy_commands() if defined(&lib_add_bbl_and_idx_dummy_commands); } # The bibliographic references, the appendices, the lists of figures # and tables etc. must appear in the contents table at the same level # as the outermost sectioning command. This subroutine finds what is # the outermost level and sets the above to the same level; sub set_depth_levels { # Sets $outermost_level my $level; #RRM: do not alter user-set value for $MAX_SPLIT_DEPTH foreach $level ("part", "chapter", "section", "subsection", "subsubsection", "paragraph") { last if (($outermost_level) = /\\($level)$delimiter_rx/); } $level = ($outermost_level ? $section_commands{$outermost_level} : do {$outermost_level = 'section'; 3;}); #RRM: but calculate value for $MAX_SPLIT_DEPTH when a $REL_DEPTH was given if ($REL_DEPTH && $MAX_SPLIT_DEPTH) { $MAX_SPLIT_DEPTH = $level + $MAX_SPLIT_DEPTH; } elsif (!($MAX_SPLIT_DEPTH)) { $MAX_SPLIT_DEPTH = 1 }; %unnumbered_section_commands = ('tableofcontents' => $level, 'listoffigures' => $level, 'listoftables' => $level, 'bibliography' => $level, 'textohtmlindex' => $level, 'textohtmlmoduleindex' => $level); $section_headings{'textohtmlmoduleindex'} = 'h1'; %section_commands = (%unnumbered_section_commands, %section_commands); make_sections_rx(); } # This changes the markup used for {verbatim} environments, and is the # best way I've found that ensures the
goes on the outside of the #
...
. # # Note that this *must* be done in the init file, not the python.perl # style support file. The %declarations must be set before # initialize() is called in the main LaTeX2HTML script (which happens # before style files are loaded). # %declarations = ('preform' => '
', %declarations); # This is a modified version of what's provided by LaTeX2HTML; see the # comment on the middle stanza for an explanation of why we keep our # own version. # # This routine must be called once on the text only, # else it will "eat up" sensitive constructs. sub text_cleanup { # MRO: replaced $* with /m s/(\s*\n){3,}/\n\n/gom; # Replace consecutive blank lines with one s/<(\/?)P>\s*(\w)/<$1P>\n$2/gom; # clean up paragraph starts and ends s/$O\d+$C//go; # Get rid of bracket id's s/$OP\d+$CP//go; # Get rid of processed bracket id's s/()?/(length($1) || length($2)) ? "$1--$2" : "-"/ge; # Spacing commands s/\\( |$)/ /go; #JKR: There should be no more comments in the source now. #s/([^\\]?)%/$1/go; # Remove the comment character # Cannot treat \, as a command because , is a delimiter ... s/\\,/ /go; # Replace tilde's with non-breaking spaces s/ *~/ /g; # This is why we have this copy of this routine; the following # isn't so desirable as the author/maintainers of LaTeX2HTML seem # to think. It's not commented out in the main script, so we have # to override the whole thing. In particular, we don't want empty # table cells to disappear. ### DANGEROUS ?? ### # remove redundant (not

) empty tags, incl. with attributes #s/\n?<([^PD >][^>]*)>\s*<\/\1>//g; #s/\n?<([^PD >][^>]*)>\s*<\/\1>//g; # remove redundant empty tags (not

or or ) #s/<\/(TT|[^PTH][A-Z]+)><\1>//g; #s/<([^PD ]+)(\s[^>]*)?>\n*<\/\1>//g; #JCL(jcl-hex) # Replace ^^ special chars (according to p.47 of the TeX book) # Useful when coming from the .aux file (german umlauts, etc.) s/\^\^([^0-9a-f])/chr((64+ord($1))&127)/ge; s/\^\^([0-9a-f][0-9a-f])/chr(hex($1))/ge; } # This is used to map the link rel attributes LaTeX2HTML uses to those # currently recommended by the W3C. sub custom_REL_hook { my($rel,$junk) = @_; return 'parent' if $rel eq 'up'; return 'prev' if $rel eq 'previous'; return $rel; } # This is added to get rid of the long comment that follows the # doctype declaration; MSIE5 on NT4 SP4 barfs on it and drops the # content of the page. $MY_PARTIAL_HEADER = ''; sub make_head_and_body($$) { my($title, $body) = @_; $body = " $body" unless ($body eq ''); my $DTDcomment = ''; my($version, $isolanguage) = ($HTML_VERSION, 'EN'); my %isolanguages = ( 'english', 'EN' , 'USenglish', 'EN.US' , 'original', 'EN' , 'german' , 'DE' , 'austrian', 'DE.AT', 'french' , 'FR' , 'spanish', 'ES'); $isolanguage = $isolanguages{$default_language}; $isolanguage = 'EN' unless $isolanguage; $title = &purify($title,1); eval("\$title = ". $default_title ) unless ($title); # allow user-modification of the tag; thanks Dan Young if (defined &custom_TITLE_hook) { $title = &custom_TITLE_hook($title, $toc_sec_title); } if ($DOCTYPE =~ /\/\/[\w\.]+\s*$/) { # language spec included $DTDcomment = "<!DOCTYPE html PUBLIC \"$DOCTYPE\">\n"; } else { $DTDcomment = "<!DOCTYPE html PUBLIC \"$DOCTYPE//" . ($ISO_LANGUAGE ? $ISO_LANGUAGE : $isolanguage) . "\">\n"; } if ($MY_PARTIAL_HEADER eq '') { my $favicon = ''; if ($FAVORITES_ICON) { my($myname, $mydir, $myext) = fileparse($FAVORITES_ICON, '\..*'); my $favtype = ''; if ($myext eq '.gif' || $myext eq '.png') { $myext =~ s/^[.]//; $favtype = " type=\"image/$myext\""; } $favicon = ( "\n<link rel=\"SHORTCUT ICON\" href=\"$FAVORITES_ICON\"" . "$favtype />"); } $STYLESHEET = $FILE.".css" unless $STYLESHEET; $MY_PARTIAL_HEADER = join('', ($DOCTYPE ? $DTDcomment : ''), "<html>\n<head>", ($BASE ? "\n<base href=\"$BASE\" />" : ''), "\n<link rel=\"STYLESHEET\" href=\"$STYLESHEET\" type='text/css'", " />", $favicon, ($EXTERNAL_UP_LINK ? ("\n<link rel='start' href='" . $EXTERNAL_UP_LINK . ($EXTERNAL_UP_TITLE ? "' title='$EXTERNAL_UP_TITLE' />" : "' />")) : ''), "\n<link rel=\"first\" href=\"$FILE.html\"", ($t_title ? " title='$t_title'" : ''), ' />', ($HAVE_TABLE_OF_CONTENTS ? ("\n<link rel='contents' href='$MY_CONTENTS_PAGE'" . ' title="Contents" />') : ''), ($HAVE_GENERAL_INDEX ? ("\n<link rel='index' href='$GENERAL_INDEX_FILE'" . " title='Index' />") : ''), # disable for now -- Mozilla doesn't do well with multiple indexes # ($HAVE_MODULE_INDEX # ? ("<link rel="index" href='$MODULE_INDEX_FILE'" # . " title='Module Index' />\n") # : ''), ($INFO # XXX We can do this with the Python tools since the About... # page always gets copied to about.html, even when we use the # generated node###.html page names. Won't work with the # rest of the Python doc tools. ? ("\n<link rel='last' href='about.html'" . " title='About this document...' />" . "\n<link rel='help' href='about.html'" . " title='About this document...' />") : ''), $more_links_mark, "\n", ($CHARSET && $HTML_VERSION ge "2.1" ? ('<meta http-equiv="Content-Type" content="text/html; ' . "charset=$CHARSET\" />\n") : ''), ($AESOP_META_TYPE ? "<meta name='aesop' content='$AESOP_META_TYPE' />\n" : '')); } if (!$charset && $CHARSET) { $charset = $CHARSET; $charset =~ s/_/\-/go; } join('', $MY_PARTIAL_HEADER, "<title>", $title, "\n\n"); } sub replace_morelinks { $more_links =~ s/ REL=/ rel=/g; $more_links =~ s/ HREF=/ href=/g; $more_links =~ s//" \/>/g; $_ =~ s/$more_links_mark/$more_links/e; } 1; # This must be the last line pydb-1.26/Doc/perl/SynopsisTable.pm0000664000175000017500000000506110366630574014143 00000000000000package SynopsisTable; sub new{ return bless {names=>'', info=>{}, file=>''}; } sub declare{ my($self,$name,$key,$type) = @_; if ($self->{names}) { $self->{names} .= ",$name"; } else { $self->{names} .= "$name"; } $self->{info}{$name} = "$key,$type,"; } # The 'file' attribute is used to store the filename of the node in which # the table will be presented; this assumes that each table will be presented # only once, which works for the current use of this object. sub set_file{ my($self, $filename) = @_; $self->{file} = "$filename"; } sub get_file{ my $self = shift; return $self->{file}; } sub set_synopsis{ my($self,$name,$synopsis) = @_; my($key,$type,$unused) = split ',', $self->{info}{$name}, 3; $self->{info}{$name} = "$key,$type,$synopsis"; } sub get{ my($self,$name) = @_; return split /,/, $self->{info}{$name}, 3; } sub show{ my $self = shift; my $name; print "names: ", $self->{names}, "\n\n"; foreach $name (split /,/, $self->{names}) { my($key,$type,$synopsis) = $self->get($name); print "$name($key) is $type: $synopsis\n"; } } sub tohtml{ my $self = shift; my $oddrow = 1; my $data = "\n"; my $name; foreach $name (split /,/, $self->{names}) { my($key,$type,$synopsis) = $self->get($name); my $link = ""; $synopsis =~ s//%/g; $synopsis =~ s//\&/g; $data .= (' \n " : '>') . "\n" . " \n" . " \n"); $oddrow = !$oddrow; } $data .= "
$link$name$synopsis
\n"; $data; } package testSynopsisTable; sub test{ # this little test is mostly to debug the stuff above, since this is # my first Perl "object". my $st = SynopsisTable->new(); $st->declare("sample", "sample", "standard"); $st->set_synopsis("sample", "This is a little synopsis...."); $st->declare("copy_reg", "copyreg", "standard"); $st->set_synopsis("copy_reg", "pickle support stuff"); $st->show(); print "\n\n"; my $st2 = SynopsisTable->new(); $st2->declare("st2module", "st2module", "built-in"); $st2->set_synopsis("st2module", "silly little synopsis"); $st2->show(); } 1; # This must be the last line -- Perl is bogus! pydb-1.26/Doc/perl/python.perl0000664000175000017500000017747410366626700013231 00000000000000# python.perl by Fred L. Drake, Jr. -*- perl -*- # # Heavily based on Guido van Rossum's myformat.perl (now obsolete). # # Extension to LaTeX2HTML for documents using myformat.sty. # Subroutines of the form do_cmd_ here define translations # for LaTeX commands \ defined in the corresponding .sty file. package main; use warnings; use File::Basename; sub next_argument{ my $param; $param = missing_braces() unless ((s/$next_pair_pr_rx/$param=$2;''/eo) ||(s/$next_pair_rx/$param=$2;''/eo)); return $param; } sub next_optional_argument{ my($param, $rx) = ('', "^\\s*(\\[([^]]*)\\])?"); s/$rx/$param=$2;''/eo; return $param; } sub make_icon_filename($){ my($myname, $mydir, $myext) = fileparse($_[0], '\..*'); chop $mydir; if ($mydir eq '.') { $mydir = $ICONSERVER; } $myext = ".$IMAGE_TYPE" unless $myext; return "$mydir$dd$myname$myext"; } sub get_link_icon($){ my $url = $_[0]; if ($OFF_SITE_LINK_ICON && ($url =~ /^[-a-zA-Z0-9.]+:/)) { # absolute URL; assume it points off-site my $icon = make_icon_filename($OFF_SITE_LINK_ICON); return (" \"[off-site"); } return ''; } # This is a fairly simple hack; it supports \let when it is used to create # (or redefine) a macro to exactly be some other macro: \let\newname=\oldname. # Many possible uses of \let aren't supported or aren't supported correctly. # sub do_cmd_let{ local($_) = @_; my $matched = 0; s/[\\]([a-zA-Z]+)\s*(=\s*)?[\\]([a-zA-Z]*)/$matched=1; ''/e; if ($matched) { my($new, $old) = ($1, $3); eval "sub do_cmd_$new { do_cmd_$old" . '(@_); }'; print "\ndefining handler for \\$new using \\$old\n"; } else { s/[\\]([a-zA-Z]+)\s*(=\s*)?([^\\])/$matched=1; ''/es; if ($matched) { my($new, $char) = ($1, $3); eval "sub do_cmd_$new { \"\\$char\" . \$_[0]; }"; print "\ndefining handler for \\$new to insert '$char'\n"; } else { write_warnings("Could not interpret \\let construct..."); } } return $_; } # the older version of LaTeX2HTML we use doesn't support this, but we use it: sub do_cmd_textasciitilde{ '~' . $_[0]; } sub do_cmd_textasciicircum{ '^' . $_[0]; } sub do_cmd_textbar{ '|' . $_[0]; } sub do_cmd_texteuro { '€' . $_[0]; } sub do_cmd_textgreater{ '>' . $_[0]; } sub do_cmd_textless{ '<' . $_[0]; } sub do_cmd_textunderscore{ '_' . $_[0]; } sub do_cmd_infinity{ '∞' . $_[0]; } sub do_cmd_plusminus{ '±' . $_[0]; } sub do_cmd_guilabel{ return use_wrappers($_[0]. '', ''); } sub do_cmd_menuselection{ return use_wrappers($_[0], '', ''); } sub do_cmd_sub{ return ' > ' . $_[0]; } # words typeset in a special way (not in HTML though) sub do_cmd_ABC{ 'ABC' . $_[0]; } sub do_cmd_UNIX{ 'Unix' . $_[0]; } sub do_cmd_LaTeX{ 'LaTeX' . $_[0]; } sub do_cmd_TeX{ 'TeX' . $_[0]; } sub do_cmd_ASCII{ 'ASCII' . $_[0]; } sub do_cmd_POSIX{ 'POSIX' . $_[0]; } sub do_cmd_C{ 'C' . $_[0]; } sub do_cmd_Cpp{ 'C++' . $_[0]; } sub do_cmd_EOF{ 'EOF' . $_[0]; } sub do_cmd_NULL{ 'NULL' . $_[0]; } sub do_cmd_e{ '\' . $_[0]; } $DEVELOPER_ADDRESS = ''; $SHORT_VERSION = ''; $RELEASE_INFO = ''; $PACKAGE_VERSION = ''; sub do_cmd_version{ $PACKAGE_VERSION . $_[0]; } sub do_cmd_shortversion{ $SHORT_VERSION . $_[0]; } sub do_cmd_release{ local($_) = @_; $PACKAGE_VERSION = next_argument(); return $_; } sub do_cmd_setreleaseinfo{ local($_) = @_; $RELEASE_INFO = next_argument(); return $_; } sub do_cmd_setshortversion{ local($_) = @_; $SHORT_VERSION = next_argument(); return $_; } sub do_cmd_authoraddress{ local($_) = @_; $DEVELOPER_ADDRESS = next_argument(); return $_; } sub do_cmd_hackscore{ local($_) = @_; next_argument(); return '_' . $_; } # Helper used in many places that arbitrary code-like text appears: sub codetext($){ my $text = "$_[0]"; # Make sure that "---" is not converted to "--" later when # LaTeX2HTML tries converting em-dashes based on the conventional # TeX font ligatures: $text =~ s/--/-\-/go; return $text; } sub use_wrappers($$$){ local($_,$before,$after) = @_; my $stuff = next_argument(); return $before . $stuff . $after . $_; } sub use_code_wrappers($$$){ local($_,$before,$after) = @_; my $stuff = codetext(next_argument()); return $before . $stuff . $after . $_; } $IN_DESC_HANDLER = 0; sub do_cmd_optional{ if ($IN_DESC_HANDLER) { return use_wrappers($_[0], "\[", "\]"); } else { return use_wrappers($_[0], "\[", "\]"); } } # Logical formatting (some based on texinfo), needs to be converted to # minimalist HTML. The "minimalist" is primarily to reduce the size of # output files for users that read them over the network rather than # from local repositories. sub do_cmd_pytype{ return $_[0]; } sub do_cmd_makevar{ return use_wrappers($_[0], '', ''); } sub do_cmd_code{ return use_code_wrappers($_[0], '', ''); } sub do_cmd_module{ return use_wrappers($_[0], '', ''); } sub do_cmd_keyword{ return use_wrappers($_[0], '', ''); } sub do_cmd_exception{ return use_wrappers($_[0], '', ''); } sub do_cmd_class{ return use_wrappers($_[0], '', ''); } sub do_cmd_function{ return use_wrappers($_[0], '', ''); } sub do_cmd_constant{ return use_wrappers($_[0], '', ''); } sub do_cmd_member{ return use_wrappers($_[0], '', ''); } sub do_cmd_method{ return use_wrappers($_[0], '', ''); } sub do_cmd_cfunction{ return use_wrappers($_[0], '', ''); } sub do_cmd_cdata{ return use_wrappers($_[0], '', ''); } sub do_cmd_ctype{ return use_wrappers($_[0], '', ''); } sub do_cmd_regexp{ return use_code_wrappers($_[0], '', ''); } sub do_cmd_character{ return use_code_wrappers($_[0], '"', '"'); } sub do_cmd_program{ return use_wrappers($_[0], '', ''); } sub do_cmd_programopt{ return use_wrappers($_[0], '', ''); } sub do_cmd_longprogramopt{ # note that the --- will be later converted to -- by LaTeX2HTML return use_wrappers($_[0], '---', ''); } sub do_cmd_email{ return use_wrappers($_[0], ''); } sub do_cmd_mailheader{ return use_wrappers($_[0], '', ':'); } sub do_cmd_mimetype{ return use_wrappers($_[0], '', ''); } sub do_cmd_var{ return use_wrappers($_[0], "", ""); } sub do_cmd_dfn{ return use_wrappers($_[0], '', ''); } sub do_cmd_emph{ return use_wrappers($_[0], '', ''); } sub do_cmd_file{ return use_wrappers($_[0], '', ''); } sub do_cmd_filenq{ return do_cmd_file($_[0]); } sub do_cmd_samp{ return use_code_wrappers($_[0], '"', '"'); } sub do_cmd_kbd{ return use_wrappers($_[0], '', ''); } sub do_cmd_strong{ return use_wrappers($_[0], '', ''); } sub do_cmd_textbf{ return use_wrappers($_[0], '', ''); } sub do_cmd_textit{ return use_wrappers($_[0], '', ''); } # This can be changed/overridden for translations: %NoticeNames = ('note' => 'Note:', 'warning' => 'Warning:', ); sub do_cmd_note{ my $label = $NoticeNames{'note'}; return use_wrappers( $_[0], "$label\n", ''); } sub do_cmd_warning{ my $label = $NoticeNames{'warning'}; return use_wrappers( $_[0], "$label\n", ''); } sub do_env_notice{ local($_) = @_; my $notice = next_optional_argument(); if (!$notice) { $notice = 'note'; } my $label = $NoticeNames{$notice}; return ("

'); } sub do_cmd_moreargs{ return '...' . $_[0]; } sub do_cmd_unspecified{ return '...' . $_[0]; } sub do_cmd_refmodule{ # Insert the right magic to jump to the module definition. local($_) = @_; my $key = next_optional_argument(); my $module = next_argument(); $key = $module unless $key; return "$module" . $_; } sub do_cmd_newsgroup{ local($_) = @_; my $newsgroup = next_argument(); my $icon = get_link_icon("news:$newsgroup"); my $stuff = ("" . "$newsgroup$icon"); return $stuff . $_; } sub do_cmd_envvar{ local($_) = @_; my $envvar = next_argument(); my($name, $aname, $ahref) = new_link_info(); # The here is really to keep buildindex.py from making # the variable name case-insensitive. add_index_entry("environment variables!$envvar@$envvar", $ahref); add_index_entry("$envvar (environment variable)", $ahref); $aname =~ s/" . $_; } sub do_cmd_url{ # use the URL as both text and hyperlink local($_) = @_; my $url = next_argument(); my $icon = get_link_icon($url); $url =~ s/~/~/g; return "$url$icon" . $_; } sub do_cmd_manpage{ # two parameters: \manpage{name}{section} local($_) = @_; my $page = next_argument(); my $section = next_argument(); return "$page($section)" . $_; } $PEP_FORMAT = "http://www.python.org/peps/pep-%04d.html"; #$RFC_FORMAT = "http://www.ietf.org/rfc/rfc%04d.txt"; $RFC_FORMAT = "http://www.faqs.org/rfcs/rfc%d.html"; sub get_rfc_url($$){ my($rfcnum, $format) = @_; return sprintf($format, $rfcnum); } sub do_cmd_pep{ local($_) = @_; my $rfcnumber = next_argument(); my $id = "rfcref-" . ++$global{'max_id'}; my $href = get_rfc_url($rfcnumber, $PEP_FORMAT); my $icon = get_link_icon($href); # Save the reference my $nstr = gen_index_id("Python Enhancement Proposals!PEP $rfcnumber", ''); $index{$nstr} .= make_half_href("$CURRENT_FILE#$id"); return ("PEP $rfcnumber$icon" . $_); } sub do_cmd_rfc{ local($_) = @_; my $rfcnumber = next_argument(); my $id = "rfcref-" . ++$global{'max_id'}; my $href = get_rfc_url($rfcnumber, $RFC_FORMAT); my $icon = get_link_icon($href); # Save the reference my $nstr = gen_index_id("RFC!RFC $rfcnumber", ''); $index{$nstr} .= make_half_href("$CURRENT_FILE#$id"); return ("" . "RFC $rfcnumber$icon" . $_); } sub do_cmd_ulink{ local($_) = @_; my $text = next_argument(); my $url = next_argument(); return "$text" . $_; } sub do_cmd_citetitle{ local($_) = @_; my $url = next_optional_argument(); my $title = next_argument(); my $icon = get_link_icon($url); my $repl = ''; if ($url) { my $titletext = strip_html_markup("$title"); $repl = ("$title$icon"); } else { $repl = "$title"; } return $repl . $_; } sub do_cmd_deprecated{ # two parameters: \deprecated{version}{whattodo} local($_) = @_; my $release = next_argument(); my $reason = next_argument(); return ('
' . "Deprecated since release $release." . "\n$reason

" . $_); } sub versionnote($$){ # one or two parameters: \versionnote[explanation]{version} my $type = $_[0]; local $_ = $_[1]; my $explanation = next_optional_argument(); my $release = next_argument(); my $text = "$type in version $release."; if ($explanation) { $text = "$type in version $release:\n$explanation."; } return "\n$text\n" . $_; } sub do_cmd_versionadded{ return versionnote('New', $_[0]); } sub do_cmd_versionchanged{ return versionnote('Changed', $_[0]); } # # These function handle platform dependency tracking. # sub do_cmd_platform{ local($_) = @_; my $platform = next_argument(); $ModulePlatforms{"$THIS_MODULE"} = $platform; $platform = "Macintosh" if $platform eq 'Mac'; return "\n

Availability: $platform.

\n" . $_; } $IGNORE_PLATFORM_ANNOTATION = ''; sub do_cmd_ignorePlatformAnnotation{ local($_) = @_; $IGNORE_PLATFORM_ANNOTATION = next_argument(); return $_; } # index commands $INDEX_SUBITEM = ""; sub get_indexsubitem(){ return $INDEX_SUBITEM ? " $INDEX_SUBITEM" : ''; } sub do_cmd_setindexsubitem{ local($_) = @_; $INDEX_SUBITEM = next_argument(); return $_; } sub do_cmd_withsubitem{ # We can't really do the right thing, because LaTeX2HTML doesn't # do things in the right order, but we need to at least strip this stuff # out, and leave anything that the second argument expanded out to. # local($_) = @_; my $oldsubitem = $INDEX_SUBITEM; $INDEX_SUBITEM = next_argument(); my $stuff = next_argument(); my $br_id = ++$globals{'max_id'}; my $marker = "$O$br_id$C"; $stuff =~ s/^\s+//; return $stuff . "\\setindexsubitem$marker$oldsubitem$marker" . $_; } # This is the prologue macro which is required to start writing the # mod\jobname.idx file; we can just ignore it. (Defining this suppresses # a warning that \makemodindex is unknown.) # sub do_cmd_makemodindex{ return $_[0]; } # We're in the document subdirectory when this happens! # open(IDXFILE, '>index.dat') || die "\n$!\n"; open(INTLABELS, '>intlabels.pl') || die "\n$!\n"; print INTLABELS "%internal_labels = ();\n"; print INTLABELS "1; # hack in case there are no entries\n\n"; # Using \0 for this is bad because we can't use common tools to work with the # resulting files. Things like grep can be useful with this stuff! # $IDXFILE_FIELD_SEP = "\1"; sub write_idxfile($$){ my($ahref, $str) = @_; print IDXFILE $ahref, $IDXFILE_FIELD_SEP, $str, "\n"; } sub gen_link($$){ my($node, $target) = @_; print INTLABELS "\$internal_labels{\"$target\"} = \"/$node\";\n"; return ""; } sub add_index_entry($$){ # add an entry to the index structures; ignore the return value my($str, $ahref) = @_; $str = gen_index_id($str, ''); $index{$str} .= $ahref; write_idxfile($ahref, $str); } sub new_link_name_info(){ my $name = "l2h-" . ++$globals{'max_id'}; my $aname = ""; my $ahref = gen_link($CURRENT_FILE, $name); return ($name, $ahref); } sub new_link_info(){ my($name, $ahref) = new_link_name_info(); my $aname = ""; return ($name, $aname, $ahref); } $IndexMacroPattern = ''; sub define_indexing_macro(@){ my $count = @_; my $i = 0; for (; $i < $count; ++$i) { my $name = $_[$i]; my $cmd = "idx_cmd_$name"; die "\nNo function $cmd() defined!\n" if (!defined &$cmd); eval ("sub do_cmd_$name { return process_index_macros(" . "\$_[0], '$name'); }"); if (length($IndexMacroPattern) == 0) { $IndexMacroPattern = "$name"; } else { $IndexMacroPattern .= "|$name"; } } } $DEBUG_INDEXING = 0; sub process_index_macros($$){ local($_) = @_; my $cmdname = $_[1]; # This is what triggered us in the first place; # we know it's real, so just process it. my($name, $aname, $ahref) = new_link_info(); my $cmd = "idx_cmd_$cmdname"; print "\nIndexing: \\$cmdname" if $DEBUG_INDEXING; &$cmd($ahref); # modifies $_ and adds index entries while (/^[\s\n]*\\($IndexMacroPattern)" . $_; } define_indexing_macro('index'); sub idx_cmd_index($){ my $str = next_argument(); add_index_entry("$str", $_[0]); } define_indexing_macro('kwindex'); sub idx_cmd_kwindex($){ my $str = next_argument(); add_index_entry("$str!keyword", $_[0]); add_index_entry("keyword!$str", $_[0]); } define_indexing_macro('indexii'); sub idx_cmd_indexii($){ my $str1 = next_argument(); my $str2 = next_argument(); add_index_entry("$str1!$str2", $_[0]); add_index_entry("$str2!$str1", $_[0]); } define_indexing_macro('indexiii'); sub idx_cmd_indexiii($){ my $str1 = next_argument(); my $str2 = next_argument(); my $str3 = next_argument(); add_index_entry("$str1!$str2 $str3", $_[0]); add_index_entry("$str2!$str3, $str1", $_[0]); add_index_entry("$str3!$str1 $str2", $_[0]); } define_indexing_macro('indexiv'); sub idx_cmd_indexiv($){ my $str1 = next_argument(); my $str2 = next_argument(); my $str3 = next_argument(); my $str4 = next_argument(); add_index_entry("$str1!$str2 $str3 $str4", $_[0]); add_index_entry("$str2!$str3 $str4, $str1", $_[0]); add_index_entry("$str3!$str4, $str1 $str2", $_[0]); add_index_entry("$str4!$str1 $str2 $str3", $_[0]); } define_indexing_macro('ttindex'); sub idx_cmd_ttindex($){ my $str = codetext(next_argument()); my $entry = $str . get_indexsubitem(); add_index_entry($entry, $_[0]); } sub my_typed_index_helper($$){ my($word, $ahref) = @_; my $str = next_argument(); add_index_entry("$str $word", $ahref); add_index_entry("$word!$str", $ahref); } define_indexing_macro('stindex', 'opindex', 'exindex', 'obindex'); sub idx_cmd_stindex($){ my_typed_index_helper('statement', $_[0]); } sub idx_cmd_opindex($){ my_typed_index_helper('operator', $_[0]); } sub idx_cmd_exindex($){ my_typed_index_helper('exception', $_[0]); } sub idx_cmd_obindex($){ my_typed_index_helper('object', $_[0]); } define_indexing_macro('bifuncindex'); sub idx_cmd_bifuncindex($){ my $str = next_argument(); add_index_entry("$str() (built-in function)", $_[0]); } sub make_mod_index_entry($$){ my($str, $define) = @_; my($name, $aname, $ahref) = new_link_info(); # equivalent of add_index_entry() using $define instead of '' $ahref =~ s/\#[-_a-zA-Z0-9]*\"/\"/ if ($define eq 'DEF'); $str = gen_index_id($str, $define); $index{$str} .= $ahref; write_idxfile($ahref, $str); if ($define eq 'DEF') { # add to the module index $str =~ /()/; my $nstr = $1; $Modules{$nstr} .= $ahref; } return "$aname$anchor_invisible_mark2"; } $THIS_MODULE = ''; $THIS_CLASS = ''; sub define_module($$){ my($word, $name) = @_; my $section_tag = join('', @curr_sec_id); if ($word ne "built-in" && $word ne "extension" && $word ne "standard" && $word ne "") { write_warnings("Bad module type '$word'" . " for \\declaremodule (module $name)"); $word = ""; } $word = "$word " if $word; $THIS_MODULE = "$name"; $INDEX_SUBITEM = "(in module $name)"; print "[$name]"; return make_mod_index_entry( "$name (${word}module)", 'DEF'); } sub my_module_index_helper($$){ local($word, $_) = @_; my $name = next_argument(); return define_module($word, $name) . $_; } sub do_cmd_modindex{ return my_module_index_helper('', $_[0]); } sub do_cmd_bimodindex{ return my_module_index_helper('built-in', $_[0]); } sub do_cmd_exmodindex{ return my_module_index_helper('extension', $_[0]); } sub do_cmd_stmodindex{ return my_module_index_helper('standard', $_[0]); } # local($_) = @_; # my $name = next_argument(); # return define_module('standard', $name) . $_; # } sub ref_module_index_helper($$){ my($word, $ahref) = @_; my $str = next_argument(); $word = "$word " if $word; $str = "$str (${word}module)"; # can't use add_index_entry() since the 2nd arg to gen_index_id() is used; # just inline it all here $str = gen_index_id($str, 'REF'); $index{$str} .= $ahref; write_idxfile($ahref, $str); } # these should be adjusted a bit.... define_indexing_macro('refmodindex', 'refbimodindex', 'refexmodindex', 'refstmodindex'); sub idx_cmd_refmodindex($){ return ref_module_index_helper('', $_[0]); } sub idx_cmd_refbimodindex($){ return ref_module_index_helper('built-in', $_[0]); } sub idx_cmd_refexmodindex($){ return ref_module_index_helper('extension', $_[0]);} sub idx_cmd_refstmodindex($){ return ref_module_index_helper('standard', $_[0]); } sub do_cmd_nodename{ return do_cmd_label($_[0]); } sub init_myformat(){ # This depends on the override of text_cleanup() in l2hinit.perl; # if that function cleans out empty tags, the first three of these # variables must be set to comments. # # Thanks to Dave Kuhlman for figuring why some named anchors were # being lost. $anchor_invisible_mark = ''; $anchor_invisible_mark2 = ''; $anchor_mark = ''; $icons{'anchor_mark'} = ''; } init_myformat(); # Create an index entry, but include the string in the target anchor # instead of the dummy filler. # sub make_str_index_entry($){ my $str = $_[0]; my($name, $ahref) = new_link_name_info(); add_index_entry($str, $ahref); if ($str =~ /^<[a-z]+\b/) { my $s = "$str"; $s =~ s/^<([a-z]+)\b/<$1 id='$name' xml:id='$name'/; return $s; } else { return "$str"; } } %TokenToTargetMapping = (); # language:token -> link target %DefinedGrammars = (); # language -> full grammar text %BackpatchGrammarFiles = (); # file -> 1 (hash of files to fixup) sub do_cmd_token{ local($_) = @_; my $token = next_argument(); my $target = $TokenToTargetMapping{"$CURRENT_GRAMMAR:$token"}; if ($token eq $CURRENT_TOKEN || $CURRENT_GRAMMAR eq '*') { # recursive definition or display-only productionlist return "$token"; } if ($target eq '') { $target = "<$CURRENT_GRAMMAR><$token>"; if (! $BackpatchGrammarFiles{"$CURRENT_FILE"}) { print "Adding '$CURRENT_FILE' to back-patch list.\n"; } $BackpatchGrammarFiles{"$CURRENT_FILE"} = 1; } return "$token" . $_; } sub do_cmd_grammartoken{ return do_cmd_token(@_); } sub do_env_productionlist{ local($_) = @_; my $lang = next_optional_argument(); my $filename = "grammar-$lang.txt"; if ($lang eq '') { $filename = 'grammar.txt'; } local($CURRENT_GRAMMAR) = $lang; $DefinedGrammars{$lang} .= $_; return ("
\n" . "
\n" . "\n" . translate_commands(translate_environments($_)) . "
\n" . "
\n" . (($lang eq '*') ? '' : ("Download entire grammar as text.\n")) . "
"); } sub do_cmd_production{ local($_) = @_; my $token = next_argument(); my $defn = next_argument(); my $lang = $CURRENT_GRAMMAR; local($CURRENT_TOKEN) = $token; if ($lang eq '*') { return ("\n" . " $token\n" . " ::=\n" . " " . translate_commands($defn) . "" . $_); } my $target; if ($lang eq '') { $target = "$CURRENT_FILE\#tok-$token"; } else { $target = "$CURRENT_FILE\#tok-$lang-$token"; } $TokenToTargetMapping{"$CURRENT_GRAMMAR:$token"} = $target; return ("\n" . " " . "$token\n" . " ::=\n" . " " . translate_commands($defn) . "" . $_); } sub do_cmd_productioncont{ local($_) = @_; my $defn = next_argument(); $defn =~ s/^( +)/' ' x length $1/e; return ("\n" . " \n" . " \n" . " " . translate_commands($defn) . "" . $_); } sub process_grammar_files(){ my $lang; my $filename; local($_); print "process_grammar_files()\n"; foreach $lang (keys %DefinedGrammars) { $filename = "grammar-$lang.txt"; if ($lang eq '*') { next; } if ($lang eq '') { $filename = 'grammar.txt'; } open(GRAMMAR, ">$filename") || die "\n$!\n"; print GRAMMAR strip_grammar_markup($DefinedGrammars{$lang}); close(GRAMMAR); print "Wrote grammar file $filename\n"; } my $PATTERN = '<([^>]*)><([^>]*)>'; foreach $filename (keys %BackpatchGrammarFiles) { print "\nBack-patching grammar links in $filename\n"; my $buffer; open(GRAMMAR, "<$filename") || die "\n$!\n"; # read all of the file into the buffer sysread(GRAMMAR, $buffer, 1024*1024); close(GRAMMAR); while ($buffer =~ /$PATTERN/) { my($lang, $token) = ($1, $2); my $target = $TokenToTargetMapping{"$lang:$token"}; my $source = "<$lang><$token>"; $buffer =~ s/$source/$target/g; } open(GRAMMAR, ">$filename") || die "\n$!\n"; print GRAMMAR $buffer; close(GRAMMAR); } } sub strip_grammar_markup($){ local($_) = @_; s/\\productioncont/ /g; s/\\production(<<\d+>>)(.+)\1/\n$2 ::= /g; s/\\token(<<\d+>>)(.+)\1/$2/g; s/\\e([^a-zA-Z])/\\$1/g; s/<<\d+>>//g; s/;SPMgt;/>/g; s/;SPMlt;/) { if (/([a-zA-Z0-9_]+):PyObject\*:([a-zA-Z0-9_]*):(0|[-+]1|null):(.*)$/) { my($func, $param, $count, $comment) = ($1, $2, $3, $4); #print "\n$func($param) --> $count"; $REFCOUNTS{"$func:$param"} = $count; } } } sub get_refcount($$){ my($func, $param) = @_; load_refcounts() unless $REFCOUNTS_LOADED; return $REFCOUNTS{"$func:$param"}; } $TLSTART = ''; $TLEND = ' '; sub cfuncline_helper($$$){ my($type, $name, $args) = @_; my $idx = make_str_index_entry( "$name()" . get_indexsubitem()); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)//; # ???? - why both of these? $args =~ s/(\s|\*)([a-z_][a-z_0-9]*),/$1$2<\/var>,/g; $args =~ s/(\s|\*)([a-z_][a-z_0-9]*)$/$1$2<\/var>/s; return ('' . "" . "" . '
$type\ $idx($args)
'); } sub do_cmd_cfuncline{ local($_) = @_; my $type = next_argument(); my $name = next_argument(); my $args = next_argument(); my $siginfo = cfuncline_helper($type, $name, $args); return "
$siginfo\n
" . $_; } sub do_env_cfuncdesc{ local($_) = @_; my $type = next_argument(); my $name = next_argument(); my $args = next_argument(); my $siginfo = cfuncline_helper($type, $name, $args); my $result_rc = get_refcount($name, ''); my $rcinfo = ''; if ($result_rc eq '+1') { $rcinfo = 'New reference'; } elsif ($result_rc eq '0') { $rcinfo = 'Borrowed reference'; } elsif ($result_rc eq 'null') { $rcinfo = 'Always NULL'; } if ($rcinfo ne '') { $rcinfo = ( "\n
" . "\n Return value:" . "\n $rcinfo." . "\n
"); } return "
$siginfo
\n
" . $rcinfo . $_ . '
'; } sub do_cmd_cmemberline{ local($_) = @_; my $container = next_argument(); my $type = next_argument(); my $name = next_argument(); my $idx = make_str_index_entry("$name" . " ($container member)"); $idx =~ s/ \(.*\)//; return "
$type $idx
\n
" . $_; } sub do_env_cmemberdesc{ local($_) = @_; my $container = next_argument(); my $type = next_argument(); my $name = next_argument(); my $idx = make_str_index_entry("$name" . " ($container member)"); $idx =~ s/ \(.*\)//; return "
$type $idx
\n
" . $_ . '
'; } sub do_env_csimplemacrodesc{ local($_) = @_; my $name = next_argument(); my $idx = make_str_index_entry("$name"); return "
$idx
\n
" . $_ . '
' } sub do_env_ctypedesc{ local($_) = @_; my $index_name = next_optional_argument(); my $type_name = next_argument(); $index_name = $type_name unless $index_name; my($name, $aname, $ahref) = new_link_info(); add_index_entry("$index_name (C type)", $ahref); return "
$aname$type_name
" . "\n
" . $_ . '
' } sub do_env_cvardesc{ local($_) = @_; my $var_type = next_argument(); my $var_name = next_argument(); my $idx = make_str_index_entry("$var_name" . get_indexsubitem()); $idx =~ s/ \(.*\)//; return "
$var_type $idx
\n" . '
' . $_ . '
'; } sub convert_args($){ local($IN_DESC_HANDLER) = 1; local($_) = @_; return translate_commands($_); } sub funcline_helper($$$){ my($first, $idxitem, $arglist) = @_; return (($first ? '
' : '') . '
' . "\n " . "\n
$idxitem($arglist)
\n
"); } sub do_env_funcdesc{ local($_) = @_; my $function_name = next_argument(); my $arg_list = convert_args(next_argument()); my $idx = make_str_index_entry("$function_name()" . '' . get_indexsubitem()); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)<\/tt>/<\/tt>/; return funcline_helper(1, $idx, $arg_list) . $_ . '
'; } sub do_env_funcdescni{ local($_) = @_; my $function_name = next_argument(); my $arg_list = convert_args(next_argument()); my $prefix = "$function_name"; return funcline_helper(1, $prefix, $arg_list) . $_ . '
'; } sub do_cmd_funcline{ local($_) = @_; my $function_name = next_argument(); my $arg_list = convert_args(next_argument()); my $prefix = "$function_name()"; my $idx = make_str_index_entry($prefix . get_indexsubitem()); $prefix =~ s/\(\)//; return funcline_helper(0, $prefix, $arg_list) . $_; } sub do_cmd_funclineni{ local($_) = @_; my $function_name = next_argument(); my $arg_list = convert_args(next_argument()); my $prefix = "$function_name"; return funcline_helper(0, $prefix, $arg_list) . $_; } # Change this flag to index the opcode entries. I don't think it's very # useful to index them, since they're only presented to describe the dis # module. # $INDEX_OPCODES = 0; sub do_env_opcodedesc{ local($_) = @_; my $opcode_name = next_argument(); my $arg_list = next_argument(); my $idx; if ($INDEX_OPCODES) { $idx = make_str_index_entry("$opcode_name" . ' (byte code instruction)'); $idx =~ s/ \(byte code instruction\)//; } else { $idx = "$opcode_name"; } my $stuff = "
$idx"; if ($arg_list) { $stuff .= "    $arg_list"; } return $stuff . "
\n
" . $_ . '
'; } sub do_env_datadesc{ local($_) = @_; my $dataname = next_argument(); my $idx = make_str_index_entry("$dataname" . get_indexsubitem()); $idx =~ s/ \(.*\)//; return "
$idx
\n
" . $_ . '
'; } sub do_env_datadescni{ local($_) = @_; my $idx = next_argument(); if (! $STRING_INDEX_TT) { $idx = "$idx"; } return "
$idx
\n
" . $_ . '
'; } sub do_cmd_dataline{ local($_) = @_; my $data_name = next_argument(); my $idx = make_str_index_entry("$data_name" . get_indexsubitem()); $idx =~ s/ \(.*\)//; return "
$idx
" . $_; } sub do_cmd_datalineni{ local($_) = @_; my $data_name = next_argument(); return "
$data_name
" . $_; } sub do_env_excdesc{ local($_) = @_; my $excname = next_argument(); my $idx = make_str_index_entry("$excname"); return ("
${TLSTART}exception$TLEND$idx
" . "\n
" . $_ . '
'); } sub do_env_fulllineitems{ return do_env_itemize(@_); } sub handle_classlike_descriptor($$){ local($_, $what) = @_; $THIS_CLASS = next_argument(); my $arg_list = convert_args(next_argument()); $idx = make_str_index_entry( "$THIS_CLASS ($what in $THIS_MODULE)" ); $idx =~ s/ \(.*\)//; my $prefix = "$TLSTART$what$TLEND$idx"; return funcline_helper(1, $prefix, $arg_list) . $_ . ''; } sub do_env_classdesc{ return handle_classlike_descriptor($_[0], "class"); } sub do_env_classdescstar{ local($_) = @_; $THIS_CLASS = next_argument(); $idx = make_str_index_entry( "$THIS_CLASS (class in $THIS_MODULE)"); $idx =~ s/ \(.*\)//; my $prefix = "${TLSTART}class$TLEND$idx"; # Can't use funcline_helper() since there is no args list. return "
$prefix\n
" . $_ . '
'; } sub do_env_excclassdesc{ return handle_classlike_descriptor($_[0], "exception"); } sub do_env_methoddesc{ local($_) = @_; my $class_name = next_optional_argument(); $class_name = $THIS_CLASS unless $class_name; my $method = next_argument(); my $arg_list = convert_args(next_argument()); my $extra = ''; if ($class_name) { $extra = " ($class_name method)"; } my $idx = make_str_index_entry( "$method()$extra"); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)//; return funcline_helper(1, $idx, $arg_list) . $_ . ''; } sub do_cmd_methodline{ local($_) = @_; my $class_name = next_optional_argument(); $class_name = $THIS_CLASS unless $class_name; my $method = next_argument(); my $arg_list = convert_args(next_argument()); my $extra = ''; if ($class_name) { $extra = " ($class_name method)"; } my $idx = make_str_index_entry( "$method()$extra"); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)//; return funcline_helper(0, $idx, $arg_list) . $_; } sub do_cmd_methodlineni{ local($_) = @_; next_optional_argument(); my $method = next_argument(); my $arg_list = convert_args(next_argument()); return funcline_helper(0, $method, $arg_list) . $_; } sub do_env_methoddescni{ local($_) = @_; next_optional_argument(); my $method = next_argument(); my $arg_list = convert_args(next_argument()); return funcline_helper(1, $method, $arg_list) . $_ . ''; } sub do_env_memberdesc{ local($_) = @_; my $class = next_optional_argument(); my $member = next_argument(); $class = $THIS_CLASS unless $class; my $extra = ''; $extra = " ($class attribute)" if ($class ne ''); my $idx = make_str_index_entry("$member$extra"); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)//; return "
$idx
\n
" . $_ . '
'; } sub do_cmd_memberline{ local($_) = @_; my $class = next_optional_argument(); my $member = next_argument(); $class = $THIS_CLASS unless $class; my $extra = ''; $extra = " ($class attribute)" if ($class ne ''); my $idx = make_str_index_entry("$member$extra"); $idx =~ s/ \(.*\)//; $idx =~ s/\(\)//; return "
$idx
" . $_; } sub do_env_memberdescni{ local($_) = @_; next_optional_argument(); my $member = next_argument(); return "
$member
\n
" . $_ . '
'; } sub do_cmd_memberlineni{ local($_) = @_; next_optional_argument(); my $member = next_argument(); return "
$member
\n
" . $_; } # For tables, we include a class on every cell to allow the CSS to set # the text-align property; this is because support for styling columns # via the element appears nearly non-existant on even the latest # browsers (Mozilla 1.7 is stable at the time of this writing). # Hopefully this can be improved as browsers evolve. @col_aligns = ('', '', '', '', ''); %FontConversions = ('cdata' => 'tt class="cdata"', 'character' => 'tt class="character"', 'class' => 'tt class="class"', 'command' => 'code', 'constant' => 'tt class="constant"', 'exception' => 'tt class="exception"', 'file' => 'tt class="file"', 'filenq' => 'tt class="file"', 'kbd' => 'kbd', 'member' => 'tt class="member"', 'programopt' => 'b', 'textrm' => '', ); sub fix_font($){ # do a little magic on a font name to get the right behavior in the first # column of the output table my $font = $_[0]; if (defined $FontConversions{$font}) { $font = $FontConversions{$font}; } return $font; } sub figure_column_alignment($){ my $a = $_[0]; if (!defined $a) { return ''; } my $mark = substr($a, 0, 1); my $r = ''; if ($mark eq 'c') { $r = ' class="center"'; } elsif ($mark eq 'r') { $r = ' class="right" '; } elsif ($mark eq 'l') { $r = ' class="left" '; } elsif ($mark eq 'p') { $r = ' class="left" '; } return $r; } sub setup_column_alignments($){ local($_) = @_; my($s1, $s2, $s3, $s4, $s5) = split(/[|]/,$_); my $a1 = figure_column_alignment($s1); my $a2 = figure_column_alignment($s2); my $a3 = figure_column_alignment($s3); my $a4 = figure_column_alignment($s4); my $a5 = figure_column_alignment($s5); $col_aligns[0] = ""; $col_aligns[1] = ""; $col_aligns[2] = ""; $col_aligns[3] = ""; $col_aligns[4] = ""; # return the aligned header start tags return ("", "", "", "", ""); } sub get_table_col1_fonts(){ my $font = $globals{'lineifont'}; my($sfont, $efont) = ('', ''); if ($font) { $sfont = "<$font>"; $efont = ""; $efont =~ s/ .*>/>/; } return ($sfont, $efont); } sub do_env_tableii{ local($_) = @_; my $arg = next_argument(); my($th1, $th2, $th3, $th4, $th5) = setup_column_alignments($arg); my $font = fix_font(next_argument()); my $h1 = next_argument(); my $h2 = next_argument(); s/[\s\n]+//; $globals{'lineifont'} = $font; my $a1 = $col_aligns[0]; my $a2 = $col_aligns[1]; s/\\lineii' . "\n " . "\n " . "\n $th1$h1" . "\n $th2$h2" . "\n " . "\n " . "\n " . $_ . "\n " . "\n
"; } sub do_env_longtableii{ return do_env_tableii(@_); } sub do_cmd_lineii{ local($_) = @_; my $aligns = next_optional_argument(); my $c1 = next_argument(); my $c2 = next_argument(); s/[\s\n]+//; my($sfont, $efont) = get_table_col1_fonts(); my($c1align, $c2align) = split('\|', $aligns); return "\n $c1align$sfont$c1$efont\n" . " $c2align$c2" . $_; } sub do_env_tableiii{ local($_) = @_; my $arg = next_argument(); my($th1, $th2, $th3, $th4, $th5) = setup_column_alignments($arg); my $font = fix_font(next_argument()); my $h1 = next_argument(); my $h2 = next_argument(); my $h3 = next_argument(); s/[\s\n]+//; $globals{'lineifont'} = $font; my $a1 = $col_aligns[0]; my $a2 = $col_aligns[1]; my $a3 = $col_aligns[2]; s/\\lineiii' . "\n " . "\n " . "\n $th1$h1" . "\n $th2$h2" . "\n $th3$h3" . "\n " . "\n " . "\n " . $_ . "\n " . "\n
"; } sub do_env_longtableiii{ return do_env_tableiii(@_); } sub do_cmd_lineiii{ local($_) = @_; my $aligns = next_optional_argument(); my $c1 = next_argument(); my $c2 = next_argument(); my $c3 = next_argument(); s/[\s\n]+//; my($sfont, $efont) = get_table_col1_fonts(); my($c1align, $c2align, $c3align) = split('\|', $aligns); return "\n $c1align$sfont$c1$efont\n" . " $c2align$c2\n" . " $c3align$c3" . $_; } sub do_env_tableiv{ local($_) = @_; my $arg = next_argument(); my($th1, $th2, $th3, $th4, $th5) = setup_column_alignments($arg); my $font = fix_font(next_argument()); my $h1 = next_argument(); my $h2 = next_argument(); my $h3 = next_argument(); my $h4 = next_argument(); s/[\s\n]+//; $globals{'lineifont'} = $font; my $a1 = $col_aligns[0]; my $a2 = $col_aligns[1]; my $a3 = $col_aligns[2]; my $a4 = $col_aligns[3]; s/\\lineiv' . "\n " . "\n " . "\n $th1$h1" . "\n $th2$h2" . "\n $th3$h3" . "\n $th4$h4" . "\n " . "\n " . "\n " . $_ . "\n " . "\n
"; } sub do_env_longtableiv{ return do_env_tableiv(@_); } sub do_cmd_lineiv{ local($_) = @_; my $aligns = next_optional_argument(); my $c1 = next_argument(); my $c2 = next_argument(); my $c3 = next_argument(); my $c4 = next_argument(); s/[\s\n]+//; my($sfont, $efont) = get_table_col1_fonts(); my($c1align, $c2align, $c3align, $c4align) = split('\|', $aligns); return "\n $c1align$sfont$c1$efont\n" . " $c2align$c2\n" . " $c3align$c3\n" . " $c4align$c4" . $_; } sub do_env_tablev{ local($_) = @_; my $arg = next_argument(); my($th1, $th2, $th3, $th4, $th5) = setup_column_alignments($arg); my $font = fix_font(next_argument()); my $h1 = next_argument(); my $h2 = next_argument(); my $h3 = next_argument(); my $h4 = next_argument(); my $h5 = next_argument(); s/[\s\n]+//; $globals{'lineifont'} = $font; my $a1 = $col_aligns[0]; my $a2 = $col_aligns[1]; my $a3 = $col_aligns[2]; my $a4 = $col_aligns[3]; my $a5 = $col_aligns[4]; s/\\linev' . "\n " . "\n " . "\n $th1$h1" . "\n $th2$h2" . "\n $th3$h3" . "\n $th4$h4" . "\n $th5$h5" . "\n " . "\n " . "\n " . $_ . "\n " . "\n
"; } sub do_env_longtablev{ return do_env_tablev(@_); } sub do_cmd_linev{ local($_) = @_; my $aligns = next_optional_argument(); my $c1 = next_argument(); my $c2 = next_argument(); my $c3 = next_argument(); my $c4 = next_argument(); my $c5 = next_argument(); s/[\s\n]+//; my($sfont, $efont) = get_table_col1_fonts(); my($c1align, $c2align, $c3align, $c4align, $c5align) = split('\|',$aligns); return "\n $c1align$sfont$c1$efont\n" . " $c2align$c2\n" . " $c3align$c3\n" . " $c4align$c4\n" . " $c5align$c5" . $_; } # These can be used to control the title page appearance; # they need a little bit of documentation. # # If $TITLE_PAGE_GRAPHIC is set, it should be the name of a file in the # $ICONSERVER directory, or include path information (other than "./"). The # default image type will be assumed if an extension is not provided. # # If specified, the "title page" will contain two colums: one containing the # title/author/etc., and the other containing the graphic. Use the other # four variables listed here to control specific details of the layout; all # are optional. # # $TITLE_PAGE_GRAPHIC = "my-company-logo"; # $TITLE_PAGE_GRAPHIC_COLWIDTH = "30%"; # $TITLE_PAGE_GRAPHIC_WIDTH = 150; # $TITLE_PAGE_GRAPHIC_HEIGHT = 150; # $TITLE_PAGE_GRAPHIC_ON_RIGHT = 0; sub make_my_titlepage(){ my $the_title = ""; if ($t_title) { $the_title .= "\n

$t_title

"; } else { write_warnings("\nThis document has no title."); } if ($t_author) { if ($t_authorURL) { my $href = translate_commands($t_authorURL); $href = make_named_href('author', $href, "$t_author" . ''); $the_title .= "\n

$href

"; } else { $the_title .= ("\n

$t_author" . '

'); } } else { write_warnings("\nThere is no author for this document."); } if ($t_institute) { $the_title .= "\n

$t_institute

"; } if ($DEVELOPER_ADDRESS) { $the_title .= "\n

$DEVELOPER_ADDRESS

"; } if ($t_affil) { $the_title .= "\n

$t_affil

"; } if ($t_date) { $the_title .= "\n

"; if ($PACKAGE_VERSION) { $the_title .= ('Release ' . "$PACKAGE_VERSION$RELEASE_INFO
\n"); } $the_title .= "$t_date

" } if ($t_address) { $the_title .= "\n

$t_address

"; } else { $the_title .= "\n

"; } if ($t_email) { $the_title .= "\n

$t_email

"; } return $the_title; } sub make_my_titlegraphic(){ my $filename = make_icon_filename($TITLE_PAGE_GRAPHIC); my $graphic = "\n"; return $graphic; } sub do_cmd_maketitle{ local($_) = @_; my $the_title = "\n"; if ($EXTERNAL_UP_LINK) { # This generates a element in the wrong place (the # body), but I don't see any other way to get this generated # at all. Browsers like Mozilla, that support navigation # links, can make use of this. $the_title .= ("\n"); } $the_title .= '
'; if ($TITLE_PAGE_GRAPHIC) { if ($TITLE_PAGE_GRAPHIC_ON_RIGHT) { $the_title .= ("\n" . "\n\n" . make_my_titlegraphic() . "\n
" . make_my_titlepage() . "
"); } else { $the_title .= ("\n\n" . make_my_titlegraphic() . "\n
" . make_my_titlepage() . "
"); } } else { $the_title .= ("\n
" . make_my_titlepage() . "\n
"); } $the_title .= "\n
"; return $the_title . $_; } # # Module synopsis support # require SynopsisTable; sub get_chapter_id(){ my $id = do_cmd_thechapter(''); $id =~ s/(\d+)<\/SPAN>/$1/; $id =~ s/\.//; return $id; } # 'chapter' => 'SynopsisTable instance' %ModuleSynopses = (); sub get_synopsis_table($){ my $chap = $_[0]; my $key; foreach $key (keys %ModuleSynopses) { if ($key eq $chap) { return $ModuleSynopses{$chap}; } } my $st = SynopsisTable->new(); $ModuleSynopses{$chap} = $st; return $st; } sub do_cmd_moduleauthor{ local($_) = @_; next_argument(); next_argument(); return $_; } sub do_cmd_sectionauthor{ local($_) = @_; next_argument(); next_argument(); return $_; } sub do_cmd_declaremodule{ local($_) = @_; my $key = next_optional_argument(); my $type = next_argument(); my $name = next_argument(); my $st = get_synopsis_table(get_chapter_id()); # $key = $name unless $key; $type = 'built-in' if $type eq 'builtin'; $st->declare($name, $key, $type); define_module($type, $name); return anchor_label("module-$key",$CURRENT_FILE,$_) } sub do_cmd_modulesynopsis{ local($_) = @_; my $st = get_synopsis_table(get_chapter_id()); $st->set_synopsis($THIS_MODULE, translate_commands(next_argument())); return $_; } sub do_cmd_localmoduletable{ local($_) = @_; my $chap = get_chapter_id(); my $st = get_synopsis_table($chap); $st->set_file("$CURRENT_FILE"); return "<$chap>\\tableofchildlinks[off]" . $_; } sub process_all_localmoduletables(){ my $key; foreach $key (keys %ModuleSynopses) { my $st = $ModuleSynopses{$key}; my $file = $st->get_file(); if ($file) { process_localmoduletables_in_file($file); } else { print "\nsynopsis table $key has no file association\n"; } } } sub process_localmoduletables_in_file($){ my $file = $_[0]; open(MYFILE, "<$file"); local($_); sysread(MYFILE, $_, 1024*1024); close(MYFILE); # need to get contents of file in $_ while (/<(\d+)>/) { my $match = $&; my $chap = $1; my $st = get_synopsis_table($chap); my $data = $st->tohtml(); s/$match/$data/; } open(MYFILE,">$file"); print MYFILE $_; close(MYFILE); } sub process_python_state(){ process_all_localmoduletables(); process_grammar_files(); } # # "See also:" -- references placed at the end of a \section # sub do_env_seealso{ return ("
\n " . "

See Also:

\n" . $_[0] . '
'); } sub do_env_seealsostar{ return ("
\n " . $_[0] . '
'); } sub do_cmd_seemodule{ # Insert the right magic to jump to the module definition. This should # work most of the time, at least for repeat builds.... local($_) = @_; my $key = next_optional_argument(); my $module = next_argument(); my $text = next_argument(); my $period = '.'; $key = $module unless $key; if ($text =~ /\.$/) { $period = ''; } return ('
' . "\n
Module " . "$module:" . "\n
$text$period\n
" . $_); } sub strip_html_markup($){ my $str = $_[0]; my $s = "$str"; $s =~ s/<[a-zA-Z0-9]+(\s+[a-zA-Z0-9]+(\s*=\s*(\'[^\']*\'|\"[^\"]*\"|[a-zA-Z0-9]+))?)*\s*>//g; $s =~ s/<\/[a-zA-Z0-9]+>//g; return $s; } sub handle_rfclike_reference($$$){ local($_, $what, $format) = @_; my $rfcnum = next_argument(); my $title = next_argument(); my $text = next_argument(); my $url = get_rfc_url($rfcnum, $format); my $icon = get_link_icon($url); my $attrtitle = strip_html_markup($title); return '
' . "\n
$what $rfcnum, $title$icon" . "\n
$text\n
" . $_; } sub do_cmd_seepep{ return handle_rfclike_reference($_[0], "PEP", $PEP_FORMAT); } sub do_cmd_seerfc{ # XXX Would be nice to add links to the text/plain and PDF versions. return handle_rfclike_reference($_[0], "RFC", $RFC_FORMAT); } sub do_cmd_seetitle{ local($_) = @_; my $url = next_optional_argument(); my $title = next_argument(); my $text = next_argument(); if ($url) { my $icon = get_link_icon($url); return '
' . "\n
$title$icon
" . "\n
$text
\n
" . $_; } return '
' . "\n
$title
" . "\n
$text
\n
" . $_; } sub do_cmd_seelink{ local($_) = @_; my $url = next_argument(); my $linktext = next_argument(); my $text = next_argument(); my $icon = get_link_icon($url); return '
' . "\n
$linktext$icon
" . "\n
$text
\n
" . $_; } sub do_cmd_seeurl{ local($_) = @_; my $url = next_argument(); my $text = next_argument(); my $icon = get_link_icon($url); return '
' . "\n
$url$icon
" . "\n
$text
\n
" . $_; } sub do_cmd_seetext{ local($_) = @_; my $content = next_argument(); return '

' . $content . '

' . $_; } # # Definition list support. # sub do_env_definitions{ return '
' . $_[0] . "
\n"; } sub do_cmd_term{ local($_) = @_; my $term = next_argument(); my($name, $aname, $ahref) = new_link_info(); # could easily add an index entry here... return "
$aname" . $term . "
\n
" . $_; } # Commands listed here have process-order dependencies; these often # are related to indexing operations. # XXX Not sure why funclineni, methodlineni, and samp are here. # process_commands_wrap_deferred(<<_RAW_ARG_DEFERRED_CMDS_); declaremodule # [] # {} # {} funcline # {} # {} funclineni # {} # {} memberline # [] # {} methodline # [] # {} # {} methodlineni # [] # {} # {} modulesynopsis # {} bifuncindex # {} exindex # {} indexii # {} # {} indexiii # {} # {} # {} indexiv # {} # {} # {} # {} kwindex # {} obindex # {} opindex # {} stindex # {} platform # {} samp # {} setindexsubitem # {} withsubitem # {} # {} _RAW_ARG_DEFERRED_CMDS_ $alltt_start = '
';
$alltt_end = '
'; sub do_env_alltt{ local ($_) = @_; local($closures,$reopens,@open_block_tags); # get the tag-strings for all open tags local(@keep_open_tags) = @$open_tags_R; ($closures,$reopens) = &preserve_open_tags() if (@$open_tags_R); # get the tags for text-level tags only $open_tags_R = [ @keep_open_tags ]; local($local_closures, $local_reopens); ($local_closures, $local_reopens,@open_block_tags) = &preserve_open_block_tags if (@$open_tags_R); $open_tags_R = [ @open_block_tags ]; do { local($open_tags_R) = [ @open_block_tags ]; local(@save_open_tags) = (); local($cnt) = ++$global{'max_id'}; $_ = join('',"$O$cnt$C\\tt$O", ++$global{'max_id'}, $C , $_ , $O, $global{'max_id'}, "$C$O$cnt$C"); $_ = &translate_environments($_); $_ = &translate_commands($_) if (/\\/); # remove spurious
someone sticks in; not sure where they # actually come from # XXX the replacement space is there to accomodate something # broken that inserts a space in front of the first line of # the environment s/
/ /gi; $_ = join('', $closures, $alltt_start, $local_reopens , $_ , &balance_tags() #, $local_closures , $alltt_end, $reopens); undef $open_tags_R; undef @save_open_tags; }; $open_tags_R = [ @keep_open_tags ]; return codetext($_); } # List of all filenames produced by do_cmd_verbatiminput() %VerbatimFiles = (); @VerbatimOutputs = (); sub get_verbatim_output_name($){ my $file = $_[0]; # # Re-write the source filename to always use a .txt extension # so that Web servers will present it as text/plain. This is # needed since there is no other even moderately reliable way # to get the right Content-Type header on text files for # servers which we can't configure (like python.org mirrors). # if (defined $VerbatimFiles{$file}) { # We've seen this one before; re-use the same output file. return $VerbatimFiles{$file}; } my($srcname, $srcdir, $srcext) = fileparse($file, '\..*'); $filename = "$srcname.txt"; # # We need to determine if our default filename is already # being used, and find a new one it it is. If the name is in # used, this algorithm will first attempt to include the # source extension as part of the name, and if that is also in # use (if the same file is included multiple times, or if # another source file has that as the base name), a counter is # used instead. # my $found = 1; FIND: while ($found) { foreach $fn (@VerbatimOutputs) { if ($fn eq $filename) { if ($found == 1) { $srcext =~ s/^[.]//; # Remove '.' from extension $filename = "$srcname-$srcext.txt"; } else { $filename = "$srcname-$found.txt"; } ++$found; next FIND; } } $found = 0; } push @VerbatimOutputs, $filename; $VerbatimFiles{$file} = $filename; return $filename; } sub do_cmd_verbatiminput{ local($_) = @_; my $fname = next_argument(); my $file; my $found = 0; my $texpath; # Search TEXINPUTS for the input file, the way we're supposed to: foreach $texpath (split /$envkey/, $TEXINPUTS) { $file = "$texpath$dd$fname"; last if ($found = (-f $file)); } my $filename = ''; my $text; if ($found) { open(MYFILE, "<$file") || die "\n$!\n"; read(MYFILE, $text, 1024*1024); close(MYFILE); $filename = get_verbatim_output_name($file); # Now that we have a filename, write it out. open(MYFILE, ">$filename"); print MYFILE $text; close(MYFILE); # # These rewrites convert the raw text to something that will # be properly visible as HTML and also will pass through the # vagaries of conversion through LaTeX2HTML. The order in # which the specific rewrites are performed is significant. # $text =~ s/\&/\&/g; # These need to happen before the normal < and > re-writes, # since we need to avoid LaTeX2HTML's attempt to perform # ligature processing without regard to context (since it # doesn't have font information). $text =~ s/--/-&\#45;/g; $text =~ s/<>/\>\&\#62;/g; # Just normal re-writes... $text =~ s//\>/g; # These last isn't needed for the HTML, but is needed to get # past LaTeX2HTML processing TeX macros. We use \ instead # of / since many browsers don't support that. $text =~ s/\\/\&\#92;/g; } else { return 'Could not locate requested file $fname!\n'; } my $note = 'Download as text.'; if ($file ne $filename) { $note = ('Download as text (original file name: ' . $fname . ').'); } return ("
\n
"
            . $text
            . "
\n
\n" . "$note" . "\n
" . $_); } 1; # This must be the last line pydb-1.26/Doc/perl/manual.perl0000664000175000017500000000072110366626610013141 00000000000000# -*- perl -*- # # This implements the Python manual class. All it really needs to do it # load the "python" style. The style code is not moved into the class code # at this time, since we expect additional document class to be developed # for the Python documentation in the future. Appropriate relocations will # be made at that time. package main; do_require_package("report"); do_require_package("alltt"); do_require_package("python"); 1; # sheesh.... pydb-1.26/Doc/pydb.1.in0000644000175000017500000002011611023351537011453 00000000000000.\"$Id: pydb.1.in,v 1.15 2008/06/10 01:05:35 rockyb Exp $ .TH pydb 1 .\"=================================================================== .SH NAME pydb \(em enhanced Python debugger .\"=================================================================== .SH SYNOPSIS .B pydb [debugger-options] python-script [script-options...] .\"=================================================================== .SH DESCRIPTION This manual page documents briefly the .BR pydb command. .PP .B pydb is an extended Python debugger. It extends the Python standard debugger pdb and is suited for use with the graphical debugger DDD. The purpose of a debugger such as this one is to allow you to see what is going on ``inside'' another program while it executes\(em\&or what another program was doing at the moment it crashed. .PP We follow gdb's command set unless there's good reason not to. .PP pydb can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act: .TP \ \ \ \(bu Start or restart your Python script, specifying arguments that might affect its behavior. .TP \ \ \ \(bu Make your program stop at various points possibly determined by specified conditions. .TP \ \ \ \(bu Examine what has happened when your program has stopped. .TP \ \ \ \(bu Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another. .PP Here are some of the most frequently-needed commands: .\"------------------------------------------------------------------- .TP .B break \fR[\|\fIfile\fB:\fIline\fR\fR|\fIfunction\fR] \& Set a breakpoint at \c .I function\c \& or at the specified file and line. .PP .\"------------------------------------------------------------------- .TP .B clear \fR[\|\fIfile\fB:\fIline\fR\fR|\fIfunction\fR] \& Clear a breakpoint at \c .I function\c \& or at the specified file and line. If line number is specified, all breakpoints in that line are cleared. If a function is specified, breakpoints at beginning of function are cleared. With no argument, clears all breakpoints in the line that the selected frame is executing in. See also the .B delete command which clears breakpoints by number. .PP .\"------------------------------------------------------------------- .TP .B continue \fR[\fIline\fR] \& Continue running your program until the next breakpoint or until the end of the program. If a line number is given set a one-time breakpoint at that line. .PP .\"------------------------------------------------------------------- .TP .B delete \fR[\fIbreakpoint-numbers\fR] \& Delete breakpoints by number. To delete all breakpoints, give no breakpoint number. See also the .B clear command which clears breakpoints by line/file number. .PP .\"------------------------------------------------------------------- .TP .B disassemble \fR[\fIlocation\fR] \& Disassemble Python instructions at the point you are currently stopped at. If location is a line number, do not show instructions before line. Location can also be a class, method, function, code or string argument. .PP .\"------------------------------------------------------------------- .TP .BI examine " expr"\c \& Give type/object and value information about expression. .TP .PP .BI finish\c \& Run until the completion of the current function or method. .PP .TP .BI frame " frame-number" \& Set the stack frame to \fIframe-number\fR for purposes of examinine local variables. For positioning relative to the current frame, use .B up or .B down. .PP .\"------------------------------------------------------------------- .TP .B help \fR[\|\fIname\fR\|] Show information about pydb command \c .I name\c \&, or general information about using pydb. .PP .\"------------------------------------------------------------------- .TP .B info \fR[\|\fIname\fR\|] \& Get the various information usually about the debugged program. .PP .\"------------------------------------------------------------------- .TP .B list \fR[\|\fIfile\fB:\fIline\fR|\fIfunction] type the text of the program in the vicinity of where it is presently stopped or at the specified function or file and line. .PP .\"------------------------------------------------------------------- .TP .B next \fR[\|\fIcount\fR\|] Execute next program line(s) (after stopping); step \c .I over\c \& any function calls in the line. .PP .\"------------------------------------------------------------------- .TP .BI pp " expr"\c \& Pretty print the value of an expression. .PP .\"------------------------------------------------------------------- .TP .BI print " expr"\c \& Display the value of an expression. .PP .\"------------------------------------------------------------------- .TP .BI source " filename"\c \& Read and execute the lines in file \fIfilename\fR as a series of debugger commands. An error in any command terminates execution of the command file and control is returned to the console. .PP .\"------------------------------------------------------------------- .TP .B quit \& Exit from the debugger. .PP .\"------------------------------------------------------------------- .TP .B run \fR[\|\fIarglist\fR\|] (Re)start your program (with \c .I arglist\c \&, if specified). If you want the debugger to get reloaded, use .B restart instead. .PP .\"------------------------------------------------------------------- .TP .B set Modify parts of the debugger environment. .PP .TP .B shell \fIcommand\fR Run a shell command. .PP .\"------------------------------------------------------------------- .TP .B show See the debugger environment settings .PP .\"------------------------------------------------------------------- .TP .B step \fR[\|\fIcount\fR\|] Execute next program line(s) (after stopping); step \c .I into\c \& any function calls in the line. .PP .\"------------------------------------------------------------------- .TP .B where \fR[\|\fIcount\fR\|] Display all or \fIcount\fR items of the program stack. .PP For full details on pydb, see \c http://bashdb.sourceforge.net/pydb/pydb/index.html .\"=================================================================== .SH OPTIONS .PP .TP 10 .B \-\-version show the version number and exit .TP .B \-h | \-\-help show invocation help and exit .TP .B \-X | \-\-trace Show lines before executing them. This option also sets .B \-\-batch. .TP .B \-X | \-\-fntrace Show functions before executing them. This option also sets .B \-\-batch .TP .B \-\-batch Don't run interactive commands on debugger entry .TP .B \-\-basename Report file locations as only the base filename, and omit the directory name. This is useful in running regression tests. .TP .B \-x | \-\-command=FILE Execute commands from FILE. .TP .B \-\-cd=DIR Change current directory to DIR. .TP .B \-\-error=FILE Write debugger's error output (stderr) to FILE .TP .TP .B \-e | \-\-exec Run debugger commands command-list. Commands should be separated by ";;"-the same as you would do inside the debugger. You may need to quote this option to prevent command shell interpretation, e.g. .B \-\-exec "break 20;; continue" .TP .B \-n | \-\-nx Don't execute commands found in any initialization files .TP .B \-o FILE | \-\-output=FILE Write debugger's output (stdout) to FILE .TP .B \-\-sigcheck Set to watch for signal handler changes. .TP .B -T, --threading Start off with threading debug support. .TP .B \-A LEVEL | \-\-annotate=LEVEL Set gdb-like annotation_level. The annotation level is used by front-ends to get posted about program information when things change without having to poll for the information. .PD .\"=================================================================== .SH "SEE ALSO" .Sp http://bashdb.sourceforge.net/pydb/ .PP .Sp http://bashdb.sourceforge.net/pydb/lib/index.html .\"=================================================================== .SH AUTHOR pydb was written by Richard Wolff (now retired) based on the standard Python debugger pdb.py. Over the many years, pdb.py and pydb.py have diverged. It was subsequently revised and expanded to be more like gdb by Rocky Bernstein The first version of this manual page was written by Gregor Hoffleit for the Debian project (but may be used by others). pydb-1.26/Doc/paper-letter/0000777000175000017500000000000011167772525012533 500000000000000pydb-1.26/Doc/paper-letter/lib.pdf0000644000175000017500000077470311167753443013730 00000000000000%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 381 /Filter /FlateDecode >> stream xÚ]QMoÛ0 ½ûWè(G)%í´MÅ[–[ÑC³‰QÇimw[þý$Û †ÁÌGó}ÐÒÓ£…7é ØŸ \:/Å[¡—…Š`ÉæïO(êÔy1’ø=Íœ„¥Þ­øYü¸òT’U‹îí¶øtoH >x-¶ÏÙ”ˆÀ%P‹Gùý2Ï]©Œ×ò[Sõ¥F¹ëKµByÉ]#7ü\&Ä=w{ž§Æ¹ŸÁxäypýg䮿º|Ú>ã:¡L„ÂÿfAÞqU”ï‡÷™‘rz¡=ílÎI+ð&$¾üÌßpË»gî5ç¸ÔÕ§ù*8: hkéª)¿š!ÅœT¦—¹Þœ÷½,ð–ó†NvÃÈM·xD¡5DçLöÈÒVS i "ÒìñõµoÚÌD©ñf. bœþ‹Ò˜rù˜ŠÆ%×ú´kÚÏ×=D¢i•Ó½NSÕn8Ö•úXûKÛ ãPj'a8¿÷{^îåÀS¯ã1 ëmñyä—ì endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 1 0 obj << /Font << /F26 4 0 R /F27 5 0 R /F29 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj << /Length 355 /Filter /FlateDecode >> stream xÚÕ“ÍOà Àïû+8¶ÐÒ¦G·¸D?âzsš–®$-4À4û聾ÅéE&Æ y_¼÷~ïÁª\,7´*2š²99Á'9(ð­ÕµØw6~*¯AÊË €Q‚‰©'ûrCÒ³<¢<ð,j‡ óï ŠR–ìƒ(ƺ#!e8º?ÚNI/oUk_¦^*ͽe©ƒl*+”D1Lœ÷¢ï½wîØ™®Ÿ§pÞ ™2†(£’e4ýö+¨ßž·¿¹Dµ~BÀþd]¤(|CY+=*=oÃZ¥½p;«öà`*]w^»’ ç)‹<¡ù_»tS pEx¨VÔrïÕ›Êv|p|æ¼æÒêÃð [¾‚+á./¨öä!g£êÃàJX{xcÏm¸ß‹šK”ê”läzƸ†\BºûCøw®½Åe¹xV´d endstream endobj 9 0 obj << /Type /Page /Contents 10 0 R /Resources 8 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 8 0 obj << /Font << /F29 6 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 580 /Filter /FlateDecode >> stream xÚ}TMÛ ½çWpÄÒšL|쪻R+UªªH=´=øƒ8´Ž±w»ÿ¾à±£8©zbfx3¼™yâé°{|É9*IYd:Q¶—„q–‘½,Ñ¡Eßð»Úy[5>ùqøøø’•Wø4cbNH3IÄ^BÂç72C’fE޵ƒ³Z|•0ÿx58]÷ê!%ÖƒWv´Ê«vŽØÔ?UãScµ w-äŽÖt¶:ŸõÐA ¯†nª:E’4ç%þà!ì¦q4Ö¯/Ãñª[-ŽmÈR4Ç3޽n*¯ÍàbŸˆ¢”1R -­9¨ ØéóØ+°ýÒ x^£œvÙX=Î,"ÔÀ9·†©“Làß1}©õ5ÙS¬jpjkâý«SÖ‘ IŠláh˜U«âKõì |Rv‰›¡ƒ˜?-¡ç8ùæY\íIà÷áéŒâ©ë”M„Àq¤BâÚi•󀄙kQ1cÅÝóaÇOŠÊeN²²D¹D² 5ç%%G”>C~] éŠM¯ÀO³2Å•Òn+n„VPŠ¿¨cè|h¸Ÿªaªú[^‚Q"÷|Ãk¹ºb´¢îm´/XNx¾%äNfêÛya)ç,ÞodT/Ën‚Φ„Ü£±`˜0ÔÅt¾ÚÊ.ˆËª‚}6íÔ+·ê©é§ö¢9XJ¬du§‡û ä"',Òæ9‘Bþ3 6½ÿc37ï6¤²º¡Âyød¨ÜP¹_ÆŠº#±Yç"ÈCnI|§‚§µ%Lr¶ÅgÌØÖd| HFV~!#H endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 612 792] /Parent 7 0 R /Annots [ 12 0 R 13 0 R ] >> endobj 12 0 obj << /Type /Annot /Border [0 0 0] /Rect [373.299 353.555 510.784 362.507] /S /URI /URI (http://docs.python.org/lib/lib.html) >> endobj 13 0 obj << /Type /Annot /Border [0 0 0] /Rect [353.143 341.6 442.807 350.551] /S /URI /URI (http://docs.python.org/lib/module-pdb.html) >> endobj 14 0 obj << /Font << /F34 17 0 R /F29 6 0 R /F35 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 21 0 obj << /Length 8 /Filter /FlateDecode >> stream xÚ endstream endobj 20 0 obj << /Type /Page /Contents 21 0 R /Resources 19 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 19 0 obj << /ProcSet [ /PDF ] >> endobj 33 0 obj << /Length 842 /Filter /FlateDecode >> stream xÚí˜MOÛ@†ïù{Œ™î÷Ç5TJ©°Ôpp° Q¾( þ}ÇÎ:ñ:¶ëªR¥JQN엙׳³cãÁ‡3® —`¬a$þN$  'ZPB“8%7Ó/—ñée|ÝŃÓxÀÅ#¨SÜ‚a†Ü/œ$”,®ÎvªÊFÝ8Ï*$qà4&Ǥ•8E>¥t?fш+:<}ÛdË4K·¿®Þ7«åöûÇlq:|yxÈžëö8Wx/"ðè/UÜ•ªn‹J( ÌÕ}Ö2Z5D1 Fó΢x騢-²rWÉZ‹·M yyÞûù2’tø3¿ÿÕlº|ØVdS­³4#«ÐiCi¼ªÛ$Ç‹RéÐ%D#…+x<˜ázÈÛС,5ýÐÙkÛÑñ÷èl´œ¬‹d™®ë¾˜s`Yàë/êvÄ©gk–ŽHôÂE¶à"«úušŠ¶—Rãq—¸±§g>¯Ò—¹¿zKÍbïT•ØŒsà:÷S„}zO'[Uˆ‡·Ó`$¶‰Lz@çÉzÝ™GQ –—!®³0Nˆ M­²"ozÂ¥=$¾TuWU0Ê…Uýïyäyûjë_ÒR°®_ÿªhÛô¤¬y˹'ëé=~‘mŒ.z0ª$h4àÁ˜ô…§ÑlÝÄ&Žz÷§ãæÿ ’ï4yП¬1»8ÏY2{ZM—›úrHÆ@K¬Ç!Å¥ª{)$³Àœ×â@&hdwÉúA¶×¶Cæ52å!û´Š¸¾vUÅ™o‘Å ìyv°wr–ǵ߆)Ë«º­ò¼?rz=îmè´æ8¨â¢û¡³×¶£ã5íÑ9›Î3¿Y-’ýlþòô'3:>r«Ë ôxU·[.,äOxÝ#/{^Z÷3‰[ôl5{m;/^ãy1»G¹õ&™Ï“Ílë¸2ø€j+ #¸Wu»`ZS"´qäàoÒ¹&Ó@“á·v`LüöMIE×ø¦¤¼^,Ýù2ÍÞêÉœ¡lð/êN§ŽÔ„9…*þÞIò‹ âæŽ’O_à= gÉk!Zä[çäzðÕ£©ƒ\YnSùYyZfúDQõ endstream endobj 32 0 obj << /Type /Page /Contents 33 0 R /Resources 31 0 R /MediaBox [0 0 612 792] /Parent 7 0 R /Annots [ 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R ] >> endobj 22 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 526.69 225.673 535.582] /Subtype /Link /A << /S /GoTo /D (page001) >> >> endobj 23 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 514.605 206.954 523.557] /Subtype /Link /A << /S /GoTo /D (page002) >> >> endobj 24 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 502.65 199.81 511.601] /Subtype /Link /A << /S /GoTo /D (page004) >> >> endobj 25 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 490.695 306.938 499.646] /Subtype /Link /A << /S /GoTo /D (page022) >> >> endobj 26 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 478.74 411.645 487.691] /Subtype /Link /A << /S /GoTo /D (page030) >> >> endobj 27 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 466.785 218.948 475.736] /Subtype /Link /A << /S /GoTo /D (page031) >> >> endobj 28 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 454.829 235.785 463.781] /Subtype /Link /A << /S /GoTo /D (page032) >> >> endobj 29 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 444.892 157.678 451.826] /Subtype /Link /A << /S /GoTo /D (page032) >> >> endobj 30 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 422.974 96.358 429.978] /Subtype /Link /A << /S /GoTo /D (page035) >> >> endobj 31 0 obj << /Font << /F26 4 0 R /F34 17 0 R /F29 6 0 R /F35 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 44 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ+ä2T0BCs#S=#3s…ä\®èX… °—‚ž±¥…B9XQ®‚‰™ÎQæ är áÒw32S°Ô³4R!i #LŒô BR¢5235cC¼¸\C¸3ß endstream endobj 43 0 obj << /Type /Page /Contents 44 0 R /Resources 42 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 42 0 obj << /Font << /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 3866 /Filter /FlateDecode >> stream xÚ­]“Û¶ñÝ¿B} oÆ‚ù~¹™¸u’ˤ‰Û\¦I(’8G‘ IårýõÝÅ.@¢Ov§ã9\¬ËÅ~¿¿ 6>ü 6i¸I_ÄQ²ÙŸ_ýò›¿)þÝÆyžlž4Öy#“ žõæ§Wÿ|õîáÕ›¯Ãd“‹<ÇÃa#óPDy¾Ià)ƒhóPn~ñþöíWÞÿëî·‡ïÞ|-ÃM E$“ñƒDÄ€¶ #‘ø!¡ÿøÃ{D}õþáÕï.sIœ øû\æB)Ò, ôji.b?ØÀR"I3Zîá¤î¶ašyïÿUSª’Þ><§¶¡ñßÕî.ô½Ëñ¨zúŠ0w>zø©¦»3„YºAžyê.ˆ=K;ÈsKgK—¶ž¥÷ª. ÌÜ{º |¯íùwm£^1¥ñÄ€á.ðÆ¢)‹¾4‚4bŒ¢T¤ èXF"‹C”%HP‚c©Q-êÖànd-Ô(v>~IQ»ùÀÄ÷QxVp.+2LE”$3VxÊaÂ`]11Ûæ RÑœ‰_ýاݚ3,¢ â§+w¢{^ÙÓ(,ë[R]È#ïÛö.Œ½'…ÿÿ;KÛ–y—¦VÀ¤@t9è5ÚÈ㘈Àþô¨jQèU>¯WÅ • `M;pl_ã@/¢gm]ÓªŒ½fÄ"΂M"ËÓ÷Õànäk‘.)šO –¾ùágâ¥\˜ÆŒ©ÜYϘºÞaƒuƒ< gì|ÊËÝÊö©È£ÈÝ^ú®}{>ƒåз j$¨Ù±Úï ÜS³)E³ÂK€Fæ¡£o7¹ùâ.޽Ô-ò¥wßðÊíY‘nIph!:W·öÅ ©Ø÷žXÍ`è² ¯eu@-:ËÒ÷^P‰# m¿Æ¿L…ŸZiîkU¬¹ÀÜ~š,’ÐV)Åù‡»yÃäœ àÝ…tÅÏsñlF Üip¼• ãä„੊ý‰‰Y’%Âl,ï AWŒD=Ц8+&±XŸ’.“ÿ©ºÆä~|oò¾cO²ä4ò z@<kflsl{ÞY—‚ ™4aIHZéß'Å…ñ==~õý°FzÊïr<ñK±k/fXrÖ‘r©Šƒvb8š×Áܧ] ó󽃼HkÞ^ëSfê¶¥íàB¾èÛKcÆf0(Ö§%ù~~ó͇ï×t§ëÛc_œ¯œ¾Ÿ‰Ê‘(Ee/;}ÆÝ:È×NvIQ¯^–WC"‰f _;FºZqf xŽÓh¾âÓ©ÚãÎä`5$å3eÃ¥ëÚž²z“‡$^s9ïçÚÔ6³(ÆfJ&}Lœ]eXÉ”Â\üœT‰érÞjóÛd©_0ÅSâ}P}íüŽ2¥(‰4<·tœ¢_@Ì.5ÄRÉ­¿9PIG0*këHoñ.c6匦83mˆ”Ї¾=ÅxM€¸öÃ]æ{-!WÍ0ö—ý¸–Œ&©H+?Ö´ë‚*Im¡ÃßJ»œ*SÐ-¸¡2“ä™eBBa´Ö‰RŸ¼¾ÐãüÜWEIcÔ(|W…ãREU«k¹Œ¼ñA¸3[¸)…½6$«³x>6¦HÕ<¡±&0†´«Ú5†"œzn/4@"Lð_y(ò<û ¾N.†³j.sQý†Ñ0ªž’…æ"Šç[¨èyäáF`‡Ó‰¤5ÎÍPÐûÌö±k«Æ€u’¶ü5F3¡½>«´"`JûJÞ5~Ãl›Sûp”zy?UÍ^Ñü½¡ÓUª\‘³„°ÉðsÈäžó§8 Öséíœm—9Hª^[;NE¿¼µÅ2°¶¤EO ­Û0.èaœ*޵ PSd`,ÈyȨzG_£ÄQàÇ€¢Ftp©vD“E­ùY ™eŸ+3X†ãÒ×›‰ì›x/Ö9è)2$®EC‘úé2M¥æUYœ¡›É Ñ´n`] `ÌéG÷ôøÈöq(’Iöõuiîöt˜"=^ìÊöKÝɼ՛šÈ“«ä%0 ÑݵB½³åy–r8Ãï/úòº3K@Çǹ%iLy³£–{(s±lû¾ê¨ùWÍñRQÑü:›^+ñªÖöê ƒ¥J°K&#Vesc((ÂUä0£ål¡œSЋ.³QŽˆ y Ç9v@V¼@ž4 onuÙ&¿";P?›Çÿ3e+˜ò·¶Ç:öEù.ðMúÒôñxЫß/Uoú ÚæäSʬ_ ®Iª=9?S+Uš–[c¬g®FH;WÊÓhµMlóZ‡3ü¯£ÉÂM¢’;J–šã§YN}Ohº0É÷¥[íႃÍnDè+ocSü­²Ú›%0âé'.LrLBU;´ü%3þ!r:—Ó]Q¯çÒ$÷ œvt­ÐžùSuj 8SùBö;‚+f†j2ÕNq"Â`áàJŶ?_ø¦qç›TÕw[±~lÜ €n{MPûõ¥Ç$ŠÕÑçvÒLªáë0Žs·ŒñLñ2˜Dì/Pþ«ÿðzhw:§ >¸ ð¥3÷uµ7ÅÖJÑD¡üRë–NäumGƒ‹~Rz¯OUSÚDÞ©õ™¦PäQ{±¯ÚË@€…#RèÏ ´v€Ô[æ9û¡ Òù<Àzš/îÐ^»ÔDZ8ÅlìÚ? ?åÑ,Mîðp ë·Cí,éÑ™‰ýnã'Ú²B3PÖ˜þ†6ÀR-JñË`›cÛÖ<ªºëøoÝ“²Z m_ç·³xçX¤4= 0ð/94ø˜7Fs_0µ‡Ó 0`W”†& Ó@¶Š“¿Žª~íÎÏT¨„h>+Œ§ˆóÏj‡s•tM ¹ŸŽZíš "‘“WY‰á"Œ§“£ñ#ÅP4;ëZû*áOë€SxZ#Åy`Ã[ý°Æ”„âi:2øx6±Õë B»b6Ϭ@t¹âôh­ÈLÚ,˜Ø°Æ6Ýæî¾Ï»þ×yl<™ÛÅùE1º?™·ÈPaÖLaÁù7[ÓÔv©{{`Ëè'×[yT’cd:ðÃT\3 TWá£ëU]«¦èŸIb];ð™!¯öbý8[Ú ÌDG"®w-ÏD…SïÑ.ðtº#Ÿ‘!Ã`º•rÛA'¹§½ºcŽ Ý= Kméîf󹣿hÞ`h ¨Ú÷Ó©×ãs[ž¶ìcòZB¥Ä±'1» # M):0ë‰þa4ªó臶+L?"0eä0 Ÿä›œl.½è7+*üõjSb­´7N2^ ´ h)T À$NPjÛ,‰Í’Ü=«tò’ê@„H›Rñr:ËKl¢…a±~AýÉDÛf _ºÕ‹4Ùõí®Vç·Xh¥–É&¹j¯ (V6\rµaß}¸ÔÍS§R€ÙsŒIí´£dë‹V¹MzMÈ3ÑÇ¥BßëþÞ:—ë> endobj 45 0 obj << /Type /Annot /Border [0 0 0] /Rect [337.702 541.695 427.366 550.647] /S /URI /URI (http://docs.python.org/lib/module-pdb.html) >> endobj 46 0 obj << /Type /Annot /Border [0 0 0] /Rect [215.581 529.74 290.819 538.691] /S /URI /URI (http://www.gnu.org/software/gdb) >> endobj 47 0 obj << /Type /Annot /Border [0 0 0] /Rect [317.582 488.205 394.072 497.157] /S /URI /URI (http://www.gnu.org/software/gdb) >> endobj 48 0 obj << /Type /Annot /Border [0 0 0] /Rect [137.536 464.295 222.119 473.246] /S /URI /URI (http://bashdb.sourceforge.net) >> endobj 49 0 obj << /Type /Annot /Border [0 0 0] /Rect [446.948 464.295 534.192 473.246] /S /URI /URI (http://bashdb.sourceforge.net/remake) >> endobj 50 0 obj << /Type /Annot /Border [0 0 0] /Rect [108.697 393.181 126.63 402.132] /S /URI /URI (http://www.ddd.org) >> endobj 51 0 obj << /Type /Annot /Border [0 0 0] /Rect [336.141 96.151 492.393 105.103] /S /URI /URI (``Heisenbugs') >> endobj 34 0 obj << /D [53 0 R /XYZ 72 744.907 null] >> endobj 56 0 obj << /D [53 0 R /XYZ 540 602.678 null] >> endobj 57 0 obj << /D [53 0 R /XYZ 72 557.312 null] >> endobj 52 0 obj << /Font << /F26 4 0 R /F42 55 0 R /F29 6 0 R /F35 18 0 R /F34 17 0 R /F43 58 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 65 0 obj << /Length 3761 /Filter /FlateDecode >> stream xÚ¥ZK“ܶ¾ëWÌÍœ* E|æ&;V¬TÊN¢uå`»*ÜÌ "ɤ֛_Ÿnt| µR%‡]âF£_7æÛ‡WoÞ‰rW†e&²ÝÃy—‹]Ga$óÝÃi÷KðÓyqÛ±7ŠÊ}Nêq/¢`¼\T¿O¢à56—ÐÍþýX‚᪠Mh^@7ôíª~ÐDZ®æó‡^+žp­ú•†–¾·êãÖtëÀVƒQ5Ó8ôUc`MÕ ÔðtU¼SÓrSehÕº'þê·ª›Kå2¾‡ýoÞE»C‡ešk†«ê‘¼Žî“—Á#7ŒM…¼ù„ÿZ}ªkENú¼ipV@:zT6‘eüÔðT3¯T¢õQm̵‘]EÜà´8{¢1–µHQÛüklŽØE Oz¸â)Þ¼“é쾓¨…HàlöLp§ö>Òþbš±ƒ›²`N0 ME‡2Ìq:Ò˜ÊÀ |8ôUQÙtÊÒ Ã«¾OWmŽ#¯¼ÔBÈlK?6–gq¼]©]®¸Cc‰»…úÓ>N+ZÐÓT7ua9*Ob ¬WL©Ñ~ ÓÞ¸Ôž'â6äaMjÒúL…Z#iDµèÆè—ù°Ñ|…µt}{é«[è÷ËÃLð~ßµQÿáþëç}–¢þÈ$Aí”°ÙE5ª¯jªt=œGw(HX­ é³$\Š,xê­j¹*^nÕœ“VKŽFq?J ~Iï×ë[¡¢qæ$]I²G0>¥tòø»\–ëÕµ0–%7~qmS#ão Ô€¸Y®‚@´=µõ{™ÈB3¨S¸!ë±(Â<Ë5ïðÝd…•ß«°Å<¤{Ðӎá=àî€LCm찉˖ú);S˱½ÝÆF+V`hº©ãµj´¹QU3‰ Ða_“)S!2+"B‰>’¸ý‡ÅóIMBŠgŒboâ`RE4Á y¦fPãÆ[]†v²õP¸éËu Þ'Ü´jx„5½ÑŒ3ÔìŒîä¦ ¶ßP “1Â0  Zé;N‹€­mÈô@ÓÝUAï⪀C èátó0`¸¶ï\F¥eébŽe¬l®íXŸÜ`ã¹µœÓQ˜ŒŠ>=È¢îÕ °w‹M‡ ·ù¶a{1»ÂÆ—æ5Õ_«ÎP‰¸W¿V•…p?‚o©7ôBD s~”·_¬šTñÖ<ÂKã]õ@_´(pÐv¸³|Às²v8Oë×Jšíâ$” Ѐ)–"ŒáàHCÆÀR‡°HEQð¾a_ Wø‘Ô"Q …?Îïîþ¬Àj‘‡¥ÌhÙ÷ë,ÞïžPTY•­Îʰ2$Œw&¡êu;²U0z­Š`,vœÉÊlLéUeüøçvdãÀRžD,]ž$X”DÂhZŽU]sË•­-Hâ]ˆ¼ûÍP!¬äd¯ˆxh«µU~(ÙSìá ·vŒ€Û.ŸWÞéuOƒ`ã7û ?ÿXYwÇÝÏ2Ê¡X HLígGÄ•¬U,+Šx<´Ä~GÌi%žÙ‚i>sé^LO­W’9hþë3ØŽ†:¦SJ)‚·µiQM3Ô"E#¦AO$h:´M'‚V{"KÆÆ‰ ¿:ŠçU¼¦ê{Zª`Mƒ¦~# Ÿ3«$y šWº´©Øðô®«ãÇ%xIhþƒåot'x‘…ñÖHA'Éi±³=ªÎ* »­-uê³÷VÔÀ¬¥J_i2?0Â|½59דBÊZešoö1°–:ÀýžjÞ‚Î…'M4²¾AK­Î¼‚—&îK 1µR-ã”Ù³á )Ýš8d–8=êÙzÚ±f`mô¥A(ˆe:Do~"gICu*yï÷gé1øÄÎ4fAs¹FJNê×(”£/ ÆNfÈF¡Ø´ô½ð%ÈAf×·˜r?>;WÔœ˜<4«‘ظ°ŒcçÄÞÿø°íè’):B¯¥Q9ú±&/Eì%1 ¡„Pý-ë^‰H¦¿Ù»(%‹¡•·’í`éøÝßK6¥ðíZ3nÕF-\§E%.|*ïÄZX^aâe””dÌás(T]˜Ö‹‰®¹<@ÿµ2[W ìGo}H³Ò^Ê „´ÖG=¨‡ºnºq@¢SvÈØè×Ç Ñ‹¥@…@+<8_›ÚÂ8,“ÿ²Q Ôl ø–€iú;-æ é`u@/"~Ut 8øÂ1;Š#–GðÓ»¤Ålo6¯2嬯eN'ípÁL)&¤5€Svj“[‰6²2°û«ï^¡¤G»x¸2LÊ "­PM±;Þ^Ea 2¦‰òÑ=¸±‡Ùào1g´Ô¤ÕŠö€Ýéq½³Ì–€zÍwæ®ÙžnÔÝž Å”q–b¹åp핟$å3 3Ï“ Ûç46Ip©…{z§{cå2O\ {gn°Å¡|™”ÎS‡æ¼vXËŒŽš¢)ÛÝЗpò ›»j¸òî£aÑgj'][±_¦iXx;Ö=ã׆,eé zÞžv?µÞÓÉ;§Ž@-³d0$Z%¶!Ç„öRT,£U{]FtV~ÂX€Häb:¢÷ûCÊ"”€ËxstŠëAbr”•óL^È ³˜°™é‚ƒÂÔp,Ô±u@׃D2äƒ5z°‘ðéØu`¶-Š•HÜÞÆÒ'ª›'=¯Š1.f[ež=@^kR* · Ó<Ìeò¢»±‡Ùà{^¯Hy”nè*Lû®¶Ç `–l¾ý½"»Qw/˜¼^Ënl±}†Sžø^8Ò"Ì á âŸÁ&^G®•Y]à`s,ã‰aµq΋<“ DÙ¢à\"—ØRCÇ?7(,%ègá6?®ªî¶¤Ô8óù†nK›˜ ë£÷Ny¶¹äuä.à­tÍØª^ÂÀ-*ã ‚çDLd~”¨7õ,•a^Ÿ¡´W¥³æ¹g´cÚ+\"K¦îH®-‹µ©ø¯èÃU÷6ËUäŒ-óÒ%w°d#á"²ªg3‚9%làc޽îWYä\°ÂLû,'…sxN”¾ÚÌ}üì,4ö€e/W*I…÷FÐ4Kå%¡Ñ‰ÙeÔ‚6ÜóLƒ«-tâ3³¥óC¤.·€ú Çy‚4Ÿ‘:[´« óIò Â!©íA×hIúLð7š ñéj^íÆ›œöŸyë_ˆ|vy!ã+ùY‹YB ¬EykñËVš:Ìó|öhÂŒŽÙ@4‹î5t-+¼ Å@³ÿlÑ™Ì}Zü7Ì즛”Å"̹t•u;|õAi™Ž«É4þŽU–ðÿž ¸Ó,Œ ¹”£íÓ-ÈI'Ãë3²B*„¯‘‚²Gуé±?r;F}… ³û3·?ÙÉ%0Ž$àoÒÃîy;ÄŒÏ3›Ëhªm4àÑDÎú+\.\P¸&lî­Óµâ^«ˆ‚ÃMÿÇ5Ãáð¨->Ì6Œ{ó‚þ”{éÁéýyãf UÙËⶸÉÃ-ó+2Å7Ë¡²¹R¨ ¦’ªmFÜ ¤ ï†UõÇ+Ù™PލM‰åTÝ-èY¦Yñ?À^–LÙAs 5—õòpî\.H:‹dÅþãØ÷&é'{G!mÛ»ü§Œ)“þà®ûòã”Íß®"Gr(62b˜¯ñÞ /PóÒ `]6ñUŒr¯Ç¡{:F!èì]èíö{È8Q)Š nýÓ4[/ \Ê&U-›ð}p‹ÐS$–È+Í'z?) ç•…{¦Fá3PÕkRõœíÄlzו:uÔxß´YA}q÷»êóVp–‡qúáã ^ÚÁÿˆƒ¢ÿc 8®³¸ÞfRŸo˜ýt¿i>Îq¶ñ+ªÞ½sâã¾ SõUÔCŠn¯Ò'«Ò¥uEØÄ$±ñ”æA'þàçU¨Ööô¥Lë¶°'“A×Ü+›ìÄrÅ›C[ówÑ8Hcïš)3c¯¸È›dø{) ñó4øAõʽîÙÅ™êÙ¯+^x€œ¸ûáçßSéO?þüæ/ºgÅn]þâß>9‘‹]‰°€ë=Þ^ýò[´;A;lBD·{²£n»\t\"ü­w^ýÍg/RÀ<9¡X#I–lHýÊAh0²“"_±|É&ÿâÂÁ”i‰¤Ó|B‰fc—<Þ¬’›‚õ¬}´qU’[#HÍœŠÄF~C.Xå¡eù%ü®˜ÛI>ýIW4€¼EH¿‹°¦.qånQªõø‚d¨ßmƒ’dm ´Y­€6ûNiñTüÑhçåô-ÚÕ<ß}]3BÁ…”MØ4÷csŸœx+0dY8­9˜ŸÝt KúxiöpF‘ó"r½ß%Ë@Ëý.‡Ðûì—viÝ+æÌÔMw<úà²âîé0²~r[/Ò$Lü’Z$.ÏU"[þ‚4a ¢߬³´Hƒï®UG-/`ÿý!ƒ°äÁýãû){šÏÞÉ7~žÿ>Ï&³ endstream endobj 64 0 obj << /Type /Page /Contents 65 0 R /Resources 63 0 R /MediaBox [0 0 612 792] /Parent 60 0 R /Annots [ 61 0 R 62 0 R ] >> endobj 61 0 obj << /Type /Annot /Border [0 0 0] /Rect [296.496 402.782 314.429 411.733] /S /URI /URI (http://docs.python.org/lib/module-pdb.html) >> endobj 62 0 obj << /Type /Annot /Border [0 0 0] /Rect [360.904 355.577 408.725 364.529] /S /URI /URI (http://docs.python.org/lib/module-optparse.html) >> endobj 35 0 obj << /D [64 0 R /XYZ 72 744.907 null] >> endobj 66 0 obj << /D [64 0 R /XYZ 253.678 569.434 null] >> endobj 63 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F44 59 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 69 0 obj << /Length 3342 /Filter /FlateDecode >> stream xÚµZëܶÿ~ÅÖ ½"Ç¥ù·y¸H7¹ ÒÕjy·ªw¥¤}@ÿøÎƒÔc—³ ÆYZ>†Ã™áÌo†z~sqý…*V…(2•­nnWV­¬LD¢íêf»úeýuÛ¾ª›»Ë+™ë|]ôR¬‡óMíi8žBóm×.½ùûõ:•y!R¯¦y(_Áì,IÖuÓå~ÏS|ÀƒÉÂŒDß®{ç"äS%²Ô„±Çûí&BÐ(¡ÔHðõ¥LÖeï÷àÙp[¿º‰¬r¥­&3«+)E‘¦LèúÔw×ûzs}¼vm£„¹îëÁ]ËêUyçú'²Bå:°".¯ ­Ö7;×¹Û¶ɘvZ^ªdýû¥L×¾…DnÒ|}Ûî÷í¥JׯI1Ø Ó³ä}u)×]}øgÙl¹›Eã}OßQÂÅ‘UØœçn±K¤¯Òd}ßžºˆht"ŠbTÀËÏn¾Šl[eÂ$2 úW’&Ä’ƒ@}8þ…ÌáÓáæßªÓPnö&ÉÇõs ê@ÕÈx.VW*)ðN+üùO×›º¹îw´¯—iÁîͱí6—?ß|õí7Èõ§ÏžRçõÇLÃ?~#ý$ 4PúOˆŽ;ÎSÔDšyb‰òJ¨š,&H¿ÝÏXh[7”5Y2þÚ×½f{ëŸÇ¡n›ÞKÚ?ïj466¯é†¥?Ï@¶b{PÈìXk‘&~i)à¶ò7·AÃ=Ýݹ(Ù|ý×öp`MÃoÇåáÚÀ¨Íy•H‘ä£=]] ]Y¹#i"”m꣱LdÆN¤¼»ŠÑ²Bçé»ÐªüÎ"Ä2#Ò4’X6kÞÄè€Ag…žèÜÀcÈ,;{àÙˆ‹QRäV‚Õ¡7«” ªÌO=³ cÖ»…ãÁîM;츯ä†~Gg‡ZH±ÐVòï}‹. ˜B×eàP'ùú li;îfó*ǽÃ]™týïˆcQ ÇÉg\½‰ySvS~ȇL½ö›!ŸyÆòŒ1î{½ƒÃ}1$¬ @p¨}ÎKª…-ò/f]ƒ/ž±CNÖ°p©¼“Íx¼—]š,eÇ™Ù2pü¬”çÞ•B\ÿ²iÚ¡ܧ<Åèeˆ´JÎöŽWˆ^¤œ"ÿ•ùMÁ%Ù ØM…Ì%wÝìPÊZûÁwzð­${lÞŒçÍÓÀÁäqö8€‡B ®·îlþvîRÒ >ÕÉúEXÈÝ"­[W žˆoJÍPWåž›‡–›O=…MlŠ©[[)t6Š öÃ>:H× ×,‘ÏYÄÌ=™øïQ!C¼Ê²Ñ¤>„e¹A|Ùt=“ÖÃÕ¬Ç1iò½Õ×HÙ¬«¶ºvßó:;†üãpªv<¨n‡‚¶ kŒ-TAc]Ý žÜÐÞ9ê{^×ÃŽÛë0àðð8|ä†4¢°ÅRh¿#CåþäH‡)…-|²»8v®ÇCуËÐpžz€#•ãûºq¡¼M÷ìÀëp<'ʱ€Ì)[=·HîOøQûiÞ ÓuƒÒÙûµöçÉå¼Û–XÈÀò<€[Íf»ÿòoÏ—¹;ùp\ú†’ýi²¬@Ëèþå7?ðË燲êc¾Ã@‘X‚L&É–dSö®).æÚ¬H’1\}ç>©£x¢Èæ\XU†X]¥¶Íþž°C†&\j6|$­Œ± ðˆÇ·‡Ú/3ÎÜÖŽ®†¶»çœZ4p¸Ù)a#?- ýö´÷m ?A¬ :²CQIqf†ÙÛ77éàúá}D:T»ˆÓÃþ(º¶Â&z*m`@œâ¨U+‰¹WFN…Q#,ûo„ J2ªW~YR‚ ¤.¹´°Æ‰àwR,Ï¡ >ùÕškÈÇó·ZLCúÎk[”è£ò´Ä# çv¬ŒÄô!¢þ>f¹¬2…)Ðv»*~žµ>“VÔ $J @B&wfî«bÚ‡-çSŽîÍäŠJ/ý§©(tñNúw1ýCV_¤/ºØ~–ˆBÉ…hYœ{\hñtúˆ È$ÒÚ·\15s…[ÚP B)sLÉOû-¯Kž½;–™­w¤°faÎÒä x^Y(³‰ Žî(ßO>y²d€Ù'üY.iá-›Þ¨@ O øÂ.‰ØÆŸ[„\Ʀ´ÛF2‘´Uzýó¥$<èPúÝ4Îy¢õðùÛ©Fšµç$„¢0W‡¬hV¾¸sV¤ ²(¤»gÀlç(¶“…sT8åôŽÕ‰;oa…1³Ї‚äg„ ù]% xzijnNîYL™ÚªÉJb±1/¨ruÉMì€Iˆñ‰ú£b˜<"«,ÁŠf*Ó?÷ [I3¢fxÃJûÉã0É9Ž `é¶Á!+iÎ=. é 3º;ue aBB/ á‹| w§Å´¿À¸Y2ÁbýÂ/DÕ~«‡'nžcÆ“ãV Oz[*À5JûD¾ù?æKºm(ÄY…·yâÁ)V &œn*€s³ híO dË!´!¸T\â8“© 2íùG¦7­ŸÍ!Ȇz¦5fÛfG€¾GÇKÛ¶Êá!—!b‘ô˜Ûô=‚ü]MH=ø#Ì©¹jÁáÒÛ± ­{&òûaÛžbžðLžMõW*CóÂ-Ó÷  »^„–T Y¼º0i¶þ!dø°UVhµ)uÃz·½¤nšÀ:+ÔùÍÞ”î!4©¦bËÐ.j1>3Ú¿³Þ]×]Bl»(¨È…ÔöýU¯3ŸÒ‚Ó„Ô¸£´ÍãûãšOæbÕ#«¨>;S=-Üòºj\[ˆëÙû©<3vT9.†E\lT86–ü Ç÷±ü‘éQ·¬ýŒÏô2‘ý?(|Ø‘Â!]³§%hÊ„š²§ÏÂ-op-ݘçLNyŒý½óˆY Lb¢Ìù¢±t– Ÿ%,Ó)õN€õ§X°·B¦£Ê_~ûý‹Ÿ®úá~ïørË·ü†Œ°“‚ëT `º”Ââp½Ç«`<ûyJ¡ û‰¿°ñÓ|q¡÷?Ø6eó¹/ÍÒ@^‰VŒ\ h%&ˆÿ÷P€~4¤¾»H‘Šù©›ÊTmá

¤L9»ëpeÀ§ÑGÜÅóv,E¨ µ7tT¤Jmä{ŠDÉFg1êuiVdzžcPøŠ¾pü²H×3“[‡Þ~C›„Ÿå¦¥k2_‹¥ ‘™P§ß—÷ê󻛌":s@ÜJ߇ s~èÁÈÐlFP¯‡SqêJç¾ Ï¶h}l›í8÷,— Aãw|ŠÏè 'ðš?¸ßDKå@?ÃÕãò£¬TdFͯ-u®|äÅ0òhïÔŠ òÄ3ypR´™áÃÉÅò+•€OáÝ×ÈéÖ‹0þ,#¿é.>¿¹øí 0YIüˆ-5€èìª:\üòk²ÚB3¹Ð½¦A‡•!3ܯ¾¿øçÅsú.[~îœÑô‰ 2#ˆ8Áü—qøI†Ïoòå÷/( ° °ŒñhèÀíÿ?*¨ endstream endobj 68 0 obj << /Type /Page /Contents 69 0 R /Resources 67 0 R /MediaBox [0 0 612 792] /Parent 60 0 R >> endobj 70 0 obj << /D [68 0 R /XYZ 72 744.907 null] >> endobj 71 0 obj << /D [68 0 R /XYZ 520.422 567.741 null] >> endobj 72 0 obj << /D [68 0 R /XYZ 72 336.226 null] >> endobj 74 0 obj << /D [68 0 R /XYZ 72 314.433 null] >> endobj 75 0 obj << /D [68 0 R /XYZ 72 270.159 null] >> endobj 76 0 obj << /D [68 0 R /XYZ 72 167.205 null] >> endobj 77 0 obj << /D [68 0 R /XYZ 72 146.757 null] >> endobj 67 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R /F34 17 0 R /F43 58 0 R /F44 59 0 R /F72 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 80 0 obj << /Length 3249 /Filter /FlateDecode >> stream xÚ•kÛ¸ñ{~…û)2UDRÏæÓ]šàRôzio~¸; ²Í] ‘%Ÿ·qÑßy‘’¼r’b±9¢f†ÃyÓßß¿xýÞÄ›",Rnî6™ÞdQêxsØüüªuŠÿÍЕ{»ýíþ¯¯ßÇ&N5~ë0ÏŠMÄü——,pæaånb{Ï‹t1[¤Ò0Š=šÛ;cTPWÅQ ýªydð¹kãÞöòªm|÷Gµãp‡W0IàýÑv–áUÏϲî[þøalöCÕ6 ß—uýº³ÃØ5 ²áö.It暜…þ3ØÉædÂnî” ‹$á-x†už]§"¶†µ ð§‹4°%²¯‘<¿,Yå˜Á×%nç®jÆ“OÕpd0l”í¡µÝê$øc«’ÀÖ°‘XGÁOá%‘,xý±Åïž„ô57@ír&…€3[lXÝv°Dï×ÃøDWÖ£åiõ ÏAž=?K~ô ‹R°8lýÐñY?[A¤B>¸•¥Ð´¸ëÏåé\ËâV¨ö¤*3z¤ß¡(fºá ‘‚ßé8,¢lsgâPåoR…@v{§¢8ÑpŒg@–åÁ¯Q¤kTOž$‘XE2Ç«ÀÎâØFx¾vÝ~ƒ$ µÒÞ‚¢D­ÐJŠ0M‰]–4ÙŠ±ðå™™>6&Œ ³ÎÊœHœ‡fâ„¥[õCÏTª†É"`ìm÷r›$AÏ/ŽíIÞªÎ»ðÏ 0†d°»Î6¿>J“;6¤>D[xèlyXâ"S³Kv°É|pYé˜QB²é\…y”ˆj§¼ácI6;kÉ YËŸb†À¯ÝmÁØÆÇGÛñjp\§ó€F¨tpd·`Ä=ÄÁ¹ì†j?‚â׆€ÆšÇ[pl s +ëªìmOØ5QÚ‚u´<™&þ¸ÈïhǧO$ WÍÕèÀVl|v|:.˜x²ðq„„»~à ;3´µº‚= Ó¡k~nƒJqå‰3.´Á ÔiGÊ-ò’ŽÎºg7 éºì‡ç>þ®|fÕÀðTr0$_)Ï)Ì6ëÑ‹ÿt²¢‰<’Šã0ËÁ1© ¢¤$?ƒb Õ‰¡Èä<`p*ñŠ˜Ýo‘Oç'*x:C{„e³x€þ#rš å ŒO‰UmIU„t &U$ëÚ‰ _ï»ê<0²áX Ã#*û\Ä•°¾’ ,œ/§>ÓÖg’?•Ÿn] ëìâ æ>çàræÊzhmß¼Ü*à‘vð**ªdçäÉÙ^ë_óïÕ`‡é%îîšÏkŠlÂByE~¹¢Eí…ûj¦±¢Q&ÉÃD›¥FMçlrŠæŸ82외áw ]mO=Ï${‚Umã#8»íi߈—ö ‹×ö­MDB¶Ô£`ÓHR‹;Aß3Œ3ÇëX'°¯b. y¥ §Âå?^2àòxé«î·9„³}®}‹#ð:MúÑW‡ëóþ}ÿM:¢p Æg};v®¼XˆÄ$až&ëZòjÊÿ”ž¥nSm…I‘ƒ` ¦Gr7—¹ýeÉ=$koÝ)=g XgaaÄ€?:ÅÎó¨·RIhc86˜  w~¶<Ë8˜ÔgOÇŠòR|Q &÷-öÁ­²žøMÄÌ•‘7œèÐS¸€lYsì‡9˜ÅcWžBï¬Ð¶Dƒ~l)”›tÁnêxL…G(v»ŽËªä€ä¸L"iØJÓYªb°LÛõoP©U`ÃÇðëÿºú¨0õÚsÄÛÖç™1éPº°ª48Ù²‘]ˆ³†‘­0áñÙ¬•òöy\¡•„E–]‘j¿€QAÎn¼~a·\åÒg¢'õàjjie²«rŬ!BáˆüèT”`D–F“ñÃ{”*kÕÀo9&ëuï§bಘmeÍÁ©¹ƒ|I¬Ö±©063±¬!Cc4ÿ7²nœZ¾Àtk“ R´Ø£ú–ã¾H n`Õ –ÜkÍïþöñëñu=d”ßuÎÇœm/GÛ.γçÙi$3Ö¢4é-”d©¤9P ³Ôʰ ƒ¾i°\9ôgl•„¦=¿âL ê¢r× 1ñOË9y‚ÊåŠcøŽ{ðÎ6ûºeW`JJÚÿ>ú; ‘‰ÕL$.Âlê*ýòÛ×u’|‘aÒ®LÀdÈÐ¥ÊÏo$ì¦*Ì¢«°ëãŸçk„%ï˜Îñ¡ÀˆÍkVHPm)©×w5ØméæÔÌéoämËN|JÌw\LÇÎô.‹œ@ª,¨Dé¼pëÄÜt¬ ÊÄ–]À/Ø«»+ðÏi¤—çº)Nà’‚ƒZ¯.›O0L#i "°³g[²0],zx4I>#ïÇ2…<êÝç½%½ü3–þ…´¤¾Ž…ã~ÁÛªú奴7ìJïoñî9ô)k ‹*‚ñÚ³7\Ôˆî()ëP@ýÕ±#¸ùy„—ìùíä(2í"bæ”W B•:»o›ê?ò“ͰÞïÁÒ‚°åçNV}¼ GÊ™` )É`O@ ÍaJ¯´pZ5WÌî[8g‘ÊJñÎM@·>Q.÷aèΊީù¦Ù“‰ßäŠßDIL†Ü^F›² Ôê`Ö ƒÒc«‚£|"Ÿ2Ûûºœ*q௭¸ ¼íêâ( ãÌ[àŸ¾ÑiOÒˆB\“œÆAA‘è«/J¹ÛöÀ#W)B‘:€P/@Á<ðDަ˜‰:+¼¨a85æ€EÌáLºK9V¼Þõ5‚¬íûjW jGx,›G «Ü{çÒSÆÅÜrŸ–ºÎ>Ê*yjù¯Ôï˳ø©[÷û±»rÎÏúÍ^w^]yï„My²ËæÎt€ÞÙçh·*³y?€/±ùÀÃ’[÷÷„8}V¤Ïç¶#+€ ¸Î¤Ic]•´üà-Û ®Ú,i†ÝOØ(¼ÂC„³öM(œ .Re%ø×Œì—Ê3ä#U] †ª¤®žGT_öcspõ­k!UMéÔäú6bQNmüH®r_†bîF!ú‘:Å7ÊÐY‡ÿ{Ü‘Æã~ #ë’Ý«uEБô¢yÌ7+<&­Ð72é "Z>¿Šˆ>^»…W¬Â|J¼_2zi¸RíJ8Gb< ¤òO‹†4Ëx„ÁY/uO‡ ½G#»¿Ñ|€„{ Ë Ÿñq-.ažÏj9ö‡iLXh‡OLš‘(Ï<ýÖxÂW8ðûÅíûLARò£./¨‚‹ž`$à4޶§ \Úµ££-4r9Ošžµkô+œ€äSÈ8\3mÅ–-ÔEyæ{æÊ˜Ìtm¾jº#˜»«çýòý¬'ýTÕõ2I^=à4 Õ¤y¨¦sU½¡®‰ ³b bÃñü*l=‹X-“Õ{l@>i_"Ó=GP¼¹"`3ЭCbØõë`¶QÉ]àHs—ƒŒžZ^Aíg”™Ë†Âb&ebÓ·€WÛ³«'²àýØa¯ãÔÎIx&ÎÝ63Ó./0‚¢· WôãY9ò0ãDdêc“6Î""$!r£„!i<í`÷J)×{þpuOÌ4–…À7;óXVþ¨z‰÷3ªWX²:m;\÷¼ó€øA®’ùZë‚u‘ÙuÉ’Ødýâ2û‹Ñ#›¢‡kc¾õÅ ÔÁ²ëý%ÓZô³úH²›EÝX1Ïq4o”3pÌKÇXJG»æ®8ÓM:xð4ø{+°öŒÇ ¥|©Ð‘‰»ŽEPDõ~­–’xí3†ïÐãA6g…¹ª_½£l»šÉün©¢_­gûÄ)ºÑœ¸#@*FžÐÏDàYòùwh°ÞBkйˆðÍîÂÏUG•%¡1¾7ùæÍ×øSiÎ}ǬÎÙX#’$a45­Þ|µ2À_Íär¡®Ù  EW¿#»/aƾ€×~½«/ÞÝ¿øýÖµÑFáÏŠ’8„œl³?½øå·hs0L)öæ‰6qŠ<Ô›Ÿ_üãÅ÷øË$`nñˤ&¥™Ëó¶$O‚·GHî\Ö„Mªµ$«x÷y°»9ÛðÅf¾L¹„áÿ«ž endstream endobj 79 0 obj << /Type /Page /Contents 80 0 R /Resources 78 0 R /MediaBox [0 0 612 792] /Parent 60 0 R >> endobj 36 0 obj << /D [79 0 R /XYZ 72 744.907 null] >> endobj 81 0 obj << /D [79 0 R /XYZ 72 720 null] >> endobj 82 0 obj << /D [79 0 R /XYZ 235.641 651.143 null] >> endobj 83 0 obj << /D [79 0 R /XYZ 246.319 492.476 null] >> endobj 84 0 obj << /D [79 0 R /XYZ 72 254.829 null] >> endobj 78 0 obj << /Font << /F34 17 0 R /F72 73 0 R /F29 6 0 R /F26 4 0 R /F35 18 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 88 0 obj << /Length 2983 /Filter /FlateDecode >> stream xÚZ[³Û¶~÷¯Ð›¥Æ‚ €Èñ“ÆSwÒ6íñLÛI2J¤$Ž)Ræ%Çú÷Ý )á»yqY‹Å^¾]êÝǯߋl•±L µúxXi±ÒØ©ŠH/yß—Ͷvn8ùO×áÔ6ްëËn“$köK”ðÍVFéúï­Ûp(ëº:–Íž^µë —K]-7PîLUsÜüúñ¯«hµåœeIbOl·O"¨7¶ëÇ«æ2Ôìí³‡]h(nȉ"Ñõ4úîøú½Lf"ç:a<åÀ‡ÙÿÍK³¸bH^ÚÅ.yÕmâhýÊvËHÖ¿ox².bï@Ïv«æ†ÇsU5µ[z)·Ïc;â1‡„ƌԶ<ÕŒK Í”ˆ-gËdàºÙò,›©ö†üÓ†#›[ÁòÅ»ÃWŽp»fïæ\tÙ@œÉõ">·Fðú>ïKZ7·§-Ø6+~¹teßWFƒàÇSµ?¹i#)øÉë1ÜB¨fÁk¸ÄͲåÙçF´|½#iŽ ÞpÉåú=¾mì'qKågkBðÞE@7xÆ@ÝÝÅ«€j$,ÓÚ¼ ¬³,ó+D_BkˆˆÅÒ‘À…8Q,McG#¾‹CZªY&åÄ‹9œ8°ZÂtê¹AƒQGÂHTd°Q be:&­ú“™Àƒ¦«Ù°dÜø‚Ày‹£Ô-kççÌÝ0tö:jÔßõÖ§àlWâý–Í0]‹iô ”ö §8%°¯¾I%™šTBÙÝÿ»á õíÄ"#Ù­µÂ¨ 6ÒiƒÞNºöl[v¦«ò]í&+zûÚŽm]ºö&DÓ»æÕ1ðˆ6˜›ãAï!”må5˜Ïx<ÙÞ‡—ô~Óe?vÄÞãic¥£Ã©êgë¶c]Ø®ÑaŒǶ-Âζ2×’qëáY´`/±Œ×iñ´3Au–"?¹9xF–ÏsÕ‡±¶ãÄ22õëƒýDÚ_ò½kVkRt‚–9gµ˜k•1i)¾ôÈàp5ý^umsGoÂs4÷ÓþrÂH}Yz»ê©y³€#ô ½Çj8MöKÊÒ8èÎ]ã7rqÁ`#@Ü%þúh_ƒ»Þµ»Ë0¥·Ã¼b€ cºž§´I² B˜°—>×3!¿zÙñ´Zzx)ð'ú«š3悸†Ò¼Üðt=Ø.]¦"T¦AÏw+UNèV[“<€¼£+Qû¾‰ ЛêóXÖW’ö¥ÜOZš`¦SžQ¯$÷°Ï‚f­Y 0jáÄçXð^,Y-ÍÝDŽº È#çéYèw¢m"æqEUÐè\&Ãè!|8ɟ̹hÊ(U À#‡Ð[‡€©À’¡˜°ÊnÏe£œÌEñ¯¨ì¨éßG¤ãÎùò’é,[ÞÈ"ü̸`’{áÖí>¯û¯ K§pï”Ò' & ×}ëR*òg ŸáœÏoõK²v™At•dìÄ凯­V/S· ”äœÚÉD^‹£yJ†™ª²mà7¦—ºÙø5Ö‡¤l¢˜å ×;ÿ9utî“äqX¬?Û×ú~hD!BËÛèÈ2âPåÌ þ;AO¡:§¼_¤¶û¶¨i›‚JwH1©þˆ‹&éº;¦€{s9û¶wÑÃc~ŠF.ì”ZÈaŠöíYjg¢¢KÌ5àGóæºrpxh^üðñ²­ø ²x%ù*Vši©Wûó‹ˆeàvYŠOžrK¤Ûí;, -aår=³9‚Sç(æ{s0•@Ò|sššmë¨îö]BU‰“érccM™ˆñ/_8qW5&R¡œ9å{s¹»ðÕó ˆùÌΚTy±Û ]¾ÿd'ŒyJ§b^ÁaŸ¢ ×Ki‡Š±³xkJðpÔÃ?ÙÛ’DÿÊ©¸*}fÐe’‘ùcËìˆ Ã;60@š²L†…äŸ ÷Uo‚vý:§ür)•Ô„œ}Š•-°q÷Amw ÈWeìÂöt: åÇÒË1¿ðï7¤KQ¸=­Y™Œx_ÕÕpݨĦ9·.å§<|øÏ¶®¨N2âTÕÄÞ°¹ì –É( evÚøóR¸ÜƒI™¼—n†Û„Bm1©€˜`{¯‘M’ñi3ZdÐHIÚfèÚÚq•#Ž•\o¢ vå0vÍTáÈd¶ÄÓ^óc@ÆÏUyàܬ¦â»cš§­¦“eb <%`ú\//n ëÏùÕmfe¹§&®±Ø°¨ÿà ƒ/û‚A„¢…dñ”P?í3â(¾¿­‰ îÂâÉÚÆ>ѧê„bžóNŠÓZ'` ÙCú<#N7þQ å¬spþ˹ϕ2ˆÕ©È0-¡ƒ¯õ¸ç°7ØJ³ÍZKÏ¥ÌQWËÄü_cÓPeÉÁ¦‚·í œ³éô¼ªÝ»Ik^€¡:ÈÌ*ÔDc–F߀ ®zzÕÖ²² E™*õ¡]ìnŠQ”¼+k;²læ™L·(û}W]øÛmžûRJ²ÉB1æõò Ý™Œ—w&4K\E¸Ä·ÉÎòÍïBÏ1l>)òÃ:Æf ¿IžÚ⃆ “ ñ¶¥M¶Æ„ q¸ë0,óO—î&ĨŽát÷|J¥)©ѽ©}aÛDQ˜ñ;Üä `r1·†Q%ÖÿÆ"ƒÓ!$É OÇk€·e¦IKpY«†lGoh›Ü­nm0cJß„E·ã2 Y~¡Û›ñC¤­†ú@"l›Ûtcâbб ¢ÍyíÂàånà÷þõ_²B•M¶/½Yÿøµo&A ቇ“Š$!9Öí.œ»Z¤aöe_Ÿ£ªë‡ÔX™¤}žQã¯&è`B|…ž:6ŽE³’òV±CœrfÕî÷Œ8Ÿ¨$H!FSAŒ¦|–JÁ(}o†V3žwFiSn¿“ÀX0zOó>ÂÆQb3¤ÔF_˜s¾†V²µô”¾ Àȱš}ÀA+È¢‰“Õ[a-ji"¼ÝÅ•úyÌbq»òVQAéBhÊ"ý¬tŸªVÄ6_{^ÌÛߨªOx\ÊŸVÕ‹ñ*¶Ö€+°tÈ¢´".¡aëhæFö#IU'Þ #‰¹€ù;TÝÆƒ¤š\·OÙ ½iúç‚öÿe¬µ¤³5*ht2@AKÉܧt ãÖ»oôÀɰ=ãÕŸí@1ž/U^-‹4þ®&.fh+'ò@šVê,îD±ü#C~ë»o½ºÿÝJã?:ÙªVY×PiÉÿ”6ezúðò¶®Üfáê¥Ä| ½¯4>éoÓ‹ovsü÷.9|(ÌãAÓƒyMÂç%FºmwvÅY”)}Ÿy²Œäÿ23˨èòÙWT´X%1ÊTR~þ5Z0 јÉ,]=¢ó*V(°zõðâŸTmQË¿ ÅpR.¦ï} R!ö¾w©ªz¬–+ïnÇÜÿåëXo endstream endobj 87 0 obj << /Type /Page /Contents 88 0 R /Resources 86 0 R /MediaBox [0 0 612 792] /Parent 60 0 R /Annots [ 85 0 R ] >> endobj 85 0 obj << /Type /Annot /Border [0 0 0] /Rect [87.631 465.58 135.452 474.532] /S /URI /URI (http://docs.python.org/lib/module-readline.html) >> endobj 89 0 obj << /D [87 0 R /XYZ 72 744.907 null] >> endobj 90 0 obj << /D [87 0 R /XYZ 373.279 598.45 null] >> endobj 91 0 obj << /D [87 0 R /XYZ 121.633 352.473 null] >> endobj 86 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R /F34 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 94 0 obj << /Length 2581 /Filter /FlateDecode >> stream xÚÍYëܶÿ~Å~(pZÔ’%R/ºu€Ø‰ÛôCÑÖEÔZ-÷V9­´ÑÃç òÇw†3Ôë´¾1Ð`?pH 9Ãá<~侺¹zþFÄ婚›Ã&›$ð=_&››ýæ;ç­î¶®HRçùÛïoþöüŒ&ü"ðü0ØøÄÝ·á™­$ž’ÂòÀB3© “+SO%rãŠÐ“¡"Þ/[žFÎ}щjû]½;wE]ñ§®^ÑJÅž ‹êP¯HÒSƒæÏ`5:u³²Z{Q”<Þ£ZîQŽ«=^%ò 9Ö÷k*Å^Öìwy}:eÕž÷šg;Mm¶Û5z+"çC‘uz?X„>VÛ r¨snô;ß™å˜á±¦±ÓWÅ6p~ìuù@íYç²êܸA{±€<E¤ZwÔ'oëJ?vÞ °›+dâhì|ÌNçR¯˜ I¼0SCº±ï;eÑ­˜$н ²%96©ó÷ž•¸…=Ì,^Bì‡õsõ¥—Œ‡fÜÄ*ÔµÅOú²VJx¾NóþX¬î\9ZÙíÊzàüB.7YÕmQåšö†o4|@” @îì€2˜ ¬ÀùG¢þ…XV'ýÁÏË¢Ò]“åzíPÀp*E´Y ‘‰Ìʶfé]Öt-3P õ¾,®=V"œæ Œ¼À‡í@0¤¡œX§í²VWÙISÎ׬Y+À´ŽKÄÊ#íç©ûC}8¬Å3ļlñ8<Ž5z×}QÝÒ†JiTjiàÜW]Ù¨‚³ ÂêÁéÀ¹9<­>³»mÇúVú’Çø[cBì¶Ñm;ðwºíP!ã°û0IçÞpÏ^(ÖD£&4D[ ÚnÈ ¢j1K9-Ù(#ÖÙ´È$˜}碂3/Ë̦i¢˜DÕ5ÏëŽu{\,¿/wuó@ÝsfܸOíΉXãHpX³Mÿgà"=Ùˆâ~ £™="J–ÆÔö¤¬õ­Åm áé]?ì ú·÷º,M‰ lîP€¾à.5{½Û ßéoo‡¥§jEgV÷ªÏØÚÞDØD¸Ñxeÿu¥W ²’‚0wµˆ­½>PÀ*¶@@œ|Öàú7ÅN^W ¾í¨g&²‘DÛÕù’PÌÐÂà@ZËT.ZþLTÆ|ïÁ[X®©Yó¤Aêžõm´ñ›þb“29)ÇÂñ"'ïÐ…v6>Ø—jš&àÔyÆè[ÆSF¾ÔÒ‡¶Óç3y~¬ž÷§nÚÚd©R篴ÁIÌ5¼Ä\¹§ùþ4 `˜=fÕ­æ1Ј5f!™:]¼p&Þ:ê¯óEãˆîþ\ôHÈ+ŸÕ#ߎ¢|>UCfÜ¢S2¶ÂQs@€C ¦œCSŸFVC,BFÆš¬ü1 +ªÏ53½_Ãq4®mÝ7«UZF^Ç–ízE 㪡x?ˆç¾Êº¡o£Sõ¹TÅ!•§XŽå h“±à[ÓW¹( >ªUÀ€µ ‹ñ§<ß(ÓñÂÍ£\ „Iöðá¨Ëó#Qè"wƒ¬=YE½ŒXÎM½+õi>\x .²§w~Øïš|Ŭ!øÞˆéÜV*±ÁÇ}OÆÑ£\ËÇ࢜Où7€æ4ú,wà1—:ˆ ¨¸™Ž¦*·u좙•MçÈL37‚ N¥’l N²' Aøbî°.et4„Ñ â)·ºM’zA´pÓ,ÏÁ¹8eX¼Yðð@maág½ûàÑtwhŠ <¤\Ó’d‚úV¢Â*6cñ±Ù¡Z¦r~yÓ;!$” !B ‚ âá'ÓMùóæå§|„ÿ{M£fC~ŽéÂÓóýÙ?M¼8Qót±tG‡òd8•6§ ž†Œ!9îèqSfÌx¬+’hŒþŒÆ ~šgŽžÖr6âú– T¿Zú²Ó‡Ú²ƒuC.6Nö×\7¥IºE×XhRq1mÎÊÜp»ýoWnŸRzQ0ø›oˆñ¥¤Zf0K¥zŒ®Ýws§gàô¨ðLU…›J}™›™ØØëõÛ^¥&É©(Y$¹Cõ$žŒ/ ç²[òk²Û7h%íÑe[R ˆºz†rz-1wø–g&x€âÚŒu¬ë›Š§òê5‡¾Êùâ†MÑÎaŒƒQq5Cuª}aÃÑ0˜KŽÑ˜9ªé…L”À™9b9Q¼ÄÜ›ÄοXK)Õãb\ˆf`4üpæQØçs“›æ•ž?Á%‹˜í Ëï-/Al-/ã•ìŠm‡1È:¾z Á ¶*Ú¥¨MGØçÛÖ]ƒ›TþUjM§,pqµÑ§áf ôš „ô9À)×µn{áÝCÍUŠ ª"ÙECSXÀÛïøüÂbpçpʾ|¤ãsÐé\yÑ™·×Rð+5x8ì±ÂHfãkŒâ‹Vs²ï`Jq B´& —µtÍ6Ò“cŠzÒ2C^?ã¨9øƒ€æÅ!eÔKbe^{Bɧúʃ„ŒrÝñ݇úCjÁîm¾¸FtHMàî‚™IÙ¼6ÑmÞáôͤOM~Ôùݳæ¶ÅZ`ß©—kà7ø"Èôbëb6}mÚ™+$Ì\.×¥¾XWÝÆ7N¢ûÅú6p™?Stc÷úïu¥o {ýÅ¥-}Ú,°Y\2{‰pv/ƒ_bN­ƒŸ2‹f±RŸí›$µj_PÞÅBP`áÀ×;]íÍæ ÷ûˆôW‹‡ATø¬CI endstream endobj 93 0 obj << /Type /Page /Contents 94 0 R /Resources 92 0 R /MediaBox [0 0 612 792] /Parent 60 0 R >> endobj 95 0 obj << /D [93 0 R /XYZ 72 744.907 null] >> endobj 96 0 obj << /D [93 0 R /XYZ 114.291 710.037 null] >> endobj 97 0 obj << /D [93 0 R /XYZ 72 650.213 null] >> endobj 98 0 obj << /D [93 0 R /XYZ 72 595.433 null] >> endobj 99 0 obj << /D [93 0 R /XYZ 72 552.523 null] >> endobj 100 0 obj << /D [93 0 R /XYZ 72 508.163 null] >> endobj 101 0 obj << /D [93 0 R /XYZ 72 435.862 null] >> endobj 92 0 obj << /Font << /F26 4 0 R /F35 18 0 R /F29 6 0 R /F34 17 0 R /F72 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 104 0 obj << /Length 1017 /Filter /FlateDecode >> stream xÚ­Vßoã6 ~Ï_á·9@£ê·í×nW¬÷64ÀÝ0'Qã+³ë:ìiÊŠ3 DE‘Ôǔ֋ûG¥“‚VÚd½O2™d‚3®²d½K>¥­ë–+ixz¨ÚÎ7o´øÌ¹<ºº<¹å—õÇûG­F&rÍ “p:«)‹‘¦æLó|P}FWJò´;8šŒ÷몦ñõPmA×ÓØ¸­ov7ç·þt*ë .`MÊ–+#˜7<êa›f~Oã¹qKiÒo•¿´ÑÞ ¯‘¬‡Ð€‰€Ëºúj ´cˆ§% C 8¯‚ö×¥à©;w€Ø¬ÖîíÜwË˱c ô¨*3BUòœikc¤â÷ìü¶Û 3Y°†eF ê,X“b%‹‚ ˜¯¤`y®Þ£F[ö õ7 XÔd¨%4SÚÊžhä¾¼þ3ã5göJ¿ßÏ„.,3E6!´y‡ÄÕ/´î³a3" ®Ã"f5kÒtKaÒ¿ª³auúkëHþYJåkø×¤ôÃHº9ãÁK6 ã™J{.F3{ "3&ýÞà®j{‹=Û«ŒgS²Ql€òoK DèþÒQÖal–"O_.'Www×äD`F¤ðwó¹‡rîƒLšwS_ý=׬:Æ$Õ—ÓÆ53¹Tã…˜æÒÈ€¦d½Qq¶b£tTçw$©˜c7'BsÓzÙmÃaORªVw&iIC ¥Ë2{Ûü>öú¨²ƒ„<ð!LÈT/nÚU⾫1ùߪÆ×˜åñ¡¦øsÛdΊ,VÞÏOÏëç§ß?̵çŒårÐ òÍ4Til RŒm¸ß$Ž ÝjBÍrNqŒ§~#”¸!ݱª]×”Ûwû °NäùÿÑ_¢Î^±Ãa6ŒL| 8)>0 $gßV]Õ÷Xá“8¬‰µ0Á;ÑŒ¨‰O®ÅÕÇÁ# ¯ÁÒÆí}ŽP·Â?·½tTÝQveçÀ@­lúðF4źÌoºÊôµQj¸+ÌhÔiè[HgŽ‘ÜõªŽ4BÙ¬Â`ËŸ0ÿcöÉÒŒg±G¬V”ÞJÂû£ã[õY|=¸š> endobj 105 0 obj << /D [103 0 R /XYZ 72 744.907 null] >> endobj 106 0 obj << /D [103 0 R /XYZ 72 720 null] >> endobj 107 0 obj << /D [103 0 R /XYZ 72 626.974 null] >> endobj 102 0 obj << /Font << /F34 17 0 R /F43 58 0 R /F29 6 0 R /F35 18 0 R /F72 73 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 111 0 obj << /Length 758 /Filter /FlateDecode >> stream xÚíX[o›0~çWxÑ&­0ÛÜ«’‡v­¦I›vá­‹ç¢È€´Ë¿Ÿ©MÚ0°ÔN]Õ'ŸcÌùÎùÎñ—Ëi ¼»0,àêžm› ˜„-[°=O‡Ž ‚\Ž_O4Âñf—DÜÒ´ˆ”4#)müª ±p–$ËWúfÇ=<™‚ºg‰€? ›cǘyèx¢!ÌŽŸ¤y²]Óië-¿õVœÁ<òh4 òkZ”ÜÍç|ýPÇeÏEhᲸX¥›¼¨¸]îÊ^KÇâ±:ß#´™‘£è(æñú`‘4¯H»¸aXw8 }_ Ô¬²0TàJ󊱬CR,JM³:"ãVgþU®wˆ)j6¨¢\ŽÎíW>__H–tŸÁ8q¥³sEv™oô†ÇPú Á¿?µ÷×…‘40cÔ¬ªØ ˆ/¯ l†-³æ!z´Êªý‘ºD³AS…i|ç±"“Ö<åEëaC8„ý”Ò”H¤´§#BAɨ±¢[+Ý£FÔ´3²^óckzE… 杖E,â«Dvä«QcǾ«](ÝÚy³ûøÂiKaÚwû­¡VS´Ô‘dfº­â4ÔðÝðÛpÞ5äšÖÑKt¯—èp/ã½^F/½¼t¥‘ßL Äýû”_‰/RɪüÉ­7B™«¼ñGÂàKélº=˜´ãƽõyRõyr„îMç7Zm !ó"O»&µNî¤ÚmDeêç<£sÕé ™|Ôržß|DOP¥ì–Ï[Ùl$ïaå3îø($/òù¿^øI]ç)ŸŠRÌ?U’'öÕþ†º²b÷h1=–Hƒm*çòKAì8X¦ŽmÄ©r9ƒ aÛìEÝð\p}s(¦í²u ¾+_•Óú/(lO÷l¶ó:„‰u„0a—Û–kÏ–dSQöË ;îé¬&ŒÇÁ’òóßÍšpïË®Zæ·ßÓh‚áx»X°—EÂàhšñ endstream endobj 110 0 obj << /Type /Page /Contents 111 0 R /Resources 109 0 R /MediaBox [0 0 612 792] /Parent 108 0 R >> endobj 112 0 obj << /D [110 0 R /XYZ 72 744.907 null] >> endobj 109 0 obj << /Font << /F35 18 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 115 0 obj << /Length 2938 /Filter /FlateDecode >> stream xÚ½Z[Ûº~ß_a ‘XÑ…¢¤¼5=Éi ôœÙ I€Êm ‘%W¢vë¢?¾3œ!-yåMú²¤†·áð›«÷ÍýÝ«wQ¾Êý\Fru¿[åÒσt•†Äéê¾Z}ñþ\Uu»_o¢<òšºUº/J&Ä^7êÓ¨ið±n¢M·Žï‘è}´4vîÆžè§¾Û÷ÅÑ_oDœyŸÚF ¯¯×¡‡G„^=ÅT­N'ÇŠ>ôݸ?ÐPA ïør½‰ƒØk»þX4Íyýíþo«`µ C?Oº”>ঘSÛuxã~¯z¢ÔÈ„ ½ÖªŠh] Û˜^¡©Ýöªø~êêV<¥§ev‚;÷áµ-o×+=ö-Íïv(Mrµªêž±)δ‰ˆ'›¤™Ÿ%1Jø¨Š&ÍÌBù2Oì¤ß[£ ]h +еK„ Ô7¢ÅNY´Ôù™ö±Ö7Ÿg_!(õn¶(ÐÈûÔšÚ‡º 7»¾kõF…ƒÏ_?½çùƒ‘ñ&•¾á\9èÝuy@ó!ÙPaÍ ~¤"âÉØÎß^ hÎÒÜ»_g{šRq‹WD àåEÛý“6™Š;Œü0²â6/*ƒÙ‹â' ìéK剹/}Aç>j{©SO & ±éÊ‚Q _[µëz²8ÍOe8G¤*p·HäÞ‡3˜¥–úNéÓ<&´ðRh¶‚Üû;¼=HéLôéÁ'</hêïøоZÐéZîÔ|Þ¯¿}¢ÎÛcQòZ4°OÅÇ™‡¹JUUK|:=`W†ü«¢ºbʼn‹D”d~Gs(‘¥µOˆåÚ¤Öà µÑ|eÙõèaÁÃÈÄ»aUo•’\c€ÖaÉ à€Î,Ê_£(µ¯„£ð ë®#ÒÔæ™÷‘ÉÛ3Íã0D*ŠD2JD%»idŠA,R ú&ÛC”¶Œ-ø¨)─KVy$´D©û¤ñ“@#P…:nĬ¨g5Í:RKRx$'jÙ&Á IÎ'½øxRe½;ÓHAS¿AÜŒK…oÐŒº­êr2„¯¿`ÞÛñ¸µŽÕzÉA•][YïÜQKÖ©ÆgŠ¡÷oÓõS¯[Ozí lKa° øü…ô#)Ÿ·*üVØ ü„:¢&|Q§ †Ø\Ð¥=0ŽüYÀßs(p©¾V­uR‡¢aSIÌÃŽbÛìãúzÐ?tò‰gôPÿG-xC!ü,ræE3,Ù áƒÖÛY•fÎ.êÅ{^Ì{cËÏ·—À8!…³fâ© 8tÂÙ —“¾ܤ²;æ£âcC¼KxCj¹Ÿå7¤Öí÷¢\š@²;wõ<Ì‚WKüTÄO½ÚÍ}eæGBØãPìÕ"×!¼ZÛ`Ãe˜ÞàÛ†©fƒ4Z…1™ dànÝþ»pÈÐĺÝnÛPúIî@ñ¶-¶ Üj)˜ý ‘ÙZ¼Pûq”>ÿ æÌOÔ,áXF€c':šÖ‹±Ç8¾ß&`È-Œ~¹ð–Bú©“Çé\mo€Q¸]¢˜$Ö»&ÂÛwDÑÜn;cza„% ©þX·EC_ìX;.P t?Äy$PCªÔ—‘C_¯ªºW¥^Fsœ¸`ÁDžp:9ãîE˜ûI”,EŽ-?Ñåªë½ï,›ó|ÄEp‘é«>kÖ~éÈÒƒ‰¤úǾ¶1Ȳ„AýüGý„¤S$‰(ü’@Üâ’ZÜ‚(h æÁî]œN&‚Ä>ÊÓ´(O3`dQ|a Æ|•½Ùƒ×2R?ÏÃ)2ð<þ`Ç`á’ Ž}ˆÀ˜ÄPΡäñfˆº^Üfl{oNÞ{Š.¶äLÛACd»l~R?LcYöÈúu˜y¨J¦-õsËc^ú‡Yc¬¤ ˆ…Ï«\þ„µJbùÄZÉØZ+ÉÖ (FæðÍÖ )TìSkd.øXk”™µJÂ›Ö r ýœµôÖ;VœúAp…,Jž]$ù´V‹õ‰“Mw<é¥8,ó“н3äß0m3èþF N=ÍG“}äù¬Žðb F“Èph;šC{Âc¤0Žx¢…ÎdÁäú°Ò¤?𽘴]ô5H‚5hÃ%¯úÙ%zAÛRâD€¸¼n(ýâp‚(ݰ*]øO)hgóÄ¢nwXÿœÔàÚ…(Õ½§Š)ìŠv¯†—6ŸŽüÐbúÐ Ùê2õ+_&cŒ¼rì‰ØêæL$¼d{üHDÃä[ªMຮR4ïÑl›yü9`:†àäYÒ£LœÀ€²mŠö;Ÿ?™Ž‰nšzï¨:w숯«sž"ñ(pܱX¬#—x&ŠËÖ,Œm½’ínÔ£=dªLEUͲH¯ug뢜†`Ø8‚¯ç‰Ù*ºwcUµí´ÝþaqÚS—XžÀÀ^ûGñGòÄ5 õ¾<¨òûs^@Æ+Ĩ¸GŽÇ¾%¯$\%zT›Â²ã8¨ÁŽ*ê\•…f:ߺ\¯ÀîuíZDóšWˆ5õ^ZI …ÜôAèUcÇ—"A$q~UŠ$ 4èH±Tv¤Á°³£VºAÙ®ùå!áŠIÂ%h·<ƒŽçM)ÛLí˧sq$‰]zo”žl÷>¼ž1œ†aßZÏYœ&*¦Mx»®Šðýû±m]åÄì[Vã«\å¹üðÅ9ÝÍÌ›ØqS:šÕ”R†.»ãJÏò,¸nçŠJ\*º¸RWSB7Œ½²Lú6û¼¯.¨æ9,š˜®Õ}װ烈x.6ãTôº.Ǧèr²t1ª-»± Û_k\(0º±©¬·QÀÁ.ü‰ß®óÓǘ£–*„—êÉÔ@•9õý²äþ!»tHÆ}kkŽx Œ"ÈTÄ•¢(žëSMÿ÷vfå["*V¡PG„‰XžB)^´!e‘Ÿ—¢m>/Yd¬ˆ9³ÎÂᓔ荒œ(ôå¥j´ù¬úžnúl¤Ä{Ú™W%2p>Õë׿¨ήZÿì%,Á%å§ ’d‰e¦§¿#C@f*rƤ]tJZ_,¤“E`]H{u—ÈSñ#¡'Ž{.ŒÈ 2¯y±n`P`3°àÑØsÁ;1¿i;íÄ¿JJdb„Ÿdô tB Üµ/0Šç›£Ÿ ¨Jég™˜¤‰Ãâïo©v=ülñz\s-šË‰`Zê ¨û †ƒ˜ã´ä³Un“v[â\ª¢^Í;ç4©…[c}Vis™Ü2›ÅPI“—`ºÚ<]õƒ+OÌíõÕ~ë.Ó–¯x(¸ú¿Uªu»ûK»]ç5woïïþu‡0 Vá ‚½DÀ;¥«òx÷å[°ª€ {@„“­ͤ#äãhÛ›ÕÇ»ܽ1ÿ‚"§?HG+êˆÎä8Š"ï—¹ÛL3ï/dÛèÖ`ö}!>ä–¹ÿîßß endstream endobj 114 0 obj << /Type /Page /Contents 115 0 R /Resources 113 0 R /MediaBox [0 0 612 792] /Parent 108 0 R >> endobj 116 0 obj << /D [114 0 R /XYZ 72 744.907 null] >> endobj 117 0 obj << /D [114 0 R /XYZ 72 653.355 null] >> endobj 118 0 obj << /D [114 0 R /XYZ 72 501.282 null] >> endobj 119 0 obj << /D [114 0 R /XYZ 72 482.622 null] >> endobj 120 0 obj << /D [114 0 R /XYZ 72 441.915 null] >> endobj 121 0 obj << /D [114 0 R /XYZ 72 412.73 null] >> endobj 122 0 obj << /D [114 0 R /XYZ 72 347.585 null] >> endobj 123 0 obj << /D [114 0 R /XYZ 72 289.807 null] >> endobj 124 0 obj << /D [114 0 R /XYZ 72 233.325 null] >> endobj 113 0 obj << /Font << /F29 6 0 R /F34 17 0 R /F43 58 0 R /F35 18 0 R /F72 73 0 R /F44 59 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 128 0 obj << /Length 2388 /Filter /FlateDecode >> stream xÚ½Y[¯ã¶~?¿Bo•Ñ#®DQ·ä)›lŠi7Áž"(²*Ûô±°²äê²Îé¯ï ‡¤$›Öɶ@_l‰‡Ã™o.zûôðæûXx+RžzO/ã^…,Œ3ïiïýâ÷rØ< ýKµŽ›_Ÿþòæ{ψIê…D¾këñÔôDÇ‹]\°Ü’}0\›ñ´•=·úß訆 ²ëé}8JzØË톇þøül– Ǫù¤ÉÊN“U ¿ºj$C¼ IX^Á¿ I~Þ䡯–ußZšg=úþýËf#BÿsÕµÍI6ZþÏžÀÎU¹­5ù·ïøû_ÿöi¤3\Àþ™ÄœEE¢Uql7Qâ_`u–ûÃ$¤•q2W^ÈòDíõÇöâ`ÏcVD†EŽ[Á²T(QbQí7u½ boÿ•Æã(õ?rÃnxÈ < šÞµ§SÙì{zëä¹ízîÛ“4O4–Z¦ýP£^«õƒÙúXâÕ~FUè½K³Y×ÉþÜ6ûªy¦!%•nÒ·´ÞÜ¡9Z@w½jÝÓíÕ#Ø…`–ú#ÆYL‡¶»2ÃÅöÊZÚ±s=—ÝÐë{_øìÊ3–䙽¾ lv1f‹/Ï.—‹xl}FßÕ4¸>÷ŸÇÉ&ëª Qi¼7)µ§C—‘étù~\F—»˜S¨bø+áJù¬ Ö®(WuÇQb»b“PÚ4ëÒe(_”½Nqñ °Ïe•åîxUéÜDSÚjUæ~Pè0hHÙ^ û®:®oÇn7Ósï(l"°¾(²îr)xÊDh“¬K…EÃ2ÓݾØDMeºc=¸M*JY®&uKãÐ>ÞÑD?‚[¯ðî“ÊΖ*1¼ojÇÞfŒæ2)³P“2½®*šäYÜ §ˆÓpí4i²ÄfÓNm‰<0ÍW=p~"íã¨OÀ†^³õÝ•ž-bnù:EÔœÇ}ÒEàÄgü‘Ý¥«—°Q6Yðßš®Y›´ˆX÷Ër¤<Ÿ¥MƒMâ6QûúY`+‡=«j°=ׇ,¿W«¸oá6¬B}ÌÝÈHìWŒ¥¯žwG¹ûä’ ,-Nÿ»tÀVÈ»¿*Û!3ëaßYÏÆâŒ–IŽÆjŠ««©Â2äáX»•AçY¹*m…=‚„Ɉï_°ÌOü¦=#¨¸Šž÷ÃhE˜’ÎÔªÛUvªêR3†Ÿš¥v«CØKÀU`w»ÆáJôLI¶o€cUOÿý&òu/€vëèß¶@ÝY–úï›INjÔe]&ËœD§8Á,deQh×a&‚Ë。Ÿ]n/˜ÖµbuŒe6 ž³M (’‰«ì:8¢£‘ANh¡öÑâ‚CPå,šqüê«ï$”o; &Ž,"a©ˆVQ> endobj 125 0 obj << /Type /Annot /Border [0 0 0] /Rect [241.732 488.258 289.553 497.209] /S /URI /URI (http://docs.python.org/lib/module-readline.html) >> endobj 129 0 obj << /D [127 0 R /XYZ 72 744.907 null] >> endobj 130 0 obj << /D [127 0 R /XYZ 72 720 null] >> endobj 131 0 obj << /D [127 0 R /XYZ 132.851 661.902 null] >> endobj 132 0 obj << /D [127 0 R /XYZ 228.767 159.34 null] >> endobj 126 0 obj << /Font << /F34 17 0 R /F43 58 0 R /F29 6 0 R /F26 4 0 R /F35 18 0 R >> /ProcSet [ /PDF /Text ] >> endobj 135 0 obj << /Length 3081 /Filter /FlateDecode >> stream xÚåZKܸ¾Ï¯èÛªƒY$õ ’Óz'»‡Û@ÔÝìieõèèa§üøT±Šz5Çk { r™"‹Åª¯¾*ÍÛç‡7ïd¾ËÃ<•éîù¼Ëä.Q©l÷|Ú}ž/fÿ$£,8™Ã^FÁøòb:ìÑAQUí^&Á—žfÜÚ‘†–:z3ðÌf/’àF½ÍXÜí™ú)~¾¶e3ôüÆ@m¯ƒ¾¨YkU¹³l¦;ìÚ—®¨Chå) ß¹©,dÓ—²y¡Î±û±¨öŸžÚE»'!Ât‹†.*ï3ªáõ×ms*‡²møí¢ïÛcY æDí/åpq"8£; S/®KÅ"èËúZ™~À– ú¶¨5Ž¿³¨4ö{3(ÉÚݨk(kCI×ØÇº¦¼~¼˜žæ,ÃÕËQ$ñö ¼:¸›DÇÁßöBDš ¾a…SŠªooŸonE8ì›wq¼0ÕÍMÚ£©+«Ž£P‹Þ°3Ï-ž@äVNø™u²‰4øžúç¡I&„Ýÿ­Zç÷ß¶meì aPoÿºv¦ïç7yŒuO¬»Úš"vTEó2/f-Áâ–ð²Ÿøtî”NCV¡2'[‹åî6áOQ`L=u[Ï¢ñÀØ—ÉÓèâ³Iø,_\<4拇F9<îŸbרœ¾úV?´W~§mª¿}žEó¸äâ\èp÷6ç¡L§‹ºÑx¬A¤açnùÑSš„JÄ[o²žŸ¥û%<‚f;îzîµx¿cOàĦsN mk|ø0é|?å©À©¿ƒN¼ÙM-ÂS_£ñˆ3C. |Ùƒ3 O³ŒÓAË<~1Íæ“`>];Äû\¶ÐG)Sêþ‘‰–%DÚ€ØWnI¤*&§÷Þ“kßÞ“Ð2Œò„/ŠÅ}‹~l¬@Ô! l Q±<3ŒÅÇÁž,VdÀ8©.nÄ” àø3!ßrã%$ g7nu= A9’n~Ñ*Éz=søÖ÷€\× xO-6„,°¯‚Óݨ]·4²Áð¦4n!:}Ž)r½’ÍÆ‚qC th¥trò¹C[x¸ŽÝµíY$«ì4újÌcä O¢k+_án±ežìÚ_ŠÎ'/WdÐTz-¿Ò Ó1@XÂŽ5•Ó. àSA3V„RSÄÄ_H,'¿¹ñ §Ñx«pûÃÕñ{ ?ÁéÝ(ÔËXK«íXKCL6Ž+ !OÐ5Ý{Γ›·!Öˆ¨!¢"Îpæ²dóDR)#à!°ŠÇÓ]˜œÓ –HÝÑxüR‰0Nü¯ÑÚ$ 'Ì3YtZrp,d¡ÎÁd&1Ÿõ€€dµ ²þç¶q¨âTâ«J…:Qn8œ«Åê°d»h$àemIyâ qÛ~Q‚° ;QcJüaŠeHvªa€O°åtãŒcÇÙ±JذBâ‹óªÄ{Þ 2ëçîzW6Eâµ+Í'Vtb•L'V)X1X9!)Šª„Y›.ÇÑ1…ä¨Y= ñÀêCMT_Í܉üìvÀ›c&,$1Y«lR2À#QWJiL9 H"hŒÑˆ€;LÝ Ï,¨}l+É¡Çæˆñ.U_,³ŠHŒëv•‰Wé”÷rû&P‹è‰WjšxÀ&B^оùï‹ ï`(,*`¶Å‰à8nf@pCEJÁŠ„îio4Çž^ëMÑa¼¤^g.+ty!tÄþÖ‡×Tè):äÊ9{±»3·Y8IÌÉ6n¿ŽâN¬Sµò¥!±”s¼¥; -{„´€g] ¸”Ç‹ \Õ&]s—áá >e™Ä&‚Ï\ˆ©ÄHh¤¶¢IÈî Bw-ŠFí©`KÎË83õÒ(òojoË8æNõ-Æ`ç¶ÎAãÖDñKvÞÁœ‰JÍjN¿âÒ60ùä;³ƒ ®Æ$1þÞƒæ+=÷;cê0â}˜U{,$Héµ%W«\ØýÜ•Ñ[8%.-[…íÏ][û•LÂ9t\½yÈOZù'º4U‡ÙqŠdÔZ ,{úÜ.RaMéÅ+°Û\©™‰ ÓTJêXÞÛ¬• n…é’9sÊÇ…*´ø9àŒ~3§Eé¡”ùä{ç¡ !è{©p…(ƒ_Y+ÎïަyùI&3gz•¢%ßNÑÒÿž¢é_‹¢eßLÑò_¢hÙ/Q4ùëS´ÉŸ÷XU}m»¢³©è2 ÇZK$'`ƒ1ªC`a½n?OA‹qhkÀ¬@ñZ6!#cÏ“0jSÐÛ$†3QÁ¯å°HxÈŽ×Yu™W½¸èÝPë¾`ìIn„ ³Ù_K΀­j­7¥?«0µÑ ½Xüï¹ñ±BDŽñj²–gÿßÉä´yº‘ie9дÔ¨s6¯WÑUp]ûWµ °Úµõ,È6úÒ÷+΂,•¶›˜íÌÀ <²ÿ>Ä"[ûßtdðóÔÚÒª¼šÿÍwô@ŸNìuç"b¦­½Û^šDrØ5™âsÙ/ª«ttÜN2Ä)«o•8·dÙ\yx¹¶u}œtDu#r²ø>âÔhubÁE[‰sÚH$’#r3*@ð¥l* Á˜ýž‰y•õ¶,x´<•¬ÄˆU,œŠ©³äíW¢zÎy÷µ·˜XÎTrë®ðs’åuRÉÓÞƒñãb~Ãêï$*·_g*ÎÆm ñÏMeŽÓçæs7Áû„¦«Œ.a}†d‚Gí>æâ“¿Òü Ôë\ùd°^ïËÐ|Šv'膵C•ëÝ;©ÞÅ)úTµ{ÿð—‡·öÿÂÒõÿ…ÅÒ~.±r ñÝ?¥R¿_ÿ_°‚–')xõ> endobj 136 0 obj << /D [134 0 R /XYZ 72 744.907 null] >> endobj 137 0 obj << /D [134 0 R /XYZ 72 494.229 null] >> endobj 138 0 obj << /D [134 0 R /XYZ 72 364.75 null] >> endobj 133 0 obj << /Font << /F29 6 0 R /F44 59 0 R /F35 18 0 R /F34 17 0 R /F43 58 0 R /F72 73 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 141 0 obj << /Length 2450 /Filter /FlateDecode >> stream xÚÝ]“Û¸í}…çžì™5O"õ™›f¦ÉíÍ\Ÿ®ÍÎÜC’Z¦m],É'ÉMö~}Ô‡ÍíºMÚéôeE‚ €ø"¼oï¾ÿIÅ‹LäI-w‹PÆBÆj‘ä¹Òlñ¸]¼_~âà—§í¾ájÁrÓý‰†ûb»úøø—E°X‡ÈcÞó1NMY÷„Æ;Ãó²¦ï®<š8=ÝÓäXÖ –‘˜ÑÏŸã©hªJ×Û·ýøt2XtzÓÒàóÁÔÑ®/yÇ¡ì™ÅÆqx2íÈ´—Ù‡zËÇ”ýFúRÎN?•õžÆ¿;>ý;So¿óÒ|]Ö»†‰4…>zå~ ÛoÔž™ü}”e3C‰Ÿ;Œ.÷•ÌðÄW«u(Ÿ7™­Ö*@ïfºzÍôê›I$_–H}•Dù·’Ö¿ÿIæ‹£Ü# ]öÖpi¾S£e[Íñجd¼üL”=Á˪2ÛR÷æøDëV<£8*Uä H6Û ‘ÃTäJ:œ€^&—ýA»£:fv_"#,7jv­òPH)AÁ!(8&5**CÂèf±Èò„ÞLQîÈ5•B‘ìN-ÒJkºs5àDûbY(Î}ÙÔ´/µ8·­©{Pȵ¤ … ‹¦îËúl<ʈR‘ÉÐ!Þ{hÅ"Ï#‡Ðõæä¡"•ÈÃÛ©ÔæKÿõTZÓŸÛÚCGâ“äf:¿«gez‰H<(æSy‘Å:Š‘ΊØ@´3ÕÙa"ÒdØÿû¹ì_:ƒ—TÙ²7-ظ ú˜ÊÁ - æ†Ðc‰9Áº£/Â×½gÃçUŒ¸3·À迆ñ7>ûT!D »ÁO•Ãû’åã¡dyJæac }¦ (ãÂCg“¨¥¬ žš3Rr9zÁèpf  ¥<Œ#MŸ®¬NGCTk"ÕÓ VïcL˜8²e¥™?S͹î ã뺋ãÉO?H™~>”Åa6yÀqKAé W2c7@ʾ£]S= ^4A›¸ç¡Ñ[ŒpÒs¤Óզ܃-–†IéMsîiHL dæçÊ5ÞHù3š_±f`€wkhÀ/LEÓÚÐrÐÑ®š¬8ODÅóK=µ€o¶èaæÜ –l8±? ÀÖte«7Ö lkS„§v´ÂKºedº(E‡ñA:L`‚@|ì 8,²å`µ® —r˜_{«€PÛršÏtIÇhlõñ´ÖÆÙÀZàüº?€¢Ù^Éjb|!0!—ž»r϶îäÆÓf7‚V<9˜ÀZq@Í“ñE³ê)y‚ ¹ÈTJ2lÍÑôc® #,°¤Ô©PYê¬ð=¡DjšŽEš›S}®6 ©(q¢þuRV"¸”púñÐ1øóqµÎsøë Òã_WFQ`«@üt']˜ugNº…L±% !ØïôpN c1A´/ µ´Ð ó=\v­Cˆ(‹çÉÕ±5D) F¹‡¨_»HÇØU[Þ:³`+À °Á`êh 3´.Âéî“3ÖÚ.T“FúÛí¦ì¬ÛznŠs•eÿdžó#ËIQ²[†áEÈ‚•iI^Hó’¦-WƆkœ‰`„Æ6§Lp6¶Áˆb0¢dšˆEŠéQjÏ‹²9!WF×-Ù· | ½k•Ùo±¨b±«$,ÀNm³ouÅІ€˜GrU˜Ü3ƒMú¹>–Ÿ0v1qkÔϳ|?0ê ÅððÓeÍÖ_ÖsLîV¥³êªWOšwoÌèK­Y£w˜ïýöàJø^ D˜|Ãà*ÿ×|ä¡vYÝ›¹XëC¢~F©aœ‰0 çZ…ÜØØh<²Ê\Dã›úÆ[èzó$ Ú¹ÖK.Òxˆ†ïŒõa÷Ào°ÒÒvH•tÊÈU8Éçþ ¸,lã…J¸'[ÉÈ`JØ–bðmª²‡˜ƒ^%“ñ”kvlÉà tñP±„à‘cÛ›ø†°a=½¥~›Ó·)oxÜvc•8¶†ç,$Âá…ü ‰yuû¯ #î_xˆ8 •Þ2ƹÑG—]’‰'gV¦"FÜ …1¤$lÿmh1Ê4[>|Y©`ÒíH©Û1<µ'”Ã8a˜zš3d&’\^·Î&(‰H¢ÔÓü*:»².»ƒR¤D ò)%ÞÖâ¿C)}¦õ:£ãs0¾«I£òZOêvž&½Ê¢ïç~0ˆb%$€ÐÌTä~eR½%QÁ°`­A¶är8̳Ic†j'ž¦‚!©”GÚläjd½¾µùpê ÞnO«„³µZþ\;̺o5µr‚ܲ‹Ö{ò0ë‰çü‘·+þ}Í63\W£ë!paÚšÜjáæ ³o#Oî2ëØ.HSÓF-“6NDWtihñkF½J\k€ÉÂLk{›>™µ? 5í'1°0'¼6_βØöH8Ûu[¸ê-ý!³ð¿\B>Œ=I|¹Ú ü# Nbû+ëýü]–PooÜOú=5õ¨j‡YSš’ ÎlO¹ä>l,®é³ƒHßÈÜ´B´ŽYS·\$Üò·™¡ßð§†ü⫱1»ŸŽ½o¼Qx˜8v†–ÆÝÃãÝïwxUÁ"\@½GBÂ5ÕÝûÁb `0*¡òlñÙ"U‹(A•ïîþz÷ÿiîb¼ õNJÎX»¢Ì—oúD qÈMpø:‘rùh¹´ù«7õÖjf¿<õ—Æ~4ô8Þï©fBŽÿœöx endstream endobj 140 0 obj << /Type /Page /Contents 141 0 R /Resources 139 0 R /MediaBox [0 0 612 792] /Parent 108 0 R >> endobj 142 0 obj << /D [140 0 R /XYZ 72 744.907 null] >> endobj 143 0 obj << /D [140 0 R /XYZ 529.21 159.581 null] >> endobj 144 0 obj << /D [140 0 R /XYZ 72 97.694 null] >> endobj 139 0 obj << /Font << /F35 18 0 R /F29 6 0 R /F34 17 0 R /F43 58 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 147 0 obj << /Length 2309 /Filter /FlateDecode >> stream xÚ¥Ymoã¸þž_á^?¬ ¬¹I½í¡zí-Ú×k»ù–] ²MÇj$Ñ•ä˸ßÎP/Ž|IÚ/E ‡ÃáÌ3Ï8ßÝÞ|ø$óU.òD&«ÛÃ*OD¦«4 E¨ÒÕí~uüÍöf½‘qôÇ¢§Qyð3­)ö4Þ›íZ†Áùþ¾lîY¬£§iŠmeöïý"Öטu?³Î®/zS›†_ëâ‰[–.z¼Ø ãà`Úa Y#Ö_oÿúá“Ò“sm¤vÛD0'c:Xó%ŒCósˆÖ€/"-”N$.’©PYº IúŽD´š¨Õ"M=ƒ!Kz@Ì }&Niœy?Ú¦/›3ž9Írþ1»s_ZtA>™Š$È™ÙÌ™0]• Ï;· ‚0Ø[v|=œ›ë…Oî¾`ܸ;š=MÚöb§ùšÖôç¶éÄz£ò,¸!8áj£#‘F18<yÌŸ^Ù”)0xkúGc|I‚ñÕÅïdnL{÷4p_ .”Jä‘—yGš‹f]+Þm8hízsz¥Vt*¥\À™%õ*‰N_£þR×ÛoQ6]¹g7ôØUeö4ö×Y¥” ee®[Źˆ¢äðã<MÇ÷J‘(9¿`o&£7!À#æ\cжzriÇ¢UÅp2L 'N”ئzškº#ùÀÇÈŸØçà޼‰b‘ëäA<3äå)Až›aȃñ%ä¡XGŸFÈS¡Ï˜žØ oSȃµy0¿eiwøPðv7Xɧc…É×ZÁG­X¡·ª‹·–Ðiù —~Ý÷«ÿè6]8@Úâ-:nWxˆß —ù°Ž ~,èשH“è-¼\’\HX3« _ÂP6ew\Ò˜ ©õZc™[@ëxDëC‘Þ@uy¦„Ré,8?ÖQT¥Q$¤ˆ_]÷Úuñ › ¥Í•*Êý(ø@™ :S™]ï’ßúb÷€CÚ¢f:{KϲïHÎaD»ŽãKF˜9¶¶òKë¢t˜kZB^ƒ‰1ü@ƒD ­9€{’xä­Ÿì™»ñ–àmvKòr*t$çYá«m<–ž`Ôšîì c‡ YâËb2žÆÓÄÎ cìé‹õÙÒî¼m-DLÃï®ä³6ýѺì†ûox+X3Øæ­iýRÊ_œÚV~;K{ƒ“i¶­}`z®æ©Ý£²v™Ílž‘Ãcá1 òê†òÁÅN[ˆÁL¨8Ó{Æ ½)e1Áy-'S"V"ËD"ËCÖ%“k|PÇ"‰ÚÝ!ÌE˜‡(RA¨Í‚*Zçû¸¸ŸHU|A¯ÓO¬{%©TÎøg"B)½Ü/ Š2‘„ÃÁ4Z0I¦çÉKd6J§Ïáñ[äŒ>dQK>(‹•Îó‰-¡‡“-1ðÝñ0TÚ8Þ 5ó$ eð—}¡ZÈ Ðé~ûžçÁÉv%§zµŽ‚ކ÷%ÖÚŸœ¹È±džO–z\Ïò&„ÍD¦sO¦1‹%d?_òFä(y”¸Ñ΃Ž5wééê-L¼¼3}?N²˜©O¶-Ú§¥|ŸzpΣühâ ×wÑÁ='š»8 4Øý‰œÙðÓ~‹üª`oº^œÆ‚3OéâÐÿ(±Þ}œ‰å£ØßA!ýÄJ«²sý/Ä!´­si‰2ùío>lËæÃé H³¤V‚ ÁÍï]°£Þ’ =Û¢¹GþFï£ðªy ©ž´ud€ô,Èi6l"÷M_¶Øüᯟèäo80ŸŸîîû?}}“|¿$9x]½Áëåï¢0 ¯]äë6¦!ÿ?CêŽô‹zõô^;À•[Ýlþéú±Íæí_ñ—_ÊŸÖÞI¡ÿ²;úý×À1&my4µ}Ñz„{£¯—.u¡Æù¬WP[òlöSŸò¿èÒˆ§ ¨÷÷ WE\ª4ˆÞcP¬½öÛ—Ú rÁ0e¨½µ¤Íð|»i–b_œïô¹d;Žî÷8…Ôärèª#ZgÚÊ/"m¡³Ð#E¸Â>B ñ”}|»¨ šjùB™Ýh ïôÞ³FŒ¯ó?êš½¹ ’Tp—XÈBU¡Š•ÄÔFÜ|{óŸäNá*ZA |K&éjWßÜ} W{˜†p ÂâÑ Õ+ ¨VŸoþqóûOY29¨ÐRMa”ÛO)ƒ?M£ÚÈàªë«<†¬Ž¡äŒÝx¤¼uÿøQ#ý endstream endobj 146 0 obj << /Type /Page /Contents 147 0 R /Resources 145 0 R /MediaBox [0 0 612 792] /Parent 152 0 R >> endobj 148 0 obj << /D [146 0 R /XYZ 72 744.907 null] >> endobj 149 0 obj << /D [146 0 R /XYZ 72 703.895 null] >> endobj 150 0 obj << /D [146 0 R /XYZ 72 632.164 null] >> endobj 151 0 obj << /D [146 0 R /XYZ 72 598.316 null] >> endobj 145 0 obj << /Font << /F29 6 0 R /F34 17 0 R /F43 58 0 R /F35 18 0 R /F72 73 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 155 0 obj << /Length 2505 /Filter /FlateDecode >> stream xÚ½YKã6¾÷¯0CÛ@›-’z.vd²3Èä4Á4ÃÌKKrK;zxõH·ýñ[d)ÉVwf ‹&KÅb=¾ª¢Þ<ÜÜ¿“þ&aI(ÂÍÃq‰MÄ=æÉhóm>mû¯åi÷åáçûw"ÙpŸI?šNxLpã!Õ'$ñ匓Ϣ(²i;6Ã* ³D_ÁÄ%aQ[‚ù°Û‹0ØE®þ¶Éw<Ø>ÓtU6¹%PR<•U…sZÃWôOžŽCž!ÝÐ.©ÜÓf¬y‡ã§¢L $({:ý\"Š˜Æë矑i-95N[€>S]™÷¸‡Òâ>í¸·Ug¤8vm­nöR†LÆþfÏ9K‚Y¡ø·MǮ˛ÿè Øn/Ï›3NeùѰ«ánåœ á7œ#î´e¼Û†„°ÚÒC´ŒŒk™ÑËÂâH:hÒ˜ žZº4&Cp1nt0 ’± #XÂ1êZ5Úò1©µí¾ÒÚáŒÓYÙ«¾ÏëÈñˆKeÓݘeÛ±±‚!Ç3hÞî ±óH˜½•®ÁŠÐ»›9K8ó2- ºÁ™¶7ŽJ^Xú¨iHOvµ9™ lHOG½Ù1OI (ƒ¹­½€ùRZ+þ{¬Ok¦™ïqKdíA·ô±“±„uß.¿#GÈ×ÜÍ‹Yą宺Œ¶dê¦]ó<éçö…~PC^;šÂˆüBDœñˆ£_HB•²Ia é…p í!Ò[8…^6y×äj(,!½Ñ«:Ç7T¿¦Ò0brÂÉ—T*Yâ4 ꑳ;nð,µƒ…ߌ³«$Ó‡Ô0¦ÿªÓ©:ÓÊbÀÉ.ïOÆòFôŸOEÞÑçv¤°I8âJRÕhÕ…šP 2:I¸Ajƒç{@‚Ä‹4*±Ð&`ÊÂÝž{ž·}û¬ê²ÁŠâíÊÀŒÞíü`Û©÷ÂÜg/ðœVg»ðÜÄwV/›#*ô´{=ökb…> X<©x…gÈB?ºæXµ©ªVyF1œÔÿvžYûÔ¬ñ1 ñí|ŽöˆF2`qþ.#G1žÖ¸˜äì6 ðÝû<©coéÀ¾UˆòÜa7'âãùö Ò¯C§RóWlû¢5àÐ_á)ÍÐ!"Œ âæ„cc™há­;ä\I‚Ÿ˜*Ê~è_buªH¬Il…¼>{ž¨v|KBSìØ—ç¨®‘͈ڛ\–Ò¯€!ÞÌ+?ωZ5ó$§êSEíÑ¢8ÂÜ\¥žMJÓz?{õaÃûFåy×/Ùý¤š¶Äá©kÁ—àn%û<[&˜ÎùPÓ“1ོ Òÿæ<"& }rz(Á}bÄÄß}‡!çá£ÐÒh0>h¦ +½±ã)ͨԇӣÛû¡>ÝŸÎÙá^ï}oX°Óù–Ða ˜6Þ©G3„¶#7Þ‹ü¯“#\“ÃêCàCkúOn#’×ö‘/îów¨{À߿Ș¿Æ×ÇG76ÿ¯Ǿ»¯Êq(ÚF0ÿþ^;  Ã5´²Þ&¬bn«Á|-aÇÌŸÊvð„kn‰äS‰Òµ¶ŽKP^Vê×q’Ä-0lÓн„Û÷ ÎÑb¯Ž8î géúR»Vup@hítõìGè&V  Ú¡!fO´œµÍ펃¥PæbV/ZÑÖˆ)†±I zÑ‘µ0ÀëRÀí.€rÉf:ˆ´g NcR°i± €Wß&¨ÛŽÈKÚÊ,ƃ¬0ŠP›±²Ñ9ã_m-dan^‹e™@؇“ËO(v!€‹?õú®z,ÖÕì\_S_ÊÙ.ò¶è0ºßY(Éø©U6¹S~ŸìdÒ»s€fáÍt2 ¾MK5ؼûTÅe÷ŒÁ̬0Ëi»µF”µŒìûÌmF¦¨ÉŸó”°ºÎ–Ùá±jPß­TÉËB‘Ø.¡×ÖeRjQÁFxŸ[•Ø:ÃÕ…WÜI-;W8íÿããÕÄ{|í)_Þ*h…?_ê—˜‘ÿQŽކYà ?ê1_yÍ»²1ñ­ëSê~V¿'…­¯¤œ Gb°ÃšNb°Ãÿ.' ”Ê`€ ¬žT7à”)ê`Ý&¦’N϶8i ÿ³œ”õ˜ÓvøŸØº^á_6€ÆpHœ¶ 4Üêµ…­9÷Î$èt ‘qß/"êÔByy¨.ÌV”™ ²²¿›XzÛ LOSý©ìlÖ±B}0õ9\ÛÙdóü,OjËç° T–7Ô$/îX=Ó5R¸^S3¦³(Ó?®Å’ê›ÅÅ\w°:Ñ)Ø­äóÉÓ&'\õï°x”ôÆošµªFwq®ìÅÁâÞäô+“úÇádmãìV/ú™«·‹úÛKZ.ùbR6tÿ°àí )7ºzµi ™ˆc× { ŸÊÚëۈ˸ù‡-¸W-ªµÅ-ÖSZL‹kr^ûä>Lp:Ïäkžù"ÆûsSA<÷K@(¼íø6ѹºRA ÷8E> ¬­Xé"+ ,Ò¯D¯]Ø Dèà_¸»eEi5fù‚§tC#ïö–®»Ë¢“°qvEAbÎTØ ]Þ•­ç’I½zU5W&Ø!J\r»†ûX0OÀ3ß ¥¾’Ð8D…P$_Y w±ûßž1ônׇ5úê(ø=կ= *éÇñW£Pôiƒ')|8|Ñ©B›ë¹½Å‡AÝöôé¹}ßšÕ°xC@‚ÎÃt??4D2k áï¼5œo5}0ÀÀ;õ–ñ±àÂ{ác³B&Ó0^C=Ú_•‚ŒÝ§±Îѹ¦²°Ÿª• ÚÝù:Å- ȽåuÍC—s×Wù ÉôàÅG¢cvgI ^ÚŠÐbø$7mjšav½Ï!MÅÜüçFkÇÛpýÑ5ðô2›´¾ùôÅÛd0 6aÐÁlž Q½Ák‰jóñæ—›7ú»-(pñÝÖŒsª)¸ia=‘l,Ô »ä(Ö Ë>‡ÇÞ&Þ>y“™’þ¹²Æÿœ—c$ñÿ¢]Á† endstream endobj 154 0 obj << /Type /Page /Contents 155 0 R /Resources 153 0 R /MediaBox [0 0 612 792] /Parent 152 0 R >> endobj 156 0 obj << /D [154 0 R /XYZ 72 744.907 null] >> endobj 157 0 obj << /D [154 0 R /XYZ 72 720 null] >> endobj 158 0 obj << /D [154 0 R /XYZ 493.68 609.876 null] >> endobj 159 0 obj << /D [154 0 R /XYZ 72 291.752 null] >> endobj 160 0 obj << /D [154 0 R /XYZ 72 157.872 null] >> endobj 153 0 obj << /Font << /F34 17 0 R /F29 6 0 R /F43 58 0 R /F44 59 0 R /F35 18 0 R /F26 4 0 R /F72 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 164 0 obj << /Length 3438 /Filter /FlateDecode >> stream xÚÕZ[ë¶~?¿Â}:2°V$’¢¤¾'M‚¶è%íÙ¢(’ÑÚ²W=²äHr7Û_ßáÌP"µÜìnP è‹E‘£!9œË7C~û¤Ú”q©…ÞÜ7¹Øäi'2ßÜ6ßD‡~›&ÑC·ýîöŸ}%ÊMªb©´0´"‹µR›„(¿!%n*ÎóÜìûk7ù™%ún&X¸”qž–àO° ,ú·ù©·;¡’hºÇFí¯ÃPÃØ{ª3÷÷S¶õVØo[ê‚ýAì)›Îc™DãTí?ÑØ4T{îý6É’©§vE£²~¨gv KãíN&yô-t6Ó½÷ 䯴Eôpßìyt_¡´7; "€óØ¥i\fmÿÎ,!K¢K?6S³l‡zûž°èI€fEäaߎô¼'©ÓYËÌ9ëTqYdö´/‡»€B¤y\JaiÞo³,¼Ê8•ÚRzG‰¡c•¤‹ŠžAZäƒÑü~øD›_ÙÉN$y,u NÁ§s½„ô;•q¦Ë_ÖNʔϤL;^k'ÐOv}k;.ØÒ …¸Ì¬…”‹…@s¶ ¨ø“¾= y”¾y()\óŠ$‡4º1&”ÎbFˆeb¬-EäqQæ¾¥ü¢’þ?šˆ£½#+¥†¤e¦¥}!m é¶Yoöj±b±’*Nñ¼ÕP@P|2™c(ðb Åô¡ŠÆK½o¾MQžw×óè=´L,€3ýÀýa ô>ÂvÓš}5Õ#½Î[Ç™C&cÒªðm`Ö±º;°j}@ TË|öP¼x$Ñ. ˆ/Kb™Î>Óµ«ÚýJÅmtÙ†p^Q§°’§IhII`E N_ª·¬È8#o51{ óJéºßíÇC]šîärÝUwmmåûØ_©ANÊl°yvT“#{ŽÊeÊbÂuì$˜ÕÇššÆ"åæMë ¯ ¤â2·Ÿ-ÖÐçÛ]š€¨¾ü±:7-8/¢/ª©¢–qϳÐŽ©Lb!fk¿ ͉¼™ez6±›+ Ú¸˜ë³œ”¬Y¾žS[ªC¬@-Å¢–/³jºcO*ujû;8¥ÓBÇÉâvLÈ ù:©Á€²ND‚Ö”Œ8šñÒVA%€L¿ÚÛÉÑž«0,(ãD¨•¿ó˜å±ÐŽ/C=Ž®ót¦-â<™I¿ÆS›Ð`M`ÀU{­é£”6î ŒlÅP¹¢I'‹³?ú­Ì£ç¡b]Ì:QWöaÒ©9óôdÆ0ÿeèO`½Ô;NýÅÆ"‚’t^ÄÑ¥ËX–óîÏÕ#ñ½ãY¯c}°È0×khŒëÀôàʲD¾Mx¿Y—«‘²¾Ì·oß ¡Ð´Lƒº8B‡ÅZµpý)1É,-úYøe§Ÿv7ݾ½’4¯=Ææ?õ®­§©¶d¼£ªm ç ÿ”"Åp`7R¨HÁC§Ò—ýkõ*[0‘ußxª^8ÕÓ*ZT‡ƒQqŸŒtÝžÀƒ€´- M4ßÀpئEtºžkÊ‹rv4Þ¶ôCö‘^‡ú‡+Ä-\±!»NýÎù0]ähðu"¢¿5 ›»vüžáƒ[*XïkžÙq_kió*X0—¦¿Ží£ɇ:œ6qÈò²¦î'\%ÈÔñnϹÊâ ®R¾ä*‹Ÿá*¿´²2@^ ÊóT}3‹D¼Õˆ,]¢ÖÂ3HÅ—¾›H¸ƒÌ ¡)AGê›zè¨Ò<•žƒ”Ie~r¹ ¦¿@9 h±AеÏ)Š%_!{’€Ô×n6€«lQĘ2ð;#Ùëä#µ®Ÿ<ìu¨‰ìtª9-dï –‘7“kæ&÷ש^go_?N÷öؼm‹RÅ…/m €\Ô²é©6N!h<2,¸¶žK@‹‹Ø‰7?W‰±èùwXÓ8[Êkݯ’…«Ç8ƒ-µ9Õ»Ô×c,™aÒ #¬Ç½êH}Žcèø‹-ø‘®ëŠ2ùõTsç}e–½”S*U¨$k@æ¦È 2VFíœ*zãTFwÆù¥"ú×3 è™/„¾M›D‰mŸlŠ¥)[¶¡2 å0³ê?׆k¢C_Ý{Dx$ô²ÙODð@1F*z¬”Hè½i§2±é=¼,š½öÿMÛÞPž‚{.!zÕèy«k;ñˆ=(Ø‹J#PçÈu§áy6G¢¢ :ÍÁ2@†±¦›ƒý޼Nˆr¨Ò³Ü×mk¢ dη[u=õŸ+çÌ¿;ñ Ní+¸ù³yô ÔêŽÖåÈ—#5%yUË$ÕÈĈ˜ax¸vœ‘A'êtVÃ]3 ÕðHÝóŽdî С$@Óô·°ZUª·z\w6´£,ú(twTÇ’šê`„UËBͤ;K»sˆ?Çk{¯€¿â¸ªºº“g èT.¼ÉyÈ™ÖR=™vuÇZÚs¸¶áì_A|2ô¤Q:PÒõÔJæq™¼!׫¥”Šã»D,^S—9]gH­N×ÍLyÇJd”7Cƒµüë•9PÜ—*òÈg ÓïÛjäÏϵ¹Üñyaî’é4úʬ|š¿NÑX<ó?^»=Þ8b¦«8ƒ}ÃijzË9k‚EЙØ$vkÐì¯ÓêÎëÐï±*UÙ;&ØÁ4ð¥GFžöTÏ×ZvátÿeÉÔœª/{¯9ÏnuŒ¼TÛŒSè?·T.Übu¬¨. ØñÀóëzhiÍYÛd 3¬…Aó@¡Ù&ì–¯t‘!|rW¢qRÌpæÇ±+¯k$–½‚¸†‰šåKÐ:ö¼#e|Ýe,£9©2 ®‹¢¹ %ó4—TŒ4¬Ò>AñxƒùRImÚÀ­f ™t§o¹‹X›´Ÿ4Ìé·½CóoÒ—KÐUÖØK@/—~ÄÐiTÖ‡½»¢Ò/íå¢pð«Ut­¹ž úÜ´s6ý¡1ׇ¦R+³Â(ôX»W.þ¡×ÿ¼˜+¶ÞWí÷5‚©ú÷£ùr?Zðýèßæ\“ª‚–$±L$“´—¦ÿܦÁ v²'.JS5¡·R"fŸ>Ò «Šé¿¯ºSM½¨x˜³Éèw|ÛääãôÁd\¼¢¦¾±?×vKÖTM#3û`×:xê8X^=÷ÓkÛï©”x¦é>mÿ¤æVõô“tMsºÏš«{´'t1p×Þ• ÀH´¸ mr7E·gNOü„d¼ ëåס7V%8§† Ácœ=æ‚oI—VÃÔPMpÏ›¡Kc9žQ>üBžP\vPÑÃÐLTÁŠ“ýÌÔÜyCþQ ž Õöý§í¦Øi6޾Ãe£æ“ê©oNÒèÃÈŸ ÕHnfýqx0ßCƒ ˆµ53Rã…Ÿé²ËàòfÐ p;SxU`û›ï’ͺA2±,‹Íé›Ón>¾û+ríÿ}W LÚfg·Ý⎾ðáëËŒôU¦!àÍÆŸfvuÿ5’Qï endstream endobj 163 0 obj << /Type /Page /Contents 164 0 R /Resources 162 0 R /MediaBox [0 0 612 792] /Parent 152 0 R /Annots [ 161 0 R ] >> endobj 161 0 obj << /Type /Annot /Border [0 0 0] /Rect [469.407 291.089 505.272 300.04] /S /URI /URI (http://docs.python.org/lib/module-pprint.html) >> endobj 165 0 obj << /D [163 0 R /XYZ 72 744.907 null] >> endobj 166 0 obj << /D [163 0 R /XYZ 441.34 552.313 null] >> endobj 167 0 obj << /D [163 0 R /XYZ 72 287.104 null] >> endobj 168 0 obj << /D [163 0 R /XYZ 72 215.373 null] >> endobj 169 0 obj << /D [163 0 R /XYZ 72 195.448 null] >> endobj 170 0 obj << /D [163 0 R /XYZ 476.284 135.522 null] >> endobj 162 0 obj << /Font << /F34 17 0 R /F29 6 0 R /F43 58 0 R /F35 18 0 R /F26 4 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 173 0 obj << /Length 1451 /Filter /FlateDecode >> stream xÚ­XÝsÛ6 Ï_¡u‘{•*RÔWúq·¶én»[¯Ûr·‡4·Ñmë*‰ž>âø¿H@ŽíÈkÚíÅ"AàÒo®Îž¿ç™“ùYÌcçjá$ÜIXàaâ\ε;W3GÂÍ[%{U˜Ièê‰ýJ!áS„ÛY¹þÌ 9ƒyüD õPѲÛ‹\Õn‘±QU…£•œñ€¸(IŠ… V;´º›V7Ëgf¹s³bèQ¨Q=J¨ÅŒGîBåÄ(»#u¬Õ'ΓZåb[6K$K«t.É¥[£H¶¥œWjvsõ³8c~E–B«®9Ÿ±Ôµ¦·ëKÜN`y8j4qó•l– ÇäL@6ª¦rÑ«öH$×u-›'%i…`ó¦ìVªð!Î̸÷ü}9)b,Ì!òÔEìxðÒ=6Gòq[Ìí/·*»Þî-òöÀö2æánÓûT1óX + ´U±Ì £W>³j/&E3Op}òä .úñí;G(üÊ®j¯uWöå-Íš¡ž«¶3k§tǓԄ,~:~‘ŸÕÂÏËWøO.Oa—f¹÷â-`P.V¿¦ÅÓÛÍ,7p1.$zt²l¸sâÊñwºRÔSBFÛ;rkÜT0éWÈkحꇶAѺÁìö¦ÀÃ|Yæ¦ÔOª¯¢¤¬-›þ_FSøEŸŽàÍK#°c†‚?@®lí¥ÓÌPã÷óŒ®Rkœ• ~ëÒfJ0“FT¶@èr½¦¡^Iõ½Ql]bÏ%Î ø!8o}ÜL¸ÎR?Ù‰P•BU…%w¯VVÍ%ÖPA¦ÖíD’³•·‰qï~¡^—Ë1(]/·f ‡Èñ!–MWÇðf°–F&¦3@ß­‰u­[bnõ0ƒzÆÆíæ²™ŠHì§I²“9ÄØn´øV7ùÀ>p­® qçÚD ÏÅŽz, |!8!©8•…ÅAm]êS•ÿHÍ)|ƒ¯Å‡Gú÷uÕy—ø¿ÛT±(M7œâxÞo{h‡o;ŸºU¹H Îîáùe¿]S:¬:}¦# ø>´Rgœ{ò$ÊÿxlfÀf#qä¨üFŸ¸q ÀÓ§O-™3 9𓚗m«Û‹½Õ¶ˆ™00Ìm‘‰ÌOc@‘ø,¤ÛÊ5Uã>&?¹¯öï¦TÔ/Iܬ„§T¨õªVM?-”²Ú^ÞYˆÈ‡ÞàK6^(3aMÔ«ÊFÝ_Æ ,ã>8yŒQæó4%mŸÙ·•YX¿ë‘c{ËÄжFµ¥‚¥ü3-„i "°­Á £ª¼’µìKMÆÖº×æÂQÇp0"9„|û.ˆJйeO˜ t¡ÇèWÛkkP7¦›ê¶@–Ýþì}€,½ ¯MgC®DêQ‡Ý” æÇ°ÉY 6H¡"UçËJÏmïÒ~ï4/‹„ýèøÂo¢a›ÆºUf;wGÝ®°å²!¿o_‘~þÚ5›½n–Ä>vÙIn>Ì’0‚rÙeùù„9ÝœlÅ&OŸáPùKºé¥!”‰y>@ÍN"ÂÇñ)ñ§^›<ê^<$´ës¯:¿ù"ê<¬/ !@!ÜÝb?Ÿ5»L˜¨vs×câʽÁ—X–ÚóÊ2ÈB(­®4Ù²{¦÷( Ò¯dKº^­»‘Øêa¹' r]Ùš‡är ìЉÄfUæ+-I‘ÍA»`^ö­´/i`c%CbBj[´g—WgŸ™ëSà0ó¦„ùîäõÙõMà@†èûa–:+T;"6ÈS9¿ŸýzöÆþ-þ- ÇDZØÔOÀ3÷íJ®1ZIê2ó®ãœ0—w½j ‹ 0û¸íW67aün?täñ?$4$2 endstream endobj 172 0 obj << /Type /Page /Contents 173 0 R /Resources 171 0 R /MediaBox [0 0 612 792] /Parent 152 0 R >> endobj 174 0 obj << /D [172 0 R /XYZ 72 744.907 null] >> endobj 171 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F44 59 0 R /F34 17 0 R /F43 58 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 178 0 obj << /Length 3218 /Filter /FlateDecode >> stream xÚ½ZKܸ¾ûWtƒÕ€›+R”(ím7ÙEÈÄ3A؆£–ØÓŠ[R¯O~}ªX$õÙ3¹äÒ¢HªX,Öã«bÿ|÷ê‡_E¶ËX–ˆdwwÚe ËBµS‚ç©ðdip8ç åÔá‡öÙx ó {ÉW˜oG;î×êtU_ÛξU–4œ‡sUœ-‹±0p9cÄs°±¥ª©†*¿TÿÉG8àT:ÈÙ¯`J§;–u…ÆìrЦ[‡v˜‘»y¤®†q¶Œ9/lÔcoÉÎÛ/,Ed1KcµDÈÂLäm»Ë‘A¡6mPÆŸFÔ9M®Xy+<d^*J {Lf}Y­LÅ–§’àPÒÌ„\P·ÕŠ …+fâöPx.‘T&ÿƒ`|óïÛÓOI#Npf˜‚„\{I=Þ`šuhÌ"¿ÍÈéÑ4L4†Œ}ãõz©t‰¡BqÒ×ù0 Ú®P 3‰€’i_ýù¢¿ní>Há³0ÚÂ@ž E qd¡çWؼî¾»Jº>ê²$û‹‚߯vÐ=nR%”Ëb/|2^šoø‡çØ»orÛC‚„†ó° à.K=é{ÇúeKƒKŸ´ RÁŸª~hÁ3&1àBÀ¦QpìtþùÚVÍÐÛž¼°yr‚î„|4Š4Œ—¢Xy÷o'$2ù]µŒ` ç0œ2áý¤L&ËU+à~6^m–ªÙáKå >fuëBÄááKì6ZØ-ÈC<³EÌš%âYÔù#5œ‹ÇXKŽ{)DB£Ÿ"¾>ºï‹íX¯2@½^Rý ¯Û±>M½áÃá¶–'ã½íJUS\F£¸ÈAŒ,ýÄp@~UF6L ”drƒ¾nô†Üº3-Zæ4èŽd%1‹ÕµåL(?sT³„^I,¶4ÀF_¯d°øö¹ºÚU’ô²£²AhøP ƒÎÿÓ„¼¡Ö}«-°i Â4øÉ®UÕÕ%ïˆÌ,j™¹½§8P‹84Œî`cY»ÁžÜê_Ê’•5N¦ NR‚Ï"ɰÀQ™8 Åú­AºÒ«Ì§OÎ?}Ú1x ™ÅGB„G€nl:ÞÄ/-ß÷# ÿé¢WŸ9Ò%“…Úš ,P‚ô!%€nwÙk]ÓÑvè¹×–™Â”w |)r IJÐæœ½‚˳RM e\{¹jpfZŒƒ/ùý`SÕüΣ¢É%ÜÁÙ¾ÆÒ#ž5„=ÈàrÊ®B‚7øôQ2¤ré–ŸÊàt²ÙX«=ÅØÙ…ÛÆ€JÓ* :È„›ò v9!;‚êDÝd Ðð°Úf®¥JŒèr#±`‹jªu5zàH[™5(s¨’É]™Ú0jSûÙ*„â0eÂ$ ³£ñõ, .ÞÐÛ£+†ÖÕýyXÏ£ý$?^ô²¸fœ©+ V¹núCbmáE1šij‹yEç *:ÿe=êÁ¡0-MM„š+Õ[SZ—G‘‰ƒØ1ƒÅÐKõ{´½B—ŸÑÓЃɢ·ÂLlªšÏ™¦ð{[Ú#.Eö‹P¡^® Ñ0Ç^È@Ÿñœta?6‰$ôƒ Ûòt:5ÄU¶adÅÝË4^’)Y—?¾£,f”Fl{..aüÂDBþ?‰eµR(É”LŸ–+yhë•oðЧ}„–ï+”樔C'Ðøëí÷Ë’_‘|žŒ)ænŠ LâçJ›BŠâ‚%I¼Üà2Ï‚Ä-ö®®¬:Ðc„Ùꀨѫí¶úfœjÛ}öÅø‰†óPO=l1'³U{ýÖÊà‰’©Zê/9žBxž§ ”ñšo‹úå†àxjÆWµ´éL.$bb’ÜMGàåûIâ`»‚G´«ÎT`qb Jé”NLœÛÌ=‡¿Lþcu£‚.Àæ@§ÕÐ¥jôö…ƒánãŠieÌI6Ì­-§3[æÖ–ÿy·á87”^g"uM 7ø]K†ŒÑ«Ó(nÚ ¨Q½Ü˪Ǥúè/äTʲɾi‰)ú-¹¼exJyq; Ø _]5,È.®Úã¿A½„Q3”¼¤šD%ÓÃ+¹y.!”ñLÁ:< ªÂ¡ë£î¶È§€q2õâûÝ”/!±t" Ÿç=}kà´Œ­Æ‡Sò -˶™G©ÐºìWóIÑ–ßòÍ-#JåO¶<¹ÄXBîñÝ3¤ráüü’y-Ià¿o8S4Ý!‚?.‘ &4›xð<táÁ7WŽ»ÿ,#”– endstream endobj 177 0 obj << /Type /Page /Contents 178 0 R /Resources 176 0 R /MediaBox [0 0 612 792] /Parent 152 0 R /Annots [ 175 0 R ] >> endobj 175 0 obj << /Type /Annot /Border [0 0 0] /Rect [364.581 676 396.132 685.021] /S /URI /URI (http://ipython.scipy.org/moin/ipython) >> endobj 179 0 obj << /D [177 0 R /XYZ 72 744.907 null] >> endobj 180 0 obj << /D [177 0 R /XYZ 72 693.983 null] >> endobj 181 0 obj << /D [177 0 R /XYZ 72 610.411 null] >> endobj 182 0 obj << /D [177 0 R /XYZ 384.731 564.448 null] >> endobj 183 0 obj << /D [177 0 R /XYZ 133.621 540.499 null] >> endobj 184 0 obj << /D [177 0 R /XYZ 72 510.446 null] >> endobj 185 0 obj << /D [177 0 R /XYZ 72 451.059 null] >> endobj 186 0 obj << /D [177 0 R /XYZ 322.792 271.193 null] >> endobj 187 0 obj << /D [177 0 R /XYZ 72 261.808 null] >> endobj 188 0 obj << /D [177 0 R /XYZ 72 242.386 null] >> endobj 189 0 obj << /D [177 0 R /XYZ 72 222.461 null] >> endobj 190 0 obj << /D [177 0 R /XYZ 358.085 174.49 null] >> endobj 176 0 obj << /Font << /F29 6 0 R /F34 17 0 R /F43 58 0 R /F44 59 0 R /F35 18 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 3002 /Filter /FlateDecode >> stream xÚµZëܶÿî¿bë"°¶¸eDRO» 8Iá¢MÓÚ€?8¢ÝåÞªÖIk=|¾¢|gÈ!õXîùì¶_NZi83Îã7£ûþÕ£¯’Ñ*gy"’Õ«Ã*«4Ì™ˆV¯ö«7Aõk‡e×Ã…¯ß¾úó×?‰|Å#&£D ¹à,‹³Uh¨ß’È¥ij 6†„LxÄ, ‹ŠHNXpÎÂÜQü†¢ízŸ6<Â+så±<ã– *.ˆaQ½]oòþZ‰Þ1ËcG÷0ãz#DtÍÐß5{ÅÖÊàõ: ƒ²?6ÑíšgÁõp£ê¾»‚gRUiuЦãIÌ¢,²²j6)£2UY«Ž4îªU{+³jºïVÉ¡mÊüÀ¥x—Mk÷P÷e=(ºÚˆ(g!W8¶<Ž<ÍJFqpjÕZÄÁ‡²:|é•õ5ìO&yp{]|ÔÜîÝ`Æ"Kegä‘à(ø€b‹j =:Õ››í¹þFîO9r–$Ρô’$ µÆ]ù/å32g©tôİF;¡ ݱA%nëOKNÀÛòÄI>6·Ÿ²tôþ'àTq¯Žt,zmÍe¯kÅPááÆáÔJø­ˆW2Í%„åàÔ”|ŠK&y:zYG&Ûx– P’Ll%ÒØlÐsþ"âø~ÿNE²ôoà¸U‡¦Åý¤IP˜Gs'Ä䄉Yâ"Ѽk´¿Ã²i<Ò+p¯Ö¼ìEmþ¶y‚ÁšñKÁ*ਲ4ù’ÍL‚·c‚UŸ¯ŒS&éyظ ;©]‰™Ó,MƒSÓ•}ÙÔ¸ã\Ìv ‹^Ñʳ,”Et°øÖI¸.µI×<TmØ´E}­žÁ}΃ò° ï¤ý¹³T;¼©T×مƾŽEf+éTöÎEÑɘЃ sÙÁzæ9“H²tô/Ím0)“\”±JÑæÎ2qê­$¢”…£ÐÞ (¹¥èS%¹×¨ÿa¨wxlæW]ܨ«Ù{JÎøn¸ÙÂb8V¢€,äQ3,åÉtß•B¶¾xä©Ï±ÙdˠɆ”8çe,œçÕUü2pÁá&bØ«íZ„Áp}ÆÄ'j\!Vl—C‹ª,:ŸjóÌuåc“KÇi×Üœ*Õ+3ŒÛ,þ$3WúŽª:ùøˆŒ%¹ø ¥Þe‘‘ü FïʪúŸ0êŠê A}Ë¥ý TF Òò°„xGÁ^– K"wÈC}Ñâ .ƲHy†<7<ŠYˆú #À˜gv†«“%®^ Õ ”Eì”M ‘?ƒ›Þ¸t6çöŠ²Ï…¼Ï[Uô˜$äxÌY2¡-ëG»¢ª”/yf<³Ä»¹I²s–noPzÃUa ú¨ëÐnè•LÄ’á»Üô$á £1IJ5 2ÚÓ:ýãfÐöW7¤‡Îâð@Õ»ªé•i‘G,áÙ¢Hrx?4 °.ÉaðuªŠ*¶—SÑ‚% ãQEÜYÀ±¥’ZÖûr't€øû`š@<9§ýŠûÎÒ ‹Ït™•^nH9†ÊWâÁÌ ‹ºÆb-zs{,+uYÿ,„øp~ö•¶-¸^Іe)Š~þ"H•®&DOŒd‹8Zcö… ÁS̓Þâi NóÞ1Á „=I ^a®£ÓÀ-2ÉæÐ ÷ŸRõÒ+\.x`ÑÁ[Ï…ÃHù©Ð‰ ÁçÓV ™»öä‚î3 h”(ZÒÒ·c3¤B­M BÄ—}ˆá›þFí}ÍÆwÄ:NÜwæF»¾dã÷Â:ܘÁhP‹²¶¯QË»þ¨>¡ÜlÜ ÃWþDâë56EÉìïNN­#¯XöBPŠâÐÅÅén¿õF%ÐÑ´€zjxðsÓ«¹†b¼ j‘GÜFBÂJäÒ%/HMAµeâÇž9áÆ xƒVÀkƒF0‡Û¶å~¯ìû;s¥µ“H/‡Ý‘ž?ëôø£$!`2ârœpt^VŽ`Â}¾¸U7È_6´§YjÕncNzÒ϶PÚnâ³úlFŸNU©O~ ’Ô×#y§=é¦Gj‰¶9,hÇH'XþŒ$è¨À#¸·¬H»²^ðQý(êÐ[†Ð z#ƶ>ÄÎÆ‘(µzÖ2ç;¶~ðcèÔa¨¬Úq¨tOIa›ÐŠw..öâ)CX ÇVŠ¡³¶;_¿HdLk¦MA¤õÔ1…†"I"€*€ñ|X–ç—…¿{ÏÜ,… ‡Äºj쯉…töœ> ïÈ`%ŽM4‹ëÝùW[§ÌÙ¢x½‰Ð>~üØ,úÓó˜¹{­Ìµè:ȪæÞ4æè—i :\ëãÌžè)Iü½áñ×âzJ‚ÌåߘëÖË4ƒ]âòÍ·ptÜ”‡Ùêoi±»¹~k\¤¸"ÒÑè$ßnéma!ó’— ½O9mo¡–ÝTèÕKBϘàëVõC[ÒŸq´£Sǹ œûËÉŠó±÷=aCKu¿ ãP@·Çç¢MÉÇÍãtÌøsYmèkNÂä¥k"v¡ª~× aþöòê¾BŸÍêüb6W•IΗ½¹¥…N”¨³úDÙõEk±޾}B¥ñy`®qÎp)8õ·›l1Ûœ#õz'3¸ö`£Œv(ª®™!ÈwîxÎ…¦ø©ÖåÚúÐ\˜©ðó¡Øüû¨˜~óµs9™CÝûàßìë±þÊåí¢Ð)Õ Û ƒEý PDÙ’k/°Ÿ"(öûÒÌË>RK!]QÛ͉@ïÐŒ'ß™Xq‡n0()‹¾ØÎ×DÁ©ËZ@A·D>àÈ(Ñ8ÌyO52$Ú]ñƒh,ÝØ~f¸p˜ÿÍiòœ¦ü?ž¦m=½u”cÕ‚Y°rÔ½Guºø )D_úàÉéý#Ïð3f°ã^|ÌâÔâãÕó3n¾ÿƒ´4}õðAוMíÕ‹¦\ˆ›DÎÒñ°æÿz ûÁqÖsu–t'é2íΊÉX0æß`&ù¹£(æ)(„``ůMK™KÓÃæbù¥ÞhÔo–(üŠrA3öïðpwT;»{óV#@xÑ)EËæÅ’ÍXZr«€é%÷F%J>ÿx£!»ú¨|n,Y:'FÆto¤ƒa„/2Í8™L2Æs1OŸüVÿ» ³Ò©.ÐXóä›3‘dz26ù’œ[0ŽxáàÆ£5ã çÔfo-]·ÿT»~4¸>ßáHõ3y"èpò©–¢Òwn¡©›Cµ_ðq­*h.¿ÜA|Ô³o̱MuÊVäv¨k7mrab|¿¬ú‡M MŘij8ð½y%∠hܽy®öð”Ð(ãVݬ"©ªÕËG'˜Ìÿ« À6çýx†ƒÙPäÁócq¢þ* 8Ž%„ Oðàǽª÷fžYèû¦ñLÿ–¹ƒ¥ endstream endobj 194 0 obj << /Type /Page /Contents 195 0 R /Resources 193 0 R /MediaBox [0 0 612 792] /Parent 152 0 R /Annots [ 191 0 R 192 0 R ] >> endobj 191 0 obj << /Type /Annot /Border [0 0 0] /Rect [194.568 216.915 242.389 226.016] /S /URI /URI (http://docs.python.org/lib/module-readline.html) >> endobj 192 0 obj << /Type /Annot /Border [0 0 0] /Rect [440.306 216.915 500.082 226.016] /S /URI /URI (http://projects.scipy.org/ipython/ipython/wiki/PyReadline/Intro) >> endobj 196 0 obj << /D [194 0 R /XYZ 72 744.907 null] >> endobj 197 0 obj << /D [194 0 R /XYZ 72 720 null] >> endobj 198 0 obj << /D [194 0 R /XYZ 221.068 597.344 null] >> endobj 199 0 obj << /D [194 0 R /XYZ 72 588.127 null] >> endobj 200 0 obj << /D [194 0 R /XYZ 72 234.873 null] >> endobj 193 0 obj << /Font << /F34 17 0 R /F29 6 0 R /F72 73 0 R /F43 58 0 R /F44 59 0 R /F35 18 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 203 0 obj << /Length 3566 /Filter /FlateDecode >> stream xÚZY“ܶ~ׯ˜TÄ©ÒÐ$ÀÓ~’KåTìØÞM\)ËUæØZrÌCÒVåǧÝÅz×y"6€F£¯üòöÅgoD¾Ëý<Éîön—'~¤»4 ü@¦»Ûj÷³÷ÍÝþ ²ÔÏŠjzí^æÞ‡º‡f×î¡w–jG¢ø°±WôuqlxÌ÷û\x¯÷Qà½ýúGêªzVê]ˆVU¯à=çu°ÛŒ7Ä×úª*ÃOßM§3¾$ðRðÚew¹måÿìÃ0ðºéåMC$m7Ö¥2³˜©»¶¹ßÿrû÷]°;„¡ŸÇ1íÿ®ë †á]{¢ÖY5WjuÓxFߎ‹A~!û w[g Ùd’‚@öaæ¦ È ö*sØN_·üUo[&™×Ôwuwâ\Ê„ …/ŸŠËµQ.=‰C0¶‡ú­OL·šºU9e‰¦‰¸ÞâZ_ycFeº’ùáì[Ÿ\9N|‘å÷À+SáË@l4V1OE3°Y…¾ðSîl«EŸÏü-ÒÌ ×!#÷³ˆaÈïï‚8˜ê¡K2?Í„aò Üm¥ŽF§Ó \P{|t·æûµïN}q¡—£ªM¬§ãÔ‚.§Ñ¸ íŒIÖ=tºwA,Ñ.X•Þ×{ ÷a6›­‰/¥õc?;¦‹ü4µS[v­5Ç|ðÃÀjË/å~ÛC}&!µ‡K1¼gŒ!…VjüòNy.ú žõàN@†qœy_C] À§$Ö!– g€ÎÊ_î‹f®ÇA5w.¯‘‚¾ {”ZbZ=¹;&e‘uGÌЭu¸à¥¸§ÆQ±Âf‘Ê|mà­RÕ£À±ÇUJ÷|<+Ug5¢´*ªíøì„&\g¹Å¦¹gžU_ àŠ4RÎá¸ú‹»þö‘GÀ/×‘Çµæ ¡®(ǵ×ÈÁ•©€ûz4Pìö×?Æìd^1wîÝww!Ì.ZîÖ¢D®;Æ3L%ûÜ!WÀ¾å¥‰J·ÒtÒ¾•ýU%Ðnùä~ŸÔ0òޤ7Þhxì=f­ìs(TqÈ*˜'t+rcµ Xmal?+Û— ‘†æ¿ŽI@XÁ rŽpï]óˆØOeôü‰ ¾ …ƒkgRø‘gÿѹÁPøÁŒ;¯¶ÅÅ).™€­FO9%Ëß ç=ÆØ’S C’Áµ£>Ø­YGÏ‚ˆ ˆÆ®çºOý S‹—: bï»nä%Xƒ`aR?èb*BZÌ'‰‡ß»’Ãr¢0^i<̯͜³C°3¹ûÅ4v—bd@ÃÜ„Šo÷‹`ïÊÄñ²,Dç.yÓ™*°²é`$ý Ý€ë_^ꀗ›ÊTb¢æ±t¨K½KW)&¢©Smèš2ò£`Ñ̽R¼,yÆæänQjµTN[6?Ãõ þLØ<µ¬m!6Bsi¡yêuW®ÏàΨƭ£š76{°EoÓ~—«þ!0£ÿ%~µIhÌ)j´uí•Í þ€‰ä#Xr±,Oª]%è˜/ª+Fek½xÍÀSõ½ÉDëv5½,N–Wý¥n‹Q ®d§6•Ü®&± @jcß5ka€¦¾Ý¢ëÅLíÐ5Ê …ç´Z¦Þøõ=aj™¤Ô˜±¥oy!c¹ ôö‹ º5³ CHÂÖtŽ*æˆuV0?KãeED§"ÈŒ:ÌûºÖu”Å"_¨dºM€‹MV£wˆÖúk³jÌ›¥S`Ɖd¹ídQE‡6: §;žã¯âtå®taZ?FR›ñá‚—¢â–V!xbGsÁR˜¥™ARÿÆ%q™„ÞWðªÚq0ŒÅÁbyíkI¡Væ©ðs€«£ø«ºÊ™N;s®€`ëÈ¥(Hïš©ÒN.NSm¶Ø­ gã1º £[}J É2÷VÅ.Ÿ%&Xj ÂTØÓ{Ltµ£}ð†_TÁ“›ªY¯®ªàœ½/…)¥Òþ\UüWk'g*/:VvSÖOceûì}šg×€& ®‹Á$‹ÿï Ž>™KhSÕ†¥áªJªSç† 2ƒ0 m_ƒ60z€!e䇨…“¢m†Ò¥<ÂM}ÒµJ‘fÞÕ¶¥™VE«m‹9C˜KHk‹zr-ŽÈ@æK¹ @!³Dæ"ßãs¦HH– /_Þh´n8Îæ_mýÉ×Í—7ß¼ýæ»[ŠUŸ Ìú#óC”Ì®ùrúNjä!\â,÷WžFë ôhì'­ƒÐ]ž ¬Äjà(éîFg"&2€ÖÝ~u(Ÿ´etµ_¸ žÇñB.¯ÿñã·®„±¡êÊrê—ûä”9Ej×uµ–EÏA¾Ôæ@__LE÷Ô™LÔ ôéÎ$?qÀ•92ô †°5i¸1È{,È<¼³96ãÐ`ÁÛs( §MýäÎ…Þ}ý¹\¸=™m.œ"o?¼Zã¤eùkp$lô{A3Y¨RüÁÕïy(ûúÊd—út6wÚ«Š*¥ˆƒ›Æ–b™¥XGr7Ù¶†„=|Á-žˆÿ¥Ñ2×½³îg™‘€ ëç/çØ™î¢Æm7ÿd˜ýòõCf´ƒY* OGµá~(ÊØUAƒ¯3²yŒö¥\5"÷ƒM\¶wD‹|}tÞ,RiØ^Ñ’¦v`¹ÒjâÔWú+@`ùtvØàU)½pWŸóly½ÿn`u§öŠ–ák”ˆ‚hÄ—OÔ6uˆ£\d6ywS[b!ã ´ÆŠ£e¼‚jÆf7ÃD>!ò êß8Hé§"Zìèæë·ÿ~ÆŽÈ—%›ù&ê·U]:/ǧ‹)þ D…ÉûYæ#zî½Óg;ê{ªd.vã'ºÅÄï;J×A¥ZÕ°pÃ#´·›ÃÒŠÁ.Ü¥bC™¤»òòâç_‚]Ýpä¾Ì³ÝGMtÙEú*¡ÙݼøáÅ—úÐdyÕ ð/À0\$´x™# _^yÿ4Óå]ÿBÁDqâç3ª sÃÝÿ§…ôí endstream endobj 202 0 obj << /Type /Page /Contents 203 0 R /Resources 201 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 204 0 obj << /D [202 0 R /XYZ 72 744.907 null] >> endobj 205 0 obj << /D [202 0 R /XYZ 72 598.473 null] >> endobj 206 0 obj << /D [202 0 R /XYZ 72 576.609 null] >> endobj 207 0 obj << /D [202 0 R /XYZ 72 516.951 null] >> endobj 208 0 obj << /D [202 0 R /XYZ 72 471.829 null] >> endobj 209 0 obj << /D [202 0 R /XYZ 72 328.761 null] >> endobj 210 0 obj << /D [202 0 R /XYZ 388.487 280.113 null] >> endobj 201 0 obj << /Font << /F29 6 0 R /F44 59 0 R /F35 18 0 R /F34 17 0 R /F43 58 0 R /F72 73 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 214 0 obj << /Length 2789 /Filter /FlateDecode >> stream xÚZKs㸾ûWèªjŒ!@ “S6ÙÙuj³5‰]•JÍÎ’(‹ŠTHj½ªÊOÝ‚ìÙ¹X ÐýøúA÷t÷þC’®r–+¡VOû•+Íc'zõ´[}ŠN—Ýfýùéoï?ˆ|B&Ó‰\ÅHt(úõ½È’h8”f £bSÕÕp¡Ù'wåPnœ+š5O#"h·Ûsו͖Þn÷D„}õÜ5NU þ^Ús‡«§®}îŠ#[ßKGÿ^søÛžéä²®‘ûÙ%ÎYª3ÇþWÝÑ\ì~]‹øw̾ŠaqÏŸ÷mg¶]Ý'*e±T«{87OSܰ,¶ Syô¥jvf”áÅao W‚7£‡'Q¸0ØÂÝûrþFwnšªyÆIOI²yO:å+‡¢ÙÕe×ã Çâ‚ÓÚv ëÏåŽ^,¿ »r³qt~~.;|m€hÌ­ãùu'¡HR:zYƒ²ŠÁ ¦Àìüp¨zœ:µ}_¯jâV 4%˜ÙnÛn—¯/k—5„<ú±5jz)Íß_­•´w_‘êÔä˜b·ëi7œØT´;Ú¢ŠZ³mt(‹®"•Š*z{8wMI ›pö6—PvåÞJà\,d§ ã2uØ—p˜Šc£Çí¡Ü~ ج–LáÞ0²ºÞ•+–iíw=´/on›ÅŒç¹{e[‹Lc´ø=÷öÎ0²Š…_àõ=ìlU€3/‡,£#2<Œì‰h¸ðäfwmS2ôK&erÓL ’ÛÏmw,jÔ÷»ÀeÂD&ÞòoÍbîÝNX@!›Áù„¿æF Q½æ® t³Ø´Í}ÙuÀm{vX'£‡ºúbô[†´¥,^¹?üù§þ=À¦”,—þ.›ÒS—ͰO§¢·*愆]Bœþ%NãžHÀeŸâ˜é4ŸÛfÓÛVuª8 àPvû²+qú¥Dp(«iº¶¦e‹—J8ÈàŽ‹?¬Ó4êqmn¶CÕà¶8Ò!°ÌÎQ?´'\&àW“kÙãŽÇrWø¤{kÎdqe”Ö…<Òc$Xá¡8ʦ70<,Æn R:³.ûÒ;À×"{&Y!IÀ„ˆY¦Æpj°9` IÆ’Ô“mÛã( 8€b$„£r&8DœD0žføÂƒQà¶< èo:‹±šcÞòd+g¼MLR¸7g«NÜKNùâ"Go’%2¿ÞÖ¦qzêÆcøÑ—unuy1ºðïgAÌ#C Dâ÷?×ÂXÌ/Ü¿xµº¬&•®.‹ÙE,„%¼PÄ6ÞNÎò,µ¼^§@T*/r½SÊTöö6ûy²Àð„0\ºë$Qs>nð"”ˆ¥˜ˆÍ®b ð+›;OKð^ d÷Mq$0Æ5z#43­õõ›®ÁEÆ”Vœ Ý-fRø»“ ]œ;y®‡4Âù'wâLšyÌ” „ß`m—à:Ñ‘3¶¹gæà™£*ÑFb—.a‚‚ä±ÀÝ™Cáö‘B`J2‰[=¹;#&i¶fh­Þ®@ ¤\‡‚ðæòª@yÎô7bÍû\ü/6›±Ö ðŽó‰ÂìÏu=Z„ã»+ÿĈ4cÜ`×T6/˜Ê½“{a-]26iι&þ)˜Àˆ‚ ŒÆ`‚¹J³LTn†'OSOuå®–~’H0ç15é ª†¤/X2‚n@÷$B_ Îa!Y&(RÈ{Pz&¥‹ì7¤ ù¦à iJ±”¦ä£4aóéc´ô1ZNc´äN¬R8±š—œXa}"ÖXG´-Ö&vÿª&J›-ˆªì{ÈЊgâÙT~æàøA›Ž˜5®àb®j—¨¶ʪ&(j€é<ÖsIßR/`qª§Õº;µ~À *_m³!Ö-; ¹iš6çüw2FbynLÆ·ø¬`ž÷¯¨Ä髸eóÈà\ ‡ôŸ&ó»è«ê6›ÜV=Þâ»Î'ÆžÈÃd_–4jÑ®º71(—¾‘1…  AŒÍbÐv’Ú+F`ëf“wT¤ÒeÝ)¦±õcúœ©T.,¿ìŽU€MfýšÌEa¹:xU4Ký"»;¬x×ãún¨D19–e_SÁ6-0Úv¡ –Æ ê¿YçnvÂÍÂé1ìI ‘gW.f`Sëä[=bjN·CÒXX—a/IR8¦Ç¼èöf±þ™{š›·[éox&Xœ-U?Áv$œgsó«Df¼À¹ôø ÂVíöv8t…Åž8 …ÉŠÈ»r[Vc)ÙÓ+îX߬yýË¿MMQÞ £_„H0úÂHçÜi–Ñéa°)ý:Q#b3Ÿ{°uYemÊê˜øÃ¹g,ß1X¨©5©Ø=eíéØãÐ0w8C‚ ¬Ñ«Ø÷³à+ †^ÆêÜ$÷±p¤”ÎçFŽñR}Õ›+«dZã›È !¡9m±°X·îbƒúšdó¢½jö¦!dËW‡f£†°uAüPIþ­î|¦™§%3›ÅëŠÈfv ÇÁjŸ8žûÛ±|YÔú÷ ý$ð6œ_¯ÿ¹i@*#kìÞl@å­Ç¨êÏAé8JxÜÑõή·Ôœé„¿Õ]€PÈr™Ù„&QÚoo„ÚNã“×:7m¨Á1VðñˆOv€©^ÔÙ÷¶Âµ¤ÔÏwË…'þ_`7(kã«Ý°öp§ø¤hû°ZÈóS¿Ýƒlf+=éœd®$W”4À¯/øa\Ñç‰!6¸ôŸs?àˆZzzêw8Ña¡½Nùw“ÏÅ€Æáqªn·Ü|L#×o¨Æú°Äwmâ¿ö¼ß ¨»|-™‚ds¥$•å¢ëÛYzíh Ã"‡yøÁ‡x]Œö©úʬ;™ì¤³)Ê' sN¯…9`n£^õ¹Õ›}n­!]“6õPR\ïÉå<Ÿ•±Oš÷ÁГgükCOÂ$Ï_ =àñø9/{fÜ)(¢ÆPÏÁØ“+ï'£ÃhN£oõÅ”‚”>y³‰ åE:†¹±+©Ûá!HO¼N»j|,Öùäߘ<ŸNõ…m©X®ÓÅ×újúõ2ä× w#ì9XÿÂs5ýâG!fyÇ™…½óóÀŽàEÚ›Ex·yk¼íÞ„¦µŒ£7.K&¯ž†¾¦Ù©™ƒß}ÿt÷ß;Ãn¼âæM :…¤aµ=Þ}ú¯v0 (ͨ»_,Ñq%íwzõx÷»ïÌÿªÌ“B±’€ œÜKĶJ¹ùxsÂ*üƒŠ•®»“Eßÿ6€©Xd…§—á`ÓÿuPˆãÿïMy endstream endobj 213 0 obj << /Type /Page /Contents 214 0 R /Resources 212 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 215 0 obj << /D [213 0 R /XYZ 72 744.907 null] >> endobj 216 0 obj << /D [213 0 R /XYZ 72 591.538 null] >> endobj 217 0 obj << /D [213 0 R /XYZ 72 281.58 null] >> endobj 212 0 obj << /Font << /F35 18 0 R /F29 6 0 R /F26 4 0 R /F34 17 0 R /F43 58 0 R /F44 59 0 R /F72 73 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 224 0 obj << /Length 2632 /Filter /FlateDecode >> stream xÚÅkoܸñ{~Å~‹ˆhñ!J Ò—k¯wE‹¦ˆ‹~H‚BÞåzUk¥ñùßw†Cêµ²ã‡ë}ÈRÃáÌpÞCß»ëW? ½áœeq,6ׇM"6 X$“Íõ~ó1àL0®¶!¢(¸>6&ßoC‘¤ÁÞÜlEô··EuK OQm?_ÿåê'Oir•1‘ŠMD$;¢bç̕ƙÇ{µFK3­QT‡zjìqšIʲH=Ÿæ—n WL*ý|*‡&?™5B2f©ŽŸOèîu÷(¡A"P=wXÙ&c™d@ e*YšmBòg„;X1Ž.¬ ¢¥ßœ~nŠŽfËãà׳iŠ“©º¼dÛPò(x÷à)¶ð™÷¥Ã÷ç<½ªv€®o*ãø×Õ+Z´Eµ3óƒù~ÿˆ(õaÀ(º¢®ò’¾wõé\’œE÷°ÕqÀP) ¤'L å°MÆ(Œ[=­–AÒsÞ¶þ„ì7êœÇ‚‰,õ– C"Œ„. ¤S&Ôàõoãù=Å$ŽY”Hîü°¿Y!.4Sƒe«¢à+Þ«ÞåȈ”ÊH°ˆk§£Øë(“·^Uòà˜ã¹¯¨Z´’A{¬·"î+BèŽyGue´Ë+‚˜¼-Êì[·ŸÓî”SÖ»;îL×<ê‘vM°Ý1¯nçç7ÆÉVÔ ¡Úq‚ò@"¡¼/ ½uâH?¸scZpîÁil¸‘Bî‘\x_W/·< :ú\( x-¡‚{ ³7€ß¢mûmÅugi2$ʦ¯Ö¬1>š\þ”W{ôM üÊîX÷·GÇõh¼Í~Y<8\½Ë›n…£R,J<{±º¹k­îDðÁº1–ŠÌ(ÛÚÉäïþ¥/œÎîÍ¥î¼RGr¦u¶0€ã‹?˜>MÝw¸°¾„ßmߘðS °¯…Ÿ (Ä!£ ëLs*ª¼3¾mòW@Åí² ´ûP÷´°ÞŒûûš÷Gã  çÆ¡çžqå°(øQW ÒÑ¿0ó8Œ¹ç ®‹(ƒÿ¼YóDÈz>}®9‘”ŒgCÔße¹žd–-œÈet2(P·µ_Ðú`£Ke¶æ6§|–¨V\KÇLˆì[RH6Jê¸_}Á˜"`\]W:Énš*KÈ”ª}Ñp¿ÉâÌ«Õ(¿©ý àp@(Tʱp@—â°Îäîî7NH f^jÜ™¿c’B÷¨X%Á­édù"äT·4S.nõ­Í‚¸÷þ\Ù‹ ˆVA€ÏTd^üéúê5Úð)ã2ÝÄ©bY¦6»Ó‹ˆÁoD¡mîÔÐã†äwØ#ÎlAqÒÔ mÏL‚ {1“ÀmMy;¬ Þ3‘Yí¨šó.*È\ei“‚Uuw$­¸ jA-í›Â«Ì¦.}!±%>³úÏ+A -‡Ž–äAZMúE¹Äœ[ú,:·‹'Bg1t¼wZÚ6 ¯kíj€Éµí¬g!Ìz–­>™UÊÒe-<ØQ !R»–fÆ~íh¼Û·ë^~<Ó‹û#$‡B@«Æ”Ĥ]£4<‹}s3õ³½ †gOú«Ç 'È—þº¤8ñוxDÀ´Ô3þ—Þê±.8Ïó[ÌYœ.8Ÿê}_´g”@‡u6»"·ÅÓÕ¤è1 L +*·… †<)2ürpP¯ûsSC);Ñ4Yíb¿„tè|¹A#…åħ˥  ‰%H=1 ØïRù:‹áofô(±cÑ”å¥Ò=ÖÇ™Ò9Œ¯2Ös¶ ÄSQ™ÖO ëþjv_)5¾¤PjŸ8õ»£[Õƒ•Å©èÌž ³ÜlJ³CbQæbêt`™ûaºî&Ã7„õVF6ûƒ ‡ø^ÎàÓÎòfÌ¿98O&“˜%cs8ΗRM%çô|˜D@‡||@Ϫ‡¹ [»‘Kæ¦iù3&ÇÞò#¡(9í>Y’¤ó·ƒ°¦kgB F¯x|hø$D²Bp>Ë{Šýé†Ú­¥„b—~þ¸¢†ÌÞÝa|µ¿¹©ÛUÁƱJ§"B?êQºjhô?¯ôO˜hè±þj†ím¼?îú¦¨|缾à,f]Ô%zM‹6v•PÄšiH\!L©p‰ 3ŽH…mmEÊG"Ëm@Ôúd*滤\»o‹Àn‹1ûØÑ:Íh0€½’®+rT‡®ÁUض”e™×Ë;?„õäykóuÊ”ûZlÏPçÀ¿¿ y´I5Œ÷ã §³±=k£^ù Ë!£]7½ùö°EqžJ&õÂim7'3h-±7ÁizGßPCÏvà†…æbÒ8“aï{6¾ØYÔŠ~¡Ýì¬úðÉݔ ?ÞÀro`Mã ’iè@ Óz3)[èÜ_ЬÚe?“õzŸ™i(\ÉFjÍDŸlrj8Á½ltô¾5q-˜Ö3ö+ !]0ž÷;P©±´Ï8S“éú?9£»7ÇYnÿÙx×äjúì›Û‡U—nÚþ44KÞl¸¶f›Ò8¿œ6¹µ²þ˜Ú2<úâ‚l‰±²Ö©Ø0kùŽ:|æö,‡øRóóoþý·¼¨(1¢ãט$÷!Knb&“lA„Tþ ŒâïÜ\ŠëCSŸÜª@eâêåUÛì®Ì¯àÞU^†»¯í慫δÝÝøê ;?¼$ôÜe²¨X¸H†æÙo¬—÷ ÜigšIÝàß¡’¦¯lcaÊÞKëwTÏ~#Õ-Ýñ-Ñóc]A¨Ì®,Sßš3ý=“Øï¨?¹¦¿ôt=¹ §•ûÊ'|/ý>ÕÉÿ³êÒµ?ÖÁ,dÇ[ÒdZŒñïMC-üJýW n>´^áÛâey&Çùo_ì ¦¶DûþX쎴ô§´­ _7F`&cW*ì~7Çóni5Î —¢ ¤úùì3ÄzÚYœ±Å0˜–±k»wrü§o$48H1T|TfÆ")–O¹óözÑ]O· ÿ,Ž÷~¹ãàñùT™š%iúì2Gk¯µì“yÃŽG…ÈÌíÑcÂù ?MÅ1çRûFèËì©I1¡ìo>~Ž6{ƒøLféæÞ"6JãÌ\n>¼ø‡ëôü•I ÆaÞþ§`,DðÇùƒl’?Òß:èÉSÁœ›‰!r÷Òý:æa endstream endobj 223 0 obj << /Type /Page /Contents 224 0 R /Resources 222 0 R /MediaBox [0 0 612 792] /Parent 211 0 R /Annots [ 218 0 R 219 0 R 220 0 R 221 0 R ] >> endobj 218 0 obj << /Type /Annot /Border [0 0 0] /Rect [328.138 582.837 393.892 591.789] /S /URI /URI (http://www.majid.info/mylos/stories/2004/06/10/threadframe.html) >> endobj 219 0 obj << /Type /Annot /Border [0 0 0] /Rect [195.838 541.303 249.636 550.254] /S /URI /URI (http://docs.python.org/lib/module-threading.html) >> endobj 220 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 529.347 107.865 538.299] /S /URI /URI (http://docs.python.org/lib/module-thread.html) >> endobj 221 0 obj << /Type /Annot /Border [0 0 0] /Rect [96.907 366.147 162.66 373.066] /S /URI /URI (http://www.majid.info/mylos/stories/2004/06/10/threadframe.html) >> endobj 225 0 obj << /D [223 0 R /XYZ 72 744.907 null] >> endobj 226 0 obj << /D [223 0 R /XYZ 459.871 710.037 null] >> endobj 227 0 obj << /D [223 0 R /XYZ 268.222 499.409 null] >> endobj 222 0 obj << /Font << /F26 4 0 R /F35 18 0 R /F29 6 0 R /F34 17 0 R /F43 58 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 231 0 obj << /Length 2765 /Filter /FlateDecode >> stream xÚÕZÝÛ¸Ï_á·È@Ìã§$^Û‡\rASà‚n‹>$A*Û²Wˆ-ù$9›úÇwÈ!)Êæî¦@¯@Ÿ–¦¨áp8¿ß|hºyöîšèœç‹›ÝBçDÓbQ0J¨(7ÛÅ‡ìæ¶^®x.²ªï»%WÙþlÚm³dÙ¦ëgF¿rsîûºýl_WÛ?™:«öK•UMëDØ%RÊ7ø>*ƒÏNÕ0àÈštÚ&Ÿ-kQqxù#UÞ9Ñšð,XÆœ(x¢ƒÃ›Œ¤,õ׺¯Ÿ/•Ê´MÕâßÚ˜ú[u<êÍ{?¼jQ‚«åÒ¸/‰ùî€ä¹e´{¿]›½–«œCï:ùó˜±óaÕáŒ(¦A' :idÍùyÛ §jÜÜ~Þ[‘t¨»¿üm×{‚£×ë½ßk „L{oì ãx×wG7jŒ£™Ñów] '·ãjÄ¿‡¦uOY΃µ"Íús;©ò ¼ð|¬{3ãÏô_ßèÿ3m~'§ûµ:¥ÌçÏë®°ÖéR M Îö˜r2§è 3.ZIMJðŒ•àDæ5~» ®±aŠÁÙ슯u¿î†:!PJ"r¿¬:êvktçJÄhçwJL‚) f( ÀZœD¨ÁJ º¦¯qÒcÚp˜VŽà`jߺBjq ákêjsë¦<ÑpËNN›ÚïjÕ2·¹R\ŸÍáøöµ£(ÇáIÛ¡²rÓwõá@œ‘òØê\Ú° ³”(ó×s3:þ-Jkøìcã+‰‹)4)¤·øïcb;§9 øgNŒŒuÒŒä<ƒ'6'Å\œ…‡®,û]»ƒ*ˆÊƒvæˆpé- ƒ@¼ÖK¤÷œh™ý}pËŒïàhSG,&ÔIÃÓuï–«{¬ÝDgÆB‡ùó»%ƒ«jœÍ¥ jð·Žüg¼„*¨·n=|R9÷ŒÉ¡ p?tíáG±o~·gÜDNðó·±n}d5ÒyG©¾Á8/Þþèó×»øsnÔëKQšˆ2¬YƒF_’TúU›îxiCŠx˜. çÊžò|áˆ{`oëµÉBÎû½»*…À3ËÎ}[»e]kØCbL—v?Ÿl¾bžíðoÛõÇê8ç¡Ü+~‚ø˜P¨PW‡³‚£CÞ?‘pÌüõq\¢Ú˃™µÓÒd{&ÕC÷×ÙÛ ¸‰@¦8s´SÕÍæ|¨ú¥¤™9y®²ûîl̹$h_»{üqw[;LÀ«!L¶K+œ·W{êšÖM·[÷βN·zþVôBµé»a˜å‡,B Ìú­.Œà6’Æãt,‘ yŠð ’s÷èA’=oÈæ—•Ï4Áu™É¬ãôÇ!QgÑÌçaþâ¶sb ?»°-@¼½\›Æâ¥úmÜ`JßE`Îä°ÿÒÆ¦’eñà’O©$ÌE‰6N`nY: ÃÄ5Öî‡ùëë°6~öóÍ3ßé‚-xQB— QJ¢´^lŽÏ ¡'JÚ%_ÂÒ•_»Šÿdjž9¼.$F÷H)Ö@H .Åg¸GÑÞ~ÕÕÞ3ÔB °•ó½]@kØ{5f8l½¡®ìÚ%ŒeMã1¥¶ƒ¨-¤Ýwæ»Áà5pòѧó>dÜVíÞyÈ¡ƒÌ‡X€õ)Àï2&´ÑÅaú‰­]Ýâ¯M•ªN•ÍήÙPpÇí8nè9Û‹â’íÑWB)p>‡ç»Îà@PFAÙ‘ Þ–!lëocšŽõÄÙ„­T akëÓ“‚&Ú0Šn;TÓÒ¤™ØŸ«¾jÇÚÄ„Ü5†ëÌÒ¾>Úê[Øzǟ׭,ûãÁ]¦#ߺu­'®N#!V>~ÈK 1Ñs¿ÆîäkÇñ‚ŠZô7|\ÙZd¬¦<¥­ëØ‹,X6ç±vŽwwÛln£*á››ýíè¥&ðÆ¥xQºí¸Ó'Uη]’àá•r ,DÕÓn%i(ušöRåfœks‚h×`g$zŠé¨Ñ΃üи°“PL@yEó§Ý4Vlçà¿ÙT†©€ƒî—Trϵ&9¶ Y‘‚53yXΑ­‰ž‰@’¢x¸€½#i ¢RÐõ2­TQ!SEÅù¸®û”†¹€c~ú´‘IE'Tª‘=&–¦ù$öú ØR€¿tÆÁÑ˾¹r0ÏåÞͬ«5킟»…*¾_d*JÝÍ. í§7r έ#÷À"E@b ®5gƒ©êryN×?™Ÿ¸•Ôù¹s¿¶‹–¸)ÔdÚ)ÙÆ»0aÌ”“ZRd¡9¥ÎjÈùb§‹2¸¢¥¦¹a×T ›Cyà„KQdÆß=PÝÂéÈ®O]##¼T ‘^£¤ò@ C³¦Æ “aò옴Fß…ó‹ÜãêJç´n(Ž`òúòñÜ6d1>@R¼ { ímîÝîû2â+*s2gpW΋lçR‚i¿L Ž9¸… å¨)¶ÐNÊ©QBù¡ž±ZŠ!?á¯~Lí9‘è§§HÔtêKvUÁglœÃAƒWþ+!¨$9 iØîÜnL‡$iȆr}Aì³s];Út›ØT@50µúRm 8¢µNóõlÿ9_¿HZM—lÊÕÀÍ:­¤„›¯ö)N>Ò“cüf3;Æ2@.‘†5´´¬aæ*ü.0H4§_ÂÓ-þôV0qB)½èbâ SJßø”¾A:«Æa³L3òµ¸¡¿$M…ïÞo‚ÄjôMUßYã .<Àå àÜ÷”k–Ásp×´Pbp9õi=À¥¸ ¤DŸb£GáÎ4‘Ê%.ãÚc=éäÆ1Õ“8WßóüÿçÅæê{a>¥d©]gôú¿Á¶©´€Q —ùæƹÆ!*cf ð“ ¿ø$}ªÐ<|ësßIaæË:`y’8òËðÄcY,kî±l6iqÆaYG]r£øKœC,à ²yŒXÖË þ¡¡.!º4Ø ZºïLŒÔ~k¬±ý:´zm 3¿tÛó¡N|‰ä²Pªe¢{;Û^Hûe#þ‚ßZZ×\uÀO½lU‚Ò,ÄŠ÷é¸"åÔuŸå#±gš–sn[hPnåñ?˜úÏèŒPˆáìéNuT*nkãÇ­ï¹zyèÎý¦^mº­Ûr;7¾¹J_ÄMSßíኇ¨Ú¿(ϱ²ÂX]4à¾X9)r>/óÿ 9}¾`ëÀw§¥ ™9­¤Á©–Ð ¦~Ñ»]‡-0R¾šÓvX”oç_6}sºh~+]ußpõàRèY+úò;½éuþ™@dJž¦ùá]la€J„.wvÑq!scŠÃâ·g¿º&güáDHNãxpÎM#r½º­N£ÝrÎ'¼ÙÏIø…~…[¾D¢Óøßîèƒ endstream endobj 230 0 obj << /Type /Page /Contents 231 0 R /Resources 229 0 R /MediaBox [0 0 612 792] /Parent 211 0 R /Annots [ 228 0 R ] >> endobj 228 0 obj << /Type /Annot /Border [0 0 0] /Rect [277.798 382.442 343.552 391.393] /S /URI /URI (http://www.majid.info/mylos/stories/2004/06/10/threadframe.html) >> endobj 37 0 obj << /D [230 0 R /XYZ 72 744.907 null] >> endobj 232 0 obj << /D [230 0 R /XYZ 167.012 534.477 null] >> endobj 233 0 obj << /D [230 0 R /XYZ 72 461.218 null] >> endobj 234 0 obj << /D [230 0 R /XYZ 407.827 117.56 null] >> endobj 229 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R /F34 17 0 R /F43 58 0 R /F44 59 0 R /F72 73 0 R >> /ProcSet [ /PDF /Text ] >> endobj 239 0 obj << /Length 3687 /Filter /FlateDecode >> stream xÚåZK“ã¶¾ï¯ÐÍœªL‚“µ7UYOìI¥R¶k‹!‰^Š”ùرòëÓn€afֹ栈Ghôãë¾y|óåÛ0Þd"O’hóxؾ/Â(Ù$y.ü4Û<–›Ÿ½Ëu8µÍÝ6ñ}o{¦ÿ˵ÜQé|í÷]uÄåz÷ëãß¾|+óMe‚·2Ó·a$Â, ‚_÷wP{OÕp¢1°ˆi t’dã›Ùa¦[Â2i,M§ª¹‹|ïÓô½v_ .gøÅý^)úDp· °.¸ ¼{"E3¢,2Í Ñ—w‡¢ÌöûfÙéÙï0Öõ•ª~‹ºúÅ÷¥*©¢`Ô›juyä5-µ]Šá´íUÑíOUs¤ºŠÇ•mó ­Ù¨/¦^ ×»Ùy$’(†B ò8fæ×=ŽI°ýóÚ“ˆÖ5|âXîÛ±ÛëÅ%,ŽÇìÛó¥ªõ~à«íøÿ2Tçê?¦úÓ]{ªëá8zq· ãÈ{[5ñÚ¯íÈ+(®´€SGHã¨iàÅåo¸L‡´€¨F¹=´‡?~ÿÃû‡¯¿wœY"EDVhĦ(öá’Mà ƒ|·åX+ÇÄQ ¾.¦‘Ø{¢Il„¡›’O+ EÒ¸ R‘H^Å¿N Ž!Lc+áAîµïßC&cÊ’þÇ¿Ä#‘½w¬7€íůªLÛõ>UuÍÔÇ¡=ƒbíéôp&Õ ª£ÖKÛÛsÛ êLm¥ÚáAŽÇ£–]½5iÆêA]{ì °S¶ã4¶HræBÁò€ ÉÕ€,M¤Wìš¶;ëÕ´ ´E©÷õA/ÛKÄŠÕ± ­EËý‹i(¦²™¿B¯=P- ÎB{Bsï´l‘ÈdúºÌÄR.ωwªŠnpOÉB¦ØÛ|¥òæðÐ>„†[•(¨^u¤t½Kpd,’0xmÕ!(‘íôÅ] ¦ƒæƒÙESi{<îOÔ@fÌN§Š—¶j†^gj$s¡äëŠsK&6òöE¯˜vÅ$àdÕŒ½ÓKåáT4ÔþûX fÇ¡fIXñ8’KvͰ#5/ÚBÉšf»Ý'TÙ £ð—šü¨‚}_QÏÙªC TÓW»Zý"eªålÖ£TÚÎkû ŸšÐ<Úûºè]'(ƒDä©=œçÂjóÐÚ3Р( Ùá${8$æ NÍÎJÝIðãŽ)óXÈü•¥/²$6}ÚÝoj–kú ú—3In œM­´W'!á'ËC#ÓŠ ÓVUTu|¤j²õoþúø×äoêTda²‰ãT¤AºÙŸßø"ç¡»|´]·¦ïvÖùOs=YRÔ뮕uÕ¨›éSPª8]LÏMó‰¹×ÍÄ«“ËD­&CæPeà¸Ì&Mž¯îÖWÂA,=—ƒ½hieà½k¨•JûªÛgÐý†Ðè ¡l+¸;†Ö ~Qûêp%1ƒï€Ú‰‘×C¹²ò¦¹Wº{hYe'¢ \.y´j\€«Á(zT:©ŽK•[£uDVvyõQ¹ b’ YØQ°)!×…RpkÅX3* þÖã´€¥íŠæ,Ñ^OóEf`w²üÖþ8ä&Œ^ÕÒ µ}fFJÛD‰ÐøG[Ø+ªjŽÉ`Y™µß=?—åjAÄŽån[W¼W]³²¡2ž÷zAx⾄ýk6êVúÆÎnN›Ž¾]{vx¾{Zÿ·çòõõ7¥‹ç œŠÕÁož·År²ÅŒScû+ßþì¹æ™|yXk$í¹’ëXÈ[©Lî+Qµv Ë}õ`¼µ‚Ý®ff€‚ÈèE‚e—–à¾Ë]=ê,ñVÛ+¨ Àÿ¹¸¡…Gô[y0׌][t%õ©šË¨=ŒLf6AWÄ ñõ…èö×`"Wíe[k7G©^®æ6ò´à4‘v³8°§Så 'dÉ×N ÈÉ-sü|¥¸À‰9ÐQû½ÿH4ƒ5ˆÂ2©ï[ füq¹0gòŠæ,ööŒæ¤"Jò?ãc˪gÂS>‰Ä„x];‹O(1:š–34IÑ_ÿL8†³xjïÜW(EêG¯îKúr¢´sîLS²\1²0š+—¶™r{|Â$ÔÆ%J1;½|Lßí¬ó-ðYS$ƒBìXÌœðÍg¾Å<¦×ÍœKndИ-§üîîž³…é”Ìxu§š)½‰*#?#¬ì>ªFu… 5 ˆ2ðÔ‡xi)k7G³0B¶±:Û¡aÉÅ@’GÕb»ŒQÀ¾R ü˜–=%]ôa€^wõKËÝQ“Ó†¼V+i”*U¹ `"“7B“ 3ô†2ç@*?Ú²§ô½M©“2'8¦C_•<öKÍz^¬)[ÀŠ˜P€¹·qkkäÅêf§d[ ÌHÞ6ÚIÙF÷Ô¾H‘õÎæ˜þÒµªìÚ†¬žáôaÕwßv(0mS2lõ Gœà§¹wës¡¢¦ ÿ–“øÁÇ“ùœƒªµ1.vké¿wƇÃY³±.—iÑ8ã8€+dò<«Ãn‡ ˜MkãT×û£Ë4Åó@ΕùˆE8!`7‘eüyOùM·JK)â)×ä>4í¾s%ir~ŒÒò0QÎoù˜&A¥;ÂÙÔÅærÚ ŠºÌ ñÞQs Z|ÉfAÓô+Uá¹b ÙÓ9ébqXÊV>šéÔÐ %©÷Ž© Ž5Óµ£YÏÉᘨܻ`2ïæf€S”Z;cŸØ@^QØAÕª7ÁŒ¹H»V)†“–º©¸Îû‘¤ÎS£=€eÐäV nS‚Íâ¥'«Fš'áÞÝ8|ôU±‰Üq{1B1½»Ÿ”ZyKv¬­üŸ¡ÉW6‡Ñz·},snZn2gU4/¸?›Aé]ʺ•‘ÈýôQÙïþïT–r®Ã¹À9 ßÒ^Óa%{(a6ÿ¼ã°9`„ÂQ+j /@ýïÞÿóv&J¾#e›NÑá°Ò.'½› ¨Õš ]õµœ®á4ŠKSçnèj¬‰0ôÂ- dO|Þ±öf‘Gk¨á‰{Ҫˊåð°ô`H -ýï¸ED^g‡5E¼ˆžSG>´ø›ý%»8÷ïØ.røRî¨_i€è<,ô×¥óÈ"›’tÜ9B •%Ÿ™uÌæX¤3«úº_ÜÃ%l¶t²)MŸCIZ:KÇóÇ”MM²L€ûÖ!ÌE0Á´Iano³Ù¬ž£i—S`•ùBÆ+¥™]¬³WU7e˃ͮ¥G h§Å«Ú:¸#òÙsg³}YšÎ(¡WsÊD8]Îrܸë¬nÝÎh­LºÅöóÈÎD–±›Ý3ÂHÈ ùs¢(EšL#«è‚àø¦Â ÁqTÛ+ý§‡C‰oUñ2 :6Eͽhýåv÷êÂ}yÓPlÀÛ¹²Aˆ8 _ÃDDáôœ|ž™ØÜ?¬Òô!ÛÅPJïÝjèAô%„Û ß„éü.®i]î! C±~‘À츷‚ ?ÿÊ›†¡Ô]./-ú#M"¡~ãDûL9aó43qaæýe)aPÃÑqŠy á±|Õ Ï‘ûpl b>Òog3ö42=Ì(]z;– ¥5æê ¹\ù:ûdF!ßj{ õ .v瑘¬MíEÑ?¹ß³åÑ"Q­gy†*اxºèúðáPÕêÇWÉj+„lo `¯:{ú&%‚ªƒ¿àáÊ á1 äØõ¤êZ˜k™ßí 81°Ê2ÑïK~þÕß”P Ò Â<Û<éNgÀÄêÍOoþÁ÷1ÉŒ@a~Ý" °ÖRòS '´ø;=­¼E «75ë$’µù^@M“¸ …oMbüÙyb8Ë$»}‘¼”zÀid†ž Oÿ Óv¾$ endstream endobj 238 0 obj << /Type /Page /Contents 239 0 R /Resources 237 0 R /MediaBox [0 0 612 792] /Parent 211 0 R /Annots [ 235 0 R 236 0 R ] >> endobj 235 0 obj << /Type /Annot /Border [0 0 0] /Rect [127.836 555.56 175.657 564.511] /S /URI /URI (http://docs.python.org/lib/module-readline.html) >> endobj 236 0 obj << /Type /Annot /Border [0 0 0] /Rect [363.932 472.491 381.865 481.442] /S /URI /URI (http://docs.python.org/lib/module-cmd.html) >> endobj 240 0 obj << /D [238 0 R /XYZ 72 744.907 null] >> endobj 241 0 obj << /D [238 0 R /XYZ 72 387.737 null] >> endobj 242 0 obj << /D [238 0 R /XYZ 72 330.262 null] >> endobj 243 0 obj << /D [238 0 R /XYZ 72 165.31 null] >> endobj 237 0 obj << /Font << /F35 18 0 R /F29 6 0 R /F44 59 0 R /F34 17 0 R /F72 73 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 2396 /Filter /FlateDecode >> stream xÚÅËŽãÈíÞ_a ‡–v^¥Ç °“L#»‡ÌìN{˜CY*ÛÊØ’Víé¿Yd•%µz@€\¬Åb±ø&ýúáæÕ}˜or‘'a²y8lÒp“¾ð£tóPn>xoÛ](C¯hÆ®×´~jFªšªëT}äÏCCÏ£pâ/½º˜UàUõ »¶ÓðKŸöOôlÇa¨êãöãÃϯî#9á,”©ñ‰±öi855áÍne"J‹ö»/ýÇj8-8éªã‰¹kÕp¬€Þ~÷ý°ëùÓ^šN¯ð„™~tå¥Ü¯pF"‹ôW¤yª.u³‹c`4”›]ˆ\JBbÑúV´¾w¬¶¡ôþÜÒÓ±_4Â>·çª¨‚ ógÆÂkѪb|¾¼ïõEWµ¼¥f•ø¬6ß+õ~úÞx†OLEÆÄàëqpÔ:Ë] ÕE÷´|¸MN8¡Ï}ƒ¥® à„V&‰¯l)õ0DÙÐb¸Ú„áê÷MW0]Åx˜NÃÏcظEo(b|ºÐðml¾_l/_¢XÙ5Té€Ï“+ZEUEqº‹E1Ä þ›j2 ¼ÙÔlÙÆzc›\ƒlÍaݡ׬Å<µ.ÙI¢sƒœ*mÏÒ_»æn÷«Æ®Þí¾ÿ+ŠïÕpi_ÍÏþ!¿ÚÖÊŽw bj©sÕ›8´4h2fØ11àü߬Q2ßl•ÉœãL/Å|ú2ÓÊëk†šowAx»¿96\ƒ´”èÿBcP ªÖeyêϺ¸å¦s‰óá¥y{G˜·sFX¹Õµ¸ýø=V|Û¾ì㱟LRq”J×Ï®dˆLÄ bÍu–erÝnnQÏUÍÄÛûx¬EÓ˜º0*z¹ç@8ðùBª¡4M]ªÿ–²ùq¬Ûj4É4ÉbjRñ@h5±3œÃ‚ÕeksgOŠc!sG_[ÜÍ‹P¤™Ë°|7èE¤Y˜Ì+ÇΛ#éºæ²Våe"‹µ…-gpD’\kFè´bÛãâv4 ªº'ˆýì¦õ¡¹q¥¥†jpµ˜×¼ŽT¾l*!”méÔT°? ïµ.Õ|™-º³Y ïØ65P1jf,WÚÓ«©‹²³ <Ò ¸A@)·ìŸQÙ~€e ÏI"?dm cIìýt Ó_ãÂL ¨»÷iš…P4¦U÷U¹jÈY*‚kiý5‚¾gd­1Y ®èØÉ• ÔØ Y¾àD>ê(ý'’ùT©wX†‚SŒfL ¨Þò³bª”lw²i¯¦8 ¡]ŒY%‰í_&mZ˜{÷c‡C¬«M!y•)3lŸ'Óiß@áPÒB×¥™ƒHžNˆ"®2¦5¸>vf÷ði*­ºYa?… ’kÛÑ‚šF OCªñÌçŸÅ{â5E1vfV÷Îö¥²Ðá‘,8 D˜G+&ü¬{²­A§Uq¢c|ë…»Lq5ʨ‚‚:%¨òVD´¦2‹‡ªmë~<÷ÜËP8¥PÙy^ ,gMòZc‡urµ—ž¼@Ž"çL6¸Q;£´AäÍ™„ÎÒ Ôµª þ­{Ú&Òã&Ë /-óÐÂõÃrJje[(Û¢ÚNö¨‡ÞaÕÇ~9£¼yópóÇ z†¿ p”Ž^™@¦*.7>ú›àÞEÉåÑ`](hähŠçÍû›_n^óH^‚îR Ò¡È È#‘ÆáRw) ¾0žˆ8KAq" ¸Þ~§»“2”<³÷‚•}*z”í¦¨t] ,qŒ˜çTë›mÚ¢M&Òˆ4–=o/ôlƒýh:d ñHF2¥bçî°¤0ûÄ óT–8µ²»°s6IïmÍ$ ö;X.ü÷Û°9¬‡Ên³'P7¸ƒ•¨ŒÊEœÄ‹¬ ‘Ä`>÷~Ž1fÕªZŽaøÿÏ9jä×Ї3Ó(’ÞŽ[ØÒ6}_í«³<=Óoh;n%)NN¯7AZ†¢gÃ\éDØœÊì5hm †Ïr«8 çÃWS‹CÈq´L6+F¹³¨F¬ÒÔ¾1#xÃ$»æÃuÚÑ»`c}¹+çQP+Dþ4ÅšÑ\SÛÿ;Ñ »ã²8ˆ-wÞÊF÷³ÿ'þ3ÚˆÅÒa2źÌeëñ@Æ"LÒ/…ƒØ”ÓPÌÿ‹!§ÂÕäCý8:ý—–f^€epò<o>6[ÂÛ;nÃqýÏÅü9þ/*7 endstream endobj 245 0 obj << /Type /Page /Contents 246 0 R /Resources 244 0 R /MediaBox [0 0 612 792] /Parent 211 0 R >> endobj 247 0 obj << /D [245 0 R /XYZ 72 744.907 null] >> endobj 244 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F44 59 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 250 0 obj << /Length 1948 /Filter /FlateDecode >> stream xÚ­X[Û¶~ß_alV>ˆYRJ*‡6mÑíAN»@Ò`!K´¥F]QÎÆÿþÌpHYrä6ú°Kšrîß õÍãݗ߇ù*g¹ åêq·JÃU*8ãQºz¬VoƒÇZõj½ e4†Fݹ…ß9»¢Å2(ªë0 Šn(ön_ïh<™¦Û¯ß=þøå÷Q2á%Îâ<^qbU©íi¿Wýï<áð'èÄLº$gi*ý¶ÞDIüV«Žd%ó¢šAÈÜþ*uå%ëi¬ Gx< 4)è¦m¯Š÷GÝtn¹é.W¼Ài µB W›ì¦«,O ªþØ+øÔ"tœ`2h·ŠF¸9æØŽºý°I *Ú):7)‹¶u§ÁFHií„“MY«ò=iˆ”¤!Ìžûf¬]ˆ‡ßœ‡Z»ùÎÚ@DB·ãþL{f(uPVy¹.ܬVŸˆQY#ð¹úÇ^ïûâÄYô§Î€«b_[•`m¨­‹2,C§‡¦TŶEVY¨Ê·Så`ïw£½š¡^¨PH&dúJ†LŠÈ\°g.‚Pª­ÑíiPíÙ‹Gbi4˜³Z­ §rÝí^S©QY¼–b%ÍXšÍUXž §»aÔx€¦—84´`Ô@ëS‡Úv6GE™ÓTN4EÀTJ—×k´l‚Ž(ÍÜm0™š]±cáF½Ûù…Š&7ó<‹Y”iû¦Ú2HòP-8dã‰7!ŒqNG~mº‹ „¬„x.!n™Vc¬<"€ëö†¶*Úéh§Õšr·l"àªôMíÖÉêt ƒ×;Z<ë?¯G°sBiZíÕa^àÆ ôiÌà¾5n×êãŽ.$Õ˜½àlÈ)š”­6>X?»SÛºh9*U½ 9áÃðÒERM&¡V/{_á9\©2‹µ«è°·é÷_¾Ï0Ðbôgœ³L¢73–d1)bΆA}Q*̘ÿnßÈÏ?aT:Θ Ý)›j §ÞéѸ|ñ–3§­QžÜÚóß 98;CÈNÑòd^>”ºšî¤>Küp.þpí£Êí•z—X›ª8†ÀVA;ÇL Þ¢W+o‚t<}¦ñ »÷ÈG¡¿Ï›c1”õr:GP…e”V:Ï ö’½7Q.—ùÜâÍá¨{Prn­?æ‡|È=¼ïˆàp&þè½ýã­Z=Ѳ°œ¡>°$œ_rÿ„®»̯+š«ªÜw¿þ8'M±³5ÝNi(õá`“ØrmŒ5ýÂÌÇq×t©Uŀݒ*ûVo±‘BÚ'Ô÷É&Ç)(È*ýÔ6f@}ÆÐ»AøŒQf)'Ú ?¾ nmshœfÔ¥3ƘÕÐm´W_pgžnèe–C×c³ÉPÝVOÍÜ2—Å[«hŸ‹³ñBõ6œqþ`aç}TŽØ(à­jõ³ïȬŸaÈ…ëc§Vµä//ÁÅ „§=µBžf¢Éâ“4¸yÅÂq¾7ÏM‘§ÚZã™—oÁïì‘HÆEY"ݹÿÐg|“åhÚÉYÙÍ&BaK„®Iø©é\;0ôƒÊfYΩZ»:õKáúiqÆ"´ËdzZt¢†+÷í‹m®¡cݤ½#¶ôJ[Ùà ¤¤ßˆöÌÞ¤‡@9Q¼¥©®‰ &%§æ¶*÷¢ÀŒÐN´caŒ{R ,jÌMWtv·ê¥ 3búBÛ‚ûByÝÍ.Ø?NY¾ŸE (+bx¤pð¯H™ ãÏGY—›X›<ÜUnF¾Ácì³¢÷í½í_ x:5IGÝÝ;ܾ÷EõþÝ­„t2=Ö#bxø½T÷ GóÜ´­G ‡r·tÿ‰Òÿ‚ª»Ý_èj“¢)´žƒ²ÅÐBÀc97Á"xr¸ã¼m<ÆôÔ É·³ˆ‹áÅâ WLO-^QR›ú«õ&M²àÍCÖ ›Ÿ±%†W<éìå¶‘ê8ÚDÞ(ËÏǨµv9Â¥OÂæôH’¬±<Έ ¼Ô#Æ/½Æ‹%Ž’ÉøŠßâUÀÞ®{U:»J},Õå ;Ü¥kE$Y˜"Þêà œ–^½k^lC8iöxãa ІÃ˜dµkâ[䨢>°õàešê~‚€[[ñíÍ—¯g Oûú ±/ûRèðn'y èmß„«šbÙâjRžO ½`²djPdžÏñ–pŒИÙ/&Êõ£q<íG¡ÇLÇK1.7.öìùÑ–¨Ù~¹ØA¡Lòlò Jr¼îè‚aÅ~C!ièmSMXˆÔm_=daëRð=Pab[shyz¯ãYúæÖ7ø½Ä‘#‚Ôwß=Þýy‡ªò•ÀÏzIÌB™®ÊÃÝÛw|UÁ2€‹@•gKtXÅÕjW¿ÞýïîûePο Æ!"¼@è†ø‰š„o?ùfð³®N­ÛÆ´ÊAñK± oÅu޳O¯Z¨ÊÉš$ÒÏ?Z¸@mÌ£ðŠM˜EQ&Þ¦ÿÆ‘ endstream endobj 249 0 obj << /Type /Page /Contents 250 0 R /Resources 248 0 R /MediaBox [0 0 612 792] /Parent 255 0 R >> endobj 251 0 obj << /D [249 0 R /XYZ 72 744.907 null] >> endobj 252 0 obj << /D [249 0 R /XYZ 72 633.265 null] >> endobj 253 0 obj << /D [249 0 R /XYZ 72 272.773 null] >> endobj 254 0 obj << /D [249 0 R /XYZ 72 99.087 null] >> endobj 248 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 258 0 obj << /Length 1852 /Filter /FlateDecode >> stream xÚÛ®ÓFðý|EDŽ#Ç÷ j©Ú‚J¥T©¡½'q‰½a½á4ß™YÇI }H<^ÏÎý¶ûóÝÍòETÎJ¿Ì¢lvw?Ë£Y~ç³»zöÎkÕ(ãËŠÁäÜkÕžmxsóç¦3Rï´4Öìyàõ¹Ý‚q✃X½W×Ìn°âPîîvK6X_TÇšd,aÓõM-¢•ÍHÙAÐ09¬ ŽFöÄdG„Ž‚À˹›pÍÊOrBlL0@TlDÜ4ºfŒýQ2æÖÜÄØÞ¬ä—}©Ú._Äé¨Fœ9zw¨W„uRI¢Ø/CÀµ8>#d#„a,âÈK¦õfù¤z³øMšIàic¢ðžI2ÝzMù K (Û,èq ˜Â{ÕYÄwŒšÂ{‹Î ð¯ &Ô‹ÒÂÂÒ‰Žêù`Jó¡UŹԤLý,t}BqÌ8|_IÙ‘ µÍ7\[-E}@5ä˜Âø©B.E ³Ô/ò/Ûs,i *c‡¡5A2€(L¾âôóÇ`°8-O“Á¦VÊ&G`#0l©½ÑŠ G¿“¥9½-*¹² _Õêo‰á„UûŽ— ÷¢}/§[ϼ:„ÓŠ¸—E€¼éy]iéº]Waž0§‹Î·nŽ}šéè)qíMWb96"gyÍTÞ¸WÛ-ÍCÏ5DÌLx(†0ÏRç¡öerw‡·Ü,¡ÚRf~$~Z°AjyOmdo\¸<±¦‹B?À|¸’3i§›Ž ß‰ÉHJ¿È2HÀ"¤m¯I#V²ñvžÂtê{k,†%Ti¨Y—J€èq’± 1Qúô)‰4ÎOg‹!FZ ƒ•ŸÚqw D܇¨­ê™•–•tV±Éi¡­°$Ù–@,ÏNi¾hP]D}ô}oê¦{úè1om:þò –t|þ8%܈Ð(.‰EgÄPékÂM8Œ~¯E+Ÿk­ôB^oÕJ°:Ñ2ç[¤qËÜ{þª˜>D ˆXÑQS•÷*òDí;ÇÅoË ŒÔË^WKù´ÂNlÕç~‰»—hšåȘO"rå"ŒÆ†sT‹#Õ7°Ýrµ¢<ØIwB€Ë\&ß1pè@˜¦@ ®¾]šv7‘Í+Ì…Û§ø÷ØiHŒèsL^%{Õ®§Ø6׃,ÄI„"àZ :£±Ð|vëdœN°z÷ü÷ï¿Mb˜:͵øš¨w®"ëÝOÜ`Èêmiˆ’ò² ×f® •aPø ÐvãÇŽ&¹K!’Ð/’ø8lqK,F%vf¯í\ r ­†ÚJ%wˆŸÖqC]§bu69÷•¦° Åž—±cõO&Fɸôà ;=œÏ<1AÅ›êX)²lTYÔF3ÈeÔÝ<¿»ùtƒÇâ`âÅb šå³ª½y÷>˜Õ° \üº©…ZÇÉíìíÍ7?Û»Éìôn2ì #î(Qéý²¢ïø!x%‹"w%TxÏaâéj—tã {6–ø_çχ) endstream endobj 257 0 obj << /Type /Page /Contents 258 0 R /Resources 256 0 R /MediaBox [0 0 612 792] /Parent 255 0 R >> endobj 259 0 obj << /D [257 0 R /XYZ 72 744.907 null] >> endobj 256 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 263 0 obj << /Length 2242 /Filter /FlateDecode >> stream xÚ¥Y_㸠ßO‘·q€‰Æ–mÙ^´ ìµwíXtڙḽ'QߨVÎvv¾}I‘²Ä™Ù¢/±,Q$E‘?’Îïî~’j‘‰LÁãq·Hä" |á‡Éâq»øÕ»_ƾgÚnõÙ4ËUä{®–+™¤Þ_õz)}¯ßï‹zOSÏEw(êåoÿ¸û)Œ'\ƒ0J¥ Ÿ˜_¶k¢’Ù„jåÈV2a”ñ/]û0ñ€5(𥚧eà{z‹ ÊË["ÈéÑnšâØÝÎéácõ†R 9êú\”%sï;Så]±ÉËò…ëºÓ ­ÑH•iÈ>0±=³;Zêš75fßä­®5N÷ÒO/ƒØûVt-*Œ–ò…’`© Y“ªùº6MeµS±',¥$ FDòqÇ «s…ã9…¿ø±oZÎÇ­$†¦b´bvôäÆî„À(˜»™øBJù7_܈òÝvyÓ‘$©œH±\…~ì}t·FT¼eEf”™‘³¢"ötø(>ºÕÍW<ŸngtcáGá[ª‡" ÍÍ2޽–¸ƒ¦!Z¹í7zË™`ÝèüéhŠºkÑz¼XoiPÔô¬ài´É[Í[‹Ö-6,¢oõ®/iÜrÞüG_tÝp^2 &Þ×ðö£©G"kº$“…§È–Ž ÐáÜC°mÔ‚6H48g‰ e¬ D(Âå*ð}ßû‘" 6èBú ÕfvaTúgßµÅVŸí¸Å0üx»¼'ÿt>uîab¨´ÅºÔôÖz¶ºã ½=“öG^4n-gªg‹c8z1½ã€×‰£œ'Š}5Ô «áÐâ„ c ³*f§7#¬â ò~fåúº+ʉ~(¦W‰ŽGWØL¿?¸±¶.CC­y¦6ô4xç7ÍAç[šÍÛÖl pú­ÛßLip©öÂX³ÇeŠ"V!„úÖ>P‹ö†±³ ‚”FIv•©7Qs8‡!€sE Xoxá+døš+_ ?H\4?ØËúœ×9ª{éRi |5ľYÿ®7±·QŒò0•8‰ÖOPKÈî7“‚X¤£ù¦+L=#=Ì„É* ·¸¥È Ë<»o¸Š4¼*z´]3LQƒ4›ú`¢,(Ó›µº½Uœ4}É—¼³ÙãÚ_=¤ ¥ˆÆD €µ-õÜ!SÆÃ!7¦ª€”ø;xê‰,è'©Ž¥~?ˆ0S*²Eˆ ¡’V2qk!F_ôÁj „; ð á_@ø’ª MÕÑ`zÂñ…·œóº"â@Ûÿ<Ãó†M sÛyÒÜ<|úÛÏÿˆøû払nlÓ¬9Þ\cƪ—kàb¯À¡bNÆÍš².! òõ pJM/à–à*'Úý`<Ø_0ŸáNB\˜°(‹;Œg£HeY…ÏR ” g™ËÓE‘HÓÈÑMU#mbDïŽðÌG#LÄE6­5=*ݶpk·„!Ú7U§AØÌRÆCÛ|ca(½®É7<Ë béjGhŽ4X³YÐîq|æ²BzŸvDÇÈ t¦¾Ybn WÒyÍo¦£,9‘\‘egøöü޷̯Õú$ÿpö<&š[r7cª¢;ƒ•/R†¨<#šax_{!Pj“$mÀÇö¼ÝñsOdWÇp¶”~м7RáÞõ‹d Îvâ˜CêÖªŽjxã!g[·ëìXS¦ÚV S鼯âã{Ë«èÿ,¯î_ Ô46¼š_.=4ÂÕ*‹ÝÝ:žÊØñ`0ñ4x³ž¦&Å ½æôpâpL IW ~‰›jƒ¥ËåÖ±¦‚Ûî@›S_—dv¹“Êw»Éæ³w?>¾ÃÔï/l©eÆOåbS½ƒ°TqdWŸª­&t?ØÖ<;mÍÝ:™;ø¡ˆãàD&/M¤9ª×Ežó²r©—ütc% èlúºœfªóåŒ2ýíèê3|‘Žm ðýú_, ¾»¾ÞŒ±ˆeWë†õik;XxÂE¹’˜Dz(’·2^?¢S«'"7ï1ÜŸÂÉ£ ¿4€&D–7h‰Ì½._oè¥íw˜(¾ø¾üÆý)ÌKÈš).Ù"¥zƒº¡4{Ó39¥M\`JÍç,KŽYÓ´¢=æÏ¯Ú_Å"‰£ñ^gúg&S–ú›Þ¼Æ1ÎD’¨ÿ…£U²|KÉpê|i†¸vÉŠ.Ø|’°YëWEH!ÕP¢"á€ã I8ÀÓVÖë&o¸ÌvŽk¿Ì¢üŠ%Ö§#ÖÇŒõÿYdÂŽ ù£CB|ùLmÁùŽžPÂYÿ2›üJwqÖ.ÿ‚樟SgƒÓîh= +¨š€§u7xµHQဦ\)ûõÚ…çABo{•9?>Ùw|NŠ£Á5‹ºè þ¤‡Ê ðÂêÐÃ}T„°Ñ`ãÿÄÇ¢ï00:js,Ù¶¤/MI"²P]|/Yçk×Qõ+æQU ½ý¹I‰ÈÎ"×xáÖç¥F ×0Qñ©ñ—»÷3¬~p4ÈPÊ:”>ðs_Œû˜O=/¡ð¨Á­F*FÅ, ÜÊ (^öpVT-°ñèºÆÞuü²Š–­·z8BÝ5¦<ÅúÙæt®9”xŠ[CÖñÇ—Ýž»žóNj–¸z©Ì¶/õ«lƒ §´ Û!:Ýv|®¶oHð'ª$?¼êý Y:’Ýõmstw´€]øÝä_Þ‡JÑÎU }²÷Q÷ )}±D½ÑàEÝkW¦ü1­‹Sº öøõ7±…iàœ.ž-Qµˆì—ørñðî_\Ÿœý[Iû1c@=*%gÓÙbö3ÙÚŽQݹo,2iÍÄšºöi—?Ñb9\3 þ¥Ìm˜\—C´Žÿ4ÜÏJ 7ä™™†¡'gÓÿù«ù endstream endobj 262 0 obj << /Type /Page /Contents 263 0 R /Resources 261 0 R /MediaBox [0 0 612 792] /Parent 255 0 R /Annots [ 260 0 R ] >> endobj 260 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 289.225 103.551 298.177] /S /URI /URI (http://ipython.scipy.org/moin/ipython) >> endobj 264 0 obj << /D [262 0 R /XYZ 72 744.907 null] >> endobj 265 0 obj << /D [262 0 R /XYZ 72 318.302 null] >> endobj 261 0 obj << /Font << /F26 4 0 R /F35 18 0 R /F29 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 269 0 obj << /Length 3714 /Filter /FlateDecode >> stream xÚÕZKä¶¾ï¯hø2j`‡+Q%XY{7p¶ƒ#lc¬nq¦•mIm=2žüúT±ŠÔc4;qàK.-’¢Èb=¿*ö»›Wo>È|—‹\K½»¹Û¥r—F¡ãtwSî~ ¾kÌþZæ:(«»½L‚;Ó™æÈc3<ÓPg8U=µ>UMI­öŽžU³Wa𯽠ƒöX Uë¿)†åÌæ8½ŽDÄß÷ËùiÐï£`(S›fèi¨†¡â‘Ú÷†×5û( ~ÃsSzzx=>IU_ÚnØÿ|ó×]¸»Ž"‘' 1ƒÑ7âdÆ%œ c˜j§Ôu[ŽgCìL"¡²ÄM|¨Îçýu¬³ ij >Ó 4äÎxoJ±¿ÖZê¶£ytŽ¢¾œ T›téPhýnÂ*\—Y‰‹ô臢)‹sÛ0‘—®½ïŠšç4åGÝ©ð>%êZ¦‰HRµäëímSÔæöΆÁ[z\ÝÞÖEÕÜÞ^műÈóÔÑ|<co^ƒü’0xlGj‰‡âp~¤^Ù6Wû( ê>ì£èæÞÐÒVáÒ`hÕf8µ "BïˆpiOãÈ¸Ž•ˆ26“HÄBﯣñMs2ÀWü³¶’fÁ]×ÖÔÂûÞói¶t”d"O3wÀ¯êrƒ ×nÖµT"V9Í}gŽÈ îljЙvk~_6Ö”¡PÒ«s…ôW³ÂÒýtÙD ëÏ“¥"ý²¯“™ÛwíùÜ¢Ky¨š{:¶ì'Ð\ôLDÑ/+ ðAfB"`-Y«þŒúFþ$u3ëèÕ±­kPâžÞŸ«žÜCjÝX-l+iîóå—['–" ½†Õ°6©SO‹eɦ©è\`ë%aéÔïÑþ ñgÒŸù”_6}c,’ÄÓÒ¾lqŒÛûÏ+Zmbtª~ËR‘MÇ#?³ºŠD¦±Ç/íÉ_lèh%'±Iº”Œ·©Ís«3éö¼ëXÈësç"˲ùÁ­=:: ³}p-R™ÎþÜú 8$£Iàd‰*Z™ð7 DìÒs @Ã%§@¯ŠmJÂT¾h:Yœ,M„‡\5-MH# .mßW«{@‚ 0z,¬A¤ç‘:^¤ƒÑܵ@Ï»˜BÈ#‚€!©QVPK'Öb|KÈÈÁt¼FcLéÖ8ð¶¸åcªE®tÂûœ8ÔÁOaÞÙ`ꔀCgŠO—¶ÂÀˆýf¬vcìðg©ÛmÅvBJrÇSÓ‡M¼CЊ<ë™?@V„ü—ìáq¿ G<(¶ ¦¡ ú ^sOdCwè¬åÛ†ùû1 rÂìãŽT`2køá>–IŒagÔacrÆ#\1œGë=¡o¥Œ€ š£€Ú™˜`[KÔãy¨ÈwmMëxÞà+Ò˜g%‹Ã—âhzA¬y_O¼¨ó|ІïzÃ$·ã&t]ìª2&ÓXk;œOªo¸ë1#a>sÎjF_Ó"[&)•*Ì^Æá›ÜX,qäCã–sMæà‰É: SLŠiÛs}Ǿ×wìÄüeâÖ”ìyC)¢µ•E!ÎÒ`âŸ[ê!üÓV`„¦ò>ê"À_]hŸ_Ä„zDáh› à´Ì'Mp}-‹Êiˆ ëÑ9Û–álî8PßMÝN+bt®žù_8f"O¨Þ 8ÎMÆÿ`:&¢êûÑ”K â¶ PkÉÜÖ_–NúH)ȉtF oÊýþÔŽç’Ú6ûÂÆ*´ÀHQ–ÏâLý_Çv0¼„õÝÒÅié<Ý<žˆ\£ü¦åO̰Z1ÕÙx쵲ᇓå„ýä:´Ý#vÔ,ÂÄΟà0nƒî÷³–ô u ¢ˆ÷Ms"ç;ƒ)Øá¨Í›ˆ}¼øFžØ7Éâ…rÃa­f{ÊQEîªÙi¯Ýg‹C¿êË›ú?ÃÙÏÄž(š’k }äÜn ÏÐñ2´™D;6å–Ž‡™ˆ§$hEÂÆî`u¯ :‰0׌h”KJz ðS+³E€FG¨~gFKe! .NB„ÆÉœ/ä´ksøXõµŠÑ yt¢·}[óÇTWÿæÒ ¾¤”Þl…Ç®V”<ߪŒ.…£a ÐèǃÎP€·qº4f¤RÐôÆLÉ!|ðêýÍ+”k¸‹ÀÛiˆÞz§’DDZïŽõ«¼è.‰²S>ù©×nîõlò»'%®õŠœ3 ÃÞš!ïT=™S$C-H çñ«-nÖçi‘a.B@¾ Z,i—÷V l+‡ãÔ~ù;Ç¡ ÀaÎ`¨×[ݲ«-!¦ŸÖ1 RTgrçøšÄ¯}wÔúîãëͬ"JËÏ«+ÄöY™Œ«_°¤­¸`ƒêyزá é:´Ã‰†|öÉùM“WS îÖj0q(Ï…²šûSK„L¨ò&“ü)#P)…Óð{Žgµ¯_dË`´Å %dÏ/·YŠ Eœ«4¦=¨•Ã^%ÃÃèT{Ãt /$ºHKxâ€ïšHÓ(ýŸé¡¨,3‘†Ù’¥^]—ARF_µqz ‚«+Ðøù—o Æûº8òW/0X JC¯÷ã³S.œô“‚æ-Õô²© —rAïëUé( Þ7ƒµa ÿalŽT®zJB¸¬Ô=#E’~y܆ʧ§â.9'féGÿríΑúÚEJá4#ÄÒg*³¥VØËÊ’W G®îOƒ¯¼Î® Õ×Gƫϊš 8dQÀ,lÂŽÏÉ~YM@sðìŠ×Zº„À+ü4CÍKzJ¤Ó„òpï<ý¯Sô&«èÑ>G'þãÏᮄ—ÕÀN²ÝƒZï$HAùy÷ñÕßÈÕ/6‹ýG¡¶K).C¤éß~‹õu`HY>¥CcÒ$û#èà•S•.è0(Úߎæâ¼çj÷’/)ÿÝ5 OmóÝOmûéíÍ>I‚n|‘±„¸—ÿ!œˆãP„ÙR"éÛÇ€ßaïÃýÛ{,Ôžû9UýP cÿö ódhwÃÕ–îE¯ª©îþó–ϵ×.B)¹ô¸ïÑ@š8w©Ýû„WöªL9†Þ]˜Q÷áTY‹Ws?ÑÓ;4)kß*\]¡‚XZýîž9­Â¥ãšÏ”"ÒÑTše:wn8£d[tåõ±-MÏp;†T8É—ÜÁj‘R.}Q ¡UÅ•Xò _Y¢÷í}…Ìà{zãêcð¶j“ùVìµ»¨[YÝ­¶ÇðJ=Ðu ø1ÝCÕó̃¡ ¼Y]&ùtA8Oµ3èU(öd5zéÏ]‡•íú6 rÐÆ§Uôì{Óñ=-Æ»Puî…§%AŒN˜×Ï$x¸Ï<Öг Ç±¹Ü/©Ú†ÏÁÞ¦a³¯†ÑB`¬I)PŒU×¶Šnµ¼ãOk{ P¢ƒ-¼<›z¹û½¾Cˆ]^® *ã*0.7´¦{³îÆœe¸€{¨Žã¹è¸.ì} Î5ÁØ`à™Òð( øÞ²WÜ›˜4šgŸà÷¼QÅS‰z½D§êRQ‹¿†™~Sé¹˜Æ bÄsKÑö®ÎÝ{>jBðXÔÚtÄ9pÁeŽØ+©Ó,¾õ×Íø¡[¯²^AEÁ;›ëÃÚ>Iŵ»ÐÕ^…áëªéðéû:=Rc-§r^­ntTônJ™ñWr_|±íP©É^L›Þº´¹…DôùßÉÀ2W©ƒÆZûø?ðüu¬,›­Þ'îŒðÂÞ÷«u&âhKÏ¿]¨«ËÏhPQFw/ð‚X™¥sñâªXF¯šq“A3þ/oÜ·â‡<®ÖÑã™D%šn¶غü8Ša{¹pEÿØG¶Åi¾óf$ñMŒ;»È™e+xGáõä'‹~ˆñÚg‰”}Mr+hfŒ²½Etøß^¥!–‰â|qÜš³éûíZúô? @:·Æa¿[Äb[yT 5ý]„µŒŠ™™­nnT•¥Ï £^ºxd¥~à‹PTºrË4ŸÌÝ_9°Jw¤HõLSÊa^°©4h¿´-Ò}^i­*’³¸¼°j{9ë’Ûa›†ník—!˜¸˜®BôcKÐVÁ°œ³ÖP¯\ÝqèÔ ›¹²Ùtó€"§U9éY—6A—rÁ°)\Ð9-xÓæ¥Ët¯¨),/õ£©»KÕg­%Ë„’Ù0Žýö­c’ëÙA–;øK@h_56?\Q—ãAªÈ­R³ ϤŽUQþ—ò[¸&óßJ”ÜøFav§‹¿Ý0¹‘««J_ÔvPÈzÚÕ#´Ê%ï3|Ç÷šO*ˆÎ=yD‘Ìã4/éŠ:O}"‡ùm°gHæüýVÖ =•¹?'¹4Η's'g3Ï‚+t®¬çÈØI¸JðÀ ìò¹ à=Ë7C¤Õµ±AI‚ïêj˜>aêì4ú_JN§·÷мì@<¸Â> endobj 266 0 obj << /Type /Annot /Border [0 0 0] /Rect [126.276 453.009 206.534 461.96] /S /URI /URI (http://docs.python.org/lib/module-cmd.html) >> endobj 270 0 obj << /D [268 0 R /XYZ 72 744.907 null] >> endobj 271 0 obj << /D [268 0 R /XYZ 72 370.059 null] >> endobj 272 0 obj << /D [268 0 R /XYZ 72 351.253 null] >> endobj 267 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F26 4 0 R /F34 17 0 R /F72 73 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 276 0 obj << /Length 3091 /Filter /FlateDecode >> stream xÚíZK“㶾ϯPÍÅšªL€H&åCÖÞMâª8NyªR©õÖ„’¨3)ó±3ʯO7àKÐÌlÖ99'áźÑýõCx{{õõûH,–h¡·»t"° Œ·ÛŇeö´ÉŽm^•wûªz¸ùxûý×ïC5ú ™Žõ" å?* ERŽ)–D±[ÓžŽÙ –onVBËOiÑûíÚ6¶ë{$uõîöê—+_ ¾aÄâ(2‡„öbs¸úð1XlaòûEÀÂ$^<𥇅`Iœ@«Xütõ·«·ÈêäPB,ÖzÊïæ°m¾ù¡*Ç'‚±Ÿƒ@MœË€ Óa<§U"­Z!SI´XqÎ¥hñJÚ6TK'l2'™Tö$iQx÷WLDÒíû!{<Ã0¸3j+µ8±”“,d úÛ?G/ލ¥ÄBÅ1‰ zq2! ¥(ÍÀËs| %ûã}ôˆarþK ,R3 {W¶F1E<Ãt7/ïq("µ†©vŸÙFn²uºy î®êŒ©C3/}v,ãªÇT”"mÚ»Ìù¹yìµß°›U„˪6£3‘ ÁއôD2Ëì!ŒæÃï>EN>!Pû¼À*DŒÔT4V¹çP0)04Æm%åU=59»1 Ð¥5Ó¬®ÝÚ:ÍGböØŒ8Y«fÞ0‘ÉBiÉଟ§™Sø”àh‘RXÕ_1ž#k-$ ÷aÒ?nÀR–æJ’¼‚L¢Èhdˆ05D˜_Ÿhô˜6 I -”Ápj—¥Ôµ€‹û°,C¥öhX\œÈ‘_Byà,|¤r8·QÙS“ÓOGãÎàùŽ&NŽ÷ѰÂP³ˆÏT¬×†mÞ £¾Ö‹4ù¿³©F¬m_¶rfg6ê çz\XR¶µ]ƒÂôzUÀ2Ý»Ë×p·Óð'‚ë7}–ɦ{1yßì©Ù:®É–pÈX9ŒœÛ’%bɩެåÌkGgò‘jmWšxm¼àPm;ªbèÛ¾ có¬-b2–øbî 1¯’fÉC¿tåÖ®F‹Mü;ÕÎEsþ»»Cš—wwóí!ñg*J&ÛÛ©ÑÆnÕÙÆS•4žnld Üw£*n‰1„‰xfš~.DyCrÊš=e› ú5Ô£ÇN7¨ŸÛ`FXתBö)-… ¾yZ0%íÊy‘]WEaî{”ªùdâFl5F+稴vþI++U½,«–ܬ‰›"@EÍhøˆíÓvÝWºa y öÕòß½¥©©©¤ {[îCºy!GEãÂÐd–„¶äfÅ—60ÐgÑ€îsF.évï˜t£ïš}Õ[šY;ðãë÷ù•½'üÀvày3oòm6süÖŸÏ ÈiíÖÕ§¡ÜTÍ24o ,$K‚è,¾ð—ÄY±ü¬ô¼‰/ÒL«ès#WÀÝ0²¸k‡cÞÒ¯Æêþ—¦Äœh”ÌR¤oI}Cq!t C&/Š`\tÃzûXž)QiôŒò‡| ä¾ÚÚ1“ó¢Bg]°Â~>‰m¡ocT{\Ó˜ÈøñÌ£B}¨ë#çQùb¥)»™SÇáïH1¥þuc]o°û÷}æ-JCäÇ“Z â?ƒ™ Ö‹^eê¬íê²Ku¼Ì1Ô“ÒRçÊI×4J"4†{Æž±º ãˆTÚP]Êy¨#}¨í!T—&Ý1WK&åüJ*—ާÍLÜ#ÍC)7}ÖžÕxœ×CzŸ_B2äøéhÌ>kš `"!̓ⷓW«€˜åÕŸPÓÒ¢KKV—kw ø+ä;ù#XEê¹ [Ù SFêNPH ¶:ó©jœa«I†­ú [)§¥Ó [Í2l\WM؇ [C"¤§þ¿L±ãçQG \ÖVžC=~(0 Ž‰A!ãup¸€Q§›(UÆÃ¼e1à©1]5×q Da…UõcÞdî›ÜRAŒ»Ñ&?äEZÛžòC3>(ðý Ï"aq=[Ä“Z1e*½‘)É;ª>Ø™<£x êØ0ƒûLY`âó"4ÄþÀE€x9-îLJšÅüò}1ŸbE«!§ä2ä­»T>Q ç¬Gâ6ýÁÆÌÁˆq_!÷ÀÛͦÎw‚i”z×t@Ñnb¢–m7ÒCæhÚF:;í¦«k°sG®»ìALíLqÄwNƒk¤š“ãåŸK<"äl:«Â²×w¹t¿îºÂŽ‘£v³ÏŠ¢±¤©ŽA´©üo)íªúàv±K¨Ôaæ-~g'B÷pçÜøcVûøÝ‡»ožàÞølÇ|fÏILé~Í¥­7òþŸèßK™ÿ'|N"ÎÂø™G'îÔüÕ‰yZ‚–:v½Zµû:K· ×oèC+Ÿ®©Þ§Bˆçã)ëÉd2úàpZíòºiW$k;q8™Ñ´¾¿¾œ2(HÆCà‚’Ðþ±÷' ü%:<…µäÑÑ=„1ºþäëKYÓðA³$ŽzåÓ…JïcŒ{¼BÍé*ñ—*ü,óöL$㪇+'Jÿ *)ÄäÕx¿Ò˜?¶¨œ"†©^{¡=$Á£CÛLß ”f¶«²aÄ—µs˨3,9õ‰ó`¬o|ò…àIóÑ…ÍÔÄûŠEŽÊ‹¯-}Ð1ŸÀ~=ñŒÓ¿¨ÁK* Ƴï,¥Žg¯AôôA)ÔtÄlf ¦…p¥ÙxùÝT7`ä/T64íÁÃN¹„|+„7zò¨ŸñÕœh"AãÛ‚Ðçò>0†ÄÞ]Ìÿzb¶ˆÃp)'ÓÿOÿe endstream endobj 275 0 obj << /Type /Page /Contents 276 0 R /Resources 274 0 R /MediaBox [0 0 612 792] /Parent 255 0 R /Annots [ 273 0 R ] >> endobj 273 0 obj << /Type /Annot /Border [0 0 0] /Rect [255.758 385.327 303.579 394.279] /Subtype /Link /A << /S /GoTo /D (label-module-main) >> >> endobj 277 0 obj << /D [275 0 R /XYZ 72 744.907 null] >> endobj 278 0 obj << /D [275 0 R /XYZ 72 532.355 null] >> endobj 274 0 obj << /Font << /F72 73 0 R /F35 18 0 R /F44 59 0 R /F29 6 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj << /Length 3048 /Filter /FlateDecode >> stream xÚíZIÛ:¾÷¯0r‰=h+â"‘z@I^2“9 ÞÒÀ’ mÚZ–ü$¹—ùõSÅEeº»ƒÉq KY,ÖúU±ßß\½ùD³Ye)Mg7ÛY–FY,f‚ÄQÌÄìf3û2¿Ù«Å’&ñüõ‚ÄóòõµykOÛMæ_ã˜>˜‘®6¿Eµ)ÖygWåæ§,ÚÎ<ó&?¨N5vvkçUyYïêSëëÜî§V9ò‹o7ÿ|ó‰%#Æi*#Æf±a¹n£ö˜ßWå×8‰á˜ÞQÓ$ w+ì¡ê&@›ÀL1"­Ôú)ÊIóS· ³%³(e³%˸ùòyk6}¬OæáœW/Z-(œ7ÈúÔ4ÊMþí±ÛוÕ̺)ŽÝõ ¶€¸bI°Åi·SÍSâ¢MŰ7Y©Ùd¥Êá~‘&æÀo> :Z½¤‰X’ÂùE”R+€æTÝ…˜cQFÜNÈ’™ÃùXÆQ&¤›“7 &æ»6¤;1žŒˆ…ζ¤4b™#Q–$ÎìÑ2asóKÑ’ñÕhéѼ ’ðÛ:/K;‚úÁ‡^o;4uA9á³Ñ™ùŒG>µ' h7©êΣMç-x£iò ·Ö< uUT;-=°mêƒ6ÍØž;5ç.ª¶Ø ‰1gU,ˆùüseÁ»b}*st`F€)íÂ̺2Œ€ÍmO¥;#gæ´{U–­&ÍlˆÁQ`±Tý>}œ€On“ÜüØxê­é‘úØue§k/Ò\*ï´Ioù#%é8dнBŽGzÏ;w¶'=6¯¬› Œ&óö,äå]°åØ‹ ÐÒ9ÇŒf‘”¾G‚ÛïÓÐOÄl4œ7»ö‚0ð‘9_éãrÙNC±±>+šs>EÅY‹ÑÉm\‰ÝæÀ'#“ÀI K¥wöO ’`¬Ö<(|yÈÇRýÒs#hÊ-Q&oyq8Ö è,Aü›Uo1F6Èé-òüj¹ìöÊ7`š¯®Í"«à×Ô(HÍ[üêðhìb´àð¸ÜMÛ-¼²z¶{å¤2[†h"£‘æZ\ºCPÌšù?TLDÓ·4” Á&}$E›D[€Rôª‡!šF éSÏ+%ÆøSb &ž™Ò {fɆ<îJËqÄ)õÌ{¼_eŒ:µöë?õþÏǦÞA\ò™µXc ¥Ì1÷ûb½7¦ºSÝ4–4ê™'਽"¥d¤°‰QNM0Ó“gÕ&„3Xä%l“L\”aäÄó1Ò9Äö× 8Ö¢FÎÉ5âw”!þ¨ßrós‡“ó¦ÈW¥ýP+4|FEáï 4KÊþŽ åx§Î±¦!%iR2€Þ\ýu…Ïx,…d˜ÌxÊt¨]®¾|‹gø)b…œÝ멇…؉®]Îþ¼úýê=ÖfÞf`‹Q,¹&%,X[6íÛ!ÝZä›Í9@µ`éÏàƒB4ñøPhCkÕG¡Éîàì§ì YˆB†ッëÛ·7‹$0ü¬cQ,~Š>C`âë(–"DÁÞ~ZˆñÓ˜«JÕûsÎ8ˆ•ðŸ¢!p0Ÿ3Àá]^­Õˆ©€Å§ˆz‹þðÏä/A–A@âÄnٛ\.ûl+çÛÚy ?AO_²”Û: '¸_›—ż.7çô ÚM¿Eé+ÑÇÛ­òõ­ ‰]°®Ǽ+VEYtfè¾èöæé0‘ÇŽ©wã.]¿[ ¼x¶©QÁ ÊÇ>ý ‡¾\€àºé[ý:k8½ke"’1q%@‚VcŽ#‰âÙm?sé¦.‡¹ÚvüØíÓ3‘ô±n˰)‚&6lk¿Œ6t“¦úU—Æp2Ú°Þ^¬8PÑ6Àú‘é.)O5!°¾ˆ:B"¾ H[Iùü+ÄÂ÷y[¬áã›ÿêaMœt¨7§Ò-èÓHj´#F5Îú4·2…Ä”/šD°…ç1šªV3>|(ó£Vµ¡MÈ ˆë}xyQÞXB؃A0MfÀ¸¡ÿöXUôdñV °…6”¼Ckæ #ÀòÄ) ¥ÁÃjHÛw…±iÕZ'=ßóåQ’ôBý­?¯WB@<àº4%4l }hÙt÷ÇrËWQAô)t4ÚÊj;hc T{=t~+±¡‰ódþõëb{•æòÌn*LÙÍj»ÂKÙ­íí¢´7½øéAYŽ™~–·¡Æìéü£{·$óæÂ•¤×ý×þ£ÒƒmÍ%¼0y©öÜù¾«qÛî šˆ(É^¤B ¥…È|cýàÔ•&æºY?õ=ÙI§TfPMcU e@ëùÉ<ƒEMŠêØ0a®s„à›2ÍšòsU‚ü]UPè˜V@›ºz½Àk^×–wʱ×ä0jŒÓNÁ¾œÊ­jÜÅÚrƒ×æ‹^_Ѐٚ©"=‰hWÞ­ÁÔFHŒÅ!I‰ñ,pÓ+"¿(T¼Ù$V;óàî¿ôÓ%ó2 @â8âéÿfIĤ&DS25nÿOsýk:F%¤‚1 œš…Ȳ±Yàzm8wd8îÌBW›>õf/½Yh~^bi”$“aÑf1¨Î¿GÂ̳_à` ×èó Ys]¡%ŽÍƒº<Åhå1ÍæöùÑ$"!!hA¥ÔÖ-0ðñ¡S•IgðÖß=Á󯓊9þ/Ý}¼( endstream endobj 283 0 obj << /Type /Page /Contents 284 0 R /Resources 282 0 R /MediaBox [0 0 612 792] /Parent 255 0 R /Annots [ 280 0 R 281 0 R ] >> endobj 280 0 obj << /Type /Annot /Border [0 0 0] /Rect [297.802 437.693 315.734 446.644] /S /URI /URI (http://docs.python.org/lib/module-sys.html) >> endobj 281 0 obj << /Type /Annot /Border [0 0 0] /Rect [361.507 328.621 378.104 337.572] /S /URI /URI (http://www.die-offenbachs.de/detlev/eric.html) >> endobj 38 0 obj << /D [283 0 R /XYZ 72 744.907 null] >> endobj 285 0 obj << /D [283 0 R /XYZ 192.364 382.624 null] >> endobj 286 0 obj << /D [283 0 R /XYZ 72 285.402 null] >> endobj 282 0 obj << /Font << /F29 6 0 R /F35 18 0 R /F72 73 0 R /F44 59 0 R /F26 4 0 R /F34 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 290 0 obj << /Length 2387 /Filter /FlateDecode >> stream xÚÍZÝoã¸Ï_á·ØÀšÇoJ»OwÛnÛZ´·îáö°Pd:V#K©$ošÿ¾Ã/IÔÑŽw ôú˜¦GÃáo†¿™¡òÃÝÍw]å(—T®îö«\¢«•"a¦Vw»Õ/ë]Õ?CyøÜéáÔ5›_ï~üî³§²IÉVØÉÂÃq‚4Ÿ n¥BŠËÕ–” áäßu­w›-ËÄzßµG3’ë¡+JmTÜüñîæ_7´ãY‘œ Œe+™gˆfdUo~ù¯vðã+ŒXž­ž­èqEQžå0ªWoþqóƒÙkd É9ʨ²ªpFãÍ:sÚÆS4îû'J™GÁÎë ë/"ÖºÐf«ˆ\ÿI7ºƒ-½¸G^Ú““ݵÍí†dëÁÍ—‡¢yÐ~¯‡ªw³÷Š×'/R5ý ‹“iÍ*n©®«v:ᆭ’c£{êuy.Â@ ¤žCN"Šˆm¦T” ”ó™NýïR? U› †d&¯ ‚”ÌÓA¶0Ÿ…ÿ4Ð…°:Lp÷ÓÒŒàõ´CôáAw½;/^õQ;ë|aõphwIL(XK”Ç„Ì@©«&åÁ‚ȼá‘+ð˜à0kþþ(œ‰¶mWñgpÊåWÁàVýfŽ—Ô™+I8x/G4gÎ\‚ÄfK0Æë?[ÕÏ FÁñ?h7˜Ûâf~Þ00¾€ôcŸ€æ åŒ]ác{ôV:2ñ†>ëN‡½ÛhÃvüDÕ º{Ìt÷Ö­Døœ9¸”ÛåD¦‚¿ˆJ8ÕŒFŸö/=êõ`ÉÛø×Éó¹j)gajÊ„R¢sIEI†¸Áªýbu{_Ô~Ò¦;4KN¼mâ `’ŠåÆ£å£Ã¢õ2pUQ÷ö{…kÝ–—ìr! èõZ‡çëÖ„ós@<Ãm¦Ž&Þ\„;áÐií~,:“›NG8,ýÛ„Û0µÈÕè·Îè)Ž: eç#2oÊ$bŠKç_`Ý”*‚`Ç“*H…9ä‚]B'ÂDDa?L­*ÁÃ\æ‹”iÊ€ÖøU•HB°xI›Ã-ªÓòÔuf[v¶ŠòÑÍï;P—Z˜À±Ãò:`8’•†¥ ·@?tUóð6U"pxÊP#x"¹…p¬o«02)žŒ3¢l4ãÖ¤¢o×3b~ë¸<¥‰+`Zr½Ec•rûjõóºYåçs@}­Yåçó[9RjqaÒB‚%%¢TΔ^ÜmL¼(y,ÉTµ]8A ‰ÏËíô“nv½c%žfbQ‚J‰9JÍþ·—'w$L’ö—ÔWwö¡\MlãÀš0œ±&|³ÉÚ|6n¸¯}Ü@æ·…C.-­>WÃ!uú…æD\yú0Îg©Ç›Õ&œ²ŠÍœt騉(ãYÏè'&¼:7[¸÷˳û² û²}ÒsD¤A2Ôî0%ëÊ[좰J]f |(bvz7å¹zâš”6,²!‹»Pu…»ƒ7¾2KÅ>}ð·¶9ÃÐç²Ú/¬8™¬ÝžêÝØ¡ÍÍ´ûq…ŸI·Pâ)¢b¢"›@È'²„|†8üT„¹¸™Ç)'õºÞ»9·¦4´º[ÿtÓš²ÃMÎW5Ûqº 2™5 ƒ×îEæ¹CÃDžÁ]žÁsˆý×`ßz©(„Ƙ±í³uìÞ„ï~‚Ùw6 ’ ñh“‹12]™îKÁ"ÔdEiˆ1„›Óö‹?W/cLîOµ?~æÁþlP÷±5q0,HÎk‰K°(÷mík¼„£.øʱ¨ùÂqåw–V8F«¶ïÍAggRÏl]†þ Æc¸Á¸wmŒB¸ÁCe»ó“÷õnè9Æ  gY`o6co6±7,a KÞ%8š)ŽWå(6岪O6.bÊbçøƒA-8òÇ;ŸäTfÚ½(ºƒ#Ãý‹-phQŸÝ<é²ú„1ÕýWÑgºûö À¼S9[€Åa`½Âh6ïý„)$)¤‚ûÖÞBQÇFæÓݺØÐ-OƒWP¸1™/öÄŽà|[m.XÌŒíj ž†ê¨{7u<ÕCõTëåÃËócÙû8£¸™‰ûpœÛY¹+‰¨È½&C…^ÿ|âNÝë¼dª .Åß~qÐ|S¤M%÷…¹€]ôÇÊu“¤1ÓR|©Æ``è F–`<#ÃWë#øô!j†6³Ð[Í]fžz`6l’NY96‚áQéæaàø©|¾èx%è¼3³+k掲óÅàB–e‘eÙõ\Õu\¸=šzÄÞhé&á¿ÛëþÕX A_=4m§wדÍånCÙ;õ÷æàÚ¬7»º5Srbï~kKÛ0› ¬M”Ê`™Ê/é\­!2fÌÁ]}”úPSS6‹aöÊE]´ëÿ “0Ζñ|¾½ÿ- ¾~ï>æ„ûÃÄGv‚èê^îO0÷jÎ/¥åá =ɹkÄpfÝôã*ñš®Öç®›àþRUÛj!žêù™ÌTW <뤼ÑÞ! W UÕââ>αíý?u9\Ï2—®J$ôÖ"ªna÷©Ì~(ú%&ŽÎ–¿KnOãA!î(ó€Èë®y2Ц¶ø*H†Cç:Å»¶ˆ¬“x ‰²©<þo_UŒ‡†<Ë //.Â?Vc?˜ÜLœøžºö©xØóŒâ.d¤òPTSï:•Š]ÿf\-uU¥W^Ifˆr>ËË‹²`ôƒ}Í<Úd]˜w×–g×,FÌ;÷ÏŒˆãè9Ûn|C´o»c1;¸M¸)ÙØúÕíöüx<Æ7ó #ÿR?¼Ò‡21ÁÝdæ>6Å;Föj¯GÉmÝN²¿}¯¿Ðg÷ø÷—áìÿ)¾ÊúkÑœ },Œâæõ^ÆæFù_fæ¡‹æ,4M±ÿcœ|a®æÕ¥ipï»æÿÐ ç%]q iœŽ/ !ÉHH2ßøÒÜ*¹f$Xûh‡¤& endstream endobj 289 0 obj << /Type /Page /Contents 290 0 R /Resources 288 0 R /MediaBox [0 0 612 792] /Parent 292 0 R /Annots [ 287 0 R ] >> endobj 287 0 obj << /Type /Annot /Border [0 0 0] /Rect [310.354 87.511 414.383 96.462] /S /URI /URI (http://docs.python.org/ref/ref.html) >> endobj 39 0 obj << /D [289 0 R /XYZ 72 744.907 null] >> endobj 291 0 obj << /D [289 0 R /XYZ 273.791 563.148 null] >> endobj 288 0 obj << /Font << /F72 73 0 R /F35 18 0 R /F29 6 0 R /F26 4 0 R /F14 11 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 296 0 obj << /Length 2695 /Filter /FlateDecode >> stream xڵ˒Û8ðm媘¡H=yNzk73;Ý©=Læ –Ô¶*¶¤Ñ#ÿýHI¶:é˺I“â ðÍÝ‹WT´ñ¡ƒHmî6±ÚÄ2‘7wÅæÏÑvçK)½Õ±ì·;'Þ)ûZÕ{š-á¤É»ò~«¤7î÷e·ýóî߀!ݤ" 8%Rüe‡ß±—ÑÄB‚•/R* ?΀qš;YÌqš#Y]ÐÖã!hVõ´UÕîë“Øî´L½·cוõp<ó7LÉØ3ü_>}f"Ç¡J¶¾ôÊ+h4!JªcAûm×äeß¿DVàå}_¤!3—ˆ„ãÃÁ§|/;›­ ½ÇžvšŽ&ýxßÕ0USÓÑ¡á'zàW{Ìò’Ò tÞ›Š˜,òßÎÃÁÂj÷]vbä‡*?Ðt_h?‘eaX'½FÒfÝPåã1ëHd6Ö.äk©è N,8¯ê¡ìÚ®Pžf¡§DRØïP° K5À•¼©ñÒû±³Ÿ™k›¯Ê~°‹Õp€ûQ佦bÕ´Ë“BƒqL ­c-Àõ̵pýZë•i ì™~|@#ŽïËëeרÍ=‘;"Ž£%âÄ¡µ¿X׎(«8bå™oε˜DÞÝË0‚¾mê‚;ôšq``¡£ ²Ök–¨D ¥ýŸ²$ŠCÇ’¡«Úåaðþ<0…¶>,ñUJüñ=;µÇ5̾ …ö µ=÷¢=¯° d"” –ü¼/óæ6²&h¡Ã È+`p¦ZÛsÙƒQaJ”-ÎÜ`¾PssÆeˆæ”Íö%ý¨³ϾÈP¶hí€æ>ƒéitÒ- ¿¯ þ´_*˜3!Ÿhã”Ã$™.· ¤‡Œåò R¡RÇù­f†ŠH~ÛÔCÑ!0äOírð&Ùý‘©ì@媺i~–b/ÖÌÉ%©EÞkúfœ ^®€ Dš8-ªŸŠYA,å?S~ËŽk€|‘ޤUyè$>œÙù°¨X)‹ª¿NÂXWºXL¶ôö˜õ½qó:¡(¡Sжmº÷ÅýîX¹°+ŒáÕX[\æ+ò °o•åøìP`ýý÷¡¬ £opÜiB\ÑqtâÝj¾ñrJ-Œ’O~j¬2S²`t ýRáh…™ ä"ã%/ê~‡ZŠX9?þa¬sô’¬®†ÆÄ,Cã`òîê®k’%øD §?ûçšÙF–®À(Šá€÷BްÎë49Ê=À¯Ä€Ü©jãz›'X¾-tz~S?8®Ü3âžÕÿ· Ðu<²-ŸšžùîÝòï„^l]„kAqLý~bÛ5‘a(bßù;;\”nš†û†Ñ„WŒˆa,x¤°¯b›ÛÁÞõ—dD7Ñ„ S`RJFê¬/3UXy“õUNxÞ]m"ß°«§@ŠD^„,Cóýî`ƒ‹×F+Æcñª?ààTã¼î™õ¨dÉœ±þa VñË#ø©±E“ÀòSñ„ À­†zEPE³  ¾¦Ú íAaºN‚Âd;ëX6°Üt‹ Ü­[M}IÛû².;ˆAg[t„’¤0Ð~Ýpý®þˆÿ²sÏÑ—ë î|QÆàw$2¹ßEÖÖ·e^¡„Pò)çò©tn–•)ÐÚäg x8Ù“‚%£ƒ0žÚƒ•®‚jÆÈ05® CwWô §ž½p#°²â¼­¼×Ǿ¡Ý$-DAE¬×%¡µWò!¡ZËþóCV;-{èš+꩸pð¨Ïöí}9¬«š‚’Vº|áÖªû?á·Õ’®CCºód׉ˆ|n,³λ¾…±öÕþ`¢ øù¡¤0:¾J5´ li¥gÊË\EâÆ¡<¶´XÕ4Î ‹v¹ V» ö½_è—wšüœ…:‡ÀõÊâ$ƒÌ8ÁD®øÑµìNaÄ·þ'`Š!“É”-.{®rNƒBg<³<žŠ\ãuÏ™†½œ1 {¹%w–‹yþ°,×ïåk4Åt¸ÜG»â°SSþ(} ")ô¥ö?ˆ¾PÒ©Ó –u'ð]ý‚Y`·HlfÜ£ ÕrüJU˜$ó” Â¼eÅGh‘>?ÉWóŒšÃÉ~­†èçÔ<ÄãM‘ä„Ó9‚gåwZ‡BJiäÃÁDø2+Šû=Æ€'Í< ž” —ÕÞDDz§¸c`;%£¶Å˜‹7ÔQÊLgëé†!+“iWhª5pž›Â@+2!\ᤜhVqy‰ËipÆ‹ïï^ åÆ"~)Ða\x~zm› ¬æÈWwtgÏîf‡ß˜vêR¥–)'²1ÞÐázrø£/sêïáUìåúfìòõÜdf¢&Í›S®ã{sÂygF2ú1Åæ†Ì•+QàâéÍQznFš²o,SV0ë3¾Î¯·4¶YŽ2úš!;öœ{à'®Ô Ciš.ôã”Ã.+@þ/”w·Õ±]ûüûìÑÞ5E pÐø–-ô8å¿4~­WÍÑO"¥É…Dm7’¶ÛCXÁø¶¥ê.ü5…7=ó¦¥Rs]ûÑ’Ò™ö«4žùö4¢¸c )$^ôcÙúÄoÆ~‹ýÛU¢’‡3ç6¶O8l¨b§Vù^bpM<›3¯ôÍ´PS÷Èz¨¨5ØPι» @·ÊâF–up)Ë:sÂæ¡ø\p¦¥{fdEÔ^€X õ…R™>\Ù¯vÈ$÷Æb:úE©ÿ°è°ó–\ÑJ*±U¹pð©éNThh.*¯™…5QüÑr³30˜P¯H‰»¥T“„ö>Rª\âªñú*ö*|P …øÝ6*éŠ*±Ï0#¯NÿòZmóo\_V ¸=#×ün%Ý: *¾:k2_ÅrZ±– lzNx6†b¸€ãŒÛ%ˆ,÷&¯ƒæ’øl$‰¼¬±a«ŸóÓ$œ‰=%¶ƒ`j ]‹#‘ªO¦—ÌžŒhß$lØ!LØg=òë¯+^Îx뱩ÙzYcš§0®˜>÷¥M]l–}íNBoRNóò…Ç20­gW kî‚O[T«¥‚/‚)/åÞMà³Sùòä s¾«Š’<Ú WÚ0ÒSM æ§¾{ăin˜°dûšfVÎ4òK§ï½?e¹)7eìÝ0\×@r |“¢Ã–}v4½aû`Dý\4«ðÕ ˜ÞxúX]u³ÐÉ‹ nå´îEý(ÒwŽêØdÅξC^ºÑhþ’00YR*lÎõ—˨bµ ¡¢S©?þ”›–A ¡J6æÐiDÐŽ›Ûÿãt+š+€ÚJø¾"ôZm1=S©÷öµô*é”ð»H)ûT·èºÃ¯©¿xýúŽÿ ¤éCå endstream endobj 295 0 obj << /Type /Page /Contents 296 0 R /Resources 294 0 R /MediaBox [0 0 612 792] /Parent 292 0 R /Annots [ 293 0 R ] >> endobj 293 0 obj << /Type /Annot /Border [0 0 0] /Rect [230.501 257.952 379.35 266.928] /S /URI /URI (http://sourceforge.net/project/showfiles.php?group\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip id=61395&package\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip id=175827) >> endobj 40 0 obj << /D [295 0 R /XYZ 72 744.907 null] >> endobj 297 0 obj << /D [295 0 R /XYZ 301.35 709.635 null] >> endobj 294 0 obj << /Font << /F26 4 0 R /F29 6 0 R /F35 18 0 R /F34 17 0 R /F44 59 0 R >> /ProcSet [ /PDF /Text ] >> endobj 300 0 obj << /Length 464 /Filter /FlateDecode >> stream xÚuSÁn£0½ó¾¤âÚÛp­´•ÒÛj¹µ=8ÁYÐLi”¿¯í&UÙ0~Œæ½7ãyl’‡§¢5¬a 9NÇ¢‚ƒ¦/é+!Ì=çÞt1ž{#óIþ‰¿rÎÞšç‡'RßÔÀAÌ €|‰¦ëç,'œ§j2½]ÌR•aš~¸—ÔºoeH9wRKŸa”‡¦Åxà!2ÄDÓIO]Ð[jN!­ËH=]Úý†@ cì+É;Y^Ô(ݲ¹SËÐz®}P$‚ A¢ÆN˜f¥ÓY–8 RK—c kJ=Õ,…>t«Šœ×ÑG'Õ.C„…Þtf댣èþ4)m6¼VWow²…¡Øí”sÌ­ªª´ ý>k9Šý ãiºè W©íÐrƒ±æ×$2îŽÞÅE->hÕxç ìDFP¼Gt,½žöî÷²•¼Ñ“Ã_‡­ÿ/’H®mQÚן´<ʯ×Í~—9(q³½ÿõaJþ.¯ÍM~5É{ât €ÝÑÒ’qp8%/o´~uÎkÒ ”¬²ßüI~'n ­ÊoKXˆ1ñj1äör2BÒÝ81 b]#wÍJÊìü¾š_QÏ'Ÿú endstream endobj 299 0 obj << /Type /Page /Contents 300 0 R /Resources 298 0 R /MediaBox [0 0 612 792] /Parent 292 0 R >> endobj 301 0 obj << /D [299 0 R /XYZ 72 744.907 null] >> endobj 298 0 obj << /Font << /F34 17 0 R /F29 6 0 R /F35 18 0 R /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 304 0 obj << /Length 99 /Filter /FlateDecode >> stream xÚ+ä2T0BCs#S=#3s…ä\®èX… °—‚ž±¥…B9XQ®‚‰™ÎQæ är áÒw32S°Ô³4R!i #LŒô BR¢5ŒM4cC¼¸\C¸/æ2 endstream endobj 303 0 obj << /Type /Page /Contents 304 0 R /Resources 302 0 R /MediaBox [0 0 612 792] /Parent 292 0 R >> endobj 305 0 obj << /D [303 0 R /XYZ 72 744.907 null] >> endobj 302 0 obj << /Font << /F26 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 308 0 obj << /Length 881 /Filter /FlateDecode >> stream xÚ½X]o›0}ϯðc"-ž}m¾—5­¶‡©[3iRWE¼•@$[ÿý ˜‚¤©öT):÷žsï=¶/-Fï¯ÁDÀ±e[-~!nr  Ó –>ºúr5ÿ1yX|.ДcÆMÈÑSæ@Ÿ:DÂy ¿{Þ¬â0Ur°cÊ8‰'h*£-§Äáí„’ñ³¿J¼‹¨‚!!;†Qb~¡x7™‚AÆ\«¡ F•âY‰dÆIò™¿Ò‚90 UäñB7MKú *ÿÊŸ©RÄH¡|ªâÒW‰pŸ¶qe©BS¢+@ê†M[ ûxZzñÜ(Ž/——kÑÔa˜$ºVG^o!b#²ÇØ×Ô bÊLÅGùÖ»ÄÍ‚86&_¬&@Æ»õZ$NÆÃ¦Ç0WûêuNƒá”¦cíjvm?5Z=m¤2|WGÇMyL«ÞñÊ.›Øß…¢e°Ë¶«À†ô—ú‚h]áá„1êqAºu3ïq)þzb›WÝ¡˜`Âá“´z¥RèE„A$:øåÕA ~ ½Ê gOD¶K:ë'S:ŸêÍ[¦ÈÍK(Í{Ý+¢üTìƒ$Ž6"ÊJ†ýŒ±›î*éIOßNÈÃoæßª[Åjãƒ+–qüÔ5Sç˜ÙÑöGåiô纷?å=ÙƒÚ³Q?Ç­³P¿# ØÑ…0ôZ:ÜÌ7½ÊÍ›<*À´’ª7¦ÞÌÛÞfvÌQûnµ¥hïÙv1BŽ3kðÕDÐÐ’›H's[n(TU·Ýt¸LÌ }…‹›'I¥iÔ°Ól¹‰“Lt °åRt1}‘¤Iþ¬·Y«Ü4s#ßMü:kÉWòðZ´eaK>À*ºãºãNÓ‚ßzOE"R‘u´‰K vÑC 24º”ìº.˜YÎÅÃQiމ=7 ÏÚÎ^EÞXØ^ÈÅÞýßäæ¼‹™Ù˜IèÅ=/Ó—½KfFôŸ;ŠZúŸ©o^÷Kï/³ÄõºV!ÓÆÀùåúTžÆù\ô*,Ô-«Å鬵 ÿ Ø¾÷*Ü¥"´Óž¥jwJ%°î®‚¾g›mð\æjx-æÞMV>ÔqÎáͣߣü± ˆ" Á‹¯o3º È—?Ëw3ÇF Ðq3Bt7ú:š©Ôn°åfˆË•œª¹2£¢ú'ßï* endstream endobj 307 0 obj << /Type /Page /Contents 308 0 R /Resources 306 0 R /MediaBox [0 0 612 792] /Parent 292 0 R >> endobj 41 0 obj << /D [307 0 R /XYZ 72 744.907 null] >> endobj 306 0 obj << /Font << /F26 4 0 R /F29 6 0 R /F35 18 0 R /F34 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj << /S /GoTo /D (page001) >> endobj 311 0 obj (1 The Extended Python Debugger ) endobj 312 0 obj << /S /GoTo /D (page002) >> endobj 314 0 obj (1.1 Invoking the Debugger ) endobj 315 0 obj << /S /GoTo /D (page003) >> endobj 317 0 obj (1.1.1 Debugger Command Options (--trace, --output, --command, --nx, )) endobj 318 0 obj << /S /GoTo /D (page004) >> endobj 320 0 obj (1.1.2 Startup files (.pydbrc)) endobj 321 0 obj << /S /GoTo /D (page004) >> endobj 323 0 obj (1.2 Debugger Commands) endobj 324 0 obj << /S /GoTo /D (page004) >> endobj 326 0 obj (1.2.1 Debugger Prompt) endobj 327 0 obj << /S /GoTo /D (page004) >> endobj 329 0 obj (1.2.2 Command Parsing) endobj 330 0 obj << /S /GoTo /D (page005) >> endobj 332 0 obj (1.2.3 Status and Debugger Settings (info, set, show)) endobj 333 0 obj << /S /GoTo /D (page005) >> endobj 335 0 obj (Info (info)) endobj 336 0 obj << /S /GoTo /D (page006) >> endobj 338 0 obj (Set (set)) endobj 339 0 obj << /S /GoTo /D (page010) >> endobj 341 0 obj (Show (show) ) endobj 342 0 obj << /S /GoTo /D (page010) >> endobj 344 0 obj (1.2.4 Breakpoints (break, tbreak, clear, commands, delete, disable, condition, ignore)) endobj 345 0 obj << /S /GoTo /D (page012) >> endobj 347 0 obj (1.2.5 Resuming Execution (step, next, finish, return, continue, jump, skip)) endobj 348 0 obj << /S /GoTo /D (page014) >> endobj 350 0 obj (1.2.6 Examining Call Frames (info args, info locals, down, frame, up)) endobj 351 0 obj << /S /GoTo /D (page015) >> endobj 353 0 obj (1.2.7 Examining Data (print, pprint, examine, info globals)) endobj 354 0 obj << /S /GoTo /D (page015) >> endobj 356 0 obj (1.2.8 Running Arbitrary Python Commands (debug, !, ipython, python)) endobj 357 0 obj << /S /GoTo /D (page017) >> endobj 359 0 obj (1.2.9 Starting/Restarting a Python Script (restart, run)) endobj 360 0 obj << /S /GoTo /D (page017) >> endobj 362 0 obj (1.2.10 Interfacing to the OS (cd, pwd, shell)) endobj 363 0 obj << /S /GoTo /D (page017) >> endobj 365 0 obj (1.2.11 Listing Program Code (list, disassemble)) endobj 366 0 obj << /S /GoTo /D (page018) >> endobj 368 0 obj (1.2.12 Interfacing to the debugger (alias, complete, help, quit, kill, save, source, unalias)) endobj 369 0 obj << /S /GoTo /D (page019) >> endobj 371 0 obj (1.2.13 Signal handling (handle, info handle, signal)) endobj 372 0 obj << /S /GoTo /D (page020) >> endobj 374 0 obj (Intercepting Signals (handle)) endobj 375 0 obj << /S /GoTo /D (page020) >> endobj 377 0 obj (Showing Signal-handling status (info handle, info signals)) endobj 378 0 obj << /S /GoTo /D (page020) >> endobj 380 0 obj (Sending your program a signal (signal)) endobj 381 0 obj << /S /GoTo /D (page021) >> endobj 383 0 obj (1.2.14 Thread debugging (thread, info thread, qt, frame, break)) endobj 384 0 obj << /S /GoTo /D (page021) >> endobj 386 0 obj (Showing thread information (info thread)) endobj 387 0 obj << /S /GoTo /D (page022) >> endobj 389 0 obj (Quitting a thread (qt)) endobj 390 0 obj << /S /GoTo /D (page022) >> endobj 392 0 obj (Thread Extensions to the frame and break commands) endobj 393 0 obj << /S /GoTo /D (page022) >> endobj 395 0 obj (1.3 The Debugger Module (pydb) and Class (Pdb) ) endobj 396 0 obj << /S /GoTo /D (page023) >> endobj 398 0 obj (1.3.1 Calling the Debugger from Inside your Program (pydb.debugger)) endobj 399 0 obj << /S /GoTo /D (page025) >> endobj 401 0 obj (Turning the debugger on an off and using Pdb.precmd) endobj 402 0 obj << /S /GoTo /D (page025) >> endobj 404 0 obj (Line tracing) endobj 405 0 obj << /S /GoTo /D (page025) >> endobj 407 0 obj (1.3.2 Calling the Debugger after a Crash: Post-Mortem Debugging (pydb.post\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip mortem, pydb.pm, pydb.exception\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip hook)) endobj 408 0 obj << /S /GoTo /D (page026) >> endobj 410 0 obj (Post-Mortem Debugging within a Python Interpreter Shell (pydb.post\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip mortem, pydb.pm())) endobj 411 0 obj << /S /GoTo /D (page026) >> endobj 413 0 obj (Post-Mortem Debugging arranged within a Python Script (pydb.exception\unhbox \voidb@x \penalty \@M \hskip \z@skip \unhbox \voidb@x \kern .06em\vbox {\hrule width.3em}\discretionary {-}{}{}\penalty \@M \hskip \z@skip hook)) endobj 414 0 obj << /S /GoTo /D (page027) >> endobj 416 0 obj (Post-Mortem Debugging within pydb) endobj 417 0 obj << /S /GoTo /D (page027) >> endobj 419 0 obj (1.3.3 Entering the Debugger from Outside the Program) endobj 420 0 obj << /S /GoTo /D (page027) >> endobj 422 0 obj (1.3.4 Entering the Debugger from Python or a Python Shell) endobj 423 0 obj << /S /GoTo /D (page027) >> endobj 425 0 obj (1.3.5 Yet Another Method of Invocation) endobj 426 0 obj << /S /GoTo /D (page028) >> endobj 428 0 obj (1.3.6 Inheritance from class Cmd) endobj 429 0 obj << /S /GoTo /D (page028) >> endobj 431 0 obj (1.3.7 Debugger Entry Functions) endobj 432 0 obj << /S /GoTo /D (page030) >> endobj 434 0 obj (1.4 The ``Basic'' Debugger module (bdb) and Classes Bdb and Breakpoint) endobj 435 0 obj << /S /GoTo /D (page031) >> endobj 437 0 obj (1.5 How the Debugger Works ) endobj 438 0 obj << /S /GoTo /D (page032) >> endobj 440 0 obj (1.6 Files making up the Debugger ) endobj 441 0 obj << /S /GoTo /D (page032) >> endobj 443 0 obj (1.7 Installation) endobj 444 0 obj << /S /GoTo /D (page032) >> endobj 446 0 obj (1.7.1 Installation options) endobj 447 0 obj << /S /GoTo /D (page035) >> endobj 449 0 obj (Index) endobj 279 0 obj [2 0 R /Fit] endobj 451 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 452 0 obj [500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 0 0 0 333 500 556 889 500 500 333 1000 500 333 944 0 0 0 0 0 0 556 556] endobj 453 0 obj [556 556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444] endobj 454 0 obj [667 611 778 722 278 556 722 611 833 722 778] endobj 455 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 0 0 0 0 0 0 600 600 600 600 600 600] endobj 456 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 0 0 0 333 500 500 1000 500 500 333 1000 556 333 1000 0 0 0 0 0 0 500 500 350 500 1000] endobj 457 0 obj [1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500] endobj 458 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000] endobj 459 0 obj [278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500] endobj 460 0 obj [500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 0 0 0 222 556 333 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 333 333] endobj 461 0 obj << /Length1 822 /Length2 1090 /Length3 0 /Length 1655 /Filter /FlateDecode >> stream xÚ­R{XWYy¤VZy {}DE$ÉcLº@€" ˆ" »CæÂL˜L A´(,Ú‚,RP¨‹­( ŠŠÊ"híW"HÅ.ô[PŠ<¤´([Ýwmwé¿ûÍ?ó;çÜß=ß9—½*(ÄÙ#£¡IÐί€= ‹Íö¢ Jã$!Ai(ˆH„M @€'»ðÄ!‹ ¼H•ŽÂcbi°ÁËqV$ Âå(P:&0;䨄rÒ:ðP*lö„È RIã°`¸œÑ0'XÜYG~„‚ÂyÓ¨ÞPIR3¦ÀƤ#`,b$¡Ô *X\)ÉÜ'ÿS —ûh”J)š0»~.¥ßñh®Ô½V * )@b"JwÃysÃ5 Y?Uâr"F 3²™Ãã æ \íƒk!„ÓòX @•j8‡C[h…‰oÎW²;ÐÏ7Èéu¯sdŠôN Þoê¹ùmfR¢p-ˆàqx<„2ß›¿½ .ó&ä$†1ÀE° …êXÌ b&HEN`P  –qÌå$ÍL4i@AR¬ÙZž àFS¨*¡‚žå^Ãü×ð|‘¿âfš€ÿ1J9NÉ•P>Ûû<ñû@<=Imª³‹8‹¶0d  iÿ#”k( ôÜ›cb}3+p¦ µPÎêí!å®™qŇ?O÷>Õyf ×ô—޳Oz¯‡5¥—âXZˆà³àU1tåȉ†[­âõÖÛ実XRõ6ùÒ¼¨©“–µ 9UaeZ8B¬tä-qZ?âך¸«äø¡;q 5øé_×lêZ³¿Ãü3lØ3üÔµéþ³åeWÛ {kŒû VXéú~èúãOMû‹ÛÝäO¿~¸Ã/ÈJ퓳^¯p7‹žBŸ?bíU$éõNÁC7º‡’­±/ Ìk‰ÐŽÙg¯ÎbOþ=¤Jû,'Ý.õÛ;*c«{Ù£ù'ží 4eµØ{¶õu¶f¶pdø^³ß±²cûÒ¶ÃIZôN ¯Ÿ¿øüP“ÍWqBë¾D²^ ÛžNÿWüâQ{ÉXJbu³Ût¨U~Ç¿±dÏDes«YOó»ˆå{ݽ^G~)7•Þ5Êq Ð43Fù7÷ç¶©xµSXÈíÒñóÁcgµlñpý˜¢tæ^VŽòO[O_رáfMõµ›V¤ž¿}l¼p`ê wÉÅÆz¼5n­ÉRÿñ™à,Í.é¿uîNkÛým³¦ë"ô7Š/H¦{¥E‘-?¸çÀ“gâÈÂ&­á Å_&EæÜÆÄŽ."ŽÆ¥ïß)ryV£g¿eð4Ö´§­ÁvP_Sbµ½aèÈÆÉoCãË £L.EŸr•xƹFL¸Öþ3yÝ<Äïyød´{ÓÛášsCžÉ %Ù½&8LU𳑌ÿSÊåÜãM>PªÊ,>å=™UO^7µøîŸ›—©&Œ^ŸÊÞ6pYRè}•W–â^`À ]êÐem<𓏲Òù 9\u«(‰Ùò/Œnž¶>àúðÅPâ{ÍRñž0Â:Ií[nãkñXxÉ$ÔÀº”Ų|’T·þEä;Íè"ÔÎá-ï˜Èó[mð»áÃK€õþ{‘;,º\yxy_Jt(&³ rɹlÅG£Ÿ¤· ù—x[¸ì \#·ŽÞõÍÍCñE°Ò¯Ü6¹Srä–›ÅÉܵ©Ž}Fú§'{eŽ•Ý3 gøßŸœsn¹ÒÓÇúª~Õ²%ââ¡<›¯•¥Å‹ºý6 [§*WŒåɵFäÙ3öâjü´C&Ús0«:ef»ó²Ú'œ¯m§ƒ~öãœé|¾˜­oXyαnúºžL£wKûŽçÆe´mÅ¿¨¨Xßî]5yIs“Þ¿Z¾Ã®Uô~FèÔ];“®øöl>YUCL¸N›¿Mé`Gâ£ÅÞ‡n÷¦V ίjùÓG-ƒÂÃØŽ\ý•—M»êoŒ¨/(¢kv¯ë[™ä!ðyqÛêüêÂ)·UeÒo2ÿ—l endstream endobj 462 0 obj << /Type /FontDescriptor /FontName /DWOIGP+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/braceleft/braceright/bullet/circlecopyrt) /FontFile 461 0 R >> endobj 463 0 obj << /Length1 1606 /Length2 9116 /Length3 0 /Length 9935 /Filter /FlateDecode >> stream xÚ­ueTœ[“5îîN£ÁÝ <¸»KKãîî„à4hp î.Á5¸Ü-¹wfÞY÷›_3ï^ë)9»vÕ®sš†BYYÔÜÁ(å`ffga(‚ìL]]ìå™ÅlÍoNn$qg  ä`/a ´€æ  €ƒÀÎÏÏDwpôtYZtªZôŒŒLÿòüI˜zþgäí¤ ÈÒ@ûöá´up´Úƒß þ×Õ€@Ø °ÙâJÊ:2ŠÒ:iE €4Ðèlb Pv5µ™äAf@{ =ÀÂÁ`û·0s°7ýiÍ…å KÔ`pqšÞŽ=Ì€ŽBLG ³ÈÅåírX:›Øƒßfv€ìÍl]Íÿxó[8üEÈÑÙá-Ãî-ö¦ìàv1s9‚oU•%¤þæ ¶2ÿ©íz ,Þ2ÍÌ\ÿ´ôWì æ- 6Ù»À@ðŸZ¦@€9ÈÅÑÖÄó­ö˜£3è/®. {Ë1`8-MœÍm..o0oئó¯>ÿ­{GG[Ï¿N;ü•õ_@` ­ ;Ç[M3ð[mK=ëŸE‘±·p°³ýí7wuüϘÐù¯ÑýÙú7&æö¶žs «¢ø­$€î§2Ë¿OäƒÄÿÿ-òþßÄý§Fÿíÿ_ïó?¡¥\mmMìÞàïðöÂ8äÞ˜ÿ/×Ädëù?dÿ3Q ø7Ãÿ Dlò6Q{Ë7)ØXØþv‚\¤@@seØÌ `abû6£¿üöæ@g[=ðMË¿Æ`fgcûGLÝ dfcÿgè܇€öæÿdþ&Ï_¼Yµµ”´Dåÿùšþ•¥ü¦:XÝÓñØô¡à`þ_Æ 11€73'€™ƒ—ÀÃÇàãe÷ýªýÃþ/[Áì òè½µÌÆþWãÿñû—eðI{3ó?[¢6±7[¬ÿrü ›¹:;¿éù×]kø?í¿Vôš!-Í;˜ †X§e¦ƒ«ñsÆ$ôzºØ¡BKêÔ óª:ýÓ"6øËŸ¿…²ÔO¼¶xÎ9¾ìÈ2ìuáÙ¾ëLž~!ñ¥¢ïÎÇ\£måeÜ b5,AM?ÖŠñ>›•_‡ÑåaÓÜÝSQ5,~†#håtF8»£ rËÀ¡¾uDó3û\Û†QU]ptL›|pwû®oxp ¿ó¶{‡˜1'‘FÐ •6:À)‡XDW£Ü;’an/cdÌïÃ1›eç€ ß5ÏJ{„àZù€»ï)þå©ò ƒÊ…뉳WPwò®¢¾¤Ö­Àz ÚvŠËÊÖéä3WÙ##’eNŒ!¼4<‹ùêX·ÈØìî¼XH0Rïþmìû’MD ±£aì!íAg‘Š/Y)š‡Žt¶8 ÂÏÓ¦*UnÔžÝéü©,È_±¹³p«}Às‡aq–G˜éÓ$_ƒ|Ö.:‚µh‰gX<_‹Û¤5ÜûoC‚%ÛvcoÄUµöêÕŒý:öîMgU«vÞCŒwNkºéak˜O¡µqzŽÑö•Œ½¿Ã|Æ8å jcZTÚ’ÁæžF´Ï ÖøÆcù~eïý»ÙóÍà×åöšSÎ-B“¦ï…ä>Âûð¯aðd?µ4óP½Ïó‰}Þ_c$[œŒQ^«É`& #ì}WûS›Á®¶Q…¼‹:ŽÉÑB´NQ,ËùsË~á]O(U÷{í³MO÷¼©øöUqù×ü‡‡:ɵF  _ª˜ÖddÍвˆõ¹'÷çJ÷§úcs}çYÕõ‡i{û¦â„Dw‡|œS–Á"hj–¨~éöó>¯éÅÛ:•ﮃ²X6¢Øf’c’bI2î0“N°¤G¨Ø’ËÕÅË~9 ‚ÚM»þÓˤÀœxW`‡-j7cçnÆC3ú-h€ƒÅç‰ùE~ÂóÝÖ7г`Wmþ²c|ô’ým¿ ÞIV5v µ«þÞŽøVh/È_pV¬Ë‹û¦æ¼Ï¢ËfÍÒ- º³quMª‚Žv†Þ÷§ï·CŽ]·3V–øZx”c=/b«U, ¾”%×»:Hœh½d7o™TÂñ%b¯ÈG2§uÁÕöEÝ!6°]Š` ¯mAŽ:ÉȽï“ôéúYãù{_5àÄ Ö:¡ÝÜÓ‘íºšTcc÷2éâ"qD€·VfcÞÐmÖá6fcå!t½ãõFÁš2î€8µêÉ Lì8N ¢ôÏë¢÷úÅ9‰‹ù1N¹É•³Ððç9îGEÀV­hþþ@š®°U¿§t/ã ™ÙäHª=tËGë¯p4)”…1êe>0i:IQBÏή #Sà2Q[ ÿq|»Â…¢\›½ ©ÙÒUkÂǦá½A…GÀ,jÄ€ˆŽ|››šWM(òÉà/'hG†3ðg‡ÆÏ{’‡Pójê…JOuù|MË (ëA Ò&æi¹Ú¡èÉJjPbÆwíxd :Ö´®ÝÏq‘‘4Gáü<Ç 6|µŒ'EC{ÌkÃAÕöüã~k– í¾EݘOB\0zü4Í1?ò›â4UG%‚ÄæyH2§ìk£„‰ØWÒYü!/Žda ÞåM~_׳¥"4fwÔŽ<¿ÛÄû²ïÏÒÅúüÅ^¥I%›ºf+ßÃHž% ™F ™¹M&ÂÊØŒ09FqE¡=3ò¤ÐŸªØ#nþØ×MκÑbÇ_X×bÖ»ñDa§±¸òDXœ¥Âp-¤uO ¿hè•~Ô$&T¦Å=ÎBÊèI,Qßš•!œ+>µÿLé!‹»0 ²öyêwÝ%Òc†PëTq»3þˆøiNlÇBM"çÐUñ„5U¬¼I…kVU«fÀ/„Y›‡Yž[w‡áðs*‚Ñ{©uB¹¢ÃžÌkÇè]vVLZ5ÿºtZRš>ïI)¬ŽWIwY©çzüÌóúèjW úsWÍ’Ü!9‰¿ó£ðuÏdò{¥9h-xÞyyÄ"dRí¯™.qÜï²±§°h§_…É«hëðø–»>­0FóÁІÿ"w,åqá“ü.§’»ÂS·ÍwÍCLHÑ})×>︶…O«o =`-àDÀ}º,ÝyÔ3õ]bÝÑ/4)/ԌӪh¯Û¾9Ü·4J¢g%;€ DEV:i„"Û­r‚†2×Ýhp®üŠNÑôµµœTÊuZý4½%ˆÏ6ØèðQ©ó÷È–d¾p0ñs(*ðVP§.¤v7©šü7÷,§© Õá‘O9ŸLÂ†Ï ó€ePO÷ {€ò‘ƒT+ÌÕFD¬´?#¯í7ƒ-h¾â Úe¡Z ‘çJEV]†MZ)Š}R“k œž'ìô>Ux5ÎÀNåX^ÅÈ-Gam9«µR‡é^Ÿ!¾³Î•F-ä1ñ{‰UØÎ„»Í®UåÈlÌ·¸-”r,çŠ Fnœ™A¡Nœ°¯£ß÷ cf¢o9ç!g)ðnà¯ÖÍË_¹ïDfU)%å­³Z/a¡³í¸»2P¶Bvm=1Z»šÌº_ Ä4‘ƒ+Ô«»ÛÙàÃ[?šÃ¥6)‰Îm3©•z?€ìÞ»r ˲Ö÷R&e8 Pœ"OÄybù%Êó2Ù3/ÊDî‡'ˆh>qÙïQlòêÍùýÊ£J ©½Ž_Øz ßò$ñ$‚€ÕDÛ²U=Ôsêk¹]¸x,Ë­UÕzNì-õð'Êž”ÉgŒ±ÐX>ÌâÉPõ‹¦=Ä))Œ±õ“(¾,¾µsSFíÖ Ô‡š“üè@„é¢cÕŽ'Ïø1-“– á‚Ĉ°Ë—¡Þ¬7{å³á1zu€† 4UR5±¥°E,«ªÐnóô ôi »Ç¡¤ê 2+ZŠV½æhwº£v |)c!V]Àî„Þzù©ñ4þâïãH±.u›N Iv mœÊ‹Q9k#2ÙMÐsœô¥Ë"Î~¨ ìO/ýæöJì–¤ ÌQnЂÑciö{Í;FcÃÇ \±ZCâø‚ˆµCìÞch;[è$mQËX¡ØRÜ\ŽŸ#ì3o“3©t4QLMV÷hž¼]–CÙ™SÈ6Ä*_Ç5Öˆæ®`UÉ-ùjwHÙLšÎƒi”dÓ,jÀscÕHâaeá“ð&O<$!ÚZMe3ý(+OÚíçgþIABæÝs°]HýP5r‘ócÒ£qÄÄôÇléx1€§ìwèSß©Ô#ïæÏ$mh»ÑÞoÂqp/AãBuSDSþgBvbÉ%|R^IT_|e I±y•[S Ó-[’GÇòÕÌکøfe°I= 2³Ó8:½ò®—Ê™Zò¶çpSê磥†üŸtÕ8¿$¶î«Y¨¢: ‘&¬Åf© ÷µO]m ¦VÓïs‰Õ²tO&“Û&±â¹ôž7F3H5—ÛayÉS<; GNô¿—ézYx?¬ýAÍÇrB^°è‘@v™CÆcZÇs)3âh¯­”£:ËÍ÷G€Nö[ÿHwB»^kÙ©©|uS(“o²u-Ƭ8¢#+»?(Î,ëáÄ*gL4îËý©ü¯Fœ ¬ðô¬wœuËf éGBŒèÇÏiчh<:AÆ‚ìê»Ëîþ(·T¼è«†Vv?{Ãó Ý•fÊGëªE§çŸ\Z!TMh³²g[• û4åŸèï.ê¨Ðtù‡qÈÜõCnÎc/ðƒ…îñûœb`¥_2 ÷Ðnâ$éàÔ?>óq¾ü6Ê2f©÷z{Ú²‡‘̦å7árAèÔ§¨Ón:eFÉïG¦·Ž'b¸¹O\‡¶ïT§Ü¤½¯’¼;rËp:ÄOÙÔ!ŸØÊ‰ R$Ëš « ÿLRI³$Þ<ºMjú-Šïež†ô²«fæÊ«¼æÞù§ŽÚ`¡Óø;à8†*}!ôÑQT&Š–=sgì÷¥€~Ж† >2=ù¯ÁEæHª1VŽZT¼Xã•'æqJµú~Ñ×…a¡t”—áàïÕÛ@nðuÏ£©ªÍštyPkEçÁg,—%ûZÐ ‹S÷;—©MS.Ê·nc_]?†Þƒ„]³"/5µA˜¬öf€¶ÊðÛ¨gIÖ^ääøG]AÙ›:t]EJ¾øîG2<CQX–&ÅÄÍĤ]’&º³=ƒÞF«£8j#?áfÌBøJÎ*ý °lªº‰Zâ8:%5;Öƒ# ënšXc:7æÃ=¦²”Œ>lÆñî3;¡zÌX- õ¾˜b kKbumŽûÞÐ}׊²©<®©žS{`Ý9”K@}ì4þ¶³ÊC\øjH–yJ5AO7ÌðEf¡KZF¹<YL¦‚46ZmwfËÄ|ô3メE•Ü@Ž)Fh‘S†¤ÓtQ†#*? !mDU¿\Ùìý@¬Î‘u¡LŠ jíÎä¥Ä=‚‘l…·\J ÙüZ.Û3(÷Òâ+”òïñ6/£ûq½ß×¶¢ÖñåîÕô2 M¿µÙ`ªX½8…“ýŠrO~±™pÍ †’ð¯Í÷ëP/‘å£ôà³Dª¿úÉM ;±ñØÞìuÓv&ŸkZë¬ÓTR[ȧn3ÒÃv…Y=·B½À…YÆå`Ø1ÜWç‘ñŸÌäq[l´’Þ‰¶Ë^c-ƒu (Oö¦ÌYçã¡áõn}åóílÉ ±ÂZ¦+ÒKÔÕ²¾@ a.¢_×1ˆËN²P<ßW$‚Úö#b>º ªó¾\O7S±^÷óÌ>,¤Žx&¯Ṙá«Ñ‡z›ýiŠü¾ý¯ÃûJ?÷O%ëç"²>³Í¯º÷<$²<’ä*ˆ Þe°7¤\ÎÏ"ü‚©C[;˜”è®s¡x“™‡xø®“µ]*‹>_‡Î%2$m˜PTŠ,Fÿ¾Ægáàùp»ŸnBó®Ã}&ÅáÐSz4ŠãóPyˆ–uíñܮÈ>¥5+Wê”ýžƒ¬sHŠY(j˜zìðýîˤêRç ³W[I‡sž‚o”ö‚åTº¨bðSˆ:ÀcŒ¯ŸJjXè èBg* Ëü¥”²¯–h4Ž©†ÖeÁž˜¸XCpä¯7´voW|*R.²Ê)Ù_W÷A3¤Aàâ<ÒøÉ¦H‚¡/xVpYÔè>€©§;4É€-³ËërC>‚·pL~{vkgÛ¦Ò×ߥëå'å_ö¶|‘Dý`”•i;’»c}‚¡.Ãj šË )D'L–g6_6Ãn"×£Ššd°¸æ< {é¬ZË®›`)ü‹"ø½©WwŠÔ.m© fà¥é"ÒÅ-3`˜ð?ĤvÛÖVÇc 9¦ÀEˆôàXò™h‚§fwÐ0SlóÁsDŸ$­áÈ ¡0=n…S¯jEýô·,– Þ[°l ­$n’x6ÖPÝ—A#µ¡Ã«­Þv¯¡í—;ø‹Î#‚Ó¡¦¸ÀÜä¾v¿ÓéߘiãÇXxÓwºÓgœ¦>ÕØæÓ!èš²ÃvÐj6ÕhôË f„ôK?kϤ®Ç^ô“.›ÃvÚ~ªƒþu_cý¸üÉ™ü’,öEïG„fMÙ- V϶f´$M¼¡Ž×øªÒ–†Ò)‹<'!{üJ«Å`­kO±54—–=ñÂýÁYMìÓ§v„w’m|dsrà²ÂÐ °­¢®Õͺӳq.æ7Õ0Õc!Ô•¹Ë0^Õj´Ïu¥Xñ’pЪè$×·£4“—iIlIø;åYFØÔú¾à£+‰½•©Âͺ>x|”þcty¹„m‰1+™IföÎTî(þ<ƒ>ÜÄëiéö䲦 0“A ¦âdSmðà;¬¯KÎbzÌòBáH“⃠™Ê%›pœ2ˆ…z9c÷ˆÉýrêàD:1œ~¼†“[ŽW˜Éô½x‘–Õ–Åõ0Ãæò£ìGlçºp(»™ `'·)e¯úÓ•ë‰vÏᣠaÙF­Ê‹üõ xÓÞUÊÌ´éÚ¥ìÒØ3k㘡_`™ÜãV2fÂ;TžPEɆ딯&Þ1±ˆ@(þåûð-(2×K4\1Ç{»ƒ¾#9^ óQR¶¿½åÜš×]Ô=´€U¨¤ÛZ~ñt¨EjE˜$éøÚï•v!„N+¡ .“©!Lfîf3QÊVæà5“s¡Õäé²keŠØÖ!‘{Ný‹ŸhFí»ézÍH—Hs=‚ñH¼òVUЛ„öÓÅO 'ÊÐ×âÚ¥Ñ;­~+ÔO#öáæ5UÇ’w4+RG6–LïaZCË]ú܃sñcºk 9Éi ¹î`Ùßþ¶÷ê–¦[°ñô̘íԂц*ðÖ‹g~Ú,Z‘L¿ê¾Ü«mB¡úŽÀík`8µtšÀ̺\‡Ïvs3B ‘¹÷!™æ¨5õ‚áKùçè¿ÆDˆ£v/6Œ&ûìD¤´§|`>ä¸ÑqVNçUBÃŽ’sÍÉ,hqé‚dp̼òFª~hÝvÌtO½F)¼Së|x}2ÚÖ,`l¸âíÒ¿U|å]âR ?¢92­`Çjˆ/—,†S×!ê«ù(¦sú»4cQÀD'H³´­÷Kš;à¹i6Ë7kÆ©¬OßEƘv²»NUÇp†êgØÃr/øð‹W£(–Ñ““¡Š®–º8?_Kî>‰Ë÷4Î ÑLà®v³Ó RºFãVΗbûp¼¸Î$[†Ä~:LÕw‘r©“к‚’¿¬54¬èx˜mPX'F š¿8ø6ÉÞ.6B®Ó.5ÂÞ-K %øN$i?Þ}çÐáüÆð>íÞwÚ †H\l§-h¢{Ø[;côм+ý´ÕÔTM‹òéå»[2 C¦p+G}†)TÅS1w‰ð€?m_UJŠõU©”ÈVûtºfή€F: iêk<‘\Üê gd†s$akú­Æ/‰KÁ‹z–aêÖåTBóM!œï"73µpËQEØ*.M÷8ÃÁ/åNi¥ÜûŸòg(’WÛÃÜwÁ’Ϋ-3OÁ&Ô¯è4µ3âø1a±›,{”nÕa÷íÖ¢…b ¥)ྛ²Êûæ“D& EóÊŽLÒ~lZ+àät­Da[C.P4õµ²pÎð´G‡x´rpì„ Í;KQvc(¿fÂL$Ù0ßÕgšµ(ó›Ûu‘©a„"š´Ìa¦^@šÅ¢xÝ¢R ©š–M>±¶nmÿŒ#Î)¾¬á‡6–õ¯.ôz>ˆ¦ «[ãfØŒv…±òÓ·™òµÔX¿ŠË«)—ÒOMwWÜ ì>GÑ÷Å”¸gúžKäêÀ¶X`Õì2m³â²á?tIè&[k`óê9÷¨ÎÉÄÉãHÛÁS¦öµûÄbš6¬!û¬Íœ*E¤a©XLUœRÿ-zƒw@R3¡FòW`6¶ú¸°8-’èJq»2o4â é¨Tå‡Üayx¸árlGÒJ9Òó‚óÙ ãV|ʯÉçp•Æwß~e ØÌí~r‘ÏÅm°_¤ä±Xœ³"(h,úÌ,j秨FÂutßv7JqÔ¾@$~]Š®Óþ¦y)-k1Š”™Øþ­¬GKƒ êëÃú€¸O„fr¼9ä'Pj‹×£î·ëîpäQ?f‹€G«™øYßKǘf²<ïH5^; Cí䤷‡“²-kd™–¯fr3|¸ï Z¶KÛ•„Ò-†twïà “fR ¼þJ¿9·þ„Ì·Ÿˆ¹¨½ˆ¶ˆAúÐG)¹·¯}%ÎO¸Ü5Ì-þ¼~ÐkäúÄø™û¢Sª™`‘ëfŽD šÝ ·†2 ùùEëÒ\g~9©uzÚ·ÿsÊUV˜Ú¡™yroüêá¤ÛɑӾS½ðF=f·6aÐrRXãwn™²Ë—JÎôƒÜÍ!îXqÆÕÙxg{ºBÚ£J¡¨Ù*Ñ *àˆhíÝìj².Úu©*þqž 9œY8îô‰zD]šÞßq_zLöÆ‹gµÍ#í'l–ršÉ<Þoc°ßÔ:òBG§áç69× Ê)*å¤2Htn÷ØBΗÚõ6[M• ów†¬7$šØOôعƒßo˜á^iùåÊ/Dq¬Æ¹ázâ=ö÷ëÌ×™™o8cްùT:ÕE?XJ9ÝfzçÅî˳È饴î4Ühq ^î.L4½,VÐ8~Á™Xx›p‹Ý(i1ÈÜFÍO• \9<Ü©·úÄŽ+ú*dåŸGŽC@8¨ê~ÍÂÑIË@%°ø ”L4ã“Ü©ŸûÌ`œ Œ«½¼!†ƒo<1N0õŒ¶D,´‡/Â`Ѹβõ>¯F¡ÓY°¿+™¾,y?E1„"=Ó×ù#ŠÄéç|zÆ’‚µÐê ÀüVèæsÆ;8s­bØ´Q¼M–Ê*5Rû¼}õ•ÓG\¹‹,`øÎ!Ô©9KVm~> Çë(}=j:ß[€M×;׿ýÁsû~Kq,+ •z­‡òýGqah׿küÑ‹±¬šÝºü?fî Q1îœTQï%A W'ì ÌÓ1FTt€¬6e˜ÀçæûÝLÒú$J§ëÂr[ƒ>/ü¤ê†Ð “kZŸKL4<¼«T#ÿ”ÃXƒõS3ûcTôAVbRLÑbB—H¥æ‡ÅŸÕ"hH^YMF‘C9à5s‘É¥UÎfãîÉÈ †Ÿ:.b* /ƒ?drz™y6,×neˆ=ûxlMë<)IJ[Õ ñhþŠOõsª0s”¶š[=a×IûÖ̓­õòÍ!«Èð«F‚š ÓYžM¨Gˆ[ÒO"z þÄuŠHŸ­øûjÃÇ\ˆ‚3]ÆÚ}YôŒ¬dH¤•NC{m˜¦X÷;ÞŸ°BrGé=?]ç« Xå ò“&ãJ!‹*å+:j7×üÓ†çHfïø4\å*HÆ4Úœ m8~ÞV­?ܬ › L}r½Ó¥ÆÖmÞqa•4]Œ³S‹çZ²,õ`Â0v |dÀ˹ٖ9ZçmÕ“`O…ôXÄÝ¡"ý±)»¹­TO¬­eV°^|½%› ƒÅ cXÕÎð·O™ZX&Ë.BZ~fü°ºËÕ*ÙÁfÖ8´ØÂ$Â9FNIîG¤-ë”mެ=+LŸîÇLöˆ‚_å è!÷dip«3øÉQDÀtö`îgÞE ÃïÌµÄ »øq±Q¸ÞŽ‘Ê@ùóá3µÈãýæ0µgâ1xW—46.&"FL°óœ#tá¥?+ðíÔ/u”\1áÎänK•µQ²_w˜Æ9)¥Œhô*@%ã‰X_1Yžïx»ò}ÑRSÎtƒ¨ÂJ°*s=øÊ§è…aY„|åÝSƒ_WŒô0aB!úX7™F¬y³ sŸ]8Ò­ª¿lm9K¢€ZCh31W¬Iõña-ƒù^„òë"‹Îÿ3¦Pƒ»J¹Q¶‘ŸU^‹"™&Qé‡äSQ#õYì p_òWÓÔnN—«*Ú¦ŸNŸÑ†œK¶{؃Öìn:2ïÒ®”uÂÓ ér ëBR¢îÓ–uŒ)ŲÇHsXŒ4®­ÃùQÌôçì|ɱ*A¬,…Å¥ˆ˜†vâe¦¯g\ÃSˆœap! 0!B¹½Bm¥e¼â:TØÄVA¼º®ŸkæF 8ZD´Ëât‚zSO—N…˜èïè!ø 9£UÈ>”Î_u4L!¨]}ôi Ftî/ mVdÛ͘cNõúÿÆñ1ŽÆ£6%´¢$®–ñq)TßÃýLB÷ë×Ä&\ö›ObT#Ͼ"sy£þùw/¾C!+ô‹°âÍ*2sw!‰6ž3–AYg¥ºÇ¯œ® å§R±âÿ½Õô endstream endobj 464 0 obj << /Type /FontDescriptor /FontName /XWOWAL+NimbusMonL-Bold /Flags 4 /FontBBox [-43 -278 681 871] /Ascent 623 /CapHeight 552 /Descent -126 /ItalicAngle 0 /StemV 101 /XHeight 439 /CharSet (/B/G/P/a/b/bar/c/d/e/g/h/i/k/l/m/n/o/p/quoteright/r/s/t/u/underscore/v/x) /FontFile 463 0 R >> endobj 465 0 obj << /Length1 1612 /Length2 18123 /Length3 0 /Length 18941 /Filter /FlateDecode >> stream xÚ¬·ctå_·%۬ض]±*¶“äĶíTÌŠTlÛNŶmwýŸ§oß÷í÷K÷ýpÆøí…¹æZsí=Æ¡ QTa6µ3HØÙ:3°02óËmŒ]œäìle”æ.Äp¢Ž#g ­˜‘3€—X`J,0!fe%fááᣠµ³÷pš[8S«)kÐÐÑÑÿ§åŸbcÿðüÍtšÛSþýpXÛÙÛlÿBü_'ªÄÎb3 5€XTAQKZ^’˜ZR^X` p4²&Vt1¶šËM¶Nb3;GbëˆMìlMÿ´æÄøK؉؈ØÉ`ü›p7Øÿã¢'¶8Úœþ~ˆÍlÿÎÀÙŽhkbíbú¿v3»²w´ûaó×÷LÑÎÉÙÉÄhïLü·ª¢˜Ä¿y:[9ÿSÛ ø×Mlgö7ÒÔÎÄ埖þåû ó×ël´u"v¸;ÿSË@l t²·6òø[û/˜½#ð_4\œ€¶æÿÉ€žØ`nähj prú óûŸéügŸÄÿ[÷FööÖÿʶûWÔÿâtvX›1±°þ­iâü·¶9ÐŽéŸE‘¶5³#faþ·ÝÔÅþ?|®Ç ˆúŸ¡ùKÂÈÔÎÖÚƒØ`Ç$oçü·$1õÿÊŒÿ}"ÿ7Hüß"ð‹¼ÿoâþWþ·KüÿzŸÿ+´„‹µµ¼‘Íßø÷Cü÷…±#–%þç±6rüÿ„Ù­=þ ÿ5Pðo’ÿ?8ÒÎF‡!lkþWfFæN@w€©"ÐÙÄ‚ØÌÈúï¤þeW³58Zmý×0‰X˜™ÿ‹OÕhbeûÏè9þíØšþWòEúu&9m%y-Yºÿú¦þ+Jñ¯öΪö‰ýÏVäìLÿ×á ;wb/†¿7•‹˜óoAnŸÿCµÁ°üçYÎÈÙèN¬ó·ef–5þ?ÿyÒû/0â¶&v¦ÿ슊³‘­éßõú_†Ü&.ŽŽUý×ÿÛðœÿµè€;ÀneÑ΄/Ø2-3ݹ;ghBL§¯‡|(ľ¤^µ0߿ʮÛ/-|›§Âð½:„±aŠ÷³ÕcáÔþcÿíÁH–5Uw à2߇Œ¦7uƒ²‹î I¿1ýL#Úëêì„6'³úÁ΄’²~ñ;ÁT;›#ÌÕ?™k¾?ù£=’¯Ij]fJZMÁéeâñÓ#ÕÀèðÐ`÷ dï>]v,Ÿ+"e”¿C6ž ¶Z…W Tz#ÞMÛÕ'‘F——~.9.y¤ì«¢yÞªm›ì{dz› ¢œ£TË~¥&ÖõÜT¿pâÏlÎך …¸6#þdPßíŒyÐt&táÐØ5uŸS¸WMík/RÎüð´RGI[3Ô>3Ãp„K%’h‹½…§î’ˆŒà½ôW¸m\òÀã cöžY«ê3YÓ=ÇšÌoŠŒ§Ma'˜'œF 7bý“²CA×ÚòãRdEgJí¾—Q®}xäñeî0,Qš:ð¿Óî™JÔ:šeçUŸ’FºŠZ‘[-ð‚‰“ûò$"„“ÿ$CÂ2žÏ Óù:í?Êpß´EK«8 ð< uÀ"…›™/ø_2Ñb—ç‘[ Ûh2µS–ß5=i²UÇò–¥ÄT9¼ ­ Me…óÄaE뇶¿"ÃéÖÛr0ìå>Ï“ú9BZ½éŒY½ !{"‰™ÃÅðwdàÜyŒÅÔÃ;)EF»Ip‡$.çª üÈ¢f:ÑÁY†Ž‚ëÏ nÓ[}#¹Ÿ¥}“ãð—ßmÍP¤T8Ô[P^‰Q[M“að!Tž>¯C6‡pÖ£ƒ'4,H¨Ña8FP‘íÌÐ>_³“NW¯9DNlOg6ÙÇÍáÜ}ò˜oÿ¶LˆéMø¢×î”6zGuœÀï‹n2¤‡.ϳ¡.öhjNf Á#àÎ7f^Y¢3®Ç2¥œ™ÉaB±ŒUBÓ»Dܸ¦X~·î6úcH¹b`Ô¶9Œ®æ‹Ù6ËåÕ !ÙHÚ»ÊÈnáTÖëe…ÍSF( _î¡T&ÿ Ä䓲ÁÙ3ßù uÝ!jê%iòèáø„­=Úì°UE§QÝ1—ƒ¼µÚ˜ê©õðǃ`I Ím^RïȼAí5ZÆ~šRžöús×›/ÁÛœkYŠ/ßs€"Û „N¢Úù©Uàš6â@‹Y º®¦*ƒäEXûK Ø›ùU¡¿B}‚4&%Ùn=b’‹=ùÍlûû91ãs6_dUà†ëƒsfc_)™½¢¤î®×ΣKƒñÔ. j«<Ûó]E 8 ¾`®^èh ŒÔà]±|»`‰ÃIn§m»¿„îû.`Mɯz²ê9¿pï¢^)Ãð…tž-¾&­±AHm3øŠ°x:9o{(åDò‚Í/T›½÷¶&=wÂYÁkôÆÆ"¾ïÅíODFrÔé}¶Ï_.Èç#á“n!or»†GŒô‰ôá3Üõ¶ EÚt¢ïþ V*¸ˆsŸ­…I¬2Ž®L¹Jw@þ'ޤŸ(ŒypfNP)òJ9J¾Y!+ÑýárÚ“ç¤ý˜Äô~‰äa~ þ%v¥‘è yÔ £Á ÔÞüŠ è\=Ï‡Ü ùñ‡sBær%È,Ðä|J  YÉW–Êhi:6LLÀnèÚMÿãH},°Q’c³C“¥ü°¢Â´JÉ\çuh¾8z©˜Ä{L×`e㇭àò¼²ž"Šq˜…iÎ=ýþÁÞ ªüZ6º²} Áaá…ö0`Qð| í¸‰ØþÀ=ùZm+n†ÔÔO[cÞøŠW,=Åï4E úìÕ©DÅ<Ô¡örLΉþ—D”*5ˆ¾R?Âó¥>°¿<¡µÕ²¯s ©Àß¿€E]ˆP`D‰ÄÌÞ°¤9JI´8ýaæ´r(¶„ßæº–&1ÜgÛêx¯ù$0šiËÓ­bøZöTlâÕsèÌ•QŽKã…=&ŠÈ²ZÉ»ôDá¶Å7iy£(Wä)”}:o¢2‹¼W~ƒ­çÖ¥-všÂ^Ü$(X¼ä’íbfˆs[§Ìí—ݼÙ⪩³ †hH47Í÷ú7/ÉÐ÷ Ó¯ö¿ýe#®¦»WE±?Í*üX¶Ÿémüfa±:²OÇaõ>‹6Õé„9Cò¯Q‘ ¾‰à9F]ŸÍ²jN#ÈÝœ÷†)~éÞD;døVjõÕê6«ª{vÁÿ6}¿ Š_wkànŠ Üïh¹ Z@मh…fˆ¹Žd]ŽÎ)+Ÿ=@]/€ÇƒÕ¦ÛËM Ñ;m{ÜWlÄ%”ê¢@s*’i¶MG ¨Ü|uîF˜OþlÔž°]Ô‚p™Åy”~–+C`yI­ aç yÒE Ë=¼@§Úܹ·ëÔ*ªiÏ®$WÉÌJÓÝÌž‰´Ï~þ:„@>d6" ^Î"Ç?ÖèÚFkÚ*:½Þ>¯§ˆÚžÆ*g =Š[öhïê›%ƒˆÉdŠ®¸zK³U‚ì:‚?¸CÝÈ‚ªºÚJîö¸>¤ñ Iã9 £-(ô L @’#L²CC#gA²-ÆJ77Fùq×¼Õ.‹ž¡~»1tÍ^ –‘,ÍŸ€ ÀÝ%%%³ÔÕ_¤ßlørk|ŽºŠçåy Im„ILž’F£ë]¡P”5xt/é݇YJ¬Œ¢G&üŒÞAU«.±Á´YDF÷€âò‡¾á'èÕ[‰H¦¿÷¨_|F:˜ÐǨa¦‡˜ƒ0<ƒ:Ï ÐX@'o د]8Ãá~µcØÅ#FžÈžäE{‹Ãe0|Eä@­À…¦ˆÒ2P ãÖ¼,I9óÌ @“£ÝÔbÁÐ'éûæT±n¢›ásy鑆~_óݯz§^ a­B”WÐÅ =S$³)Ä~@Mš•h[3Ý6ˆ|dµ—.Ö¤fáÐQ‰ãrøÕýòjý"åCª¢øB#Ô%XWé( ¼S4HFqÖù‚eNêÑýet1xë c—ÙbØÀË+O0ˆ‚ÔpZÜ5*Z+)Þ«kÚ‰«¢JÐ1ÁŠÇf)ä#bfºÅ’^Õ;‰PÛ]zE&ŠL½¦‚(|MaÂMïÏ-1Ö:CÊ ŸeÌXȲÓBÀ2ÙÙ…R0M•Çþl¥¿ÂHÈà¬OC‚z³À¬ëé…¾YsVI¾Ö’Z(Àê£γ¥ð3BÈô#<ȯ/ÿèSÏc‚«²L!SÃPÁ#Æ?å‘wâ·P&YA2>¨×PXRRG–ËŠÊ6DÿXß$]ìª7~'œÝ͹*ø÷ò žD{C×E&Y!øÙ\¶\FñáÊ©3e˜À €2÷É–ô4åc™(ÉÈT1Å>û½cU°]#ï&öSkÈßËA&!‡ð·^A 8S>40»ÖêN€¢¼¹ É×+’Á“•ÙBs­‡„ð¯T¿~±±ëÈn7WaÂ+õì{ƒ ¿*VÈ  Î<*_Š”D‹@ p{|X y·eR"²æ~þ‰ýÁ¸k0˜6±Vß6Ý•ð"쀄/,U µ¥Þ5¬0K5\ à~“êÛÑýÓiêî†S·­Ò “³Î\Ô/"SM1ßùÑG^ÜàÊ æ"ˆÙ–<…žâÞHoè½~ øÊù4Tó²TæÚX¼ Es!&¥"_y;¯f$‚´ c>™Z{Ý[n`ÞñûEúž €ÜAœ]Bbiœz§ÿÀbæøaƒ@Z©8,~óK+½47ß_"IhX[¦|ð)ÍçA±¼QNrî§X}s uRÀ.½Ó;aL»8ÄÒ¼8´ŽÞ6BÅë™lv½˜grõ£<°5YJ÷X`aúUüڃΉÌE [î%/ª– *<9ý—Û[h!ÔÑž¡‚ Š*˜£dNBà Ž9´› ú¨Cm©G€L/jœ í¨sý)®}ÙU½hGõGÁx6æuÁîK?^¦®4þc‡ðµÛa[‡æWOrˆ×B¿Ê­zÿªP3ÿ¼%Æy¶æâ0w 5fÖ¸r s6B–»Žk^™“"+s°dtœY§Üi›x±§TÕÜfk4È5'–bpDŠÊuMøöÏúþ"c–BÑê}¨«kJGï»áµTË((I*w“i‘Œ­OÒ`"D˜]Õ# M"¼ÏZú^µ®xØpn¸+am§ãÑ%CÀLm'vÄùÑã$ã¡bû²«Ùm±Ô®Êû¸+Óo ô_[<¹DîÖz4G­ªT ïeE‘ÊL¥ ÍÜH³¤|4Ö bUªssÍ?Üû@qŠíà±P*'1ô¼µÑŠspêõÊgÛ…MCÝ–ÙÉ3±ßR‰×½`Õ$ÉßéÆJ¡y4æä3bu>iÜò~ „CrÞ±ˆDö ÈÊ 2’X€ÌEßǫ́ÔÎî~+#|$уÇ3áüaƒS]±ª\Ÿ@yù9æOúƒ\X8JŠÂà µŽ* sSep…£ë«@­Öð”Îýî2˜ €¥¦ÍäÅ?®œu-ñAŸÛ¿÷O®*óAïi ]Ô%ëãyžä¨Ý`¯Ðp¤Ø»élŒUžß}µõÛ‹†/m+N7ù’ÈÄ5à• ºVꜷ-Àìv¨Õû¾+†NÔSVˆÙ4ªÿ(”R™jNš!Wî#üä"Bðã ³m_±¡Fýµ/‘¼ÔkʼAWåÇ@AœY»1”ǘFƒŽÞ°OÛå¸J’ÈS? O³usŸ”·~¯Fa Ãrª¯"MœrÐ~lÈöZ‚@¤ÐnñƒßKß÷#Ä0P½/ð[õx[ôy°¤Ö/O©¾“ý"ΚÅï‡1" "&SïŒ"‹j òt?oå#1W>Âùo1-R v¯a8QŽúuÌ% Òж8¸c¿‹FU"EÁ%«€ “ÌW¡v*¿Ó@¿ûx1xq)ÉǺM7T±Éoaã]‡Œ,‹òÐ :/L2ÜÁ߬Evf›¬HÏ:FÅLÄ Á´7’¤2Ç·g›bt¡˜Ð‰.z²4)øEÁl呃)²/xÄS¹ŒÏ¸çÔÐG¶³r,=°5ˆ’p˜çO³…™G¿mÒö1/äÂR•cºÔÑ"ª<# ¼Ox޽öQAœžÛ®ËUüßœÁ¡Þ¸ë[LCkæìð_D³gг˜Ÿ¤å­ú÷hjü¬þhóc~™4ÕHϱQbÛ͘ >ìçòrÎ%¢G]ÄÒ¯D\ãF´€³œ|Ó³ b+i¹Òì2/¾Ë³ þxÿ(;A?€ Ä=qÞ‰Ýz uD'“1ãpUDú7W›"µš0÷Ššï âÕ0Ê‘«)è$á÷^R\Á0VuØÃíêÚUW¬—=µ¬äÃhNS:ì[³V¡Òµô̪P¡CÆC¬ñ—6³³`¤€ôܳ{ V÷ g×õ2g’6Ö¯¦«ö->ïÏzÉeh#hDˆü¹é›Í¸9$dT·Hc#0ý붬dåȰ$—>´ÊH¸y¯35„C%ÓÊôUL6MÄó[.sd N@s@LÅE›Â ‘Ó÷A “Ú+ßµ’PÚÔá͹rò” ªž².ÆŽxŒ·ø?u[DjNð°l—T¶ç9¾5›mÈ,Œ7 ÉÆèèSn”Ï„ù礔#Pºæ©g“îæœ(‹ŸBÅ«YK´¦Á-lßýyóc¬ŒMÚ£ã |õF:ø\‡+8¨ïÂ7N‚‚hϰ¸ùר>ò"ÞPÚ7λ#MbqLì•ìY¼µ•Cmw‡äåÞë’†Œ|DÖZö:ƒ×Ñò½>žËöÄ ø!Bäy“¾/€VE†a<äp5„tN:ŒtÛÝÆÛ ›`’Œ£@Ã9oRr)—Àž+oP…ò òÈSŠÇ»f3,ûßðd5Þjæï;„4ëtt¼üòkS5·Aw)Ù´q‹u”®wMŸ±í{ãáÅ9­Eø¹(š®‰çP†¿ì2’†MöNÂrAO¬ [ò©üSUm´nQÌ»x»³¶Š'4=-‹c²¾Éï1ùeË­‰÷uãC°ÙwÜb®ò4ïÂ@˜dC ‘|Íæ8ƒ.ð8ËXw’> ó’'2JÔÑuj9ùª‹±<°ˆú±vš–ØÂô»¹…´sL+T<1(ÊC¸Ú?’¸û¶’/yª-’M—{ÝcΧîuÀ3ê"dBÜ7ŒÉ‚TKÀëNÌBQãkh…å=ч©¬µÃI i‹‘X'þL<ì¬Aê‚QãQ ªâbC©ua“£›æo›ï&CÒ“"òüž¯^8Y—L e ç†&fL#Á#Çß#¨&œâÅ1FºÛzÏüfaNBš­ñ2víc y³'|ë¥ CÕÐ?Úw¹”[VU!Ü"º…œ]Mï˜îòè^îüìˆ4ÌJ€ë7¿tæVÞQA`’tŸ„<òÓCµq’ífŸ|-…—ѳÇõk å§t¦°örùGz)«.±+·âÕ;»–êÙñÖþ'ö\Êù*šˆ€”ô•9¦w6é&^ò®(A>ìFG_ ièÁ÷()n`öñ’‰/Ž¡A0(ž±çÑcª‚ÃyVFMÁ ÍY-Ln°A?´úVéÎ:$úþ ’àd€ µ9Gs)¸ü–ÇÎåQ(õbË@»í«)n%,„-7‘¨Zž³ëÖ•%–†SÉ}þ•nÓŠôýG&:;ã‹´´¸L´òÛâ mf}¸uâ]ú:ó ®W1™LÓÄNZïã7S2TNQ'7Ó À[^eï©£Éô àæÑuMBOuf\¾Ü,´ó(£äز—˜çáðÁ[@î»2>N3!çò^Vb^áDk:`úãü7¾¤2†8ñQvô(Ž\4µÄQý[Ä “2>|ó6³iÇ\[\wÙJgø[lV×2­E8ÒO¶ý@ù–öXàlµÏŒ)˜™d„›­¨ü•Ç8ÁÙ:#A¤æêgW!º³œÕ‹#âÚÉbV>T*v6Øù¤‘šT]Ð3â0Ÿf*†f¤·óYòÛî~ê5[:YEBƸšY­Z~ФeZ¥&—êW1 áöBŸ±uu52ñÅ$¬÷](© ÏZhöWˆ™lJEŠâç!á‘\÷bãP­ÄAiÜváh“7kSòDno«ÝÜÕFèºfŠÀ}Gð†“'·Í&¿ÅÒà”Laê"R¥µï¯qZ_cú~#ŒÄ·›ñùªB˜~– «ue@ÐHihº# ÎCÕ! Ó6o²¢’4^úÆw•%ød¸K öZݸ0÷ÂÿÎ7ÄÇß¶¶]ºó±›Šñ‹¼Ò'¡–†½<(î`yˆÒKB¼›CÝÔc1)™YYç” xŸ˜°k¶ê¾:T™Iɾø‡Åí‹Ðdë{åŒðñ¢4•’{-²³Sb‡ˆnÝöÊiKø# ß°Elú/ Ö!ÈE›˜—Ç!Gªâ J ”=¬fBç °9%?Íl8wÖÑ‘Ð52Ö"ûÏYv®ªY•9f¡©B=Xþ[2V©Ò4 F(¼ýyÇ2P¦âé°·¢ÒjAU!ìŒ2ZAP^UÏ‹×CóJHº}âÈï}Wœí`ÅšFwäZ²osbPŸb”d]þ2½Vì»%¹×Ý€Ó}”à`BHú(”Üh3¢3ˆƒfú°BeTÄce~ÜÚªÛ£{Käé§o?Zו[û“òòôú"ˆ®&´gS¨ë¹ÁBQÜú8» ¶ÙmšK~tß õ@Y^ñB;H7Œ4ÞSsØÅÈ‹vÕED`÷Nâ©%á4¨Á‚9.3™E¨¸äÉ-„¡™O¦ú)ü­W) ?<•YĬ-¬€ÕÚ²åÇ8ƒw:¬è•Œ»Kg%WÂÒT£Áå`•£„ìÂØG -ök ·²ÊA6öÍ/Ë`ÏŸ¿ ^(±éb§ÓÏâÝ¥dxÔSK3 ÅË >£*•‚jÌŠuªÚä-Š|¦ìcÍ÷‘±ü’Õf(F-ï~úËüäÙ%:\aWöq]F¸k”ÛÕ)'³Ð}CbFÑX.¡¯@Q`ɤ…-ëH7‡¼ òóÏÉ_3,0q®¿°|—Êèg·?¤dÚ‹ýùxu´šAÉ/è ëEJr›ão…ï…T­¿b)±Œ’Øñ¼I„hYky± uÕÑèÌÛ¨lsK¬õüÁñ£`@¸¤9’±·BHµ–Cý[‹½-såtÐMŒ´‹$‘;œ4õXÔ}˜¶­j”{7qÕö´º”Öl‚tXë¢fsƒ^väøWKb簈ՠͺn^.ïE˜• ”FªßïgIýD8ë—ÆáúÍÛ¨?…ÌÆÙj‹jgí—ö:â³ç€™ÓÉ,I®²ñ±¾þ§5t¶Â3þY;t–M}$î!SÍD—ÈiöéÌ¢¥J…Û _óFÉ?‰CÇ_OÖ~+—é,öuc‚ò1†i6KÐr§Èöw{Ñ´ì¡Þ@»y¦nL 8î‡nƒw†ï¬ë«Â`Ù,÷íŽêD,açlXÝ+iKlÎÅôÖÝJ¶?HÇdþ‘úåì{Û…úíû(®€¦·¹ãù‹$=Sâ'Ue/ÃÊ÷dþF\™ Ÿ6 ÝO?)Y‡~ò7ð½x;k+˜5 ƒ/h~@¥ÌåÛa˜«VôTÅ;[k,X‚‘ºrO¼ bsKOËn²­V)”O™]lazîuÎ,"¥'ŽŽ‘åÓöuÆÚ÷œî:_ÚÜz¶úÏØijׂhÙ=©/º4ï½ ^s}–—ïñÖ§µöô]ú[V3Eìùð Ìæk>¦xú]gCY“«Û7¾_%Åæ)•: k*á~Þ GÛ?R¾ïÅTñM27ÕqªæìTD Ѽm™ rÈ sþ¢‡ªC…}å:Å1º¿Øñz¶u´ì‹(d©R»ËÒ§YøSwú£@:k©ò3$É þ­htwŸ pŸDù¼Æëµ\,O8 iD¿û Ò&e_"ŠsoX¡%æò²b"™>€"åøÓ?Ê]ÑM!~9îàßÜ;@w²SæÐÄèI5·PËÕ¼ŠbT{Uª$¾§l3ÿ™}BÌÕŸ'ˆzò•{qÞâg´^«4ǽóÅx‚½bŒ9;åäx^Á¦g · ѰjRJ¹óÍ•''ª.Jãä`”åÈ»ò/· ‚x'ÆF:ûÄ¥{{aÉ‘²ÈÎß;#àr†7‹J®K#¿ÌØ‚ÈbϤœ1ÄéIér, ¸ìÙ®ZpðLÚ·§àþøj- â4·dÎÏI>:ʬý *É‚ô›ËüOÑÚþ÷üôJUM@ÿ+®dÎ’aжò LjWkx¯¸{„gv;B+ Îór Ÿ ,S,Ak'P•Z(™)<®½Uilw#9.:®„­¼jå<)t«ß¶TQ.Ïw.ÂØM]~´’R¬ ÚG*§mëh*]ëè?(²lc›ßŠ•Bã%E=0É`ÅÛRj°2ºéã'E¬ù+% œ?õA·¿Ó¬EàÚböh~Žxe’8zyòÖ+^w=©×™÷Š]ÕûóIm@»Æ¶L®íº–;ë·ŽŽ&„Eúèà%8hõMömhÙ½¯Ë”v×oÉ%e¥¥SÞ™ÊOjwŒŒ‡§Nv±¼÷ÇXCxä1ræÕ·B•[î-Ÿaf<<µoì}Èí÷x‘OEœï2¶ù[ÞP§o÷üèilû“àóQUÔOuq£çŽWºìïq®ƒÞï%YQ©Çy(8Fö'¾í0Op«h~‚HˆKœc¾¯£záÖ£)Qš ú™"ãË”R·šgWž¸§°iê†{b^,ÔÆµï–o¿” )Žƒi’øë¨…’üK-™Mr‰§fìM`°ŠrHªÊ9—›2¾¹fu¤G:§ßÄ}ÉjNAaÔ[Xÿ55õ ‹»÷gó3…oÅ‹'@çwÅ!­ò]OðEÜ 'ïÁ·I'¬¡—qȱ¶rX¶cž3››ûQì_+rr„I8 ­Z/©Z5Á»Óê§² 6sÁ·×õ`yâHx‰÷ï•KtzöeågºØ?•«©›ÚWÐÉà“T)ýZïkÂØ‘qΆ}À†­\}¿ªûí6§r‚žÏµˆ"b2èuÌeJ'¬o¢/‡~½÷÷RHy¿Kä¨-ÛaT2?sáýóËF…&nPÇ]%BEŠk‚›EŠQS”UªöÐu³Cö/ ÅE¿uP=—ƒ×à,¾”¢†>Œú°K›ñ]™óLïýº-¬"€ª¤)’¤œ*ŠE¼À±,¥QË”u™$RÃŽ¾Ê#?²QÞlç}ðè•L_2ÔOãtÝ'+>£ÃŒF-¥-öÙô˜æ÷i½íNýu7’ñ€jdq¶å‘fÔÊQCçhéÝÒ£š»ˆ•ä ÎêԶ힆 ßÇ”s2W” t÷?'/6µÐ[¿S:Iw@eBãtœIvìßssW*KÕT«!Š¿ƒNF)Êœ0ž­aBX|—Y̲îYI[$,,Í7­ .§(Ac£¬ÐH®³ µBÓª0Qµß‹7'€’£°NŸeéà(ŠÈiuÉá¥ö©[x‹©(ãyl©ª¾µ #ñæ«ÑuA>î˜ÍEnà+‡ªdÐÎ<ßß$FPOZszÝM‡6d…*ª‘TQ>ï™ö”¦Zæ­HùЊê;= è~©¨Úï~ ä#ÀÒO9è4wpßg¤[›mĸ^_¥¤%¿xšm(9]ƒg]p‹îQW 'µŸäÄ©úÃ{×ÎZ9Ey{ÇÓÄ4-/LCÅ cGÒ[5d|J™‹… ¥8DnÁß—èÅ7Þ˜Pµôu}QKÕ êÜgEæûL»ö=Ó¾ƒ¸c^ÛÌ.–®²ì˜ë™Bé—ƒ[¥î«"?-LÀW+xÈ—ªXžxHȨ›¡ÇxTTkðÜ=äqt¦©ïJü…¹µ¡Qr˜~ •Ö½ókšpw2÷Vý€X”¥dè/4¡mr›<¦6GÔ¡ªr É…o¼Ü1}Ì{<€5Ä›”+['xÝ·w”ç|¥y¦áe™9¿cúþ£%o¢ü~éž#!Fr»´ÂÁâI™‡È¡‡;òà±Ò_\…ÕENÔâû2ô™Ç‹ÍÓ/Ó•U/„P(‡µrÃŽæ˜Å“(3ç?¤¶³˜cxbö'¹ßš´Ì7o¾O»€ë‚ÁÞ=–ô"x%[ÕbaäcžÒœ6þÍ1"°³* ü;–ìþ 2Õì$¸—8ÔâîåÔ°µ]F+k¤üyÆ0™q&°XŽ®]¾ QÍT‡±AÑ~kÛ»š¥vez.øćuKáÉÃáòQ¨ðXs…Ñ6²gÜWbíËëÝM,—ÿŒD¶k• † ÓåYì_2bYNYûóÐû¨KRÏö:/_+ã¸Ëg¯È…†6ýä‚I‡ñ£øáôoÚ*¹]#*n¾ÀIá6ÎνÌgÆ@…Î[ßå"í˜dϽB-° {Þ¯{gLÆoåDI9Üì™A½Š»I«`/·¹üŒm›ÁZQšÄr. Ã$ý;ª3Šcæ›9lSiî̳—ÊO¿›2ÊÊžýŽ7¥hÍ\¹a’³Cí`òU© Ìá’=®N2¶6y9¾Ùп¥'{ýjÖL<ì=›Ik˜Û •ïé¤cY\ïöýÝÿØâ€¸ùÁgU%©'m["`7T'ØFéÕ”ý=T@‹ªÝ‘îE/ý;ç6Që^%GõK}Uœ·0=?î'Á$FÖ#fnù„ŒlØAlÐKøüË{ðÜ;—ËF[w‰‰®¦û rq™Eät›wØpjÌã¡[óxþ!òš“u†¸}iáBëbÖ ‰Wˆßæ˜é¯MhIj¶n>Ò_)J·D©~(ýïëØIÙ›ªýPµçWâg¿ÈFz.õñ7ìrcA²,†áÏ鬙´Z±q©b©*m½uÍNU–l’š©(ç}é1Ö¸]¢Ö„•Š–M¤•ÌÊæ|%Ñÿ¡ÔPׯ°SÛt‡j0n§h z~ÂÀ}ë¶ç¬$´¯!¤OE#|¤škÕ²×Z¤l|A†¬x'ÎácÑu6 ï"…×U=öu+mØnüF7|*oKIëµ\\¼Ò« °Ù=²ÅÉò4ø]Ô gWÝ{ —Y@IƒòÆ' -ÆJðY³Sg0š†{ŠûD¹î--V·üQ–Õ°Z¶äV|O›ò2̆Ǜ#e3<‹ñ]` ‹4Äb´Â;ر´k çÕß4ˆÈ­•뼨 Y‡/ö‚¾¡2‘*U¥”µš†î=âN.<ÿõ"‘ÁÒ]£ 1ý @Š–ÚdKÒ„raZãhT¹ýÉ¢ÜѾ]fBîÏŸÄ:8w|$ÂË›Aø¶±7F)¥ü½b£¶ÇÆÙ¾—Ç·H/F†.°„Ä‘èxÆ Ífµ(Z®îiŠÙ;Ö|«kI‡»Gõ´ˆ¯*ÞŸï¸3yÃz¼«Å>ÏáÓŸ5[pï8*Ÿ‰¼ =E,ÙnÄÁ_PÕ iÅåhULSwòQ‹Ï©ÆŸö]ø+­Ù?Jô—ÜLe®Ía\tŠX.ç“V¸L; ßí±˜ø!uòpÀ…°Ô Z É àËql!Ðóe- 6‰¦âX‰×TãW´%[3¿Ÿ9mžûj9rt¥eÁu‘`…Á‚w•eöCz÷žgìùiîÔ£è¦6è±ÒÔÕÙù'LY•lÈŽhãÛþ1_Ðn}[„‰OðÈ„"ÑÏ ÏG<‹Àð×>¶n ŠÀ¥¥³îo){«yáê²Rè cˆÄ»à¸îZ!õ²Ø'l_rùTÚöG€LkÇÒ¡Qq3ÐæÉY}Ndý½Á<”ˆƒÉ}`Ckv4AzññÑïUÒZ¸ºšZ³<15Aš–Xý•c·VuÿµžÆÑûkó*1);,'åø+[gû{–8àRÊ›1.¸//ÇÕ¯ýÓÃ…Ñ“¨Šó-Ôw¢ÏÕKÛËå¯zRÔlYÅi¬lGX ¼QëGv¾„›&_xÎÂî~:3êTRD–˜ ƒÙuï—°}Øûìà3æ±.BuF4Qh‰1α+Ãì<Òœƒ@œ.:—nmÑhlÝm=ôñù‡s.AŽ`ñéÐæqèš_'öÍG~pp+Ð 0(ï—Ê)¨ÍÓ¨²Gœeß‘ñ¡‰kËi rŽˆü½ºž ¨ïb‘ùÚpMÙð7÷a1ˆœÍ–gºÏ1ßTƒ€ïK¾xjºÇä>íÉQåc×Nvïg’FfLø‚¿ÒÃÖö1­Xß9"ß^ŒaÜ…µ=Ö¹x,·pC÷#Ür¹$jÊÛűYò[I<Å£Ï3ÞºÜÝ7¸[­ §ç€Poè0–óuþ±9ä”3õ©2Òß«ŽÂU2c>^ÌšKšÓŸ´|ÕV€än¤:eçx,S¡ør:vzv—’ÈÍ¿QŒVRŸ¶mv˜š+Ššä&ËH6¬ý¬RãyüTü{ÌÜ z6˜JŽñRá$°OôajËBXê)‹z•9çá]& «‚hÁë$©ÏÙý‚¢yÔ¡¶ E[¡ ¨„è ÿjkBÁÅ¡×ç²ïÂ~4½ƒ õXBY‘·¥Eþ`ò5+[þtf¬¡&m÷à[7ÙöOÉHƒH…‘¡º÷YÆêQg©ÿåÆåÉasnyƒ5iR³D³d6€´€1€Œœ§£2üª„ªÿsÃ0,h4èÏõ2~PÁc¼…`½Éã†ÅýÆ‘thñ¨°ê>t 9Bqmø¶È,¤4×.«¯nB&±JË ½ÚD‹¸W ¥Æ²%žígZ“;ôü9ašn‰ÇŸ¡I2(^Å5  ©çÈß œ¬žX<‹‹‡R—Þû ŸãC`Í kBK}µW?lElÞìıÂ]J­ð]Y›9qÝÖ¡S¹|Ú^¶Ý{f}|­ØÄx¿Ùiç'ý®ï(jÒ]ȨYÖbA¹JÖoIAü³xL‡«j•,,­J ²LüÜ¢ D2òX÷;ž4Ù‰Íc &œ¶–?2æža%îþí*ÊžM$Ô'ï«'ÆŸ€;Ì5ôm:çôêv-~<¹™Õ‚ušµI«jWÇ—¬²KycF‘¦ùÞó÷c±zÕ¾Ø02ìH,›qÞ.u¸NP>N•ß|‚3CÔK´¾®ù¤áî;«õ²jhøtU¶„ŪMš%ãzD,h¢5ñEŸr ²#LG Z—^Dîžš.‘XÔ|tKè50©z¿\â”ÿäAºýãf|4O¤kåýe}ùä$1&ÜÁ¾QF"šCêç…¥ÉñÙô Cf5 Pß[U÷Z:¹Ü'O%² ”þu²¢¿SÐgqÍ™ž ö”Û,0°±Š+¨±žý3N!Ìä­*•´ä÷ͽ“Ð4p?j’Ìî2˜ü<ù•Š+Ë–"–äÕìsbeM"¤Nhá6Xd°C¯86œo«àô†ÞÁñcÂHª~püYGïæç˜Žeáª;(¼.së“ô窪ž¦ï oU—ÞyÀ±\ÌΡX”è÷”%â$^Ê™ö"›Ü*‹å^D}‚äÂÐP>šyÞ|,˜²]ÈU™6.iDÚGæ s=b›6 sß:¹á›Œ(“®,zKbú ö# ]<×eçx눴­weø¾ÕˆvåThuîKSê@% Ë«¬ùzÙñ6(Éýh¾;ÄÈ8Ñ5Ž6– Qëãäb/]¦ ¬Ú³Å…ÑIT‚¡áni8ˆ .R5\Ý¢Š¸5v'í¬ÄöqéHiñ@%‰]À#2¶L²,Uè ã$´ÒSÀ.nPÝF»ráM`àêà†jSja’–ºK„)¥ÚŠ&sï¾®¨iÅ”Žƒ—ä*Áh4ë³× W–‰³T¢9Ç•0À:—+Ú½ô§ßâcä!åçlab_ðpÚœ”î~σlðéM4<þÓKu`IM5îæ'4©ºT犞5¥O.ÕïÊ)ÉŠ °RÆMe)ôU7êúƒ‹â •aWEj—ý1ñá{ ‰¬¦X‰ôÛwD6Ð}ôÏ•€Š|÷ÉïÎ,wÔ ól–u:1hGBmÈ©ì×ú:–¾Ë¸^”­mǵ©ƦX¼}\_lЬšŒ~B9¤3Ê[[ŸjÉ.ÞQ.ôajUŒ@zz4ÃÀGž?í`0¥ß±>DÆ\3ª˜=OŒ”¾ÔÖ«è‡ï‘ÆJâfs ïè­„e9ÅSO_ö÷E–žñƒ Õš3êV¨î±bN¤zÔ^=Ã~|«ÒiT§)iák»’¹^/ªM¼“¬àÖ7DfÖ ñ:lL7µ#ûj¥‡¨þ€)6¼3qиéc(¦‹Sg…ìFÀ¯”;0&¡‘Ï14GXp1÷hÈRÎ#(œS§ èg)êë¾0ä’G©£É"ˆL|8ËŸ6ˆØeßPéÍI¼¢°1)´þ2R:oº¬LtgÒ-àè3Åž]çöÂâ„9N»"0'"]þƒJ[c0ï½ü¥ÔæºD"ÄÐeÀ|,°£l0áp‘äá+IJ-Þ£þ\ÈLUž¦Ewƒ6_=9PéÏ JaC&3(ùçÆpn™£ïýAô†K]…¿ºŽ ¡ö¯6c"åÉ%wrA¯ºÞàŽ½RËé¼fM4piå)ÙZ'5tÒò3ÇŽ0éAŽ6Ou#¿Øg ýE8]ú"P¾@Äü PãÈdЍò…<ºüµüxtàŸ43 ?zº,ô)všt-À=mŸ·&¯o?§B³Î{ÄÝ/á“Án±vAr>5¹ ¤j>k)nAÖa´¹;Ð>·ˆë•ˆgÜ ü ׉UˆÆÃå”™+!,‘?Œô/bw6J¯Ø6Óâæí#2Úõç—›mIâßít.âE ÷´„1|× X=¡É+ Ù,êÛ†ãËÞv Š»â@/~“ÚŒ‰^9BGûsÆ—ËÓ”j1 @µˆ™í®HÀ˜¤ÃÑ„¦ÄƒXl8B½òˆºÎžKÔä¡FÏ3¦­ÒЮ¬%ÈY‘ó$E-æ¾ÜÓq"̸ã3Š4æõT ”|îQfQ2¬ÿØÂ¢xÓpKø¾` ?ËVÌa…fx²Z7ñpª°÷óý÷’çl¤ù%S¤Ò’ê9e&-Žo"z8´{dƒLœëA'Ï…6[®ÅÎV qL S êZ*Ûó<5g¼R¦öý Ó%|®‰BL¹qq*£!ÁìÌ rÓ7§;çÝiJpLyzé§Ù¤VïµÒjhaÇÛñ ×Éœn&®¿+ì|ýª9Š7+ý^H*ɪÂÃêˆë¹&yÑ‘ÏT;ÄÀñþ±ñngŠ÷}ílóP>Ùš':Çì.É(™X`¸Ì×Wáê–žÎVBp‘'ïÜ!ŠÌ¤vèéźBŠÉ5ÃÉ‚óÚ=ь땊 ‡ñ°cT‰žÁí¶D2דBg­œTÒ>殈p=É É°ð™â’åádÜŽoý¼³èþç(üó³ã–|·¹$úö†P^ v„doTÎÇ–Æž1½4D÷ݾh¨$Þ}€2D!†;ͧP.FëhâØ9:Þî|ì*#Û¿¼œì[^lÜdT\<½Ù™ âˆ]¸óÊ2ÕZ£æÊå= ‹›\Ö‰[8ƒÌÇ´”ôðBÓܨ†~ÂmÑzeÏ&¿ˆ§%t1Zò–¸oŽÌû$ C×O¢,z‹sLB»%ƒ^Öžû`F½ÙCjê ½9®í×§¶eEŠO¯-b*›Xçѱ Ëv‡žÊŸë6ËAØ[~$2Xz,M“ÏÃà z75TÆ^C5Î9ud\ž–ø–=Îö[%—­v °´pd.?W_L_Daôæ7Kéx•ã÷¡é™ÈþÑËjŽ[!bÌÕ†t)À„˜ëkk”Û8Ž;Þí×®õÖ4Ó·Îé‚’<…¹¦¾òˆyl[±O õ.ªPN®°Í‚yu¶h¡åŒñ‰¥¯ˆ”¥üaÝä¶ãä0Œ7•ÙD‡iÂ÷‰«]UWǵ‘£¬†aT JGK×׃÷éA“Ï.ÔÇÜ&+ŠË€,yX§Lô§ænµ6έjÄáPòÊê;©·/?à&àØnÀN^´ŒTL8âÜ”ñ~×ÈÙbÁ”ÖAùç=Ü•®Û±z*ôÊš>””J kõ&*kµ æv9Æ]!,±å í jâ:¡ƒ=*R=ì³vvÔAÛÊ9y†[?I% j›BÛ½P8yµ:'‰ƒ›Áìîk—;ääyoÓ?à‡˜rÖƒGö›œ#Yëj´${[V;k’q%æ¦ñä›o8¸1ùÏ É΀ŸGâó,ÎÒ6`ï6#ÍY#á9jè&­¿:´Y„±A­Ôƒ^±é"®Ç_ì|ª1u$1ŽYn!_Ø·ʶc6åŠM¡íf>!`Ã> ÒD§3–AbùʽÚcï÷…¢­o·I#Ñ2æÛL¤~ ž¾Ÿ?þˆšoLféýÀÒÇÒvŒ‡FѾjõﵟHtƒ ¯EbpwuÒÈc_Ø"ߟDk}8òþ Í纙;ÅØÿçuÒ›N 1OFñYJëà0õáåAay›ÑDùëhÍÄ…¢úÄm Ò± ææ|¥H§îHêK‹IP`DĨ§V±-ü‹³×ðEÍG3‡‘JÜÎÉì¬g¾´F{GCÀñ€°ÂÜùü Zq¦«<˜ø§ç€'‰*⦴š¦ :Ûö*‘oç7 _SP:wOÕ«ö„næ“­¡ø´TÚ|û…®Lâ†d&›. ~Õ28КÂLö:pÓÈèŒx¬Co™±èï"k 7k# rµss,hUPœÕ~?h>k²Û±üºíDyÑGb~1ö¼îl¥sF^oOІí©O»õ—¿ )²€ã'QÇI ^úuó ^¨}ˆgbDñcc“ûÍ=y”%ïì8€Šdó°ùJz9ج‡)8L*­üÚÚð_:Ò³¦7GBûs\OyV(¡NÀ]2¤Ô(;”Èç $K*ÿ ÅŽÐÿ.>xÑäÇ4\‹/ïÿ5µ¸0ß êð‚êQ”ûÁqüH€ùOGIòipê…6í+äÃÀJ42†]Üù?‹èB2?Œ|í²#ƒ† úú×ÙÌ\*AAnߊÕÄJfGï´×·º0wPðk­Sš:©À’(6sæ%3žƒ díS X@SÊО|„Ý/vDð¦4Èò-ü,€sù“ éCKGZrê¯ÑúsçÿÖÒèAów<#«‡B;âýœ5WK¨çÂ/H-ûFÕÌ „4 É ĩʤ¦¦œèœiíçÙY´d¦Wg«¤p \2Kú +ÜÀaCnÊs«‹#<Dê(_ž+Äå¡7¼·v¥FÑ®ñ‘_‹o©"Ý‚½ ¯«ˆ¹¢ò6#@J9ý²s¶–Æ5‰£+t¥¬Oš¢ÿ ‘å6FÖC)ev%µ‡r‚Õ6dpzjô>º}É%'2¼D"¶Ym~#é'.Íäl´c¹Âì'yæö?¡?õÌ{ù±šØ¯Y‹‡:ΤxîÚó¥rÛé›Å8P-줾½§À4*NÛh`4D¼JŒžòE×ôȯ«Î[a endstream endobj 466 0 obj << /Type /FontDescriptor /FontName /MZQNYL+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/Y/Z/a/asterisk/b/backslash/bar/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/question/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/tilde/two/u/underscore/v/w/x/y/z/zero) /FontFile 465 0 R >> endobj 467 0 obj << /Length1 1608 /Length2 2199 /Length3 0 /Length 2981 /Filter /FlateDecode >> stream xÚ­TyŸó,ï÷ù>Ï÷y_””ÝA%}<É4!a%´²ª6`ù¸ûQb‰VJ$@œš\(”!ĉh„…AmÀÄF PSÐ † ’ÈAÈÓ ä8Ë+((~÷¬¥îAF“TÈ“È ?þ Dö‰0ñ¯Aöˆ†¶v‡ÍmL9SGÀ$‚,°ós'@8À ÂD*(x(á›àHD<´ÖUÁÒ§X€Jqr Ääµ"@)>•Šüð¤`‰02˜@DÁ¿Fñ{Ö ‘)$$É!`v$*LÅQ 2 UíŒL¾ñ„½°ðZm*„„’’‰'áüÖZZ!0HÆBD*ƒðZ-wÀCT2„ÔFÀÈh†"z~g P@O,O©TÁ^›Î÷>¿u%“ Aë§IëYq€`*HðPæB«!5q0RÛ"r©¬-Š9у U¿ùñ~ä?cþ e}@rk;#ÀâIDB€=¸TlH0Rûw*+ÿ<‘‚Ä?EàŸ"ï÷Gþv‰ÿë}þÚÄ@°Áú ðí† XkoÌÿåb} BÐ?dÿ˜è ~cøO æ0ƒ>Ñ‘BUYõ›¢š@ Þ‚q^€–€ÌhÝïHăD-×Ç(¡55ˆ9xA8oâÚÐ÷`ÖC ÿ#sDžuÞ*Vìõm~|M׳ìÕa‡ 2Bì>¬Iø¿Œ5 R @SBk©JêªZÈeSU0˜¨·„þn[ca AšVE¯·þÇ÷Ý:öŒ1G¯íÉAKÄ#«õ—c-Œó£PE×o;ÒòŸöú’ƒ` ˆãêë%át"OddgÂUBy­ŒŽ4ßE³¶F‘/]s(*« Ý Íˆþ S~üSe”rM§ö—† gäÏ£»ß´ÝÝA½“N_ ùE¾©€P¦QKáM¸Šë%žÌIçxÚû«!6—=ªNo†Ùp-ù´I¼³Q²ùý’|Ø/þaÛ¤É[OáÒ«“¶ßä«Ù PU81)“2¾´({Ÿù µåÎ,{ÓèN…Ü$N”Ž?L\˜oîÎý.Žå´÷tÊýŠówéMŽrêƒ/fwÔ©.cœ×Êpý´IXG9N3[u˜b¹X|7ж%DãLq*p£çÈjzªG¦´šØèŽÄý§›Í-¦Ã^›•ÐEf•Y¨¼®ÒȘhïðÎÁ´^žÉÝÔX…}¬|/¬Py¥ëúÙtËÚGû*9“M·9¥QÝ^iœÞ/[þ.…eÙ»¦;¥04ÒãTè¾/£ß=)ñ/¦ÄWÔîRYà)=WwL.¡VÛÉÛ/FLjÅjy_xQbpŸÉhœŸ÷/鑘mÓ´ Ã<VÊjôÀÙ{ã J'cS}qÙH…^©¤¤¿£—hS}ÙOŽ™¥ÀâU£­žªó÷ð@*õV6ú¥y²ƒxÈX¾c;8Øboæ‘L‘ßùeuã†ÁQVíì<úýÛ¾_ëœ.’ãtÙøѳl^¹z!èƒ ‹oå*·|¨Šm5G0 OÂ'lð¯wsIÎë˜eUß ×Ï¢ÜCãìŽz%ªÎzõ¤â±"}ª#º9Ùüòf!4Õ7uåúÕFX§ä±žFíHÍ.àØøºj žnàpn‘i*Á,MÄñP­¯ˆP$·¨©µ=Ï¿no¼?fiC\!í~âfô´îÃùɽ{?Ål‘[LÍ•¿¢c=X­“LéÔȸ¼ûÕݺ:ý‘ó\†±œñï´°5Ø^ù|!ø·¬.°}Y\%à“OX‘r“¸ç‹R1-‚`Ûˆ‘ÕÐ+ëÝ]Rú¼Ö'lÒÃ,Þ™ß:§z¾½™ù4Òi–õºÛÃoéýØ9‹u{‹ÊÞ‹7›é¼Mù «±Z*Íܼ=ÖRnÍ•ÔÐ.õl‡·x=1c£B<+ÂJ6¿:E­ê¼8ÍØ–›åO¨™ç¬y}£ ~v™ÛZ_ T}²„óÀî³|o.ÛSv_ѯ-Ÿ[ÑäfÍÐFMÞ'ݰÇ$ìáñÖ×xJ8lõðyZãvw†of¾)¹At¬s˜—d™i¸‘nn@ÝážÒÕhXðVb“ ˆ1DOY¶Ìv ìk+Žê¿qyùÕqž`öM5è¹·1¡˜2ž^¹î>ˆëµgÍ›ø=|^>W7ðüýR‚¶oѱ#KG-‚sàÞÂÅA5äÒ½’ û˜¯q'>n+©zÃ.¸i«þ ¨¼g]– Ýßûš£iÚ_“ˆ“l‚ÈwªÔÜ|‡EŒÓZúh÷žÌ2µ‰áþ~†_æeOŠW(°ÙÖ‡ÈFö^ÝÌW«wŠ/ŠñŒÏÆöæ´¯$ð¦EÔì3¿2[G8¹úœ7ý¼®H‡±‘×jðÉYcPzóˆÜT.•l¿X6ÚÛ}úªÎÇ rZwĘ]™Îõ¼ª[*ú 3%T¥‰õvü¡]褹ÌÅ4M¨³û(ªrÁ¿óë{LTHI'/‡õ‚+«cÚwG{]7Þ-± uß@AÜÀ&1î+$ï+uI—gO >Ñ™K›êæ© øX s÷rÅ2õ,}#ò2ë‹™4ï$S\·Ä†c1+“·Bâ6ͯÎL'*³NÏÙÉí°'%þyú‘ò€Ñã%ûµ£‡œ–‡vIðèÚù,+^³zÑjYÒwäÔ n—˜ÞÌ®m…l/cEä ¼åny/¾Ÿl <½$/—sïw?½º»Ž·îÌ̵H­4.WNH™rpî•ÙhÀÝ&Ìü§`ã(¾²F³ì>ÚI3‰/ÅQ¥#Žlñg¢NÎÉk€G}2xú“ßFÞþðpüpùªF”+=¥âËݲAnþªM®»o.ð«ÍGz[prái”±{f™øHkbaÁ«šÏlõÑ¥v!¦Þÿ²PT±^5üuåHÞ÷ƒ“[|G£šßsT^¹/ÉhzŸÏÜ‚²’”gWOÝÍڥܞ–Ã!&Ii"–å[a½‚[tÑ…‰â_çRÏJrÐÔ,vU¾ø2»·fucg«ÛáɧôKcÄ ^¶²nÓ]q6L˜äX´½E£öå”õ$ò^>zÏPŒ¹j#•¹°¸7¦G®s¥é#%ÒN;M-úïvAв¡½gw™¾­t ôD°éCE[%o/Ž$ KM®\~zòšî‘j–‚Ñ•h0îH¾OÅÃÏÞg‚n›ue8†#\N*Ú¿óëvœßažGk˽ÙXéTíÅÀÝÎ5·á½÷ÒàÌ–^Ö§Ï·§$géÇS5½è-E¸Cß½ÍTiIT–)u°-b{iÆþ«®Ÿî’Ól•cp^$™]*^yˆ_yÕÜŽ13S¶’jï ï§4;KšŒw€,¤É¢÷ös S½º^¤=ž"y™jP=MŠ^W>H×Ij¾¥¸Kv† “¶rûËÅã! ½À³C‘@qL晫—.˜ ůt\ôâh1K‘KO»$¤ä,ªÓ!gì_s«màÐW œb¸¡‹ÆY Ø^?¿w ×Ñ`úc!õðéÆ%ù Ï­Nº,Š÷Þšy‘Jª×+¯zµ{15?7Peë:nÂO˜Ë’ fežØÓN>÷V¸sðèg(¿ÿÆc³G ÆÙ`úÍÀÑûÌFˆÞ0ð?^¡p endstream endobj 468 0 obj << /Type /FontDescriptor /FontName /LJRQAO+NimbusSanL-Bold /Flags 4 /FontBBox [-173 -307 1003 949] /Ascent 722 /CapHeight 722 /Descent -217 /ItalicAngle 0 /StemV 141 /XHeight 532 /CharSet (/E/N/O) /FontFile 467 0 R >> endobj 469 0 obj << /Length1 1166 /Length2 9248 /Length3 0 /Length 10025 /Filter /FlateDecode >> stream xÚuveT\[º-î„`!@€ÂÝÝ5@îîVHáînÁ%hpww‚wwwàqN¿î~·û¾±ìµæüö'sÍ5Ʀ$UTa5%Á¶FV&>€<ÈÆØÉQÅÈV–Qhîx9P()UAkàÑo„¸ÐÛJAÞxU '€œ‘€ÀÊÂÇÂÃÇÉú¶faÿg Ø è²» ƒ5Èö’›8Ùm!*NvvÖ  ©2Ðìä`t䘽uößUâ`;7¹@£¦¬AKOÏðo„•——`ìöO t™Û¨ÞÎ@k°Ý_•ÞRHmoM›þ«hfôÙùk\bÇÇÌlgf|Ø͘lfÚ·F?ÛšŠƒmþJàˆò—f  ÉÛPnÌÿ©›•-ØÅÖã¿`3­éß#™:Ù1«Ù‚ì€_$þoð„òoÌp²°±ð²°€ö «‰ó_%UÝ쀓¬ÁF¶¦^v`;€™‘µ#Ð d|{¡x89' —ÇÿKüÏ ++ÀdÍߎáßÙß` Ù?örF+@‡…‰……Àò×ó¯•ÞÛš‚m­Ýþ.od0k‰jhhiÒÿçìÿŠ¿¥ddåæ0²ñp¾9å-#/'ûfü—ÿÔáoTÑôûdùwÊ/¶f`ï?ÆyÓñŸ#9ß¼  ùÛÆ´€ÿ™_ ™4ÿ¶Ž. 'Ë›kÞ^¬ÿ«¥þÿ¿ë?kH:Y[ÿ­ Í?ä¼éáü¥ˆµ‘Ã…Ù€¬Ýþ—þ3Pø÷ÿò|YƒLDmÍ­ÿ%ÈQä 4UAL,þa—ªlú÷=*‚AÝd#+'ëpª +[ £ãÛYüMmMÿ£äg[°)ÈÖ ys¥‘ƒé¿€¿h'‡7yþ> ·oÿ¹7½5ºMPçÀ&ü–5m÷U¢„.Œ»cì½\j·¯N$(QÖÐÛL0=ò­Š 9r~ó$~—P±ªÐ•ƒ…Ž%üÅíbÅ+Ö΄ˆ…„#FpÂT+ χvD3qÉÒKù19ëPÜ­_úœ´ôV‹RHü–J0ׇè^{ÿÀ^¸4¯Yá`Ž–÷ãÿ™‚´µ·ÂÌP‡‹¥H2ªLgÃ䵌6jÃÉvy;–áì\Ÿ:§ÏL° ¤æÂ˜P«˜›¯ãW'Û£EI«ÙcÕ]§ »žÝ2ÃÏ<@DüÅ~}äb½•7&BüÏ¢( T‡Øe,ü¤íÆÁ rßûÎ…~TQ5e;Œ‹Y2:óòÙYÅ[â^göøZ9µ®Óºh’IÛÍæJ›ªwjíW¢qÛ½+Ê ú¯åvW×GPù¾"fn׳⸀m’ê›ßt°–„ÿGQYÒYªr3⻳pÅN‹ÃHšÅ™N§¦jëåö¨”®1ÇÐ4ûgªˆ]fdÖú¦%t %Žho•™Pæ†xñö’oéÛÅ IYkЙᗳ?Ü—|dDÈ‘ƒ–€JÓ7”uz®>ØÉGâ¬@Þë$¹¡û4´Rí­!D–Ëä’v\ ÓÜ€Ð2½Hîž ¯÷¤xb{‚; tÕ­rç³GÓ×Ä]”tåŸú7]wš”:c»:‘8!)œç0‡ÖïöÙÜ’q3J7ÒÍN˜<$B[w™Lò˜Ù`˧RwTBmÛÔõ’ùƒ¼Œ>%)Ê´X>4M|†"æj&äkä;õX8.I|¾EFr‹ëÏ.$ÐãSX\-Êwò\ã_(3–sωŒÊãs›ÅŠÃ¬ð§Ð´vD‚>5g† †ü1~Îô ý-¯Ó­±@`ÐfJü$ì§žwÒÁ×E-÷§,¸>ÚÈ/€TZa¶õ7hú±±µûâMú ¬)$Ïl;ûÙ;¶¦ŠYiökj¾XÜ^ÈMa.Ò°ÁZ¢˜+Ó’€ £à¯çõ× ~®e/Õïb°ý^E.tÌŽt¸kæzlX=QjÛ¸–.¿q0éZw¸éF’礱7ƒ0bÇvÅëºÒ7¹ÅŽRš†G‘ÿôMiéŸÌH‰À`>zµaŽWëDóî/x×T0ÔŽ2v q ©¢mmøÇ±ñsݪf,'·>\,‰eš4Њ"©¢ô¥•,³ôÆ* ŨzüÒ4•^Aîô¹š¬F*=¡«ØA@ÿH×^û¥Ÿzw0àà†1v.u&J”\Š™ôSL+DÎ[°ŸêvAÉ ´Y6eµs/\ÁŠE–àgÎåï…­ [úÁÜúƒêë‘Rù;ÇÖÍüÂr›¾ßy†ùüµÊ£±XºNŸg³”¨/Ê“d l.·¼Ì• Ãþ]˜€SP':ß]°™m·¨¦C4jîj¸IÍFáQD§aÌüºÛ@ýêü`ïÜ;¼>†OÎÁ{ünÔbvœ‡cÅg!Ÿ` sÄvÆ”ý Å‚šy©ÍJ÷Z‘ö3I+ISbàþ j¢¥˜º´; Ÿ‡’xk\òeÀ…WÜ]YQ¿á³"}ªªw\^ðÅÏØù§L¥Œ Ÿmk,“º‹Ù+ì}õaËßjÚ d>Ò[µ™\ŒI8$º†D1dô­SØüiÛù|Åw5aLœÉfoŒÈ94Ðý‰Ôl4£ÿTE;úË Çb‡¦I™*^´&q¶ôä³Op¥^G“6  S×ÙÞÐꦊnÔ^ jnFʽÇ7æQü,TÎs—ÒÇÃ9í8Ø%]|Ì}²¬°³C=s\áÂøóüá˜SšÕIðV#N  …­ è˜zŽB*p'¶Å@£&rŸ®ëÃ}Â2Vã*\´ÌD’;Toô±Ç؉l£2²\RTI“­n6ØgŸ<ž…ð\{tUq›šþãû3œÚÙžïìRÆ ”ëÊÚuf¬V kbcY8øÒvÌ„þæÞëàC3_®ÖÈ’Z¢“‰ÆÜѵnst—‘'Óê‘•¸¨YB4zî*ù%`î=Î>ÓJ43y[}w×”Á­.ñÕECÒ°} Y#Ç&œdÉ*]•ßÙ¿uëISý}B/$o…ß2t yÒT#Ë™Ã÷° u²ýœ^ûÚS(gLuÉùÜR $!Êà΂+ó•X1 5@Zè ]/ ¥é¥¡žúƒß lbÖߘôTq<—´6$ß««3%3¼h-Ÿõ±Ùô¿¿7·gErô-7…@N<^Ú¥å¡òo†«Jç7G|zçà·²~˜Ô3†ê~½ñ‘O0²˜¹˜¡ïP.ÀHÜJ‚yGóñÙb•…Òðñ£œ{¨3Ÿ§!ÃůÊÖ $ðudO=µÓA_¨NHR¨¸›9v«-G¬CÂï¦R<îJÝ‚®ø£Î¯]C ­ÄtûÇ|SéŠSçÃçDd÷GŠøªã¦hl%4VrçɵÁñòîqñŸ“–Ú«;!VØ|<¼êß?põ‰L­3Zñf`ÌÖëÛklãç 2ªjXæ—È wcÉ6Ù[Æ7bhdô=ØÛ>æ3³û|ß$&ëÀÿüöØýÇrôÏÖ¦}X9ÿáVc®2¡ñVd…”'¦æ%ÏÌ?+síõ»› ÆÒïÒ Ú4¦Ré*…š¾Àºì»ãÔùd£ó¦àõÐÙYÈ*“Oª#ÁyÆ™Þ}š£bˆ3ú@tFkÀÃF†¨< ÷ˆ›V‘Gк»ŸÁ³sð]Äè±îÜ ØÛïXá\üÔv?´?EÙ;â°²Ek;ÖZB?`ÀK]ëN‚”iù§Úƒ3cA:Ç“#ìy=Ö“­~‚½ô‹NPx`Q$PØÖCb¤\Btýí:ÄAº×ÄŽ¿¯Þ~J™Ì&gÓÎUþ83@õÙtx“‚Y&Q˘Õç\ë•¡Ë®KóbÏI$êÏÀžguý6 4>£6ZÔ;¨Ia…c‚„E¡\‚ªê]Þ7ñ6å¶·¢av´<#Ppp”É–#@]÷Þ)çû&é1Ú!ÈœÄ@‰cNÒ!>Ž$]…Û éP¹™¹æboÍ¥†&¾…5LâŠz_>c%<ÞMëÛsä”D–žÎØ |%5\íè£èíÌY ´Ã87àä¥õ0J o£Âë{’ÃÕ¸ìž$¸Ö†N¹Ûœ¼ßË9æ´:”€µjÆßgˆ \Û|Ð7|¬Gôx?Etr³Á|YëØZö#ÁñËì-klyvÁÀOš;iK*üÏOÂ+×Ϧh–]ô·À¦+ŸXˆ‹í· ‰ä­„‚±D0»ÎIÞlãy7Pëx.»ßc¯}èõ¤“2ǤÅ7ôÝWQâgÕzÇÿqà¾v×R~z$u¤c1cõæ£.+¼¢ ¤¤úâ–ÿƒ5¶Ký$zXía7b”Ƈi m†LÂWA‘v•ýÓ¹¯%êDÃã¢SÝ3ꈯ5\3T’~0¡nÎU™Ë³ÍWõvá²^0½–Í­°D€° k¨×OrMÁO]æüÌÌ#œØ4oâˆ3%c‰AwÙ&ì’™¹±u}øZez±3úÁýäç?KQ2 ŸyìG&$h8§÷@õHDJ?(’Äx04î‚Þ‚C'­J¨N©ŒfOÂÏÈL¡Ø¬-ÅÃnMå>°n¦n`ØD°ýl · ¨ÐqÂŒÄ)Þ•ËœŽ¶wÕ¨Ö×Ãù,’€Z§%4KÌý*œÍåôÁ¸“^“fƒõ6_LB=ä(2­ÿg®‡÷ü—dÖòöàJæwNøù+aŸpZ`26.†“RdÙiæõ¬ÅžG“÷Tͱ:ŒÏ¶µzîˆë×út5ÃçO^šzU™÷ÑÔ5Q §oÌì‹at]êñrù†´`®Ó…’ºð/3Ú団h§w("ÔÃå˜!8³Ÿ±fÚ°t&Íp`­»H4O-ömå5ÊñTº6h·‡}á!Q9RÓù~Ña Äå¹îW݈+b­þi]‚.âúΘ&}Z¦Îh=åIæV­»ÑÛ°ÊÂñ„-FE±jš4ÍÜŽüärŽ[®ªv!ðñl(RÆ• ~_ªlIÕAjœa]ûù‚öXΆB‰‹ƒÉ¹wq©í†¿Ò%>ÆúØÕ¸¦ [þñÌ6ÖsŠ­%ÒöC‘Òíÿ´ÁQ ;ì0ªX."“Úñ:g;G¸`}=iä”ÃX¾ÿÁ:ØÂ%öº•ËúP†ûäÙ¸¤|…±^KåŒÉaæTë¨ñ]säØ&¦Rï^‡F°oope :(çÚ§›tƒ… nº9SHrcŠÓCz7m®„xÅ(è÷{N_sžøPî(‡gèèfQ1om^ü©5 ?]^b*9$)Hâ<=ï5ëkMÆŸX®ß=§Æg[x×þ:øq¼4®Ðš9÷k¤×°ªø©"ÈÏi(ëáP1æOèÔQ_ÔÛ^€ÑìÚ%ç±[j]ž’¿/êT›!¨ õÂp7›WùÜŒe®ÃTm#fq7‹B­ˆ‡°—©ÌmjÑÜÐö3bÊbR¯™óXäÔ÷è4_øJ?ÚRw2’Ø>®‰œ(ãéT„JBæ>öOfe(À†ƒÊ ê6Ò0_CDݲç†[ÐNdœÙ,™ÁÄk”IŒŽC…8bZ¥¿¡Â›þ±WŸI¿Ìt¾~˳º…æLB¼ U«`t‹ÑûJTõeòg|#uÈæ´ÏénLyýmîžrRøÈ¾$ÜAWeU¡ù :’ñN‘µ?×c¢ƒT,Üäú9¯P^Ÿ*³÷°·‰iP…GÁª4Ši#›ÂܺÐT]ã'/ÆÚàKu/þeçEgmâä_~gI;öå”õ´Ô+ûå¶µÞ`/:Á«Ñ8ÄGD *Ê,'ᤛ64ŸðAÃX…¸ñè¶j™¾íŒbkîn1ΜlY[^©$P¶ðIâÆ^+ŽmöNY{rIHúÁÊ*\Ù’„Îý ÄeÒ›°v©ŠPÉ×DÖøø¾G?áðxZõQ'pžÇ@F9S hL¢ËGд® %Fkê$VúZ$Î6L•½§qÑÆÇ‰ˆÒžô ÃÜs1.à=º¼Ùé‘™vGOÿÉî XÈ"?&XÜUÌ‘‰@œ˜ÜøºÊ¦•ž9ž¼?㟷QüuO`§ “ôP);®B…\eK&CÇl³3î;"W‡X=«ÑØø¼ä´«f¾0ÚG}¦M¾Ð-1J½rF<ôíúÒ£MènUuÝÕD¨µpAdñk0ÈËtD\Âþ¥TîcW¾GÍ w"”ƒAX›½jþËb/Of©âÅ"½‡b˜ˆ(ýH¿öÐMÌ00–é\nhœÔRTؽÜ#ÕH˜Ð\àW”mèäR÷²¯õÃ^ðdE7r6¤¤Ûµ:k›‚u£ƒú-Ú“ʺÅ$É#²öq¥µWûùáj¸=½ˆ40>ÚLx.;#c"+‰ÒÓñ^ôìú qxz¦ø¤1Ÿ ë NO§€ï÷ûGOõÁq4¨õO88)ì"aT/„æwÌFK™bÂÞAágÔÚú\¬ý©õ }‘á~šÖÂk½íî 'ÞV°¼égcÈí…/âlz‰Ï"ÊIlýÜZ‚¥[ J±¼Ä¨ŒÀ_ûÏ® èTådJ’«ªÏÖ]<.ü³˜1/xnÔ퉿sW}tXkÇúÏÄ Ü@‡ñ™òH‰ËchñwûÚáï'/…ŽãGEOt&—¸µ õ¤VœnŸÓ ðj’YaYô”¬Ìm ®:~[ÿIvº×Zeq€tte-ø÷ƒ¸šÝh:a ü$Ü’š/;hðSSúÄ©°1åºõ™ѹÝ5z[¬ª³¼ ÂÉyn1;2Ekx8ù¼üÍý“&3ʯ+Š‹[, 0øâ$DA…äϪ4xq‚–îYèˬHʸ_èùòËtIC?Ð.Ö¥(û~’ DûÛf9Œ~°ÖUÇ_®9L*SÖSÛa­`Öƒ,2Ų[–­Ç™©C?V9ûàN±jXm ‹IBä´¤¼êŠú˜³=å#oQÒÍ_lšØy`¡Ñ&²ƒ»&%k‘-›\©¾†E ØwàcWa‚Ù– k/Њ¼ÞÅ7!ò¨ó Þekg N9CWfœö~ò ³æ·5$Ù*±ßR†òˆ¤‹4ç£}œ;Ô~ŠÃ$(ÝæÛÙ»\]ÄTi-«5ýA¯¥Ê÷'„Ó‰Sháè²3Oßgç)І§œj[.©&AGa#íÍ|ÜéÓ0xÇû¿ðÆcê勵ðWSˆPŸ¾áæ¶›”jT“- YA?ÅÒÝY¶3¾m°Ôêv ­j`Ô뿯ƒ×úˆ ¨ŽdvB&…–âQ¬pUÌr?z†ÜíVà~þųŒ1F«  K°QHNØñøÕá¼ÈƒŠxžEL€ŒB»'N=">ÚAϤ½`ù«¿âÔ3¥ú'|^*ËàL7‰*Ò-œ)PÈh„Ï»àñ}D¢<Ù©u xƒ+gÓ‘F±ìÙgC ÊœHO‡ÍOÛ;äFÛ#ˆˆº`Õð@±8´öùݼñnÜH×O,œª ˆMþ5nEΚtBÛãý²›SùýGü(—ýt¿Xt}2l3Xu0—âb KUM\À^¤´.ýÚ8z·Î{BmUÖ PŠ”Y(´"/p&—_iFÏîŠà; n¬àôwBzÏžyÜ¥ê “ Å”f?¶æ/7ŃÒFZúZ†þ\ɽ¥ƒÑü¿ãS)4Â?ÍéTPywäìí€òk¿3HU›%<ã-`Ö†~à¦é¶üz$š·^¯] ˜4q-MøuÖº<ž·ò– VXë\CÓÂ/g!õ ¯{µõ¸; E—b¬2ð|”]th¾‹VF6Á¹šöýíÓQÐN´Ã1'Ùº@¬Qo <Û0c¾Ÿ_*7³Y’¢ ß{ÖXg*c’rœÀKMóÃh;퉻 H°WÌMälJQ…•_¨ûœŸð9èØâO'CÛ”Bé½of¡Î;òZD^CkÜ7fxe‚O9ú`´+ocBNú½l9d,d˜ºµ>¦„j´Š„aÌ — `<…Ö­¸•p6x%¯_‰%œŒMòýá>;¢^ª¸7ÅXg:à镱´,Púª7ä³m9èó· ÁC²‡R…U›¹¡i“¨sö EµŽ–üq9¥ªZn„,õw¯ÆKA_­.'}®h—hP'P¥DeŸÓJÙ7&š;¦;‰ Óïa´ƒ…rÆŒám1•ÐK¸«“+t¾v Û+%Æ£‰¬y‰³oQ‰3¼¦uwŸ:„~Is2£þ£þÞMÔC^IÔœEkëÓ¬ä<²˜£æG­–ˉ“3,Üo„[Rw:‘–V›Ê Ä(22œà?»f,ZÃ÷V+ÉÒ,ÙΣmÌÖ*fçó‘û³i(9I¡ÍòŽ¡µ~Ù:êßµÓ;.t(N` ž²í¢§W•î=ŸWš†Â/SqZðãL˜p*fM>Å%¶{?ð¥v±þ„ ¢¶0Üý ¸£DgÎr)ùîKØé ¶cŠI¡&èDK^þX`uJnW5ÝMO1§­ÂŒçàC 2>Ì‘;}€®wžYÖÌšl€+],y’,YpÊôãˆI6Ý[’ÄIl¢n‘ùÞ`¼5/,‚Vv¦æm‘&GhÑæèO1ÁD$¹3Q43,æ,`@A¼Ò€„Ï/}|æ?³SÌY±ÁXØ«`ª®e¬K7À¢ˆ-‚„ÿcÍe £unÏúÎä§d÷áïEÔ4ÄœE ÈÿZq\Ùÿô]øtó4Zyk»™ºe‹ÜwÂ8Ư¢Ê$SÉŸ“%>Ò¡úä¿uYpª¿nß¾öËö’Gx¿àÚ¯¼;åŠ ò‹™¨÷´ÂÈÄaõ¾„×Òµìë€eüx‘ŸÇšÕ·hµŸ]…„k*ufåGÊà24¦Â`?’f«GQÓ<G‡ÿ™P)MÔY•¬¿ÊÁñ4€ô’näD®üð•”vwûâ Ç]V®`çs’ä#aĘöDFúûÜÊ(åCüAßóç{}ÿ>‚ ÅJ6J¥éDt«4: ³ç>0ÊXpÄË$µY×40œØ«2«Ü‰N1^³Š¯åq«xÓGÁ…çÛD#‡|·2P~²k3. ׄø äñ:¬`À7èÖtbGåU¬¬¸MŒ)H]]âk\ŽgV«†¦–Jê-€r²Aa^˜…<– Ã30\‘6+„ƒU™i@cÓòa¦ Ó[¬²³lkhkŸMš%]:ÛjBøFv2±öÓ1:Ú7žÆUÒ`¼¼…{Ê$*y-pªdù©ËÂ6“ɸ¶pVÎô=d'7ôÌ×/Ý1xN–ùG1þVàœä5Ï(|šT 3hBwÅhJêeÿZ1™á;ïkRsOWÁz˜œl´º¶>ÕÓ,’UÅü3Þöáœh˜PšUx¢Cô{\hÐ.¯Yçz͵ÉÀ•ÃÚִ±”ÖÁwšÏ{GL¦dš2 :FÄ™LNònP%xâá(º'•A ûˆ†ñ÷•j„›/»'ïÔ×_8âØÏ%©öŒ±–ÇIùmŠ3!¡Pü³°œÛ*÷÷\²›~›<š÷lUtšÆÆÇŸ/Fˆ&­Vã>í)(K,H Ëš/¸¬wrW ë?õàÏ?­)¾qË} -lK™Š£Óáþö>H忬Nw+¡ÞRÁÛë¨ÔˆœIíåž}\}Aw‚$#òH>#ø·c{ÇM„ 1,¿ý^È”­I?Iþ$6j;dVé±ÕR/ëW|£‡^Σæ&Œ¶n‘S<[?±Ç1ºÄž$´ç4á^OvM·ä2޶‡Ø‡\ÃH@O90>,ßpÓ,¼9Ë„@©Êz~í²)cÊì+œoD:ò£íki6bDüÃÖŒ¤‡€“êGyhRuí ÑÁ«|ïš´^JyÄÍß¡y{SlT1cãXð~™NŸËU ¼ìæË·’iL(®nª¥OÌT»òMÇ© ÎñÅûGýy%•Q¢üKÝu¡¿ÿ “ª1ò™k?ç 3 ¬û¾Âý4K™trvN~¬ÕuîA<¨^Žw¤¾c9Åupø·‘ÚÏcª9Š£—®H:ua Šø¦ÏMQ·ÚãcP>¯Â»nÍhæc\ËæZº&W¿‰k•àÛó`;óXsü9—"yÄÀ!"¡D»*w­K—_]KõI­~ÒͳáÉG|yßha¶W dãJ¼ˆ‘¼hŸÄo‹saZE3âr´WÑp›ß½JÃðL=hül£0.°Ë沎r‚ïj¤éçø›hÕ endstream endobj 470 0 obj << /Type /FontDescriptor /FontName /YAWWYX+NimbusSanL-Regu /Flags 4 /FontBBox [-174 -285 1001 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle 0 /StemV 85 /XHeight 523 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/W/X/Y/a/at/b/c/colon/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/parenleft/parenright/period/quotedblleft/quotedblright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 469 0 R >> endobj 471 0 obj << /Length1 1199 /Length2 3521 /Length3 0 /Length 4282 /Filter /FlateDecode >> stream xÚmVwX“ÙÓEéA@)JˆzBE…DšTé @HÞ@ $@B—"]¤ "—"½ƒt¦(]émqi""ÅÕ_ÐuýÖÏ'¼÷Ι93sfîóD𜾡¸ š` ¨ð$q˜T ¬‹u²u#"ñÚâ7;7M&²H  –„~ëBá®’„%àHÙÇÈÞ ¬ƒtKAÁ0¨TAIJ>C¥8\•Àú®X'‚7X ®8,ž !(7'O2tsvÆaô €HpsED%0†\áï3ƒág/W¬= 1¾a*,**öÓSTTÛzý@À€ˆµÃƒ/îŽà|”L¡àWráè#_} òK:j ±'‘œ•$%1H€l“ b$ðIR˜\ì5<Np:" ‚ŽôC`]¹1/Éßièˆ'xà}~ a°xô·öÐnÎ’Æx¬‹ ‰ø'€lý´Ù$°,T ªU.`Àe/y”ÚÈËøÂŽÌH<Ú×Ç™à Æ qDÀ‹Èé€I®n€¯Ïÿþ{Á``4EÛvä‘üd'›Ì÷»’äŠõ[B% Pzôû÷t‹<\4óú鮋tÀ’*Fˆ梿ëÿ_OUU™V&¯—RÃ`ä>e¥eýWZ|³ê#±ÿÔ ýI©‰ÇÀŠß["kù£-wÀ•HÞU0äÛj ƒÿ˯K aQòsnBe¡ä "`¿]¯ÿà¿]²_s¨¹ápß”|—LÖ„Ö©‚#?œ#e°¨ÿ…tÂâ¼~÷«£)ðýAüC÷+ü]o‡Àâ0©ïF,Q ë  õ±$”ý÷Ýù!7úÛô DìÑ'‡ÈÂ~ÁŒì±(G<@$’‡ò ðè_’^ãh,ÞlH"¯(Òý¯áF¹¹º’uú6)rì;K.<hb”€ºìPÜ´W®Âí!¾Ø/Ý!g¼ûÕO…;ö—Äñv]Çn™GÓú/í/—ZRêP å¾%ïᨨÚ,AËÂÂr\ã.׺DÕ%]¥›tÁ-hW\$GRæ[¸W·ÆûsE»æ‚—á},†¡vž=‹å=nÞ¢ìz½•QaÅÓz8?%š×=-¨C`XƒVkíо–Cíú'Ö’f›‘ÑNUFYÿסê Rå¦-·y¼RK_«Ô}a#æ ¼Ç9[VKú–ó”Ø@•)$ê}`‹ªh2[¹Ûò:GÙ"þößœ¶ü™G}5‚°Å ¼ã‡mamŒ,ÍmÔìä*|ݤ0ãÐìÝSõEÈ^R9PM’2L*˽™Ë‘Ê»“”IãÂ{Õá\z¯Úó˜çÄ:?õ'†èà ®ð+biÃókf<:'?Ò·š²­òƒa h¶ü.kÂF@ÝÅ¢(n¦¼—K_'„Œê:vr “Ua4wÑü/+«“Ûž§xàhþÂÀ:zwÍZÂXt“Áx7Ȥ=äݸå%ÐîØc¦"ë'äâcü/Ÿž:!N£Þð4gU¢ô”¤=ƒtIºùÉfTˈ;2ôQg;Ÿ>ƒ¼*Çâíµ?L&6o0y¦J*¾¤¶mvmsor§·´yg¸}9cqONíB‘qDÒ}ûò-Í[‘úºùµoâ–ï|œqŽy[3‘Önã+ºµ|³{½‡89>aâžÞÐÔËwQUqêŒÔ¥/6f2fo¯ꜼÀøPҡ½ zMŸ >ÐÄ$e"xŽÚ/BèƒÜ±^ÁµìèñLŽ~ʹkŸ,þ}¦–µp¬%†}zª16Ü4Z:^êÈë¿ 7šÒ™eó:+µÍÅžØ$~ù´‡ÓÀá í#~®ÕÃÈž“ÂOÍ+Îízôþ=–¬";LâžÞ­FHØAš8u:i ö¢”Ì„,vüì@¦_G`Ÿ ršRm0ÉÂgߘ~Š­®Æð&Çà[;Þâœ;G§]l9Fº‡]fÛ—K3ò¨Žh+Üç}§Ò™ç?‹Xè$H4¯R4]ÚÞàÖ‘Ã<ö¢ ¸äj=/BûàÚf_`—JEQQ7ÞrxS*,´å K¶†C‰:[½Á%‘!î³ËÇl2q? •ù[.Á#Þ^UÙ÷>ièê¸Â—§K± ̶U¦f¸3YÙ¹œ²çâ9äT}cžŠLÛ ˆž^iοËÚ(ݦjMc¸ºþá‚yB­š1Õ±Ë?ïpó]¡ Ôs7Ähÿ¤Š)~éÝÚ!ΈqÉšQ:*RÌ ÛL$‡ÂÐõ¬ºüÛqžŽÖ4 ‹Üfn{qe×°ç>É“g"un较ȼ¡+ 3ÊNÓÔ3_²WŽ·yeÑa°>|K%#ü‡B±²š~ï2£].RBwn×Ûìé:î-HÄ ¡FÇþÉj{ˆ/9+ע‘†×è æ0Õ©³6%p«ë_çÌ´¯}Ñyq¾WŸŠé~²€%q`¼é/Þn¥ñì9L÷6ÛÍsñ,-§Žõm~.z}p¯57AèyêÕ.N9¿OKvpŸß2õ¿–F?›—»°ÏvY.ç9Q•ú„%Ī) ø|bÈÚ•”uî É.ÈY¾P¶ûªtsQù0>¢ÑôMåÃ:E6Ò™-ñà÷**(Ä*ÞGu;^`ü*~ÛS¸ßÏf HzDó9n/>p(á­j§¤ç§2 _*×*Ød2÷Ùªé -¼fIqò§Ýäž VõftÈCdi–Ùˆ'¤/®3‹Ü1sæ‚y°M‹ÐÔa0ÇŽ³Çd ÏÂ0‘ÙoŸØóâÝKü˜P^t°B¿¥C{²{¼9í£Ö«Š¶;¤~.ªqýúÛ½®Eðô»×ÙÎÚ²QLn†¯vÓžZNåȤ^¿'ç"–Ѿ慜|æìÉtM¨ÏMWYz`ÉÔJÝp‰I9–Í^9h"¥Eÿ/D›¯ãqf1X·]MT4ák£cHÉ×éåçúiÑvùÙRµ».Ý ¦Ê„ÒWOn35Ol&_ØìÎ×~zú Y8ãØÔ6oÜoÙÍyhÌêê^¶[|!ò1£ÆùX ¾ñÞ…ÎMOÔF%oÃ;Ã¥ å&½¾s<²ÀAm3â I.ñT¼H`@ÜfhyCÄ;NÁê1ŽAÄ¥‘¡ pÛ6¬Ó黌Àsvæò£Øc{¦²Î_æØi¾èм²¸¤÷A™bG=ÉSui]zgØ@2ùRe)hÍGyfŽ;E¡G3Ë=ÃBþ³ýQ3(ÌK\[«/«~#“<²IÄä*»×e7R ƒ¯Õu}öQx•E‘4Ñx«ÝXQd#Zi{Eœ:)™7Ôµè½,ÏžpŒRyc8¼¿elžIêvU/;åtÄaF}Àõ?W”À³¾,¥C–kPßuë$€eW žUwÈó^5Áæ}}…nZ¶÷ªRKb¬o©vRiI°7äº^#\”óÚƒÉÜý¡ënÚ,ÏõX™.ŽêØêRVÝ(÷(âx³›uÎ’vuðõÜb¯'Kååíª c¯”Ú˜òœh#rO†çÑÙ›\qòõ` òçïIÁï¨?ZùÛÉüàöž¥]©|±wÐ4X†®G£Æ7fÓ¦ÀnÒÚÁãq’;¦?½Mõœôgä¨g 'ZÿQ¯x5’ÆÁ×ôb!6K·!½¡ù®ùÉLsÙ4!xx«;'Õ_ºß‡%eøš…µ@ƒ?SÛÙù‚­©ÇnãÔÉNç§=ºƒÖïÝJ\> endobj 473 0 obj << /Length1 1626 /Length2 13146 /Length3 0 /Length 13986 /Filter /FlateDecode >> stream xÚ­teT]ë’-îÁ]7îÜ ®Áuww÷à®ÁÝ!¸»{pîîsnwß÷õûÓïþXc¬òY5ë+JReF!cC ¸µ##+ @deèä dc%gÃ-Ã( 4>ô””"ö@Gµ¨# 4ˆllVnnnJ€ˆ­›=ÈÔÌ@£ª¤NKOÏðOÍ_.C·ÿ´|D:€L­T?Î@K[+ µãGŠÿu 2p4L@–@€ˆ¼‚†”œ€FBN ´ÚXœ -AFÐÚH 0±±XþCÙXƒþjÍé#—Àà` 4}„]€¶™¶@{+ƒÃÇ?ä0µ7°vü˜£ dmdédü€½‰Í߀lím><¬>lÉlŒìA¶Ž€ª ¢âÿÀéhfàøWmЇ`còáilcäôWKÛ>Ò|X @ÖG «ã_µ cƒ­¥ÛGíd¶ö ¿a89€¬Mÿ‰€`45°7¶:8|¤ùÈý×tþÙ'à¿uo`kkéöw´Íß^ÿ…äè´4aB`eû¨iäøQÛdÀü×®HY›ØXYþ¡7v²ýO›3ÐþïÑüµ3´ Œm¬-ÝÆ@f9Ç’šÿËLÿ>’ÿ ÿ[þ·ÐûÿGî¿rôßñÿï{þ×ÔâN––rV ðø82Ö€;üuhœ¬þ¯+¥Ûÿ+è_½Õÿ@+lciü¯6)Gƒ‘Y›~ÐÂÂÄò%ÈAä 4V9™L ,?æõ·^ÕÚho ²~ðú÷HŒ¬,,ÿbS1YXÿEÇ?L@kã…ÿAÕßà™„$ädèÿ‡ãú·£ÂÇ8ª¸Ù~`ûVdmŒÿKø+°°+Àƒ‘•“ ÀÈþ™õãí}âædñúJþˆõŸ²¬£=È õÑ7 ëßÝÿÇ÷OIç_ÒˆYÙÿµ6ÊŽÖÆ›ö_Š¿ÌFNööÿýø?ºþOùï]FK 6F¼æ)驎Õ8Ùc¢Z=]¬A¶Eu*ù?}+m:}RB7¹Ëô_ª‚˜ê'xÞšÝæl_w¥éö†º°-©;“€g¹„^ä´Ý?ÑÖ¨Z¿Ðïù3ë}J=Vô8Ÿ“Ù€ÒädQÛÛSTÒ-|!šhe·‡;¿§õ%wþé‹Iqg‹ìm”\û« µ ½:ïè˜*þàþŽºoxp ¿óº{—€>ë<%¯3Ô'ª_»,MÕ2hœ¶ d =2¬#ï¦#g¡Y,ˆ­Ö$ƒýê§ÊC(0ŒtUÒÁÁƒü¥¢{#õ¦.|臾åɵÒÑÏÈÔ¦ú7·Äƒè_EÚl¢&Ó˜¥Ìcíýê ^C`X,ÄLa”K\Qnà›>OÉ c!B~NŒ”ûÿlˆ*ø-`M©“™±Ó9l{þŒJÜzg‹÷6Qtl_ó]æ®?MÖËK‘x,íUÊ®bÜáûâd„,¡Ö4Vä£1h©ÝÚ*ÙðäZ–ð+µ(ùzU:é¥òwuáÃÔÄ3¾w#øqÿ¤èVÁ¥и PºÌô3ÛºP,EÐ+s«ÕKÝë{ÉPTB@xá·ï”´Ü®ƒHY]‰5J«Ÿë;2âãwhÆ,pá ‰ûv=Ë1k ß‹NÍÓsêô§ zäPZUl¾£ŒÃPÅU€xnÅ}½\ÂY°qá饑Òﱸ ƒãºÅ%9ÜóÊ ,s¸7MÜË4øôÛÎ:¢7Z¤5q[YÏk÷.Þ!,O^]@‚q³cǯŠKó*Db÷žeºÞaô|$!:Å–ä!’^-CnêRR'ñ"YdÇ€i"Øeø³xµy­¨OAª—Õ')ƒ4Fuγ"Ö¨ëÌ5e ÊËËà™£ÆwSe<‰µ " PÃÅí¿é37wX¦8Éx–€õ4üVC¾?1ÀƒÆËº”û©â'T}”d=GÒ7µÞ“+n§ûغ?E÷Œrši}»ÞFÕ {² irþB’ÔsÃe_×9ަÑôb'UÆÆ‰ú“|Ì(â”Ò*Æ—­¢HáÒÞíž-¬—lTw©ÑZV¬£æÄ¬f°­‹œì|ÔC[¹55Ú¦÷h:•ÏÅO«þ„1G$)ë%é%åuôûÎ Ð]ÇÑ+–4mÒÄZM)ŽK‚f/_2F%’ÿs=FaB_*i´Ï¤H¦£Üo"HQOwyg\’7çšZd?7Ì6übÔ¦¥–nèŠêýd“kˆK‚!a½N¢ŒH öq—fFgµÐmçiOüsžûVA‘+§¶&C8µ1œæ S9Ã$õ¶Œé‡Ñ<W:3ÖÞ7¶ãXãðéìb7˜Y2Êf)äÕ ÑƒŽš£Ää¨õaÒПñ×(t¨Ê<[p°´¿5WxdQ{™Ì_Uò׉«ºž¸ÈÙkú úU½›6ë}%‚Å¹ØØxçLM‘ßLÙöå7­Þñ› ªø£0Dæ¢{O0aü‰²ßñº‚ipuâ†&·¹µW%WjøœS²÷(T Ñ‘ixZ£á;™–s6» _yÊ{g…ìE¾(gT‚5 ¢µI_Oñ”êF0‹R5,ƒR±ÒNùžvËQh3ÛÎ;T¡ºŒ:›´°ôJf³g¢ÒmõL ¯îxÇõº¡.¥¥¥ý/Á€É/;Ñ¥´œ£-kâaÛåèeF„ú“¦(uªÈjU'ÍqsšT¾-Ÿ“ûã‡aijh£ªšRx¯¹U¢ü}¯Õ-Wç®0Á'ðèAbþ+]¤“[¤žWöŽÍã^éþ…”ÕW)¶[m£Î<ä”™DFÚ'¿DI]Ä#¤AÛ IÁ)(ï:¿ZIrûÚä߉ÛÒ Á?Òj¸÷óV­Òn½œÁ·.ôU ëGZƒÿášÖÅo=H@bNßm_f!ëR B³/œl @â–3æùD6O|%;z(µøÊo­¤¼)T¸¾ÔDÚ¾°MÆ*Öª>¦ O¶ÿõ½C¼ÂÑÐJð'«7WsFø’ýÇOÔ;QE-;ÜàUêƒ+ñ_RŽEFã·C:¿VxGV§7ÜR£TòE!Z[":ú€0¸ç|‚¨²ˆ=/9.¼«T–DK›< ª‹ŽÅÅqÂ/M‹ì5 yÆWÞ·¹”lC¹³ÙP 6`_t´NÞÅë™g kfx:Â!Èí•zëŽ~íe'¨øeb¾ñÏY\™p‹ 0¤ è“ÛšdmtãȱìÎó“¿ÓW2ÿ¦J‰º˜Ø}p¸{%ÍàÅ|"ëÕÖóŪÖî¬êCÅk÷Õ%1§O0»cwýšÊ|¹ê“ic…`ηû«ÁáÝŠcoA(=Ôë0˜®{ÛÔH[›²ÐË3ÕÞDÅé%ZïÊ~Y¬°#¶Ul0Ø›ok`Cmš}5[<-Ò¸’¨!Ñ™¾Ÿ¾OÔÄ×3«~ÄLÊ‹«††þìºäÞ¾2hlû-Ë}Ž‚Xè8ú2-¨‡!¡÷äøƒDÌ8À–ù“ɸްS‚®Ü}îÔ»*–!xÔr¾uÃ×·¨(mg¯d ãÊ‘„)ÝÖQùáôê°èá¶!™j)‹nó½~|Ò»Ûžbõ×K~-Ö % ûNx¥øü𤅯˜kOþÌÒ†9¡ØÂmFHN …¥.¸zf¤9;¸†¦|ÑH~pº7·‘áZÛ£b_pRæ§ÖLè¸Ó¹àIet mlõÚ“¯¥cqºÜÌAÖ+åÔ„er†'>-êÚo>’2v°!tZzP_ °í‹¶+î1ÏÔyWvXDD­ì‰ðcšŒ¾Öf™ADeÄç×"å|šdéGc÷º“ B×å Þú rѦeò{Öø ‘Þ‡ÒeZ›Š\Ë4ÛW­3 Ng‡ß.Z4ÓJ ø„ä`ä^SÕ«&È' Cç: G Žâ',<äb˜m–éMÖâsÎvoÒW5u’¿\¡r”ÆʅǶq޾ÍÖ¼˜ÝŽWÎç#`‹ªñq'KUZ”M¾oaèôEt~þ„B;#RP{QÛê-qäyÍWCOVœðਃ 2»†Ø7/HiÉ£'.gë(¨Ü¯.ÍÒ(BŒ!œŸé‹u‰|¿œoä‡OÚ{2[¯€Á(d`ëúÏ4UÂ)ò*¯³A¾¾ä†È·J5lÐñĸŒtƒÁºd¼ìÿíQãÐvNÓ3ŠŸÒš©ŒÌO0¼Æ¸#K¼RO7݃´ºýa,ðÚêà!+K,>Ûâ ñ«Ñ™0 ~GÞ_çÀ”:í]AƒÁH? †Èvu€Œ‹#[¸¥‹‘âÝlN݃|_G>»¼!<ÇJ!à” Z@¾G°`BØ^GÖ‹IØÓ®¹Pñ&¹|‹>9¡&aaG$¤H\܆ëÀ`+ÑÒÐe{§éeÙçaÔÓ×e¯©>²µí´;ïBóõ+âàãnÖ6‰í¨+l’øri¯åÓ÷¹ìõã7Tœ³©%uãÛfôwí‘~ѽ¦ö”L6ñÂÖÁ÷c®F¾V¼¦äïß³õóÖ úž+ ž·ëËÈš\êÞŒÁ Áo©¡ÔÒh˜%¥b·îk‡å†ì ]§MRææè_X ú„‚ ]çjôÝÑQ„óÇ‚›6]ÓtJaÝãbzQ c2{äRÅ–â—³Àº?e–×w™ ª O 5Ü o! ›“Ñq^NÑâYþÒù¯87ãe0YHbÊrJ¼¿ o‘IœB‘^ðã΂žý‚I’§—¢nSpxÎ, &BÛ|üidvUxr‡¥ñ¿x@§D‹ÍoPæD—8JÛÉ-Üweë%dÕR0èRFwÈ$x)-¢DœmŸðàïãœKø¼zM²=2“ZˆM5vI‚_곌`—å&TgÁ<:7ïFãö/#Òêe¦Xü¯é6áÂ¥‰è¦»Iœaú%å«7LçQ¾0£i†ÊŒÎz>å0QMsÊ!Ñr»ë*ñz¾–«w пeìúŽ—õô @š_å>md»J·ˆê=~ßß52n· ¨MO¦±¬t\©/F”kyÇ…ÌU|› È'ïU½°@$¸•Ñ…=*²G¤¤oï?ƒ­Q· Ê$çе5˜yÕ}!=Æß!í–žêcÐĵo|ÍSæ> Ggøt“:”#LŠ`kíÙòp¹B*sãZ"åÉ¿®ÙˆqZ0½pXäkÂm+cÒþê.HŒ ÃOú™E^ÀÐÊnÁ§ãÛ¾û¸}ïHü¯äD„k€µ>1Ô@™hBKiÿt“1ZR>ŠhÁØXÃìgvÄ<œZ¹9úwáV=6#?œfUVx¤ wpÆr½Ûì.· Æn³!¨ø‘ß°;Z‘ ³¥%p@ä’ HW•ÁÁ_é¢.ÂÁ;‰{à›§`!åÓKŒÚ^j=ª„Q-»ˆÞƒúg±ÎyX óBÆ–ìi˜uÊÖ¬¸DG Ú+dÆônúصËÍ\»X {¶KCùw£np*:;á^æ›4­1¼Ð9˜¸?ôøø¸T^©51¹ï+Cá¯öáÃSv°Ä]nØÏÇ% øñøþ‹ðêÖ¿&xYéC¶^³Áv9£óœ9‚ßoŠ»ÚÉ}=‰ @m¶íäð´–%ëåL½´bon[&AÂéK ø¤$/84]Îå<¡zª„ÚŸ§–qúˆ,9ÿõpç©„•JÑW¨wÃ%óÁǦ¶aö$ûŸ½dI¶»øÝ¬j %–±0ƒØÐ?æÑÖæ¦–÷¾¹EÓÂ!¥÷’¡2§¬Ñ“ áýDêÁa Syó–þÓ¾66ÅÃC`ÇU-GLõËz­NuÁf¸äSÅk7.û0«väy®ª”ïï—·^¾ëZÁÎÓ¼-=°MF³ü¬œP¬€ù¸{‘½\‹müö“ÅýÆh4Å­ÆY¦×ïÒ{?v§Ô’Ò~uÕS“¯5B|1uK–ë°C,5_ÄÑ( J²y­3¾Rp¥D¨0Cµ6¤@ ä¤Éê6nÄÁ®Ý;v.y\ ¿×µêÿŽ‹ÐCG×ìp­ÒœÈ¹"Ôçu'H•èãÏOƒS®5DuPŠè5ù<ÿå«,>Ù¶ìÖí%¯ Ö–º/…„7ܽҿ)Áþ]·< IÉU÷®!k8‚¶³Ä¬Ì†‰£Ä»–gUP}ïné4*bûŠçž˜¨ÖÖêZùV“ÂÍ^ÁßÄz õß"WFuɇ–º&¤ïÉ*!·Ï,£z¡ ¸P5F°Qú®×:„Ç—º‹eÛCúKgÌŽ•è¼ðùu–…£iòû#ÄhÒߊ`{|á8äKTK™C¯+—r$t‰ÕÑ~áêáæAêñJñ”Ê0-sŽvé\uB°EY¹Ê¥Ž(úÁ;ŽC…„RÛŠçéK–½_†SÌ{ƒÝ—“rÂgK»¾çqÝ¡¬–™‘ûQèôzE' ZÄ6ÂT‘ÉÅÑ7žM*àme"P~CÌã÷50 BìwºY¿¡3@vb¾e^X ŸõÈT«+óôcŽíôXõŽÍ¯³6¼+Ý …êð›Tƒý ì…÷#}t›oƒ+Ÿ÷ƲٗÁD¸µÜbCrV¬À½ØÝt~ÙD>¢VÊ ~éylœ#óç…!B,fO®‹*{»TzíSm+ Ô3 ‹Û‘yƒË*åà5eQ4~ Þäi…ŠÍoe çã=›ŸFЖ‰à.ýÑß' w–0ªëˆ/˜¨ÞûQd‹h¨¯ÏÁà„ªyv„ÐÅí›r:׎g¸TdŽ—AŸ~!]/ØX´1}Fì*•++{¦”øÝ„ÙŽcYTWnFb“¯ÌijÕØÓ>wDg„I·ƒåÉmfÊwn¦ûÇÅ2o¡4××êXBªNvq±seìP¡”/9f‰If°æm¿åêß!ËÍ–X9¾Øäµ)†îwúéàaAzà ºì:k´{³Üê5f¦@"•’6PBub²7»bö|Õ²ÜûžwY~êÖœ¯ƒµ¡²&pŒ¯¢H,_ŒbPö^õ…> ðŠ%')Sq4G*à.âWßK’°2ŸG”²Fº¶U 2^ý5ÕAœ¦r°*ÚµR—&•™ÒVgÍ]…êA ®…šäd”?ÙjOvÛHSDšÀ?ÝhxüqVáZ¤•g)9R¿ù8}a¬£xÅØ"à†môî úúz®çk¬rÚé(ö¨ˆSÝN¨çd'1MŸ ;‡´s ¹5lÏKXé~#ÉÃ+‚â7ð”ËJ5¡Í*ÌYÀ'‰¢#¡Œö¾Õ\2šõxÉçKµå×j˜ý<÷p6¼ÍŒ'ÓpÁ œB‘e0+Ûçcñ›²عÎLœÝVRVíÊh+`Ff¤Æn9¯âWF3{(¤¾û«õ›¦˜ËŠM!a7ŠÂ©—¸×ÿÊd»NÝ¿@ºQÙ3Üúm¥—?˜DWÔ 1“GR9§ØÑÖÒµÚ”¢ ™rrÆÒàCE…—Î…)ýí¬úýÚÝûeÆñ ‡ªÈÆHÖ»ürþ0Æ›ë‚/Ê"µl‡s;àÜ`µ{ü{H-Àvµ)ãäxš„Ðäþw#Wo©•Ø>ùs©ÀŽÞlþJ½"R):M›Ë¢®t*j­ë»«·~Ný/…XÁýjdO»2sìTÅb×9­uh™ŒF¹¬°NÌ€R»×["áœÌ#›ê<ÙåJ««³z¥­¡ôàZz©Åîx˜€äNõ£–dŽtüÛ£Á©  {1)ÇÊ7d¾Jz9ƒÍ뜹Æôe=3J^ɧ˜Ç¡Ž_[ßh5ég ú²¬8 Ý^äVedÑV(õ£n‚pYF2øH®¹Zг0j6sÏ(jAx¶8³Ä&àuç¼x­Ë0¢tJDX¨CrÝûßAl7Ž¦Ú¨^"‚·UO´€6žÉëý²ÒÚÎ]¶¸¦N°~}ˆžG-…PÊá´ Ñþêy©úE&–³•“Aø2Þèë^JÖ&>n¨¥MM’×=ÉPžë/ðŠŠ3-ÄÖÔ^—OÎC3ÔQa;+Ÿ,áÆç L"B*¾ºœf H:Õ$›¡Ž,Á'˜ÝΓ6í*®©toôî ¢?ø“LúrC¡È.Iâ¼Ùë—T¶ÜË_ð/yyËB¿5Âp2sÅ/+v 5Kà(á­ÒJσü2%óÙFiíI®‰×äÑ9” ö{1 ä·[C@·–SqÍMgšž–¨.÷W]4iÀW+†„eˆ˜‹Å?s‘  áûœtØ\‡D³?.wƒr•ß½ØË7SØD”÷ ®1¤*÷o§bìøËÈpÔËY"™Ôß[•lÌÙJÌÑzé¶Ê5«}#ÕUàãH ÕìÀ[ä*ýö¶ Ý:øK_N{o˜…ÀËC!$»p§6€7ƒ¹“Úãã䇸TP£:°Jk_†-·`ƒh×ÈójFÛÆË/ ô©É1ã\G^¿ÅSR®/‘ªáâªØxßéá)˜ÚË™;Jeå½ô¸6b+"5t.18¥Ñ'Ál:6:ÒáJts~FšÛÏnîØ‹î0ˆ‚¨ÓìZ¿Œ8Gã¬jë`9ýÚèó¹® MÛˆþÀB7õ>.¿+†ê±ÛFGo—oL_'&>5ªÐ§ù–—¿j á$ƒUv–iMC€t(ÂöKß&СTX) øªç¬”«¥6E &ŠÍ\‘oÝ!mêêXþ?vT}tw±ØÒ ¾îÈ8õÊ ¾›þ#ÃÆù¿d£Ç©³â‰ç•Î>l±ª65º ?`wœcS‡%‹òx¶&>¦´l¥£ÔÑSq™Ç„È`y÷¡wÙ7Uù£ð:É߉*|¼JžÁcìÙ‡n¤'î¬æÂïîÚ×!djfÅ—{‹-S1Ñ­ÔñD6Ý`n6š‡Ù¯1E”xY¨e¶¡N/nöä…Ϋ€Œ=Ál-Å‹Çv©Nw9v}PVªù«½ž·a®´¾À…û¬:t¼5"Gu¨Š°W2%Ôn=eÅK…¬°!Ñ6:: ŒüìåœÀ&”ÊeD€Ú@R¥lÓ¬©ç]ÊpðËúq2ZQD¨× õÍ’ê¤ÂÁ1Ÿ0m7¡Ôq~Y+ÚP†âKé•eFM“ê‰.A8„ŠrM%ºÛ­ÿFh°fvØvZtpˆ ˆ¢F0Ñaß2ï÷Œî»-FX¥µJ`ŸŸDy*Uþæœ'm˜H3I¤€i³íŒk¤ìÅtže}º lBÕqúñ9­Lì.Õ%37‚ãO%Z ²òK¦ý·p‡`X¶8³á‚a ¯è/^+æb  Q°È<ä0¿4se5lH-“ÎPlžv’v~õÒóÓ®xÐN?»…±m2œe<¾d8t¿1d{­Û¯³·}V©ýöH5{äå¥HL%ª<Ìè78Éek·è÷üd;LjE&_X4™‰ýó  §LÕ¸žWARL‰ÁÉE÷A§G±I’¤d^Uš¹©,]Ïà>ÃYí5íE³ŸƒÕ¡¤¤‚” ’ÈZÐëÎM++Ç"z’Á²fˆKËä ^ÈG4y+ …ÇHPÆD ‹˜›i‚ ÔÕPìø¹Û°T˜Ïµù8N–™ûòrs;|O\”ôà ƒÁÌeôSÖð0„5 fEÚõ † äï È-›·OröލùÞ‘¡Ù+M/ÒYeB» 8µoÌ®–¢ÙçȉjÒà_é{u¾>µ¿lŽ^¯j»OÆÖ¿?“_M’–}m,± [©ïµuÄŒª¸‚ìLAÏ¢[ ÍCŒ¬Õ;4¦qàñ'Hr:ðøLù”C¼£ ¸ž]-? ŽòœxcX¢ÃHÚ6]–?¸ÿIß/ŸéñSîÖÅ`Wa@c"J‚CéeYRâ–Õ-«ç’ä †÷¹/z1$O§}alqºqÿ´xg¾E߈å]¯Q¸öƶ%N…t"Óó¢¶ø¸zkürV¾ðL<…R°øtÓXì’e2àE¡•>»O*ƒˆÕ®IЃ·2r¦KǼ27j7m1yR Ò9.ŽÑö^ìÅáºÎ£¤ZZvß–(ß5´'÷©5.¥s§P¾U‚0¦×Ô6|ÍcÛŒ`²ÔfHw´f¿~IÄó†M›=OÀlWšË‡z¶›R/n`£Ï&*úÊͼ1Âûø]S‰ƒßzÞõäÉ.ÁJÖu©^íx ®%y¨×ëçì›?½ø £ö¶ÒŸœÝß·­õò)`¥Î£#«æ5£KóJ gŠñP U°A(PÇ© Òû¢ àÃ:?¦± V·Gè`za ncy‚ÝÇI„üùŽº>µÂüÙò+’¹¹ÃÙ~næ3Q¬Ë¢d°ÄAãC5åe_WèÞÔÑõƒ‚;‡Ÿtñ¦Ÿ|– jlN>I‰À£ÿ9æãfy»À€ÐY“çžÙÙ‡5¦eá¯=ž¸Æƒú¢¢õRuÛB Il6T{MÌöz¸/ìgx3¶"W¡jÛÔ¿€¾¬±Ò±“XûL{öÄcæŸÍXå™ ‹¤gƒRx±Åk_€I¯À±m’5Ë~öo¾W”6 ßîƒUÀ˜âÿ!y£Î4~á±n&̾¹ûã©ÏõžE‰ìMµåÙâQÛVšócój¾'9zoóŠ´go®µ-#RZÌ@ßâNÂbënuz÷³•ðŽ„ko(rWF;â ¤elBZ²9—RýúUM:ÓÿÞEeò.šÜîY7Ù 5r )ƒÔxyKiÞˆ¤îpÕF¾üçйnW1-cûÆSÐæG¥F[(i\¾×ÓÉgK¢(ºÁ@G÷0ª³.eõMj Å@D¤ÜŠ÷–Tí9R3·ijRE:Fx¤¼”(S=éÚTP=¬¿ÿû/Þ/*L½V}1ã³Ò¸.*lþïJ—Jѯ9F{µ—H÷ªvc»ôb`¿ŸÈ ´«}¶Fá;0‚¡ã—v)sîåxåe‡â[ùSlj<Âh2ÊSf! ¸JÙ4¯`˜ñ+ßÅ=¡œ i›j{á|çƒy“nw7¶@ VBnH 'zÃm´ù±»¤½Dm^d«¢è9Ã:äÏ㬂lüüžTOêí$Ó{ ­A¸W_”g%:3xyD,åï2d&•aæŸùЦ*´ ¹U4Ÿ2­/i¡)¹œ«9 u>¿A»Œ?)tÍþ+'6—è–Ô€ê»D,©=,[x*UÎNDþRDT»ºßó 9cÌ‹¿· )^ä,;D¸"zWÇ BMùÌÙìÏí}¥ºì Xq¬²Q ØÁw: x— ®gQòä£d=yw±|D`§qýÃü߯ðå*‹'B–\o ªVÙcW×gȱb@ÙÔî¼rc 8“÷F*!„/|FÓŸ¦ÖÓYôËj§ˆ¨¢Î²Pbg³Ô‡{7w¬d¥uࢇĠ¶ceºÐž“^3leeù®)Ÿ,Käx˜ý'%)q‹t•üwÿ<<;&FzñòJ(i4>#ºe0,íAN)žƒÖ*É•þ˜‹_-’n.öjмh¯Çå¾jmgŸsÆw©ÝÕ}~ú¬û8YàÎaŸ¦Ðÿ;*(–~'ñP§oÓ½tß<°„ìO^+/õá‹ß« 6¿x÷â¶`g»†Zã·ó!ÿ¬)oü/©kXšÏÜI¨·.N’¸*® 6=™õ!… ɹ¨_Èò¾‡EÃêÃ!ùÛ1p=à~ߪééï(^_¤ÂŸ£~PÕ†Ä-Ï››Ö¹“žÑihJ`Êë4¬$¨T¬°ºJúª‘°«Oõ!¢à]Áò¯MX6)Ä„¦fºÏ!ö>Ger{·ãå9ùNGêßV½Á/e‚»qëøAF³ØŒ%‡„‘ÉO+”Dêt°ÐSÖ ^YgSÊê iù’õh½_l66Bƒ hmÂW÷سޫ$A? ¦™´j>U²³öî˜öô‰wyT9+Þ ƒa6íS“£,ûh°ž°OQÌ| ´NHÖl—¦û&Z¼&>[®Øêxp¸öÂ#­Ø³F'%ù ¾‹/)P~6çµsî®/u'}L¾}C[¤Ó^£›»`?ìB‚á&\(íÐ Š:ºŸÑ[«X)6ÔjÛä£3«å4€(ãóll~G0üF€]Ÿq«mÇ8¯5,Œ”­ÇcÞÎ÷ÓA´’Ã’^f~iúˆÕ`¡ ­Sq>| ëísßÞ¨£X¹d½Ê¬³ó¼q zòyÁúˆu½r.KlrIócé¼(f±ŒP…¯˜„,im5¨-B™pJVx·–õ՘휶¶í-æh« ³Æâ!]™³Ê/\Ãv 3 ù0%àUÍ:¡MžãÞ˜U²ùD‡z¡µÂÜÍRȤOÔ#rKøëõ9¿X…‘w‚ulÑ¥ü78/¿†Ãšâ›«a¤½…72%·íój–&_è²É•"+‹Çkþy]À »é1ÂIŸB‰x^Ýõ·ü””Ác·Îª¸;G á›´Fßþ‹×SØð\FÜå1¿_UY ¢þ``ÉÁ½µm½?}¡Yræj1<&Ñà¤Ïw‘¶–üêM!ˆÇãdÃê#@,Ëéåâ`éR6âÞÀ†O'êG³ ._DàÆ§ýøàøx˜øž…dm^A›Ý—PkÕ†ë& »´0뺦X;¹1°œ^` ìd'ü•ë¯Ëug{R7œ²º,´4óÌ@à ^rQß¿‰G½Y`)jÜ—3µ`ŒÚh#à*#;U>¿½K Kì‚rÕHƒå!¢º+ÚAp …¸Ê•cÃËÄ£`BWûâ;·E<ùÁ¿2Ömõø¯Ç9à»oä“q*!¢ ˆ?½‹#¯úÑqœ=í–¼1¼§Z”hiá¸9Ò8ŒÞs2á˜1“"¹ 8Ÿ¿¶ÕáP;5-Éšé$ Ø™d/¿òtÆÏ½5¿2NJÊ ŽéÒû½Yò=ø$³1'Ó7üôát½ô€H©\œ\ÄΘUx7ÙÁ ÄÂÀ\bÇaá±.΋ Ïð”ïNhAä¸TËÄË× ç—p²É`u½†½¶öÚbó#æŸÜäæ3›L~A¯=rY^_¦… øý2*烠q¬¼(É}.¯“¶qZ:O›¡R'‘1ï'Œaø÷Qœ¯âyª:qzºÍ–ßwÇñUĶÒÝ0¦’–ÊÅ…æóhªÈC¼îâ+X\—û„—F«Ð/de6:3‘#ä³E%G¾fjJý”Ð+Lº%Ç. £*¨7®a„÷QÀtxµ¤@:V„ˆÙ¹sTë3½¤Ð<á—ÖQs'ñ@ùÕ¤gìäìõï&Yù ØXçŽÀ!ÿØÖd³¾”Þ¤+Ñ KÉkAÍ8U¾]Üù™’³úSb‡ÔûÓlî†'œC|“ˆÖ!ÒÛ1ƒ8M$Q¸…n‰™sY‹2­¢T}Ôth‚TaŸ#`0‹™5ê‰ÜþÓr£®,‘æ\~ƒjµ„h€I¤mãè~êôúb7çÓH×®ÔèŸCjUª~úT]¹'HÛû ‚ÖA£“÷ÚÊ'45Õp%¸†@þ÷O,o¢‘d‘»(Ù¤+rgÀyI_ü‚}FÅešôóȈ{AL°k'=ù1æI\Ü%ÒèÏä ²}×*úMâþ-v'k!=t&¿)A2tüšI?‹fZ3D]°ðíMJ01cÈ| ”y¶ó ~•æ¾%ö¸·ût-¡ƒ ¹Qœƒ/Î^½ú¿…¾õ2x`‰1Í’¸ ìèhž’,–(AèsôíXlþjfQ?ƘUå÷û.rãÛÅLGéwY=ß{2×ý-ÚòŽz㈎ ©ó›‚tÕ)4X°9¥o 5ƒÒ³ÑDäp­u$†Œ\^ëRP‡[~«B£Ý‘Ú­û0Íoµ­8þë¼ ™â9)w’*± ŽÀƒz d³YxÇø…4ä¢[DíàˆXú¥.Iej€!ÑW?|tž§£5T˜¬ÌønyOQðJÕù-ZÀÛ n꺗PöB­@L‘Õ2ÚägI_<"PZ1EO‹ïMŽ–"ï“»åÌ9%ŸÙ>|ÿ:å:ë¨Rä-3iYe÷Ö8ƒ¹%ÕaYfi=b,eÅróz ÿ­÷6fÜcu<¥†Ù^‚«ÁRT7sŸ²6+j‚¶ð÷­„©—óƧ ~`öÁ3'MÀÖÖ7.â¬3ê<@¬7¿œÖÙÕ`ÛXx¯ DªÎ³c¶ñu:hOGg„O‹ ¥' Çšp¡!4¢þTû¬¡ïíOû±‹á•è ÊeÚ²pžÐÛbäî\e@&“ȪÑåúEëNü䱈N‡Yçd…³ñ‰ì ¶Päp>FЇóMjv5Ϥ~êõêÕV˜Ùæ²êRD‘;™/®jîú£%þ¥J-Sz¶ ÁBñ:«M$׿l¬Öëâ¯ÒPkBÁ•í’ ¿{°Õdÿ»e×~ý3ŒVÊ^4¬ßeõ~𫬶˜åjè51±|?Ö¨ä7¬Þ(¿)mkxÈtº¡‘uÉ~j¥î…35&s!^0*X9ap?–çÖü,/U™Oª¯%*8®¹D¤ØA¡h…3¤fä¿*”³èl¢îq‚U'W‰z»²"ªö#.<1^ °>=mìÏA…”¿œ#ù°ñÑÌØòíŽ;üö’ø-7N|^ à8?÷F.jy¼ÅCãu€×4Pï¢þªá¶ì9×CÙJ…Ûm:G"ѽ£SÞÒ–Î*ýÖ('ûáStFÜ)åƒfpµ^·ïzØíwX禴{ú5°G…¾á_úM‚Wõó_¡o]VIB–`aù¡äÌ`“Հ,hI»ÛÈ9Ø›‚ÂÚ<„Ñ Á®z§¨)NÙŨb2¤GnÛ¤f+{ŠX§?w8˜—Bã´iò¶½6º>¹íç=¦Òt€ÇŒ ‘®°ðIXû½ýòÜÀ endstream endobj 474 0 obj << /Type /FontDescriptor /FontName /PAGOPL+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/D/E/F/I/L/N/O/P/T/X/a/b/c/colon/comma/d/e/emdash/endash/equal/exclam/f/fi/five/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/q/question/r/s/t/three/u/v/w/x/y/z) /FontFile 473 0 R >> endobj 475 0 obj << /Length1 1642 /Length2 8833 /Length3 0 /Length 9676 /Filter /FlateDecode >> stream xÚ­ueX\m²-îšB°4î\‚»;§h¤»¡ îÁ‚{€àîœàAƒK‚;Á!rÉ÷Ý™9ÏÜ{þœ3?ºŸýÖªZUõ®Úµh4u8¤€P+<‚ààá䨃¬\áÚP'u¨°*‡VBX:1~% …ÈZ"@" ²ðòx„……q2P˜§ ØÖ`ÖÓ6`accÿ—å ÀÊóÈc$l 0>>¸¡0'ñHñ?Ô;ÀìÈhh)©+˜Ôõ Èå± MW+G°5@l ‚ÀA,¨ ÀñïÀ ‚ÿ´ç|ä’‚,pÈüò°Áþ@ìÈÅ ‡?>Àp€­‹%ñx( ±vtþ)àÑný« ˜ ôÑÃé{$Ó„Âpk0 x̪)+ÿw;KÄŸÜpð# €Úqsÿ¦k¶v€üQ‚ÿoþ{šýU>—²ªŽ®>Û³iÿrÖ|œ„®' ø¿™ Ô ÀþPIKC=^¼¥pðñ¾ „^ùü²þÅÃ󯳚%ÂìxÃÍÉÍÍxüÿÇï_'Ó£‘ƒXCFHa >NÝ? `kW—G±ÿZÿãü×üƒ@ kœ…Y¨µh°}jF¢úyvÿˆì›î.ÔþXQn~®%´Ó/õݪp™ÅmUgý˜È}³çÌ>ìnS™uk°‹Ô‘©3t”CéCÇò9—x‰±Um+ˬ?í‡A”×ñ´ê š±·þÖÚˆ–¶Yá-ÕX+Ÿ Öñ/:·\úK¯uJm̳6¢z¤'Õyû?v]2õ~èïëú[û¥ËæÆ©K•^kÁ«2Ž&+E˜¿6o (5`"ŽÖ‹>4 ¿Û.îA@ÝuŽA!ÙQÅ×ñ)uÎ/ʯl@" ×§-ÄÛf·úgÍëÉÓ úA½dÅnñõhùËà×t—bDX/Å6~´}Ú©¯©{ÞXKl“ªËèzE¾éý‡ÿ;,œq:ñN¿Æº±gçEž¨.k–Þ÷`‡ÔÑ ÅfÒ805CöÛ£­º3]~Èû53ù?«­z–ˆ¯À³à8ÞØ¹ÔÞñ¥Ìd$âz˜Ï¥ê… ==×§ˆw}ë â,n~ˆÌpñ[ciÿÞ4®Y¼~—M]0™ M¿eœµðΰmÆŒ`Ö͘à7÷J;ñJl#x£)µÓŽVbMµƒ÷§›- YBTVB³×¿‹[Ç‹øAïT×… êCÕµŠ'÷çó’{éë§ÈZ"Ê?,“Yóy§v¥Çusa9z-ÚÊ·ay|Àä1Ò9Êé÷0pz! }Ö…#²‡aü:.éÏsGaY¿[C®«R½U6†x ¼Œ-ñ\×Iº +½“ñÈŒq°ïn¸³ç2Évó Žg¼Äùrªö–Ì+ÌnyM§3…š™|?T…"j+hMWè$‚çw‡áBŽÃ `¸¯}5ùJ‡ó^GüÚ¾÷—@rQ”[Ó~›?üàH¡C–¦ÄÌ!PéDðÚTÅ#Üέ;íÁ iÖ­CÂO »ßrwd^­{z5°ÔG #Üx5B·DíѹîÿNU_Ð1;F×ÄÒ=Ö>0«ù*c›sº+;²öügØŸ$sK…kO.ýl‰u‡X‚r–ýAæÓ=ËŠ3•Åh‡Ý¡~Æ«q‘;Т‡°‹œ“pD±²T–”ßl’?{‰Ò)ZŠ]¶ù¹Õê0× )@o¢•ýd©Äo®G›,>JQWËc¤Ü‚úÇŽú[*…¡¬~×RW¹¡z°K>Ó±IB$%Ž¡ÐU ›"ò«„ÇoµxXf, cª€ÏS¥””¦LB4»µ²áké“ÖNui©^²¥'ÖgÚ5ö¬~QJ{Áïœ,ÙÕð£:‰>bA/¬x=¦‚(tM«uã«!<[²l¶¨pÒ†xöE>…˜ÈƬœ)åúV®¶Ø¾Æ.„ñ.w®T­Õu,GÉ?\bˆøv9H?t••¨J€žŽÈ}:Ž;èy-¨ö Îë“{E‚lB“µÄ’ª$=&a Ž½Î¾ûå2Í_”ºNÃ6L¬#7ÍwH÷«º¹HJå#ôó‰òQ¯GÓÕB•âÛìŠhv矃á^׿Uœ9ÇrÈš"c{­Çç°Øð$3ãEÓTu&ïÈÔSü•Ï= ³™p÷.ê©Ðõ¶ëÀkìêa mßp9àXlMˆv÷“ì*Ü£¢ŽÖ  ¸¹œ¼©7Lü×E˜»‹Ar—¦ŸIÁLã-tånb*OõgUh†tîF%B±ÛFÍw”ûæáKRÖ°\=õ‰øß˜a|¿#ŸÈŽÀ@Xr2‡ÔÕü½ì^ØÇu5÷Nd¤ZuÔïì‡Å‰hÁÖõG]µÉ£P°„~Ëo4“׿MšÍÔž£Ú†ÍGò½Mžm|K¬d›‚Q ?”bÅÂÊpºøÅœe µî’kÌÑžVJÌ^$Ú)€+1øOßÝ^ÍÐhhµ^ÈvÇrÅã® ”És ¥]ù?~qLÕ*žÓatº¯9Q †ë]T\:^.6¼RÀY±7Á¤ã¹§ªGÝà‰Woo[r¾iÇ#?gk¨'® Ö§Qù¥ìQ ãi!¬ÛFÚ“»(‰õÛ}×aÉÝ«šH™úÎÕ)Ž?ôch«óO«@ÿëòÎí<®Ssã4®3ü¤‘‚ ¡‚±Ó`oVGàóÊÏDs%Ö¦½x`xá¬t¦M~6¿µ{Õlfe5™¦r¢Õð‡"θ*&#W‰ä<¦Æ.«‡Ñ¢ŠN,H1ÿuúj¥4®¡Øº=ž[>C-ËÖFˆh`ÊÏdê¤îx•ºæLKñäy{Šú€fÎ!¤è1¾#çÏPöh£Ž™w[U¶¢Ïî…SÝmvÈOôô>Êé4JîE?W`Rãçµ u1wÉÃ^Ȉ×fÉÌ¿·“TÅœ]¬²S<*Ÿl´!Â\µ¤°³ÃúVcò¿_Z<‘‹{ûîX.}m[-%* Ãqùù!½iàÙùÛ«º| b¸› ÿ ÊÍO"jòí¦afÇ̶P¼gL¡´K(âïM®ÅkÑ¿ÙÀ)WçE¸Íû”.æ²U–u4©9gŠ©âŠ/µw¯W¿`‹`N;ð D¢žÔØËkó Ø÷Z¨©>s9PÜÞHžÜLïØC›YKƒ%ÉÅ>M¸+§Kðß…è<Œ{ã{X•ÕwPfEŒÓ>eÜÂ-ô"%ö¡¸ ñ5ËL˜Õû¢”Ý0ãÖBLÄANJ%Ž5±0 )I´ÃI…o¦P$‘r8éyš¶­µS þéƒßm«àcW`Il} þîΘ«Í䫊Ë7ë~£BNæC°¦]ñpù›˜ÖÆÒ,úàd¼µ"ÓP"åS8öŒûTCÞ€ÎòÕQ±¿¹K‚q¨ÞN}‰Ï3ˆ6ܳ|¾(!:s@SÌ3}×4Á5‘ñQÛIh^Ë·Sù&ˆ®Žñù½÷^¿èê„ù“]-.—äågøŒˆsmEæÛ2#š!áÙ¬aµw›¦,Ø4ob°CRïÉ…!œÄƲÚZg-½UáèŒOß±éÐåCκU äß…K­FI´ äcéÍfj2£¦¾x ·—ÿ¶½Od}ÓTRi?÷N¬M•(äkh\ü<¶Èµ ù{ÍXôG›p®ðÅW¹qeÞ„L¤AG4æuYã‚ s¢EE< U!§Åœ‡ÔØ7hJ®5ÞsuÚíQš™'¤/L“PK¨GûB÷B‹ä•è¹»h]SsyWúÙjzÏΧô4÷©qñbòï!ï/H^½UªÎôIvâ:ð"„‘Å@ü?›Ã‰i˸ý½Ú*·HüYëÝÔÂl‚“«*ާνGþDµQ=íL‚ùÑÉU (’íÐ ¹°˜¨ÿ´ã_¸“¾»r6b’J@IJMbö€Å¿”˜íé½öБûnE>†TZA®éÄØ|à'šIèŠ_¸À~SÌŸ ½ê ßa7²DÉñv¾GÙ¾v =då'qsc¬Ôx I}•‹¬àÍÂjT(2£@S”] ,ÓÂK!~Ž<²'t5"Õú)vá©ÓŸì2ô…d4KŸ3bϽgêxðc ¹£›Šû^Ïœ×ÓÑ+«ÇI•nŽ7e,:x}l03bÄ¥FL|í£ô‘•Ô[‡Æ“™˜”U ƒÃ}#tcQßʾáá˃ݓæ¤[´·ËŸ¦¤z/©Îœ‘tÞsóË•ZL£Õ‘ù<Ñ•„ófÍRfçqâÂâ+ð-‘RE}Èí°NQãßfÏ/u`}@ä|¾›°‚†ÉfúEB½ý;!ùJÐ}ã8ö=a*ëù‡Àp–¸d´^¥oýÕç›Y6ý¢,-ESÏìGOäê¼*±Läñê¤"˜~d!ÉzãmzžÛïô¿%_Û{‹ûYCºú§jHn4îEe\‹e0÷–GunFµ97ÿË1€ÎCèèœH=Xµõ-»S»X›Š/¥¾¢æxÛ…&ŽåŠâ¯r[LìàaÁ*:É(S v ü¸ÿF­©ät$ÚþDÜÁç² ^‰+œªk§=äk&Jq:¼¿T/ #Ï'JÁ:Ò†<3Ù¿½]Q]ÐŒ£MþÒìju×90×A6מèûí@ÿrÞ{ Ô1> û$ü}Æ£õl¦zº—å—…•æˆùê݇.qu<¯ È³6>¬ajþÖƒ¥Eˆ_uÜU]ymA½ØU@ËT þÒüOK޼(b\Bpóë¶%&[ÝDÍ~ÿZ9O{<Õ!(H<¡Q°ü“jQðØdÇž é³¾/Äa~…Ÿ–i±hÍô§¹g½:ãµ¾ÿ]4ÿìŠE¼•«hŸVËò|^nRöeÍÔ1¦ ‘7JϹžg,¿¯(UISTîÃNª1(ïàǧ §{I€\„ÇJäõEëºn¸¶Ÿ“5Koé‹Ô>˜ƒÐÛch¸aÓÐÐáÅØYi®el|Ôò½pª+éJÝ"¥# éö+zÀ´XÚßøÄDøYTóK3–¢ðTD‰ûf ¼kïeM·¯ðªkÓÖF*³‹ëšèÆí‰‹ø8ù7IºþŒä`$ÅUËWÇm¯7ËMîÕæ¬Æi=_Ç 5~_ÂzT¦ñA¹.¡Ë˨0âðyJ’›@ÛY 1Á®NÐŽ?îr Tur?Mñ×¾0È‹¸4Æš]ñþôýh¨kRExÊ"W\ñCÎ{]-'md,ÈA¹­‘¿ö‡ƒJª‰˜Ò*Íüjt«@^->)ä‘»'†Ý{7Zh/ŠQ±ívéõT¶šx•&–žDÞ'ðáJÎ}ÕÜöç}C›ðò/!­nš&Êq#½ëªšv0 Ã7j§{E˜`ßÉ\8”Rþê´àí=nûpxm{" }2ÆŽÚ £ËÒN‰Eƒb¹¯`–™bÍ l³ïâˆ+?ÛñF£Z4ÝŸùi %.6ÛŠ£‘êð\rë³uëÔ¥W7µjC&µu ü¨¡j º%ÑRCÄtD^±;ÒúûãbÃøµúj¹qcC]ç»ä­~S!iÙ-ùBq£ª¤Ð—ªÍ²PoŽ/‹Å_¿X· [µ9Õ6ÙMÉ^#-eµÎŘ¯0ïâð¯³Bq÷qƒ.NÛBª5âû†«¸féªîT©µ,‰7ó¾^Z%ß\ˆ†|½],4#?Äܶõçï½sp”³Ð(äè&ôÜY<Èѵ2eq‰k•w?„Ýtgk0k½`3éßC],»ÊI/þ‘5CÅJ‹2ǽû[áüá(ßZS†ÑÚ»f_<8À$MÙl~]ȸ™ÜìÀk KBõÖÁþíµË4šDÖCgË»+Yf00§¡\FLÌ¡~ËÜ-/€ÔvYÀ©.OáMFÉÞ& ÿÒh2n;Î1žak3Ú‘ÔÝiíš­k:Ùv%®‹ÉÞÔŸ ¢Åè\ÎA(_T1†C©³ƒvõ‘ü¸‡>~:~0øÕäh…3ãÍÇâÖ{ø±³€˜Ü â®w2÷ðÒáÞú•áoýî²7ÚOÈÇñ›A¹ ‡Ùôhü¼·Fs›ß!W©C ¹ê×ÄyÃT‡+Y!챑^Úã8!_„Š‘5ý×)²•—ç¢î•¿1b:eÄJ fцÆ=Pf»44âÖÓDOðºòN»g³TŒ†t(&ÏÁ•ÒºÑyÙ¶\KñÓ“'|Ï2ÏàC¯_÷…ö+  Í½È…y¼õFf6Ú©  DŸö#„©ìÕ—P;~ôïÞ-;WX1©ã•Ë+\å»›ó^Ã<õT}£JLô¹JdÅ«KÈ­ÜÍÄá‘&ûÓh½íMÛÓ/? &ŒýÚ+è)£)G'=pÏ\ªË=g7Õ®1O¦aOêæÕ¡>»q2rxYS$V]×÷YK(8:Ú\ë³ÂÙpâmIO„í'utéõi×1ùm|Í·Û>³¼± ”7óÏÆ)šç6K\âÑO›—ø>¨ÊNø$Þ #³&“ºßð¬Lnõ†Q'aS§ñÝ-­#ª³ÐˆäʉT'A}çÓd]d¹-å”DÊYØ‹“±nÊýAáe¢Ûcë\×oÍfÃL¬ÕÒÇ.ßù/’‹Zr´ö±ˆ\ÚþæTb½í¸Ü[y]˜ì5‰'øòT1ß6¸#ce¢4ò–‚-¥Î›‰·½Mæß±•žw:N’³þ†5’StŸH(¼ðå‘kiÛÞ™–ï—qŸ†:º*U”|‰ÿ!‘+žB¥HtLêZäóï†æár~¦–—z(ÁO­âfÜòåN¸©ñï1bGœR=‘ 1B†ƒk£jbn/¢‰ágz¶O/QÍúã'¹_}¦}ǃsÙØž­?·Šä™]=M`€’y  ¿Î½‰G¨šÁŒçZÂÔúˆñÅVž"º|*Ióèp·Ó°^qÑÌÜŠ¸xæ H¼ü½už/ÿ©LÒm1?§!Ñ/×ñÚÅ`þ} SÂ?9Ÿ—ìÜÍ…º Üü Я}úREñÅuêop™iO6›…$©€@‚äê+I·!»:*oÌcmpCPzä.ê'æÔeh%ÞáÌ,Yg–Ïo¡#Ì‘jßÑQ?y¡ìÅâžVbÝÙÜ.!ÔÜm¹–1ëœ)Ô3<*­Ž$úþlÛjsǦÒÜþëá"±ß`N@Ý…ú\;&áŠðvµ¶áâQ“ÊY¤ÁÅrˆé–m'« w‹'O âÉô=Ÿ¨ú‘ NIöá$nîyÔbÖÇrêMÏÄ{Š4@epWˆ<åK¬ b8ù Çv¥Ã:Iù»N’aÙn¢NYJêÖg–¿º²o h‹±ÉP„ôÏ{Y½ \ƒdÕ”tCq ‘Wen–S÷fЄltFÁˆµÂ›Ö¨‰ik®Š‰Ùž‰á¤¼ßû×$¸¡qÎüò1«§FS,îo…z8™Ÿjªæà¾Ï è.°q0±«¹h8àA>51»O£5f×lKæw‘i I»Ͻ¼ø\tobïÃìµWç_Ÿ]¢§“ß>/ f㉉__'½¤Ä—8’Ijà-jZe\ÀnÖ¶aoƜ .QúÁ¡¥Á&§éî½´Þ®^‰R,f ¢CËša:LKÕzÑÖ´‹å@>ôêÕss/£ j;,ž vì„ ªÒ=0]& £<,ëÇ™@èIö.µ—ŽI®ºÙ"ö½Ã>öœã¨&ߦƻ?ogP wÌ›4bÑ^î$˜,ÍÁå™°QÖîílNúyé%-}#jžÁIÒ—2ÄÂäRzS0É[ßN~±"ó>$‹B‘|0„ítî¼w&ÛZœç“²\`ã‘»aœŒîDnó¢ž!^ïÛñ½Üº¤}yKG᪦BËÏänãû:ì–î·Â˜]}¬Ö¤5nyýçÏí#'#Rhè²–d~WcCaí/&ê…åÔã0å ´2ú\e<ûWÁ;&\OmÏ*j¤?¨%XkaîÓÙLNŸnäœ'¼’ÛÀMx~Á»¥5dÃNÌo ð­ÑÌ5CZ¸Wµú~%°—jÍþ´'|Tk§¶Í=wûÞ«ªya+¡Áé³â•q6lþ§ÑüJ$¦¨‡òF×2Ñ»EÖíø¸4êëܤ4ß]µûjBŒÙ­póîè°ËòÐZ¬T˜4É’ÆÃ&ðFYed¿Ôãg* +_áãR‡§¤×ÅŸ¼W¡¤àZ ÓÖûõuäI§©LRi›ÓàWòwOèE1’ÏC }ÙxzÉÚ¥ãËÙõ†Þë§ó†`ÕëoV†‹–L0vêçëS ³[Ñ$…†œ2̃-5¯oJfÉ>)!k~Á£¾P>î#Øñò/òKu^›Ï­­ú6(ð9/m>]YË”J­t(“„ š¡T ºln(û„ ׄOŒ03¸æ½ÖÅw^û’Oª±].ìù&VjŽoÌs'oØ«TµŸ+>ú4ãû„«oÀ,IŸ½ñd¦°8Ï/8YMÞr‘ÜCøèù¹}}à2JÏ3ñµ¹mžØµŒsÑÛÒ!OœÏ%Ÿú Ú`ñ&tøui¯óͨü¯ˆ`‚e•/ö…“ò–ïˆö\'/ýWÝýDïÈN&í3ßâšy:ö‰-íùÍ ×º ¥¦$RXîá“DöÙ OöŒxôç2V;ÿ†&.ÞÝ3†(+ç6‘S¥7@–žúr+Œ“`‡rÌRï@FzδËì¦aFBo²´i€ 'vÍaá€8¡gIBԦqߎiWñþê]Š!{r·W½2#?Žâî_R­R€§n|«K™Ñ’ã^=˜)€Æ³×3äÓæ…ê­%оé÷‹FBù*ÔŠ1ôd¼äY*Ñjžÿ‰€Õ‹|S¢›bµ‡=œ\ÁM.F^b¤­ˆq»l±þ“{¦&޹dQb4&:"Ûëž ì@¬Á>NÊ'ÈÑý )˜™E§ùq®-RF¤dj—Ý(³9TëmíâÍ“¼„^YšøB¦Õ ¥(U®3ޢϢ~„Hfœ3¢SÊV­¿æðXŽWöL]Ÿ²Ü|›6BáJ—·*fbT´¾w¾ZÔç /䛉ݨ{b>¥­Å­òbóÑÒAêŠe*^%§þ®ìÎp—½/dÞ>Lêš%Ťš·a&þ‘ÆÞLJÜ”KN6Þ´øý1(§ÀˆìŽCl­ºt«o*Y¹œ]Í”88žw³¶ÉÐUa«Ø1«í+hÿıuŒ/·}ûÊ:5ë\WžiÅ5MFûk3+ùÑÁHÏ9w Ítè¯ ÷7¾È¯Ÿvš}ZvÀ›òs{¦\æ’ÀÌ^^Pˆ!‚‡)ÿî»AÕgûÈ£âzŸVè@ÅüËây¤ÓÂhzƒ-,ǤtºžJŸ éÀ@:ÛyÇa–°ùKªÒ0,#~OÑ÷>A+Y+–¯*¿jE•´á„…bIzŸÙÙ‡2@Àz8GÀçïk ¬#çA y,à@» Ò!šª².}UÝL?ú8 ¶ °cZqË­ö—Àƒ":ÔôýA [ú åœï’FËY„Cq4ƒçwºƒÖ+«Ž”|ÆÌüy´ á2i RÖŠäN¬=v7ïàg6™ÂåûõÀã-FƒõäoŸåL_KÃC’ð=Ü&`ÚirQ•Xé— ’PQ´]‡±Œ7DXé½÷ë\5¸±"F‰µeë²C&|AM=ÛÞ S×ù:jý‰òpź6RZé€ïRŸ ûD%j ƒ3Â\d%È’‹à•ŸêQ­D6©Àû»¾ª«3ÝA ä¤e&εŒ\9ZÁ½¨ m‘#Ú2f«h?}¤6w“‘î×n4{±íhä²—wš90xknøcã¸î’nõ&–ræóÉ5 Í:ÕfÆâǶ¥çÎ&ˆ&Néå†7N%ó@ ©t‡"Ù1ž‹h‹ îݶÄúÕ Óéï:9~©¬²Æq×Ú® -–+ß“ BR»Þ¹å U"IÔö< øøåT·Ý©;/[#˜UÎLJa†þÎe„ìþ"d …I­%˜Å˜À–=1TÒ¨z“}7“p/*~bÑ ÿ¥Ê‚$Ty”W×±µˆ¤í[ê)¢óLÐmiPS¬™S¾æØ']\Øå†œ§‡9$­‹½èŽ-é€Â¥&vq¾-° DÑ>’Qzeɰú™¡ö¥ÿ›3 ÁÝê¤f³ä´‚A¹!kæTèé2;þÕµ…«sûêkoZõ‡N3;[Ñå$É÷ô³Á‘ ÄbŽò~ãÒ¬óFYƒ‚Õ —’æ0TmŒ :$v³0Ýœg/³´ =\£žŽ3oqc®jê6k„ž©àZüÖ'ªœGSf7Ð~— uˆ;UÀèò>“À+M@ÙVO¼qL¢›ö3Ç‹ê#–]eð|¹î{þŒxñœ=jÀf}^—ËÝÐox‘‹­‹å5ëø¦T•PñåÓu™õ,¼û!»×Ìhõ¦Ìbà Lß[½v£ULÃX9B¿Ãt’æbÕ‡6öÈèí,^6¾6ù좙'Ÿöd=FÎ9™ýÓ°1òW…eû3ð!ŽR¬(3(÷¦e„ú¦F 1+–?ãܹ,æfO¹U_i:Åï9Å)S‡áN¨.Ä•Ú|)ÏÏÞ•ÎwíÔCð7ð}©ë1[Ž1°Î=1™KÙW:fìÁsXÜs€Uôi2}“Ao7CôLíº¶;ªÅ2ÿ¯¡V• endstream endobj 476 0 obj << /Type /FontDescriptor /FontName /JLWSTV+NimbusRomNo9L-MediItal /Flags 4 /FontBBox [-200 -324 996 964] /Ascent 688 /CapHeight 688 /Descent -209 /ItalicAngle -15 /StemV 120 /XHeight 462 /CharSet (/a/b/c/d/e/f/fi/g/h/hyphen/i/k/l/m/n/o/p/period/r/s/t/u/v/w/x/y) /FontFile 475 0 R >> endobj 477 0 obj << /Length1 1630 /Length2 18092 /Length3 0 /Length 18945 /Filter /FlateDecode >> stream xÚ¬·ctf]·&ÛvîŠmÛ¶+¶“;®Ø¶íŠíTl;Û¶QI¾zÞ·OŸçëþÓ}~ì1öš¸&®¹æØ›ü›’*½°)ÐØLhïBÏÌÀÄP°²3vuVÚ)¹åèUÌ,\åìpää¢NfF.V@{1#3€¦™)@ÌÌÀÂ`æææ†#ˆ<œ¬,,]Tê*šÔ´´tÿ)ùÇ`ìñš¿žÎVöŠ¿/nf¶@;3{—¿ÿ׎ªffK3€¹•­@TQé»´‚$€JRA ifoædd Pr5¶µ2ÈY™˜Ù;›QÌNÛ&@{S«Jsfø‹%ì 08;˜™Xýu3s71søGEp0s²³rvþû°rX8Ù»üí `eobëjúOåæÀ%äàüka÷W÷L èìâlâdåàøUILâßyºX¹üÛÙê¯4ÿki 4qý§¤éþÂüÕºYÙ;\ÌÜ]þ‰el0µrv°5òøû/˜ƒ“Õ¿Òpu¶²·øÏ èNfFN¦¶fÎÎaþbÿÓÿ¬ð¿Toäà`ëñ/o࿬þgV.Îf¶æ pÌ,cš¸ümaeÇøÏ¬HÛ›ÌLÿ–›º:ü‡ÎÍÌé_ ¢úgf¨ÿ&ad ´·õ˜š™Ã1*]þ†Pýß±ÌðßGòÅÿ-ÿ·ÐûÿFîåè¹Äÿ¯÷ù¿BK¸ÚÚ*Ùý€ïÀß%cdø»gr€­‘ÓÿÏÇÈÎÊÖãÿäõ_­5ÍþîÿLÚÅèo[„í-þRÃÄÀôo¡•³„•»™©’•‹‰%ÀÜÈöoÏþ%W·75s²µ²7ûËí¿Ú  gfbú/:5K+ûH`ÿ·ÊÌÞô¿Vð—®åÏ(/£ ¬!Lû¿Y°ÿ2Tú;.jsûÕÈMÿçá ;À‹ž™ƒ @ÏÂÅü÷þýMˆ›…Íçò_@Ìÿy–7rq²rèü­›‰ù_Õÿç?OzÿFÜÞhúÏ診Ù›þ¶ÿ)øGmâêäô—ä-€¿UÿÇù_sofænf·º4á ¶NÏÊp©ÃΞÓéïeq(mT+*ô¯öø¥‡ïpWþ© ahšæùlóXuj‡áú92vîZ!‰˜_LÝõÕ:`¨¡8ç ÖnXkz½°×Gni›©ª2B<š©w:ÑsXá?óŒÅ¦b6/ª¿väýG T§7ÖSj)¨j=aÇ@"!w™Gº`²ÞyÉÍn¬N5Á(½Ëê¶Ð>œYÉŠñ;öi®'h#¥°YÅilQðVÚQ¼UZËIÇA2Ô)Ö¢UÈí|ÚIÕûz’€ê`+oÛæà®I@;FõïNòõ49¸’S0¾÷¹AÄ}æ ¢x×yšæ+¤à,6¥£AìaÓÒÀYuéu†G§Û¤ú>Z öþF-‰--ý¤©Ëx¢“fóS«ÞÙ ÿ9§døŸo4³F¡ñž #Õ’À{ûá9IÛòœ­˜´6ŸoÕ5CUÄ?它đù^mH¯×á%öT§€¢‹£"/^vq¢‚É`õAÜ['ºG¸(9CuÅh³º¯Ë‹âoÃM %Ž.lþæ»ÎC³u2>ùâ5‘SþúCÊ$ZS›;ß< /Q#Õþ\w¡å˜ dèhmÛ%Â1Bºà&ã¡*…ò:{ÐØ–kýêçöLmJ”Aðñ¼Ae¼-ØÞ¨9©oÕ¦íá| í ?êšÒ<¡ƒ~&|Ü ‘3r˜›^ Q§ÄwmA’Äö Õ6/ï)Ðâ¼!j{Uü¢gI›Þ¼”V¬x,­9¥bÝ©d«»¸Å·Âßï–ÚÑÎx²Ö©t.ƒhùm§}JÈoù³•$,]yò=Nxu“Èt½eq~Ã9HzæC/*Òà“§¾¿éš[šÉaŠÛ¨¯Æ0D\ñ¶Vb,˜M );ÀɬÄzlã¿ÿ+t¦|Ù‰µº¦¡‰OE´îWÎM¨>F!§ìجOYùÙ9PM•8óÍ3Y«„i™P£•5?”[xANø]_áôµ›¢<`ãú´‹Ièi@`>pݰ9{§¢Ë<=ÿ•§ª»°•4¤.êí,×L˜G`aNjE”`0£<êÿ¦p”€íçЋÄ7NÄqˆJèr±+wa¿l73(<€Œú]IT†½ŸxBͽ`ú€CôÀ—Oìš6[ƒf6áé«¢>dóùûU$å=mGŒmrÌ¥­X`\OOz°à^•˜ÊQFö@<ž_›­«[Dq’ÎU9²YD XLT:þ§û묷›n…ÕÃ:³|ÿUU°+à ¡íð¸Ç‡þñZê$cpLLïm5{À€#н-FU´¿ð³?/·Ò/| /cÔ'Ùùcf˜k7¼äô+Ì‚” ;ÃLPÃÌyúT­Ìê¶x©$eÄ{Ÿ]6‘€¾úgvŠoq0çw0§Îb¶nÐÙëE4ÏûX¸JN!%²ü:ÛïR1¼(N°R\(ˆÉ™¡ÀÐ÷›ÔÂ7±æÂ/¬Í…Ä7ì ëÆ8ß-Æ Þºê§³ÈÁš™×±T%ZNž W„A¯Ò#9U†Úð<ŒïœË‘7ëLñPUiç“ÓþËŒ¬—µ0V•à`c¯a©WãÅ¥ì2|ƒC‘še—ðIÆs¡7VCíO· á}yÖí>ŒY&kcªDX2gÜ¿³£Ž…9˜õ=‰äÔF=Å*ÇîJžìÜf÷Çå°©—ðÞ=njÍž)ø“×}â›oÎ!—œÐ[¹Âjž¤[pŽ9î/½÷pãŠò®ÝHP± ™&*õ.B„ž#!þœ>†¸ç ¦7}“ƱQ©¶f§‚0ëÄÒÚØÛÇ;ÁÆ™sü¢ ä;ù¤ÙZ½»Øåvmö©n&Á üæŸCÜÂ.2Z%¬iЍrRDógdýÞ2 ½ -³$cV,ð´>>TZÆž¿‹QŸL‚S¤.œÌ3Ÿ¹¨´Vº‰›`yW„~¶»»œ¸R,ŽÚy þlظQv]ì9|œ*·Ô&rO^ç_}3vÁie»ýËÚõÁ.{!ïf´QÔÀM^i籇çÄ&:¶ô.lZæ.Kîª hC•_ÐE‚™:•/i´\N56=ˆZØ ñ”ï¥]~mHãùf:×Ö†JûHáIæDu’0I‰rŒyÐàòC$\ò| ßPp2Ùœ rt¾·@ðù|S˧BÒ¯‡évst‚Œ„PصÀÄ;Œ3Ÿ¯dÃ,®#ë:‡hÎæˆ:_÷wy©žQ‹D;3Wšâ‹ù&+Jx]ˆoênåò&䢢JÙ†éµ ‹(ÒÒóñWÿ´Pl”eÖfeèøs´¯ÏS2Óæ)9í"“vÇiY-—×ßÍJ‰áë¬v Z¤ˆ¶]S„>eœEùE‰iOŽ7Ï!ŸJ'N *95Üù`¬€|,à®´¹OÝø:›îÞˆ<ÜÌ`9»C+é{B¥³óædìœñÈä"­§|½f=¹Ç<i!V RGÕöy“mxá[B®|ll˜£1‡8R¸Y·EŠQà ÁãΔE¥d¨Z¡wÔñºF#ðÑòû¥‹ˆOeR! 2#ª¬p›·œøR*:{ÊÌyÔÌñ©?6pëïEø/X$qÎ ¡ M$¼×ßY >@“^Jc˜< æ ©m¹3-—Ø–ùb¥€Në•øó¯„p­lríQDüNïªÖÅÐ!x»=z>†C´£ËJw¹eñg½ÐÒAWáö’Eå}ÝŽ#¼~`©¼7‘‹TXÈS¿hÎyA:5–¡sœUqÔ~ü‚ˆþ£.m¼¨Ú­ýub³BóÀ¯Ü{&`?¡“,Ž¿Ó7. Æ1v]Š-*G“²h@×$>c—w£ÐÏLÿ-Õ´úŒüä›"\¯Ú9ALh:ì]7¸_ÔbÓ–Y£©Ù‰HQÇ(‘~0ßò^'×·Þ7B;Ýxœ Ü+×rÜå ƒlÜdA{|¢=m„9ÀP›àäVKn|åÐ9íµµ&Ó6çjQEÍ#î«goTõËPŸù}ÜDoÖ+½dx~ª¼YŽ€£1n‡–:Žçu¢¸ßÑÑÆ¬_²šÊúxÚšÈ\[¤®×Œàj™@lSyþaCLƒ³l²f̱¹L!¨çÝ‚ö½îÅi‘›Ì¡Ài¸)*nRìËùs¥ÞtŸ«´omàóiBßäõ=Ô1¤Ww”ˤÖý‰S3îÛúŠã ã—Ôš;ÑétDI2rÚ^kû"F=ïý>_‘ZX.о³@«#d‰~›ÌÍ÷¡Á¾¾L?½œ 6‰Öß±.À\¦/æž± §^aÒaMáC¥>üÔ§ñÓ4ØækоfëÙgª°R÷âOâÀ·“z\ B/á™9v Üð^å ’F®M®Êðßyúöä„ ‹ì‚)†£<¬i¼»ES¸á\oQÎ:¬Æ¾+<2ž-;4ïQí_ÆÙŸ³é=‡R‰¶_½D¸> vo¶u b«*8VƃÉJÝpæî€ÖFst°Erî¢þ ì|\شʈú2¢E¤jq‡.p¯˜|¿{k)6š¥g¾…†¤ÖJ«£?Ýc˜·q Cý+P+¸‹~C™ì ÈÜå P^„e=§™À¶| ©Ü¡ fm¤EH \²"¶)¿:éò\µ@ìµb ÊË FXÂL é'šÚÓ²­Uîd_ r$¯ &D2Îa¶ÎQFK„…ƒ<³•'J2$&bON`·{{<ß§p>Sû¥à2§ÊpR‡Õ&Sº²(¨G³Íèéæ0RÖ•çâ¦o6Yó”Ó¢oQ^©}(Vj¬Ó.Œah dU²¬—#¯ÉV²Ù¢'uâ¤hKB73tÊÖ>J*T‘˜ TT¯ PŒpBLÚvÝ‘h˜ª¨äÇúøP×ÈeGVcižÛîïF¹= ‡¼íç›~xÔºGjq]²µ–‰ÉUoeø«–!~ íÍîú¢(Ì´k6pë¹=Ä©F²@ºÛÑ“Á·ØÂ`r›c½ñ¤ÄÕ§#EÉш‘\±LT“.°áÃЯL—ËäޏqÛY+¨É¢ÅÏÀ]ŒOmè #Ê2‡/Zäž¾»&g.¥ŸKèCF6xŸ‰’IÁ% † _¿öS߈F|Sy©;æp•\J©«%Ä39VžD…ùÔn¸äÈ::ý‚~nj¼2´_#HãTÞf-(D€ûOç×íLy²ÑkÀ¿ôœÙï ¡ Çhù ôTÜ6a²d~ª’õ¤·¾${)´ˆ“+Œ2¢Cdà–œ} µ€ð-¿n.Äév)\cå®Ó•hx Þy"ÅÝ k4FZå~äï’óã?ÜÏ. ¤_Àõ•9‰Ùà47*iM B‚¦òö f3êvý¡aV]1'loÑúËrèÅìã]ÐMhê¾í~Òˆñ ÙÕîŒcÈ´íÐ}swÔ ¶%~tOÔÆ¥¡[ÃÿX!ödÜÁÅJ.È›ŠU‡bá.¤$]ƒÛHøÝžø¢_Œ¹döÔý!é70?+íw ØsŸ™’€+ÐüÑÓð]½¦mÀ*ÙmÌ©—‚ÑãØÒìtÕëV«Ä… D­õB¢aä9AekUÞÇÁ#2ªKÔ|õ Q€ìîcfsýtÝÎ|ÑÈý{¶ÛÅïøŸHkáá}¤K]t¥ÙÕ~!ήl»XtH¤?lѹäùËcK°ØEÞ‡%èÅ¡ík²_¿H¯K- (|”™VeÞϳ€Î¿ è>%9?I7Å;¦”‚wî*¢¨Ûs*M¥ÚÜò>o”—èª kHOÞx>-XÝAü¤±¯;’é!TèG <'…›uz—yíëG¸·^G%ÀC%±ô&H•¿nܾ€ªâ2¯1Ëß¹ru•£ãâ’`{²·Æ6õCq¾{·c×ÇÍñçÈÕÐ0æ¢Dþ¹ ·EØIÑâeI‰ð߈™Žëç­xÓr©oÌ_óñk’-üovP*W“N!B‰#N»x “Ÿ\îq>­}Ý<Ó3¦v ¥,pâJ/í=ˆÊ‘úyí´¯Œvܾ¥þvsï˜ka¬÷8ù-í®½Æ¡"_snä&•õœg­B ì5c™ûibGá;ÖÝYÆ.Î<Ÿ¯V@wÑtžÅ$®·…kvk tw…÷kãù7OéÃ);¡óAÙ½\Ýo¯Ã’@°½y\S} ËBJ¿Ò-©µŒm?F ÃRÛv_ž!‹’dê3~"¿É›}VP‰GÊñ`­'x¡Ùñ{¡_<~§Ò=dºÎgG*ˆY0¬„‡ ·Íº%þ¥·CC/Yy?° ºB˜6²·Ä6’ðvŒ™§w¹b¡‹ÛLvÞ¿Ù©¯¬¿ã–¤Ví ¼»Ó\aÙ_ØÎ¾ÁßLþÞ—?Tw›}保%Œô@þb%(?Û꿌ÐΔÁ§½äÎuGl±S`ÆÙ)LR³ ÉËð󯼼‘Ê(¢ìVÜÈRZ`Çÿ8ï”k¯®•f‘në¬<$ê¤÷¯'6®«Ç®Ï%}§’'àd;rÎbbе1ϧfeÆ®Pnw6~Ååk×ÌáUoÅ2ùî[C9pŠÑK4Po•ךr[n¨†8ü õJ„×]v5sº¡ò(ÂÂw%›Ú‹5³­b:![ rQÑð6yHŽXàñÐÇÌÀ¥eLîcé “RË–0i¹ìH#ŠDO¿ï¼Å ßYhM>á©ÆËZýÞqA½—}ÇæYr‚"ewîQï<¸ 5{Ia7}¾·Ëjûæ7;Xäc6ßµ".罘Þ9ô¶ª±jxÖ+<¯0‹ 1'î‘ ïRvF1óí`da†åДޝQ¿úHc»ß /ÐÀnÁ©2-ÀöNt¤„]N„œ‡VËùÖuñØ.Êìka¯É€* X»8hÁºf<‘ï«Ü=W÷1ÑÊsMÐJ.nºdû»úŽæe;Öy؆/kHQm¤Œ¬OŽ ÔŒSÖ³ÏXmˆb%ËF‚¤ÒiëJ¼öG̸«p4Ä@¸;Ç _ݾëþ›ÃðØ@„ïÛ‰ÑXTýÇÀ‹¹„pæì’ dËóéa0Ê­ ø‡ïæ¾zƒRRTx­w6 T6Ü®¯I¦) LøeÒD?y*¬´åtäZ=A ç®8“?ý9¼êî©$’ŽRòˆÚÌþÐa–$^\ô E/ò­QçX:kãFdÓuÅkéðב °øvo7±Ç™xÒ¿ÝT‘+DÄŽmnùPYá üR•‰)×;Æã÷¨ÏÕßâoUÂ.uTM…=Å‹/l„L=ÝêÜ¥…9²µa>8_‡µº=¦9I¹|cœZƒ Y+ —c?EdÿSC úYÆ$ûÞ`Œþ­?,Qç‘¿Adë'P´öX¯o=ÛÖ>7ç›Â³4IE #ü*ªDzÇ[p­=yØ>U5½bÍêÀAë;iFý­«éWä7ÅÎj .&uDªE‡Í׃a«,ÙK„üD')¹÷õ{ѧ·ŸC?ÑÞ—Ë_‡€³=V§ö»²©²§_*8òËCa]]q_x†"yÜÕ;æµ;&¾oECQE!I-€ðfJ÷GÓ›hÓ‡¢tå#Íp »UŸ§“dªyd“¥Ýæ¤Á$о«H¶»šrÅF/Ðw&d|_b›%ñ,š‰Dj_@ùÉaCÆ3©[ÿþÝilŠhô‚<[Q“·½ÎPŠí¤W lJ%ÑK' ò+ïì±êbšuA›nvà¨ë›:¥Sz4&SOD´`Mõpñl`í²ªIfl®$µa¢ov_~f ìt¼ýAé“'DOèpÑ…5‰dšô…"²\Ö€2@ùðp²Ó!p|—×ZN„{ÂM³[¦ˆJ‹Øš~Ñp®¬‚MÔ…Õ´ÕòìpÖÚxP-w¿ŒâKŽgÛáý]+XMGΔw,zú^W9¤yÀ˜Q¬&pIZ䢭z;ʦtL—!d?ZÙþ ˜›ôtKÿ–4¥¼b0 K<„~™¨Ïã ÕÇþš(6'1}}È3ª†ãe€¤iEîºoµ~AÈÖnD¸å7ì2%U¸mÍpû#!èyR ­r緽ÊI„BÔG8thíÎסq1œ—Sxv|PU€‡LĉÛ=­„>«ëf»çÏΠ䩎³"hky Ï(æÒô–ðüòìÊ2ŸŸ:ª´ãXC(¤z¶¿™aÜcîóLØxè9§š²½vßLËUÔû¨”üL¿Õ[¬0 T{Vo™nŒ1ûì¢dä7ÂTå7_(Nd²ú OûP£TkBîè´ˆ®6mã šîü÷ÞP–X^;½ÁÛ¨kÎ z„GÐN›ÂI›ø«‹(kSéXWÓþố:°Î‚À2·²yŒ°|—%O±‹eõ¢ç}ǽRT›"a[JDÂöy}½¼Øù1ár9fš&ê ;¤¶M¾œz2¹ÓÌØRËZ®e{A©þáfA…’¹ÍŽì·ÿpÀ;Vn#ñ0®k95Á{]ÖL± ZìUâ}’)x«ÕÝh´w}e®Di#‡‹0&²^ˆXK&µév¤ý'÷¥òÑ䢹6¹ÆÝdÓòµp¾uó§j‡¦ß…_»ä~‹´z-ZnA‰}ØQv¬>òÙ[NK|Ê÷ºßð_ü£ì –êÄœ{kO!Çc8¸a¦Ï_Jû ÛÂ:š 2gˆÀF'ßšÃ$¤k=v0; ¯Nê˜?4Sü„_=ÉÜÁéu Æ’ò¢ºE‰ã§ùŸœ³øo;Öêc¿,ùx~Ç…4¨.HÔÒú¹;»•ôãv… …^5!9X¸orF“Q”™A¬õò±ôZ0Ãkâ© W·O`Ò2¸þO\˜158tw&±…l"îa˜ö©_¤ü壵NÄ¡%|?Z¸iÉkT¡uLiöyØû¹Hß7’ÐFüsÜ{È¥/ØçêH=T½'dêr.Yµf%,e*îÜxN«ëÚÇñjîŠ(_ðk°°¯Õüκ1ãàuv¢¥ÓºÏ·]“¾ ÃæîN@§EÿcŸ‡‚£W¨ •,G~s˜ü\ĸõŸèïêCJ¼ùAŒƒ=ÕÄv„t¤†ºÉßPÜ•–&hñWó©>rÐù_jòÔ;hãÙéìŽÉäWÏ)›0Çä¡sNPíÄæQ NÍkk¿T.Î/gË™‰Xq©¼]u$CüoCœÞ·h"4ë¢3K5+I±gRÚèÿ¡^óùòp"Ö<ÓD¢¨æØ‹Úg=®&yW³‚B?6‚TµŒêãuÝqw?yÜS8•†„}T”Ê™Àñ‰ ¤ò½À”Â÷-ü­Çª>4÷=%6B3¸mYŒÌopSÝ•9OiqÄëª`el²œ€™­"KÜYTêË!kû‡ˆÐwV–'üÛ£‡·yyÖ¨Úâ˜×ݾ ¢:ÉŸ±˜zB½Qò ¿Õ"Ø‚U¥ã‚Aé0ëÁ‡r;U¡náõ_8ëùguO•.­ «¤]c‘!Q¿ 0eÐÛ ÅûY[l¶Í³5¿Ù…o×’á5+MŸ¹P+ö%Y¹ŽîP\б¿ž_†s¬Ëç‘’÷RSDÇïïã?Q¥”(rg¯W8þayT´¾K½QÖTA]jæXióQ4åi"‚WÈG§Cæ˜Ó‰†øÉ^ZfaôfO]Qý8¬¥#†GíñÝjì›FðNaYÁÌ[ƒ4÷ÂúÜ!j.ÃÑg¶^Âù¢ãúÖKHs.hPî¡.HÚ)µÉ³èYr¿ô|4Öø¤Íž=¶¿¨ãkM' ¢§Æ€w%š\=®#ùèŒ|…Àúî.‡§} ÚLjªº® öÌ Ó§·?VãE3‡ÝÏ õÛš(±­MïÄ7ΰ v¶à¨x‘Z¯_Ù¾È q›¨¼WŒ†±ih {²+¿Å#”š?b—yAacî?Úía¾×.+8ayò󮹈æð~éè,ø,}FÀ„iq6訦?`‚äÔV“å´(ˆ´òd²Ê;ÚÈ7_„Ás¨×%b‘B²”xbš#§>öM³äFq%wˆ¤cQÍÔûƒhL‰¤ç9àØÃ¸üЧ1¬ð|ROJ-M. ¡–OŸVNXo“aC]oî}ÈŠbAQG wµðäCÝè¼û5ëO§Hœ¤¯^|Õ”â§GŠög¼›Å[g매֎Ñå> ÿ«JžÃ<š/q•Ÿ &§_—¥»~€ç;5Wù³}î(ÛP}-Nè Yzù¨Íq%Ì;»RÍO‘V½2ôõ¯^¨KX[-ã%UØzw‰môºpèHN𬒒…œßºÕÙ/"dÙc»·‚¬gŒáç«_Ï hÃùskd¡Vb9²¾ù*ô…?v¶…¡~}`¿4± xê^Çg(«TüJ ÉfwØXNR¼¾2gåÀzíÊ}(@èÖ!›Oëô¾vÌ}Öq³]êÙÀç‡õØ—=Ãäg+‘¯@Þ J¹BŸ ÀD _EkÊÍŠèþ †u íTÝqN’–Oþ-žBÓËÛR†lÀX»^Q÷™ï«ì,f’‰å€ËF8Ò¦OæIœôÞÈ¢±—>O?t;ùøšÐŽŸ?|6ŸÍË(yæsÜ @DÓšbE òæ1«œI(ÕREûÛ”W¡4C¾pˆ aKkŨÒQIf8ñ žørî¼õ¦á‰•ïÌñö:Ó€ ,«ÔÇ›Sö»Ÿ¯‰’${ Y7cmûEä_°MR'jÅ@ËÁmo2º¿ƒ (¦ ´­õD>äqw,òCŠ;iSjˆ°ÙÌ«QÎ$£± Ka×3“;a–ðìÓ™ ³Ùµ]‡0¸”çõ*©úín| sÕíù†k ÑîOî|*²]éý`@ÚŸéŒ/g&gɯL‚p! žã»Ù\g[ÆÜAq÷³5Öǘö?™ü ñ½9×(Ôñ;¦(™qÆ“vþx%è×°ƒ-8×Oh?tžÙ¥^ò ê1R ]@äcƒYUH.fm¥o?kcfðy~÷W‰G–vQû¡,.ìв>yF†m¯2ûC~]‰dYõc˜ÝoÚSíª*í9€]Í ŒÙ‚=¸!†m+ÎðN2ÆÚÃZ¶í@…À¦4iƾ®"’2Æl𫜠dˆ8o¤ÕA%ºÓŽÓVB”ÚÀ-[VE%RÑÆ‚¢CG@/ÒϪsf›ïÑŸåW9ä[ÇuÁHÂHò²'ÊMäf}®´œÓ¥$áÂj·µªts?TFô’Ÿ‡Ï‘4ÁÌ øIJ$~cÊ’ˆ1nuÁ½ÖŽk“Œ[j¥o"ØwŠ6Ecg­¼cÕ¹Ôw·U>NÑNÓ¼$§6óv2 ˆ´¹ÖŸûªèœ²–è4Lš×~<;²Äüè§ÔŽ!ïïA¦q‘ìtÆ>­æÌ4·\ýÛ9¬[ætžƒ¹}”[VwzŒð]„UœÞ¸¸ªý¥„íürÇ D+Óñ¨¨Â‘z B<¸L¿$,d~ÆZEËu¥&‘o;ï.ê—zÈNaL|÷éãÚ%öHÓg¸›·£™ƒ#šç!¾ä]eŒì*›(9l*ãb;eÜa®t²Äù£ŠjeüèŒeô\n^aŠ6yu—–VQ(™'yyMç$FÃŒv2yèÏu¬¾.ã‡`y¼ð@½†•YmÛ?"£]€{ŸH°h^nöbÈô¸){ÃÿîkiÌš™¹TÄ|û8ý$Kç ïW)‘#O ¥ÊcB鹋ȄÝyGîýºªáK°×-“09ܹ.ãÔ2dlqÊ#›é/™­ÍtúZ舲±ÑH#ho du»¾!áo«*©„vŽŸŸ¡?òA³V[ø¶’nþe­6½Ø«v›FK²²3¦ûÌh}ªèpÛà¥Ðß/ˆ*Ù²Ü'„ pô`zV§®&O…±-0’T@4«‡'÷úeq…K…èYVÉG/xçDÈ$ *y]9Žóª*m`"‚Òí¶±´ õª&ë0iªö-@¬é’’Ìľguw­øµ0!q]ŒBó ÑÒVðÑOH¤sEhOâ^o螀Ÿ¸&\œ#t±é/§\D.]?Ìù€fLrÛgêÑåï¸0]×¢õRÏ0"3ŸCg7FzŠRš®¦èÙ ¶òƒq,äÏŒÝN¨£·i᩸íGÁµ>™˜wÍ—­®ZeÇ_¢Å©íRŠb½^‘Ý8ÍÍ“c¯Z2ßãsæÓÛh—¨%KbžÈ÷s"u­M½°6ŸVo…¥.ÏÈÊðÑž1-myqç|q‹ä§¼C« 8ï<"lPÓEEÍ,'\Õ¯¼Puþn÷ÍüLð0zÜùZ`« ù¡mŸ¦\Þ95ÄáÈ×,áXdelÀ­“8l˜eÏ©«ð'T¨Xð@ímîaâø«s-›€C±b—Pó=N;× ²KK7Ë2ßqײúZAxOá¹(’1E¬Æg…×çíëßè’áQhmÇÛZÊ9ȨUø]©¡îv®Ó†Lz+J3•jW~Ý×*þ^-0.ÏDn„„ªÖß—¦¥vv|JÃ@a¿VDñ_åI“¼dß=þž¡±ß½ÃJ”¤ÜUá–"dê|%’ïzDmcY –«&EûA­·öø<,eµ”›oM£äÀAlûA»g3ÃU‘Ëç©ãjº[îD3.µ·j1ð»Q@§œïúQ¼cʺÕÁç8DT¦O-òÒÆ%9tÙ8a V;nls Zœ9¡jmZmÉ~èÍZÁYdñ‡8±Ñ²±S2Ù1$Ýû‰ÌÎ*°ò’¬ŠÅ¥÷8W.ó´ïi¢ _‰¢ñ¡ Ë]CbW¸³.ZU\õµCîqÔ…Ò3ª‚A!iÇéìÍíêZ“*ou^šN-€ý¼ê<ý-¾.4Ò»_:‰±^nÃoú²t÷ãšä·óOÒb¦³,gzh†JZsö+Èzhë‚)£Ô£F;:SÐí—ðÃÔÔÏîªÇúÞ€TLèáOŠp!!xi +ÚÆ‚ƒVÓsªu @s¿wUж‚êkBß›/]Z ö‰¢=#è~°Á> ÍZ /ãwóÕï óºPB5„£¼Øï5fÈœú(™9=- ‘À»wßIÊdÆv Ý$*{<Îæ4Kä þ»%–ˆß8LUy®¾)ÝÞˆæÝóâ<þЗöº?ëL Uy+Þ— "ÓÉ ãï×îe½õ95þ½TŒ® „H9vlW_,óšˆïãʳßoó´?ú3ãxÃû/þýèp’lÈÃÝÐwc£3S65¢„:%hLŸê–À¬>èX&‚-2Ÿâù=Ü?¡­ÒZ‚eeA– ô‘òË YYNFD¶–ì}Yÿ‘;íë»qd®†ÿRb’é%f6¦Ö×ÅÑi^fíà… æ…ù¼}íš|I¶]Fü\zbŒòöú­4Œ¤¬4 ¢5¾eMuz¢ZÊ#ÍxbUª¿ô‰mÉÿú’üÝ0É:—ç2k‹Ö5 ¯ iÄ\[ƒb-Nõ'9¡¹é£G{Têõ».À§Î\ÍX¶:ŒÈÆd›(ý ŠÝ‘…æcÖ#Œþ¾z©d¾lxÜ’ø¬:ß;Ô·×™ òÄgµ.zñvq×÷ᬠÉKvó.íYj&`Y±=‹' ú&•'wºïxÿzü§åjs}®4tšÔ>LÙ©‰¥É«Ë¬ƒÂ1é£* -^ôF>5ò`ãŠ(jÝÔu3Ú?z˜V`‘ð´ôœq ÎÅÙ•:Ƶpô\ª“تÑù)й[g‚âFbLS—,â×<Ÿ–ðˆ%ÝiÓ9Çò0‘‘\ü*!ûˆ«´0š¿]ˆ%¶¸<€BÚˆ¡Ë¶ŠåBnY.ÿ'| 'í¦Y¤âq0‚{.DF ¢I ’Τ†1°È-®XùéÑ!B·{•5í; G®æŸc¨N?c(û2Ìïås&…¹$©äÊÈy·BʪRŸH:FT“ìÉ|ÌQÆW‰…,—~êÓ)BËܢį6Û;ÍÑV¿çŽ ‡>bw7é޶«´îå«iµ V1‡‚Èàk]<„רÜûÐ mkõjÊNG5²]ki}”䡸ù[Â#Gð%/S^ôÇJ¹´WƒL=5p“IÁ'®“‚@MgQ^|ƒ^µqÛˆp&§šÌRfĬ'Q’ôÚ÷ÂX½ZœèC2ì+Wd–”ý…TÝ‘¦$•p!¾%$•¢‡Z4#¿)a0G·¾ç°Ó†uÔÁßÚÖ‘¬kU§³U‹ŠtJÚÔFa«µ%ï×Vu²¹ÜÂh,Ý¿…WÌE"¨Œí4[Ò  ¤±ÆkF¥˜ñN°Þõ¢SUF¨ðWÖM¡¿ND&}Ã$Å‹ä#¥Uvr³~7*˜¾ÜÌ}‚gô€æº…J |»ÙÔ[¿3ïñ“†Ïš„ö¥èšÆIu¥‹ÑØ»†™ÜøbÐÚƒ4aäà®Ò™ 7²é¥¡TˆÖ>‹j:‰ƒ=Ö?²PjYÕ»Ù!Īu—ºx„*æ`Øm¢A-ºN?ÅléwñÌSä`ûö¨qÉÖ–°³p¥ÛaÅÞ # ,b9[‘uÚxÈ}¿µ•G µZ¨Âêf´p™<nÄ€Íó….5Òüð²ã6{÷Ç|‰Í§Îãèx9ù~ðä†{’ ¿´ã—IVx7¸ëø•לþ ’_:„ÓEË6J` >@G­€¨é>ÔAÚ¶›˜êбæŸÔÒ/?ÄF«ÿÌi™ô;˜:– ³ߟj5ØOÆj K HWd.>_ˈ‚ÑÁøAc~?V|†%î„|q…‘Õ ÜHÚZQ˜ ó„o;8pÕb™H‰[» v†i&w®$rB¥â‹àƒ¼­T¶üœ )IâTYtyPû0ÝN*WCGå‰K[–—ú³ A6¹· ÎÔÚ7:þì¡pɦH\%#ÇJMCù][\ÀûÝî‚bJJâ7¥í(³+”‹“…²ÿù ÚJJÅUä#°;÷@Ö´³ÒߤÜöýïõ6Sï³eÃ,\ìÏí/‡äÉV˜w!ã¼5íšLâ†ÚˆùÕ ‚J^uëõá}¤Úõƒ«¨I7J1 ñÉAvW«Í¯Ÿ&·þ˱WQÐÊ2Þ—fì…Ÿé•|Uჱë?MJÓ;$¸g†Ç»§÷~{k"s††Ì¬R«Õòle|m‚Üyk´ž°dýPé,-"MͲHuÀˆ¡[9ÑÝ[‚n,S2ðÊ9B«i³Â<cÛç#…ñŸ­YךƒÎ†ÇI0ÚaÁœ™òø¤’³Ø­Ê÷ôžÕvðzlÈh2v+Œýì#SÎd¤ U£µ÷Ú%§`Y½Ý-ÃYQÈ7»gï‰!âT4àËÿ䓯¡Ìdåqji¢Ã‡cãÀ#R‹ddÃ×€/òž¢’¶c;·÷޼ä᳓ÎôÒ/þ’”ƒ”Ÿ*KÉ\Ž áôŒ[+ÏÀ{Ò}@Λ‚ED…™bü¤ÄÙ1ñ—ú©â YË`sÛR^›¡òF·ÌQíy¤VÊ_g­²až¬*Ê”æýÍ•s!=ÖMÝfÇݼþF¨‰Jša4S9€¶Ç«Éƒ€Š:àVž˜Hýs<ú1ÉÜ1âz!¥UŠ•·HV3Œä­¥Ëh,¯%ª%ÍÛD¿žfЇ1t^ØÇä—3^ÔM€¯§¾Ÿv¨Vp;õ:Þs=î B¦¤±BÐOÀäþÚ  Iï–ü2õ Þ|p1’­©—ƒ4ü›„þ}£éb޾öÀcæNÕ”‡O c—¶½`èöp£=©ã»b×4—h) ]K"t­|Ÿ–©’½¨û¬üãs®…@qð²‚à ÷@•ïD K¶÷«[~6•ãŽñ^ù®›¾ÿ7¥y§ýØ129’ÀL¨Ï–ùÃ[3t¯¹°úúÂߎNügÓØÊ?¼ûŒ(ºšþmÕÑUVÍÒ2]zdûãK˜Ç‚Øaj oÞ8ˆ|ôñ’ø»wxY$"¹O›Cé:q¦ßÖ fóÊñ,èjw(Z v$IË->m?‘GÅÆ½rò O£ìÛ?xþTã+²Åt‘›xYrµ.5ýýiuÖ,Žö7òYÖfÖÞbõé™ VHU ËlÄ×Èé3v twðvhðÊ-G< òk˜4¦n5´1Ç‚G4L6Ÿ›’^G›Ô^Ç–…ã š6ðÞ’cNgÉM@µËÌù½0–€3/úÒ³í0t‰_ ypˆ{ˆmIØfŒ xô2Þ _ã½Æô'IusÏnãcž%…06>Z‰ nÚ>áwÖKžˆ8™C2¸ºÉ}lèÍ£¾É€À£dD‘)0oÙr…W–¬µªŽS¹çL ¬µâ0z¶Œ1ƒ/ͤ»ë8Èœq[µ¡çpá)˜>`sd4Z—d3!w³›2žÁ{Ó»®ÅAy¶_8 &«C@(ç|l‚;,ßUPo2QC€jÒÈ81A)BÙ^´˜º¡ÇÔááKƒ!æ,ŽÆ_ªõý)k$Øòʘß:¶&7DÝ$æw@áNé³¾Þ/y‡A©Ž#kV–îŸ^ j)ž¸öá¥KÚ4ng…®G`Í#¦zÆ3ú5:-o¦¤©%œ.ÛÐö/Ì7Fc;‚›ËC,_Ù‹û§hÑ!qÏå*¤Eù<àŠºÃ‹§¬d¨ìÁü³àßqRåµ­Ö“)nmý¼Ü &¢õ^ž¸‡Zv ;Øè:CÀò䡵Á,ÅóœjÊÛY¥Š÷r8äv=ZJ¢ý1xu˜rŽÏœ¿¦ˆA[ìæ€®ï/ÊIU…¼‰®>\Â÷©ÙŸÓ²êvG‡yÎ!ÊÏ¥qbÑÆ°7Ížltfå„Á™‡˜þ¼ÐwŒ<§…£÷r-¸{\*Š*+=ürd€ìmÅEš ˆööÊN#LHYŠ’µQy;éù˜‘¥Ó¶§i»Tð/……Pñöúµ)NB^éu¨Rf"‡<&q=¤l¤#™]’W|Ú­^7È¥4·þRéLD@¬5~…£”8b»ã Èú…axs^þb¦« ‹9(Ѭ¼4ìû‘&ò”…gVkøó\ð=wœ“vX³[| Ý/¡–“‡‡N&#fɉ«Ã½Õ£‹·mÅãn¿ÌÈ“­cÙ{˜ùŒP’‘qÀ%Ììt,ÁL6tgöùåGNäÖÛÊ4H¿‡kÇgšhó÷n!†â#µŽC¥:¯7$BÄðIQìaV¡899ã@}ÅmË:_Ú˜°6Zgà"õ×8ä·eïÛíÅBœ»¡÷®G²C¾ÈóÇB±CTAÓPݹ…!ìapRB$·Šbñí†ÁßÀ/ËŽUÑ 1 öYѧ~ .B°©á'él䓽e~h»XPÎ*«Íâ<(-ãÈŸ–Úm±ë¦X¾¶×.¾5¼¿\ªØBÆh.·žß Õ¬õ;‹@À¡¦D2nT”’laTwŸ{|6Îe‹æhÜ*éæ¾ëerL6˜ï<ÝÝÎ"¤g™”k·Dä1 v†ÃÔ_¾þn»8%¹¾"ãÛÇ¥ï‹Ç´'«Ø«Òûu̳~{ ÄV'·y¤ÅNO,6Cd\¹œ:l2¢‚=\Ìî5¡[5ÝoJþ¸…B7&6Úü*Q­†6ÿK Ôà‰¦8n'³¥u¼FaϷĨ1ž“5.¥¼c=Ý)›~¤ºÝ4„^>xg[;ŠKË]zŠ×oƒ_¡Ö@èXÅ › ¶!I#à‰¸ÕKŽ*…;ðYÛ8Q¤ž@…‘Ôê@@ÔSxgŽÎ:õMíXï ‹ò¤¿{’rU¬’ %'eôƒÜ8ód_в´|7FL`”ìÛ…ÑÜÇ2W÷™ñ EÙÄ=äu¸f¨!ÍTñP|Ú À;0’t¯F›´ «ûÿú÷ZÇ£JüÙì%€CP'ãí—&–¡>Ô9ÞšÛ†(<æJ¢)ü©ƒdG«Å ½—MT3îé´vç]¢ kP+Öælô2žn÷-ñ¤éŸŸãÐñ „§–y —[f›ºjDäb)ôöÎÏÏÅ)O'~¤È}(ÞˆþƧ7Ϫ`–èÓaä%þÀ™Ë«QàóqðÑÿÒ´’uÐÍ}ìY¥ñ_"”@s>—Ô(òV‰=Þ[ׄ‡-9#ç.ó.û¤ÿ˜­Kß{[ýÉa8î; ü—~4BH\òä—ias•]OMRÓøgYb6Ê(#†¦˜vågþjLÜ+m) –j/Ä}§ƒgOÇoþ\•awdzÔ8½7¸ã aúÔ·ZD—¶]™–ÆÙ*s*é7xÈ»º7’=}Ø™ŽŠ:HÛL¾¼7ÛÌïŒDõ¸¨ÿçÖ;a`>¸áîWÊÌ âIk+DÃcškØC #JdëçÚrC]¿º›·c¾:– Ý ÞŒií"n¿+.]îBWù{]”pÀá(ÄÈü!6@€‹Í‡XŽI,ü‚AÝîî&3^ï(ÛGI ¬qÜýD€î„*Ëx &Húê²ÎÅ«™I´oº`ŠK¨X¼ä0ΰ*VcîPçl5‚IÈNƒœ±¸ãû‘lt³'ýáZí•PDà¼/Lg?”¤ˆ„QMgí†E´‚ãñØeHU»´NGÓô(jVB?*×5"Κ…ÅáÊ|éÀ·ès_ ÖÎk‘Ln6V‰àBû|²xëh¯…|ϵ¡±Ê@€Ÿƒc,mUó¡êɤS0¥ê»j¯ávJÇ÷\Ãiú‹¾˜¾Èwç‚§XGÀØ/†c’ç„­…Aé5*¡keíÒ®[IyÄo.•êܧà!t·l8Eî¡ëcþŽ^¢üN]>ㄺ߻s­y§žØ¿˜‰âts‡Gȧì"“¶㾂Ú,-ûÄ æÀU= «\*”‘°‹_ºÙvæ_m@Ì®,®— ç¯ûÜíÿ¬š{aJCãU~ÄĔХ"ã,î˜ÿ.ðu ZuDÏíðZŠC+¦uÛGo`œ'©¨àùnÏSj­÷´o¼::e?Î=ÛÊ-ßÁd\ñ)»%°Ûö[3j7ìëˆR‘HCXfÁ_T.:#ÖƒD$fªS†RöY:ú !è]z¢Jãzé·³’Ñg¶-Ý Š#§hT³6è{«¶ÞÌtêOäÚ/ͳ$Y†X¨è´µ¿–éafÑ„è×~/XÅ@hD­p”’ŒÄ;ãÏþ ˆwPD‚t]nõÜqËSnÝ!Â3Ë‹¬¦{¹ìÍ¡œ.ß`˜F–¸ tpul³û#_¿GF:nÈxe¤Ušºê«ØùDL%ãõÔJc­šNÔš¸Z_×ÄÊád\ÕWÀ>oì‰Ê"†[—m||cr‚rO0ý Ù/M˹í"Ñ^ìó``q‡c1ó«g„Þ äʬT>ý; Àxq>c§ p8kK”'òΗ1ù+¼I¯3 ù…+E!ƒ xÚÌ7"Þ;R øpg  k­òâÒ>?ðØk ‡¦íÈÿ„K·KÕrÒÙ{üa(‹q)ÒH–sòeÞØ«5[/ŸfÁ±ÁÅ]Ë­%ÛÎ ¾cÞôŽÖU[Ÿž=—€ÕÞ‹TÜ‘bU¢‹$äÃ9lðºZ šÍ§éúÚ–<hQ+5jm º7ñXžÂCŠ}Ó¨ˆr~ç¾OsÓ›ˆE'ØA®AçÙ  msóö×%!£eM±\B_s ‡Âžb¶)ªA™ÿ+ÁÆZ.Û~¯N—çÍš¢Çô5ä·`kV[Ùj©KX½€•Õ)þ¹S}ŽŒû‡¦ìnZÔÕ¦,-6¥ô83ºvyfú°¦Þô¸_é´6SXÙÝ Í™> endobj 479 0 obj << /Length1 1647 /Length2 11847 /Length3 0 /Length 12689 /Filter /FlateDecode >> stream xÚ­vcx¥í’nìŽN²bÛ¶m;+¶mÛìØFǶѱÍî˜urò}{öì¹ö9ógÎüxßë} wU=wU­EF¤¨B'djo ··s¡c¢gäÈ[Ú»:+ÛÛÊÛsÉÒ)Í]¥\ŒlŸ:6822' ‘‹¥½¨‘  4ˆMÌÌ&...82€ˆ½ƒ§“¥¹… €RMYƒŠ††ö_’¿LÆžÿÔ|z:[šÛÈ??Ü€6ö¶@;—Oˆÿ±£ p±Ì,m€E-)y ¥„¼@htú,BÑÕØÆÒ ki´sRÌì6ÿ8LìíL-ÿ*Í™þKÈ`pvšX~º=L€©h@'[KgçÏo€¥3ÀÜÉÈÎåó\ì–v&6®¦%ð)7³ÿ;!'ûO ÛOÝ'˜¢½³‹³‰“¥ƒ à3ª¢¨ø?òt±0rù+¶³å§`oöiijoâúWIë>a>µ.F–vΠ‡Ë_±ŒSKg#ÏÏØŸ`N–§áêligþ¯ hN@s#'S ³ó'Ì'ö_·ó¯:ÿ¥z#Ï¿½íÿ¶úÏ,]œ6fôpLÌŸ1M\>c›[ÚÁ1üÕ/Rvfö&ÆÈM]þ©s:ý}A”õ ÕgF¦öv6žS ƒ¼½ËgHåÿŒeúÿ=’ÿ(þ_!ø…Þÿ?rÿ£ÿ2Äÿ¿óüïÐâ®66òF¶Ÿ ð=ø\4Fv€Ï]üµllŒœ-K“ÿËÕÈÖÒÆó¿sþwk à?²þÌWÿ#„ù'CtLlôlÿ[:‹[zM-]L,fF6Ÿ—÷·\ÍÎèdciü$ùïûýtbdü7ª…¥‰µÝ_l°ýC´3ý÷>yû»Y9išÿfÛþm¬øÙ.ªž@ÀDÒ³7ýÏÃ_PÂÂöo:&v.3ãç0~Ž#3«ïÿ#ìß@Lÿ:˹8Yzt陟ï>ÿ:éýŒ˜‰½é_}¤âbdgúÙzÿ)øKmâêäôÉøßÛà³òžÿ Ðh·¶loÂb•‘éR•72%ª3ÐÇ>êPö]µ¸0 Ö¾×?#b—«Êð­.”¾i†û½Ýsé—ßCi꣱>LŠÞ4àeÁW_ªþB”-òNš£ ý²/™g1ÞW‹²;ÚìŒêG{SJÊú¥oPø3,N0W¿©HÜ ÐIýLÒã1º›@Pë‹~‘'Ÿþ~¤î½ì?ģɇ%ãqƒøBà˜‹' ­Vå‡&'Û\5³5¶BÉÚŸQöÜ~BY®Ÿµ A´³ú«¨“GFöP N⽄ û. ÒpÙÈ^]î÷xvÜžR ÷°ì3%Ü­îN¥Ëj×4B³IpK¿ë[¹F¹ÓʪvxG saÊØî‚eÁ}ëî…a'`çm§@è®È»J·q¯æÅ;{?¦YëõûêÂf˜¨0XXÄ:•_\±Ù“æT¿ð9òÌ6ò”°(:m¯sŒ±UÔ©¾9£,åOÀŒŒt¸“s…"-«úÑ• ¢ÏQtAè™Ökøw Y#Þn!rŽÒW>IŸ¥‘“ÿ‡^øbhØqÆëð’ñENì9%!#i`@€¼ðצ‹:™ãzÈ÷D9ü€Š‘ ¨QëNj´Ýª”ëOqMNÇy§^ÀKÈiŽ‹ÞIgyèl‡Óîã…üï¹0^s¿µJa68‡qÔ}‚PÜ×'TLØgÔi\P~ BxVOóp‹ZY!諨¹‡DcdpY3.éœt<‹×7¦ÿ~³ôþÆüçšµ•¾Þy •³ÜSÙ•ª¤N‡î b.s¤ˆ3o7M¿ԘΫtZ¦pâ(5bmÈ+(éTƒ¶~[Cuü§N¯²­÷T©ºV‚Haatüm¡,tʤ$0W…yÖ™ïÃYÔ}ÖU^‡ˆñÛÃZm¬n!\_]aÃèT•‡|à ˆé~æ_Ö]⬤}ph\×^àM ݇¾ÕîEkêáæÜc;n\Ô G2agxŸÉå²êRŒ åëKª4Ar¬(ÜìvSâÌÈ,°ÙMO_ÏW'lpf¶ß¯#à–é¡uÊ*DY¾YKr›b$åŠË‹óx³UñD›sI²±ž0ì£uQx¤qª{Hí=¾üÊC‹ñõØ8áê÷e·@%§º¡~땨¡}MކÛaGUu>y±ïPæÀ[xÌrðäƒ$üÐIN†·¯½ým±IÜ-˜fÂ÷Ãÿ,XâCé[ùˆHG¤{{Ây¤1ûaÀEL3vÅ8µ †L«úN ƒFåy.øL|¨:8R .€ÞˆWÞdÛn‚â4@n{ŸÅ‰*ˆ…&Nâ„}÷åÐ)¯Yűìô¶s}G˜À×~Ìî¶Õãy^Õƒ¤ÓV„²X{”¬>²gêQ÷Bê›Z•¤E(Í/.0æÄ2ë'ˆG%ÌÛâÄáÒ[¬ÜÔŸû¯ ƉŒ»У˜¿¸¥´Hc8œì@¶îÔcô4¼4©˜ÍáQTqr |sùeŠb"³ÓÍ-DS£,uL¢†•æ§ôÎ8²÷ëf7u\ňȭG±{ΰŒŽRQ ä\4ô•^ †xL:UÜÆbè¾ÈyÀœøªJÄK²a…9·Ì#o‚'ưÞéØÿøÂž ùð= ¦Ê‹ŠãuÎG)´¥ÜéìºE»[?WÙÃìwxI[³É¥—'nœÝ•ê ÅÆAùü·Ñ­RtO½„ætP–€ÍìðHi¾ÙoIˆÔþ#¼çQ‹Ì-}oz7œ«õÑ»F—öâT"KÓU½ÙÒ?©=•lhnŒš–š£Ð×] ' –Fåmâ öŽ3݆—™Tâ>B­?ÆtŒÝØ`}}¡.Á`MdB9ã*G#½Õ4W#ëXA‰{œ²N¢°¢!él…bsIók*·^ é=ÏpÖözl¦Ãúó¦à‹aÖØ7§ ó{UB``˜$A;H,Ï Ô àƒ«OÙ f®Âèð]€0îùÊÖ‰±Q8ްq ˦Ǔà6‰¦ž…’/-—·¥ÔXd_î¯D~ê7 /­jíÕA7øÙ¢a¯™ Z…•½‡2‹%jþÉ”ÿÃ@¸AbüʽòaKRòQ»5Ö¥!3M]€ïAé ËÎÿ»ž}AÄ'9cõ‚üÔ9gs®¡‘»A5ÊäCPG©ûR"2CzvŸ„“´m$-&(€»`öQPO˜TrNSÄNÉ[ë5e^R(½Ä*JžÀ:Ô:`ÿÞÉx„1Kk£¹M!¾Þje²ò‚`IÐܼʂܼ[“{tBÐ9Oožîª¡cJ^΀Œ¿ÒP˜}¨·Uˆ;¨"í'Ø+uÂÎå.§Øw˜?G÷+GÍ=aü&̉y´Js†&cB†GŸo$¯¤2­T@I¡‚Á+Ѷ¤Ïšv~ãO6Ÿ†>;8nÀ79KxðÂÜ\p޲GŸfDg‹¯­qpif3틺1Ô%Ñ{&ŒD ¯8ħû]ò/é Ðì/H²ÉÉïQDbÏ\./9­rVé«…KQ¶ÜÞ qfÕS¸ä÷RlÓ®ˆ5ïdõ}Ç}õ I7ʵxý"‚ÜhÄ(lÍÍ¢öø.³¢ÃB’bp ߔާ`) ƒêŒRMKg+ÍieŸ ¸§—гÇ¥ž,ñ&’Eu¾¼1Ïën÷!Æm>;]µðÛÑËÛí±Ù§ÕÜ:³Ým} ©ö×  Æå»Õæeqø[—®?´¦OŠ9?;‰yzSzÓÃ<î§7¦ fsk_ÔÊÆRE~gKzïvxáY¥‹Fmv؃P”³Q¤ºµR@®W²ÆÞûƒaÞƒ«Rö]i‚A—ø#*è5¢ÄŒ‘6^µíp¨Â†Ì2FCø, ¸eâX¡RLÒÜË6Œp*ÉUÒ$’ËÚè‚Ú?®hü÷ÁÕ‘±¯g~RPÙÝ=b‹¸eLtÿÊNúeiá{±aêm¦U$ n$e–TR{^oLÔ°2Ò33Œ›(’®Þ²»Lƒ"ªª˜ÐÿqË4Ú¸é’' Á»+?’àëm)ÝðÔ$OÇHj•D»€S›Ó#Ëwg÷„É™ÖýBm|·‡~ÛèäÔÊ-_ã/–ŒÌTMp¢+§°µnú Ù¯Ž%ìPXï¾FOQÈk!‹îàq+§¹H©CÃî€c¡§Ù{耳†÷ØÖ %¢¡—œÉ¡èÏÇ­RëteÆÐïÔíÙ}og·Ø«Iq+nEǾÍj6Dª ˆô%‚zgg7r¸ < h¥+´ÄMÇò^§ˆ{ï|euWÆÖ*W(§6?‘ø°£Ãfl—hF‚…èZ‚óH”Ä!A;rîÇ–ß;`ëŽàY~•õgD´Lšt4Ñ%ªìX·žon@’„×áµcd ²uÑ«¥eyÆL$vðóþ¼¾È.Ì_Å9«ü[z”žÒÅzÏ´nòéá2ÃT(`µ?Ç[b­0ƒ‘²ØÆJÄpÊüŽš»S´L“R5Æp73¥'öûTQæÖÉk®2÷klÀ°ûɪ ;©¹Ö9& 7XÿQÞyV…Šdöô>*¤Àdöœö(跛ҸΠºzŒ;l7d9Òïp¡Ї8”ÚòZ¬zº–½>žœfîÐHiGl%bºÞq+kßÖY?Ÿ¸q¿È Ý/½Ü6 2 6É€¸¢ÍÉàÍ–({%¤6¯ÚdÚðJÒþ–Û ÈSäð¡QéD¯£g8ÛUþ"ÖÕ}–çåaªTI Z–èÙYÓ8Ë$‰RÏú€G’ú7a4Š›Ú•÷Úña'™¥*ÆUOÓdÒÆ‹Tßî…†ÈFø¨ÛõÀ%Kò–hf˜ÇÚ±-³-¤/){hu®`˜¥Ø.¡¢¡iPf1†À@æ_¼¬’Ç^Uކôèîa%Îßãù+…Bjî&ÚŽ’Õw.ÍÛ¸¤…Ø‚&¹¡[$ÙjÒ~`§ˆ^©Ižt*­¸×leÊÃð1-²u6}û1³4×Ç?l~^3ŽÎÊ–_±”,Nûüõ‚ÜhìxÙ¬m•jCê‰,u9Xs¨sõs_ ›Sœ–Þ[9CÁ¾1tË¥âÊâ¤üB«ÖòÓ“mcÇmt Ã\®«LçYe‹¶BÎAY©!¯ƒMAªâ}øtÊí.­R¸÷˧^„­¡©Æ†nà ¨Š¥ô~j ×É]HûÛ*Ö3Þpóš·yfÜø%rÞÐbÇ ÝÛÏÔ#<׬_çÁ$Ó²ìqŒLìöëÈË?ÕÄ´?t¥ß̹ÊÙ6™Î3í`²a;:¿C°f„D¡ÎÃCB³6Ø{βíâõò~ˆ€Ík×{ÛçÜzÌÆžÚ4˜ð¼ëõ”“èb{4-ÓÊ^#´_Qžzh$Sð€hÝIãJ”[Nµ‚‰ˆÅ-™ŒòCÜåøÎôÀæ §]‚‘ðaq±8øÍ¾ø›u$FFû\¡»×IJƎ£ð£bÅ—wEÜî_íÌ~Tæ‚×[ÙÂÅ:9ÕÉE æ`»;¤Rómh'ˆ…$HB¾3çY/ƒüñÍÁº OmØ[íµäå#èòu²™ùίYjy‘ÝÇpâå³Aš$¿©5 3âZé*6¶=0Jnƒ^3ïšø!~̘µÅ˜øÁ¹ë*‹0¹z:ó¾}˜Wz«4ÌPÍL€”z³r–€ëàÄI=>ßuÊÂŒ®(ßÄ÷ÎŒ1ÖnO™wÞHò= œ=-AôUR$wñ‰?f(Q»ØŠ0¶ZjWøœ«Ž ‘€N`!$µE.Ô Zámöïý"þ¾‡EÅ|ñú:'Mb4•Èm~’}\Ñ™@Õ ¸)O¿¤ðY›G‘£_ì½â^ücí!¯Ë¼Xs$+ ùfù^kq {7¼­Xϯ`zO)B¼¦Õ¡ð_Ë)¶õÑô5Ó^³ä0ù¡›ºZ™‘izAêÔDó·‰o¾O×›'cT ´Ö¡á{1MCêG!´Ãˆ-…Áò·Æâ)/œßØ "ÎN³¼IÁ)U¿+|àãûóIˆÝuNö]yÙ_Èúf?Z6É‚‡_‰9uùk3èš›TTUr\†øs.²6ÙšáøJ¿nÃ)µy!²xéUdüzŽÚ Yʘ(;í{Ù)½0³#Q%ç::Cк>ªñ¼«lÞE@¿=BÍ#O[pëÁŒ©ïm“•Ñ1kÒcœ¹Ðë2]ývÑ"*Žö„µ23¸:;ZšÒt¥A[ÖØ[D•rf7½èç¦ì®õ@މ=;­÷—«ä–8 C-y~ØX?,‡›ô¹÷õê9»\ÌìÔ]é´8MªáÖþÖaðÁ|à¢,“ê½´â›lÀL«Ã ˜[„3üÅ:¹+J&Ƹ¦-©â´ó$ÄUkõã­Ÿ@Š­ÄÃÁãÕ×Qq†Ð[Ó%Ú¹Ž+«FŽC+uÃù0²”þ³.µï¾™€€Ö´¯)Ž¢¾^màš¤±pzFdÂÆ j+fU-evNPÑBV1Òϵyĉɯյ¯&­ÃÜóë뉮Î-CÇM~ßo ZùÙ´^¯·hù‹: tH’Çl©aíøñœ·òJ¹·'Ç´\Y'£òP8ì¦a´³Zá–À.Ú°fè*_y· Bï~öÛŸë­WËÍî ˜¹9Sè\UL˜£ìîgèß87iÞϺ¹«AÎÃä$ Yõgô~ñ)*—úö¡x=&]vL@"6YNw xó2noŽŠ›Û´Æ³æp Þ0ŒÓ-з©Îç’ë§Y_]K"L"ƒa¨ÓWŽë¥¨\ã;[·ø¸‹A¢šD´rIŠGhÉ= Í_™–1¢"çäÜ$Ãy:LÀôBÃ_½ÞmÖÂKp™ò{B.´¬Çi6+6ØWc&ŽÜG¯à^9h£ù>(n­už¯]¿ô»%Aä,tëC3È¿ ãHд°ÏðÍ”²ú¶ÅÂovʵ‰U©¨%ö~×F~áÿ™ ¦TGwmÇ&áJ#°Û›*Šé9SÑD4šOPd¸¸ {ÞµbBÇõŽ0¶@ؽ•ÆÊ°4z °òÃDBŒ¢Rð‰rnrŠå6 em"Ðꊆ»¥K ¸ÆrÝiŒ5C—Ó3W®ˆ¼_ \|0“ãp€¼.=YMzѾ*¶™Œí’yŠÅz†ŽœšìHÓ¬+àù´Û2l§ )ôÊB=xE§È*Ï9Ê[¦ÿÈP¯¼ok’6‹ÿøþ_°ä·fò0[OH\!zE[lqg7Ú¦Ë+þE¦¸•>¦¬`âhÖþxÕ Þh¤ökæü\–Zþ8¹õYÐïé^Ú44©ðÖ뉅q+±fî> ÖÜÃT ±óëíÓ;DPüfu©¸—¼õЉË†\‰åSÇ„è,È—mºgúš”¡zA%vÓL+êëã´*øo©j"ü4YDJ‹Äè1i5CJA htÜ:”é)@PÖÓ–Sªè’TLåÒ¡6ÿˆÓ·260‚«J£BÁ”<©ÁµË$•‘«Sßwk+g)ûë¶@XüÜ|z/¿¨x![CÓ`6ÆL½^Éq^ ÒÊ/ï)Žð¦ †¡_¢¦˜áŠý'C™éŽ­ø¢f,“’øV°+8qTT‘{¼´ú2‰•t°#uÞï¾ßS²Î;Õ•=¤0\ÔȘÅíÙ‡Foûx^K¿Áðà1Ë©÷ÀsñsŠwüà>÷¤s)&ŒñdM®„]à£È¾é‡^ÌjLÕö”؃d15+¿&ܪ?"PUE ùÑ&=u:né],v /0÷Ü«À³áYzS îüâ—P0Ÿöth‡¬7–W¾Å†}•ìÜú‰ ô„¼¸ߦ²Jð’Ñ“ZWË>О›®äôÀ^ÏÆ¢€ Ïð¡à4`MŠÞ¼2ÈSû)š#Ú^b9ñ'ó1yU»L@­DÑV|<»¡fôò«˜çyCîÌìyÝ7±e¢èd÷ѯf”…ùä[Bò _ÔࣾN¦Yc±P’¤‡ë žw‹lla‚ây².àïtIàh.¾LÄ=§ÎºÍ…(n´ÍÌE•jù¸ºx(¦‘ È@fo‹íÚvT§59ûR„Ší'Ü9Ñré0Àƒ7í ƒ¡‡ ™Mƒ0êDJ€ÅAR´J#w}3=P4M©_/Ë>Ý£:y®ÁsIíïÊFÎ2áôòl?…)æj§ ‰äô€Õ¶¾k(Çp<‚ÑY†SœÑM „q¤“`ÏË[j¬ Ùš¥U‡‰í!m,Á6ý€Ð$«·VØáx“µñ[óžÓÁ2¦­JC·…RåV™Âd•YÅÅQ8[ CKvíŽ.rî„|äíÑ Mpk®ô`+l`NÓ½éîÓwy¢q¡£2¢7§²uµZu‰I݈]nlµ %MÁ™p;0®<ºužWìÿð)Ü*Si£þ@©Ú{Y4·+—9¡áª‹`R&`w¢*%4¾÷\-ä{§î$8 ôÅI蜞™Bœˆ„êæÁ…²­ÚÀÆâà”Ì…^‚,:w/Ièåïc)*íTåGnÓ×ÕÞ;ŒA ÝØGû‡@;v^„½ðñS ©{™²¿`¤Ïs3…cœäq¨+¯2³²ˆ7iÍa°à'óÄÄ©â²ÙHNìA*kÖˆÒ£ºË0J³ÒoÖÝL~ð{Oq^q9ŽqZbRéc‰©V‰Òz_öàZ0$M&¯)­íПåq"àŽoûB~%eåýÌ”l0 ƒ·®q«×F‹ ƒF@^ÎOrínŽ(fæþ90,¹a¥åÒ˘ ‚öškškËcq¤šAÅaÕf~ÏS&rç³Ûnõ–ë3Bg±]4Gªï/¸.£ñ'vÒp£‡Ž¾ßwK W€->³£ï-ä–¯X÷»°uDü•U¶ø|ñTyöQ„Ô¹õúM$.Õ&æÊjå×÷ËLž®o“¨-<ŠYŠ3PÏg%ñ§ á˜Üés6/[¿U¤ŸÖwz!§L·YFÏùˆðõìVø¸:“b ø–麃y¾“0W:ZÐèŽ=ŽìµH?*È1†'¿íÉkª‡Œä"êYµí”íú{f2·P$B 0ÔÝßÜm–aFâ~,t>>êOÎ õCøøC³«ôSqWÝæ_do˜a,›MO5ì¤AÞ Äs·¤® &µY/@¹ £qþ9Ó@Hõ»T¾´· jŠvN¬=Š8œœÓòKs—z¡B‰~a”õuQéG³Å“™%FUì Ï*7»ºð¢÷s•Òp ƒ™k8žÞôÍÊñžç„Óó¡ìypÎ`%(ÛŽÄ›siWîêJê[5ƒê¾SÇ’If³c&–˜}õÞ%r°´JfžõâOÓGQ‰ ¥:5IuF[$fÙ¤ oï} ªÅW"¢øqþpîÖÈ@Ê,†fÑ´¸Š”á:«€ïX.¼JáÇÀD ¨žP¨1y)6Mös»¹õLSéâÒPg±.= Úq /ÕŠÍß" ß8œ&Ÿ4Õ!óêSŸ½2-¢•>ÏÒ8BÆL§»ÅœíNgÙuªßyˆU¹_¤»CáÓ‡« ¹'ÀÏñ¤ÐL7…ƒ¡ùTuòŽ8Âf>Á»¹“$zª^d&èÉø¾i¸X.V'éÔäîYäQcŽØ@ý$ݶÅæ£žInq;<'½a·JVv£èï„Æ’øi~¯ù@zoPˆçí…‡óTHé>ްœË8³¯Ú*& _Re?M!pÌùž±Ó0¦ÄÅoœ`¤h8×A^¼_°±‡Œý<²$o}¸7#Ò©ð2ïkÍÌÁ”=Ž¿ =­>%Kj¤ÇLåø˜ß6ð‚NªgÉìe íX5ÛTäïYZµluù€*AüþµFm¿W{€ƒ@0Ê'öã EYµŒ-Wªjˆ²S}ßlTp"ä.3X8EÉ‹e¢¨OŠÕ8”)åè¸v‘³Wš¦xã,‚’ÐÐ9hùþ´ÀB–ÎãH©)E2 F|U׎¯A ü1ÊÈD;»1ýšËaêÊ Å쮫Bô6ï&¢„óeàE$mãÃÜ“wçºð"Û‹þ7]—ÜmA Å„«bß Rêëéã'»²l=¤6dÉã˜#É5;¯‰ÃPP‡jñn_»öj,kùÝ.cFD „5éç¾=!³¹U×Ùw"òŸNp`G¦ˆž~ïfP~~nëH‚õЭ°7Ð)½ç1^:¹<-ç½QÅíåñ6+7öbd™D’PNf‚LWÃk«ë¹X_Gh@àµâ`  ‰aÅZ¯ÄIšNE¹ úÔ¿[+°iàç@‚×ßK½&,¡Ÿó´U 1Ôš-çæ¦ÌC†g0ží~Áz%bšÒ0ã>cyËÁËyȺ7P!Dåæë…dCÕ«2i BÅ¿áp¾EÊ#­&8£9†@€5¬±'n)¶÷ŠÈ7Oµ´àü¾s°ÍËݸž CãƒE*;©;”!Ó?KÐÑ I!½PÊÒÌ(Â/pfñ€Í¨•5a6|@mÔ6 sj¨ÓíÎJŽG˜:™÷“•º9üAÒ‘_ô2Øõu+YJ“êT¥Eƒµ‹UCiÈ-ûöµ6áûЯ ,šÆwtï4pä—{_õ¾æÅ‹ªûͪ¸)»^Ð®"°-S……ë$N=Ц ‹Ó—¤ãÔT‡Ô½9ÖE–óÑT­|eœé~好+á{J›Æá]}(^†êyrêKÜÑÈ×_ëÿÍ­u­ö%0œOÿþíHá©DITÙ–ÄP©Ï)ýI%&—éŽÃ’„ÇÏYÕ½;Ðj­(ñ£DèR¢dHÉ9«¬µôÏ ËŠNï+ž‚LÏêÖ×:ø+ÿûÙƒÁ왓òŽßÈ(oL¼H lWövÎe3ý²:mj$âÊ/]…X¦þ÷Pj/œÊ°zÓO¨©¬®ÑÜO] w‹ÏšO™åðáIõ¯¹£#ùà|·G1ä°6òÈPÏsnZUñ*“% .Æó×8iÏ}ºÀÛßï,8„éXš»ò£\ïâ6-¥‡Œê¨ ïá—¦ðyLy§7(œU²ÙjIÍ€¨r٢žÄÊ «rZNmÙæ¤Ç,6Gÿ\0nÑ8{P.Õ’¶ÅVe-?m4'â^n¼‹kr=ª™Í´ÄâìU_?#7tqj€¡6ú~¯Ê܃çI‹Éš3·áTÚ×ñÀÍÖëçcm¥³o³eàÈ¢ÚJ,C臾¿A\ikQÞLÇì¦d¾ã Q÷ØÈç{ÐB#lÔ˜Ÿï‚½IˆVò”²¥v¤#Ÿ#6Εv¹VXïv˜Û±‰£¾ŸVÜb?hø‚jdç¬À1ûæ0FÈEe–8´/Q±ÞŠx”ýQ^Ïǧ١dËöK­tÉ ÆÒ¤Þê7Y¢q/U—#.¸UQU룔=hq\Á8%QjÛœé©Ðv gMw¹ÀìØŒg“M8»ö®¨ Ð…3³÷Pu4´]4©4CX‡`+Ö«R u é¦`ž°{'ÂÓb2¹Éqœ1Ó½1Q¥d–“^ÖԾ㙧ÓööŽ‘Ù+´:Ì¡«a5Éã‘6E?w£®Ì8Ø<Ù­nß ¦%¤Åµ–ʨ Òc4÷{û˜×m’¦_Q@¾Ü~´ÂÌn±À”Ô<vúWaÞg¹¼=n.@úÙ  é,Æðe2ÒÉ=·¿Íúâ‰|B•X‘Ñ!:‚ïTÔÑSü[õG8ríá¼Ãö»ÿ¹ÒÌQ”l¶&o‡úçÉ;ÓÚnX‘žÐ„!lªp~«·‡ƒç¸ƒ‚2 Ðj-*5+¸Œ¿Ê 51©}`È9@š†²ÀÌ{«g'T¬ ôÌ æùâÊ!Þ ò¨Ä‡Ù*Ή¾]Ñ@ñ¡6•šž{9©ÙÀ›ÿ¥zù£1±7Ô¨…}DV:ú®Ë-én~²§²tÕEsêv6i¥ÇK —{îôVGÉFt ì[`vý UŸYžÈ5"KÏ]ëLàƒˆÆ‰,¥ßxÿOpðCˆk^ØÔºƒîOÆÇ 4Ȉ}úÀŽÄÜQoÔ¬·¿ÏRIïZ”¥Ýï µð}A$…Õ†êšÕFh:Zwwãf–ÏŸr$[lŸ˺ʓàó wçóôººDý×?G»r¢ßX¹†mÃkS–Á‰ã—¾oûâ D+Sw> endobj 450 0 obj << /Type /Encoding /Differences [2/fi/fl 33/exclam/quotedbl/numbersign/dollar/percent 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I 76/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright 95/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 124/bar 147/quotedblleft/quotedblright 150/endash/emdash/tilde] >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DWOIGP+CMSY10 /FontDescriptor 462 0 R /FirstChar 13 /LastChar 103 /Widths 457 0 R >> endobj 73 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XWOWAL+NimbusMonL-Bold /FontDescriptor 464 0 R /FirstChar 39 /LastChar 124 /Widths 451 0 R /Encoding 450 0 R >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MZQNYL+NimbusMonL-Regu /FontDescriptor 466 0 R /FirstChar 33 /LastChar 152 /Widths 455 0 R /Encoding 450 0 R >> endobj 55 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LJRQAO+NimbusSanL-Bold /FontDescriptor 468 0 R /FirstChar 69 /LastChar 79 /Widths 454 0 R /Encoding 450 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YAWWYX+NimbusSanL-Regu /FontDescriptor 470 0 R /FirstChar 2 /LastChar 148 /Widths 460 0 R /Encoding 450 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AZTDRY+NimbusSanL-ReguItal /FontDescriptor 472 0 R /FirstChar 46 /LastChar 121 /Widths 459 0 R /Encoding 450 0 R >> endobj 17 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PAGOPL+NimbusRomNo9L-Medi /FontDescriptor 474 0 R /FirstChar 2 /LastChar 151 /Widths 456 0 R /Encoding 450 0 R >> endobj 58 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JLWSTV+NimbusRomNo9L-MediItal /FontDescriptor 476 0 R /FirstChar 2 /LastChar 121 /Widths 453 0 R /Encoding 450 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MJNAVA+NimbusRomNo9L-Regu /FontDescriptor 478 0 R /FirstChar 2 /LastChar 151 /Widths 458 0 R /Encoding 450 0 R >> endobj 59 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LMSJSC+NimbusRomNo9L-ReguItal /FontDescriptor 480 0 R /FirstChar 2 /LastChar 148 /Widths 452 0 R /Encoding 450 0 R >> endobj 7 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [2 0 R 9 0 R 15 0 R 20 0 R 32 0 R 43 0 R] >> endobj 60 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [53 0 R 64 0 R 68 0 R 79 0 R 87 0 R 93 0 R] >> endobj 108 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [103 0 R 110 0 R 114 0 R 127 0 R 134 0 R 140 0 R] >> endobj 152 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [146 0 R 154 0 R 163 0 R 172 0 R 177 0 R 194 0 R] >> endobj 211 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [202 0 R 213 0 R 223 0 R 230 0 R 238 0 R 245 0 R] >> endobj 255 0 obj << /Type /Pages /Count 6 /Parent 481 0 R /Kids [249 0 R 257 0 R 262 0 R 268 0 R 275 0 R 283 0 R] >> endobj 292 0 obj << /Type /Pages /Count 5 /Parent 482 0 R /Kids [289 0 R 295 0 R 299 0 R 303 0 R 307 0 R] >> endobj 481 0 obj << /Type /Pages /Count 36 /Parent 483 0 R /Kids [7 0 R 60 0 R 108 0 R 152 0 R 211 0 R 255 0 R] >> endobj 482 0 obj << /Type /Pages /Count 5 /Parent 483 0 R /Kids [292 0 R] >> endobj 483 0 obj << /Type /Pages /Count 41 /Kids [481 0 R 482 0 R] >> endobj 484 0 obj << /Type /Outlines /First 310 0 R /Last 448 0 R /Count 2 >> endobj 448 0 obj << /Title 449 0 R /A 447 0 R /Parent 484 0 R /Prev 310 0 R >> endobj 445 0 obj << /Title 446 0 R /A 444 0 R /Parent 442 0 R >> endobj 442 0 obj << /Title 443 0 R /A 441 0 R /Parent 310 0 R /Prev 439 0 R /First 445 0 R /Last 445 0 R /Count -1 >> endobj 439 0 obj << /Title 440 0 R /A 438 0 R /Parent 310 0 R /Prev 436 0 R /Next 442 0 R >> endobj 436 0 obj << /Title 437 0 R /A 435 0 R /Parent 310 0 R /Prev 433 0 R /Next 439 0 R >> endobj 433 0 obj << /Title 434 0 R /A 432 0 R /Parent 310 0 R /Prev 394 0 R /Next 436 0 R >> endobj 430 0 obj << /Title 431 0 R /A 429 0 R /Parent 394 0 R /Prev 427 0 R >> endobj 427 0 obj << /Title 428 0 R /A 426 0 R /Parent 394 0 R /Prev 424 0 R /Next 430 0 R >> endobj 424 0 obj << /Title 425 0 R /A 423 0 R /Parent 394 0 R /Prev 421 0 R /Next 427 0 R >> endobj 421 0 obj << /Title 422 0 R /A 420 0 R /Parent 394 0 R /Prev 418 0 R /Next 424 0 R >> endobj 418 0 obj << /Title 419 0 R /A 417 0 R /Parent 394 0 R /Prev 406 0 R /Next 421 0 R >> endobj 415 0 obj << /Title 416 0 R /A 414 0 R /Parent 406 0 R /Prev 412 0 R >> endobj 412 0 obj << /Title 413 0 R /A 411 0 R /Parent 406 0 R /Prev 409 0 R /Next 415 0 R >> endobj 409 0 obj << /Title 410 0 R /A 408 0 R /Parent 406 0 R /Next 412 0 R >> endobj 406 0 obj << /Title 407 0 R /A 405 0 R /Parent 394 0 R /Prev 397 0 R /Next 418 0 R /First 409 0 R /Last 415 0 R /Count -3 >> endobj 403 0 obj << /Title 404 0 R /A 402 0 R /Parent 397 0 R /Prev 400 0 R >> endobj 400 0 obj << /Title 401 0 R /A 399 0 R /Parent 397 0 R /Next 403 0 R >> endobj 397 0 obj << /Title 398 0 R /A 396 0 R /Parent 394 0 R /Next 406 0 R /First 400 0 R /Last 403 0 R /Count -2 >> endobj 394 0 obj << /Title 395 0 R /A 393 0 R /Parent 310 0 R /Prev 322 0 R /Next 433 0 R /First 397 0 R /Last 430 0 R /Count -7 >> endobj 391 0 obj << /Title 392 0 R /A 390 0 R /Parent 382 0 R /Prev 388 0 R >> endobj 388 0 obj << /Title 389 0 R /A 387 0 R /Parent 382 0 R /Prev 385 0 R /Next 391 0 R >> endobj 385 0 obj << /Title 386 0 R /A 384 0 R /Parent 382 0 R /Next 388 0 R >> endobj 382 0 obj << /Title 383 0 R /A 381 0 R /Parent 322 0 R /Prev 370 0 R /First 385 0 R /Last 391 0 R /Count -3 >> endobj 379 0 obj << /Title 380 0 R /A 378 0 R /Parent 370 0 R /Prev 376 0 R >> endobj 376 0 obj << /Title 377 0 R /A 375 0 R /Parent 370 0 R /Prev 373 0 R /Next 379 0 R >> endobj 373 0 obj << /Title 374 0 R /A 372 0 R /Parent 370 0 R /Next 376 0 R >> endobj 370 0 obj << /Title 371 0 R /A 369 0 R /Parent 322 0 R /Prev 367 0 R /Next 382 0 R /First 373 0 R /Last 379 0 R /Count -3 >> endobj 367 0 obj << /Title 368 0 R /A 366 0 R /Parent 322 0 R /Prev 364 0 R /Next 370 0 R >> endobj 364 0 obj << /Title 365 0 R /A 363 0 R /Parent 322 0 R /Prev 361 0 R /Next 367 0 R >> endobj 361 0 obj << /Title 362 0 R /A 360 0 R /Parent 322 0 R /Prev 358 0 R /Next 364 0 R >> endobj 358 0 obj << /Title 359 0 R /A 357 0 R /Parent 322 0 R /Prev 355 0 R /Next 361 0 R >> endobj 355 0 obj << /Title 356 0 R /A 354 0 R /Parent 322 0 R /Prev 352 0 R /Next 358 0 R >> endobj 352 0 obj << /Title 353 0 R /A 351 0 R /Parent 322 0 R /Prev 349 0 R /Next 355 0 R >> endobj 349 0 obj << /Title 350 0 R /A 348 0 R /Parent 322 0 R /Prev 346 0 R /Next 352 0 R >> endobj 346 0 obj << /Title 347 0 R /A 345 0 R /Parent 322 0 R /Prev 343 0 R /Next 349 0 R >> endobj 343 0 obj << /Title 344 0 R /A 342 0 R /Parent 322 0 R /Prev 331 0 R /Next 346 0 R >> endobj 340 0 obj << /Title 341 0 R /A 339 0 R /Parent 331 0 R /Prev 337 0 R >> endobj 337 0 obj << /Title 338 0 R /A 336 0 R /Parent 331 0 R /Prev 334 0 R /Next 340 0 R >> endobj 334 0 obj << /Title 335 0 R /A 333 0 R /Parent 331 0 R /Next 337 0 R >> endobj 331 0 obj << /Title 332 0 R /A 330 0 R /Parent 322 0 R /Prev 328 0 R /Next 343 0 R /First 334 0 R /Last 340 0 R /Count -3 >> endobj 328 0 obj << /Title 329 0 R /A 327 0 R /Parent 322 0 R /Prev 325 0 R /Next 331 0 R >> endobj 325 0 obj << /Title 326 0 R /A 324 0 R /Parent 322 0 R /Next 328 0 R >> endobj 322 0 obj << /Title 323 0 R /A 321 0 R /Parent 310 0 R /Prev 313 0 R /Next 394 0 R /First 325 0 R /Last 382 0 R /Count -14 >> endobj 319 0 obj << /Title 320 0 R /A 318 0 R /Parent 313 0 R /Prev 316 0 R >> endobj 316 0 obj << /Title 317 0 R /A 315 0 R /Parent 313 0 R /Next 319 0 R >> endobj 313 0 obj << /Title 314 0 R /A 312 0 R /Parent 310 0 R /Next 322 0 R /First 316 0 R /Last 319 0 R /Count -2 >> endobj 310 0 obj << /Title 311 0 R /A 309 0 R /Parent 484 0 R /Next 448 0 R /First 313 0 R /Last 442 0 R /Count -7 >> endobj 485 0 obj << /Names [(label-Bdb) 286 0 R (label-Gdb) 242 0 R (label-Pdb) 241 0 R (label-bdb-module-class) 285 0 R (label-chapter-pydb) 56 0 R (label-command:aliases) 199 0 R] /Limits [(label-Bdb) (label-command:aliases)] >> endobj 486 0 obj << /Names [(label-command:basename) 97 0 R (label-command:break) 137 0 R (label-command:cd) 187 0 R (label-command:complete) 200 0 R (label-command:debug-pydb) 100 0 R (label-command:deftrace) 98 0 R] /Limits [(label-command:basename) (label-command:deftrace)] >> endobj 487 0 obj << /Names [(label-command:examine) 167 0 R (label-command:file) 183 0 R (label-command:finish) 150 0 R (label-command:fntrace) 101 0 R (label-command:hist-filename) 106 0 R (label-command:info-args) 159 0 R] /Limits [(label-command:examine) (label-command:info-args)] >> endobj 488 0 obj << /Names [(label-command:info-globals) 169 0 R (label-command:info-handle) 217 0 R (label-command:info-locals) 160 0 R (label-command:info-thread) 227 0 R (label-command:ipython) 180 0 R (label-command:kill) 206 0 R] /Limits [(label-command:info-globals) (label-command:kill)] >> endobj 489 0 obj << /Names [(label-command:linetrace) 107 0 R (label-command:linetrace-delay) 117 0 R (label-command:list) 197 0 R (label-command:listsize) 118 0 R (label-command:log-overwrite) 121 0 R (label-command:log-redirect) 120 0 R] /Limits [(label-command:linetrace) (label-command:log-redirect)] >> endobj 490 0 obj << /Names [(label-command:logging) 119 0 R (label-command:next) 149 0 R (label-command:prompt) 122 0 R (label-command:pwd) 188 0 R (label-command:python) 181 0 R (label-command:qt) 232 0 R] /Limits [(label-command:logging) (label-command:qt)] >> endobj 491 0 obj << /Names [(label-command:quit) 205 0 R (label-command:restart) 184 0 R (label-command:return) 151 0 R (label-command:run) 185 0 R (label-command:save) 207 0 R (label-command:shell) 189 0 R] /Limits [(label-command:quit) (label-command:shell)] >> endobj 492 0 obj << /Names [(label-command:sigwatch) 123 0 R (label-command:skip) 157 0 R (label-command:source) 208 0 R (label-command:step) 144 0 R (label-command:tbreak) 138 0 R (label-command:thread-extensions) 233 0 R] /Limits [(label-command:sigwatch) (label-command:thread-extensions)] >> endobj 493 0 obj << /Names [(label-command:trace-commands) 99 0 R (label-command:unalias) 209 0 R (label-command:warnopts) 124 0 R (label-command:whatis) 168 0 R (label-command:width) 130 0 R (label-debugger) 272 0 R] /Limits [(label-command:trace-commands) (label-debugger)] >> endobj 494 0 obj << /Names [(label-debugger-files) 297 0 R (label-debugger-hooks) 291 0 R (label-debugger:prompt) 84 0 R (label-entry-fns) 271 0 R (label-exec:command) 74 0 R (label-module-main) 279 0 R] /Limits [(label-debugger-files) (label-module-main)] >> endobj 495 0 obj << /Names [(label-module-pydb) 57 0 R (label-post-mortem) 278 0 R (label-pydb-commands) 83 0 R (label-pydb-invocation) 66 0 R (label-pydb-module-class) 234 0 R (label-subsection-calling-pydb-inside-program) 243 0 R] /Limits [(label-module-pydb) (label-subsection-calling-pydb-inside-program)] >> endobj 496 0 obj << /Names [(label-subsection-commands) 170 0 R (label-subsection-data) 166 0 R (label-subsection-entering-pydb-from-python) 265 0 R (label-subsection-frames) 158 0 R (label-subsection-listing) 190 0 R (label-subsection-misc) 198 0 R] /Limits [(label-subsection-commands) (label-subsection-misc)] >> endobj 497 0 obj << /Names [(label-subsection-os) 186 0 R (label-subsection-post-mortem) 254 0 R (label-subsection-restart) 182 0 R (label-subsection-signal) 210 0 R (label-subsection-startup-files) 82 0 R (label-subsection-status) 90 0 R] /Limits [(label-subsection-os) (label-subsection-status)] >> endobj 498 0 obj << /Names [(label-subsection-switches) 71 0 R (label-subsection-thread) 226 0 R (label-subsubsection-brkpts) 132 0 R (label-subsubsection-handle) 216 0 R (label-subsubsection-info) 91 0 R (label-subsubsection-linetracing) 253 0 R] /Limits [(label-subsection-switches) (label-subsubsection-linetracing)] >> endobj 499 0 obj << /Names [(label-subsubsection-precmd) 252 0 R (label-subsubsection-resume) 143 0 R (label-subsubsection-set) 96 0 R (label-subsubsection-show) 131 0 R (label-switch:command) 72 0 R (label-switch:fntrace) 81 0 R] /Limits [(label-subsubsection-precmd) (label-switch:fntrace)] >> endobj 500 0 obj << /Names [(label-switch:nx) 75 0 R (label-switch:threading) 76 0 R (label-switch:trace) 77 0 R (page001) 34 0 R (page002) 35 0 R (page003) 70 0 R] /Limits [(label-switch:nx) (page003)] >> endobj 501 0 obj << /Names [(page004) 36 0 R (page005) 89 0 R (page006) 95 0 R (page007) 105 0 R (page008) 112 0 R (page009) 116 0 R] /Limits [(page004) (page009)] >> endobj 502 0 obj << /Names [(page010) 129 0 R (page011) 136 0 R (page012) 142 0 R (page013) 148 0 R (page014) 156 0 R (page015) 165 0 R] /Limits [(page010) (page015)] >> endobj 503 0 obj << /Names [(page016) 174 0 R (page017) 179 0 R (page018) 196 0 R (page019) 204 0 R (page020) 215 0 R (page021) 225 0 R] /Limits [(page016) (page021)] >> endobj 504 0 obj << /Names [(page022) 37 0 R (page023) 240 0 R (page024) 247 0 R (page025) 251 0 R (page026) 259 0 R (page027) 264 0 R] /Limits [(page022) (page027)] >> endobj 505 0 obj << /Names [(page028) 270 0 R (page029) 277 0 R (page030) 38 0 R (page031) 39 0 R (page032) 40 0 R (page033) 301 0 R] /Limits [(page028) (page033)] >> endobj 506 0 obj << /Names [(page034) 305 0 R (page035) 41 0 R] /Limits [(page034) (page035)] >> endobj 507 0 obj << /Kids [485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R] /Limits [(label-Bdb) (label-command:qt)] >> endobj 508 0 obj << /Kids [491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R] /Limits [(label-command:quit) (label-subsection-misc)] >> endobj 509 0 obj << /Kids [497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R] /Limits [(label-subsection-os) (page015)] >> endobj 510 0 obj << /Kids [503 0 R 504 0 R 505 0 R 506 0 R] /Limits [(page016) (page035)] >> endobj 511 0 obj << /Kids [507 0 R 508 0 R 509 0 R 510 0 R] /Limits [(label-Bdb) (page035)] >> endobj 512 0 obj << /Dests 511 0 R >> endobj 513 0 obj << /Type /Catalog /Pages 483 0 R /Outlines 484 0 R /Names 512 0 R /PageMode /UseOutlines >> endobj 514 0 obj << /Producer (pdfTeX-1.40.3) /Author (Revised by Rocky Bernstein, ) /Title (Python Library Reference for the Extended Python Debugger) /Creator (TeX) /CreationDate (D:20090410193251-04'00') /ModDate (D:20090410193251-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 515 0000000000 65535 f 0000000579 00000 n 0000000475 00000 n 0000000015 00000 n 0000236908 00000 n 0000237076 00000 n 0000237597 00000 n 0000237944 00000 n 0000001209 00000 n 0000001104 00000 n 0000000669 00000 n 0000236256 00000 n 0000002082 00000 n 0000002224 00000 n 0000002371 00000 n 0000001949 00000 n 0000001289 00000 n 0000237249 00000 n 0000236569 00000 n 0000002659 00000 n 0000002552 00000 n 0000002464 00000 n 0000003803 00000 n 0000003934 00000 n 0000004070 00000 n 0000004204 00000 n 0000004340 00000 n 0000004475 00000 n 0000004611 00000 n 0000004747 00000 n 0000004883 00000 n 0000005014 00000 n 0000003621 00000 n 0000002699 00000 n 0000010534 00000 n 0000015118 00000 n 0000022834 00000 n 0000081202 00000 n 0000107999 00000 n 0000111044 00000 n 0000114675 00000 n 0000117221 00000 n 0000005404 00000 n 0000005297 00000 n 0000005118 00000 n 0000009588 00000 n 0000009737 00000 n 0000009874 00000 n 0000010012 00000 n 0000010148 00000 n 0000010291 00000 n 0000010415 00000 n 0000010700 00000 n 0000009419 00000 n 0000005473 00000 n 0000236739 00000 n 0000010589 00000 n 0000010645 00000 n 0000237421 00000 n 0000237768 00000 n 0000238051 00000 n 0000014815 00000 n 0000014964 00000 n 0000015233 00000 n 0000014681 00000 n 0000010840 00000 n 0000015173 00000 n 0000019257 00000 n 0000018759 00000 n 0000015337 00000 n 0000018867 00000 n 0000018922 00000 n 0000018982 00000 n 0000236399 00000 n 0000019037 00000 n 0000019092 00000 n 0000019147 00000 n 0000019202 00000 n 0000023115 00000 n 0000022726 00000 n 0000019397 00000 n 0000022889 00000 n 0000022940 00000 n 0000023000 00000 n 0000023060 00000 n 0000026433 00000 n 0000026759 00000 n 0000026306 00000 n 0000023243 00000 n 0000026585 00000 n 0000026640 00000 n 0000026699 00000 n 0000030024 00000 n 0000029524 00000 n 0000026863 00000 n 0000029632 00000 n 0000029687 00000 n 0000029747 00000 n 0000029802 00000 n 0000029857 00000 n 0000029912 00000 n 0000029968 00000 n 0000031517 00000 n 0000031238 00000 n 0000030140 00000 n 0000031350 00000 n 0000031407 00000 n 0000031460 00000 n 0000238161 00000 n 0000032654 00000 n 0000032485 00000 n 0000031646 00000 n 0000032597 00000 n 0000036379 00000 n 0000035755 00000 n 0000032736 00000 n 0000035867 00000 n 0000035924 00000 n 0000035981 00000 n 0000036038 00000 n 0000036095 00000 n 0000036152 00000 n 0000036208 00000 n 0000036265 00000 n 0000036322 00000 n 0000039121 00000 n 0000039509 00000 n 0000038989 00000 n 0000036520 00000 n 0000039276 00000 n 0000039333 00000 n 0000039386 00000 n 0000039448 00000 n 0000043070 00000 n 0000042788 00000 n 0000039626 00000 n 0000042900 00000 n 0000042957 00000 n 0000043014 00000 n 0000046028 00000 n 0000045742 00000 n 0000043211 00000 n 0000045854 00000 n 0000045911 00000 n 0000045972 00000 n 0000048875 00000 n 0000048535 00000 n 0000046145 00000 n 0000048647 00000 n 0000048704 00000 n 0000048761 00000 n 0000048818 00000 n 0000238278 00000 n 0000051987 00000 n 0000051590 00000 n 0000049004 00000 n 0000051702 00000 n 0000051759 00000 n 0000051812 00000 n 0000051873 00000 n 0000051930 00000 n 0000055779 00000 n 0000056282 00000 n 0000055647 00000 n 0000052128 00000 n 0000055931 00000 n 0000055988 00000 n 0000056049 00000 n 0000056106 00000 n 0000056163 00000 n 0000056220 00000 n 0000058112 00000 n 0000057943 00000 n 0000056411 00000 n 0000058055 00000 n 0000061672 00000 n 0000062516 00000 n 0000061540 00000 n 0000058241 00000 n 0000061813 00000 n 0000061870 00000 n 0000061927 00000 n 0000061984 00000 n 0000062046 00000 n 0000062108 00000 n 0000062165 00000 n 0000062222 00000 n 0000062284 00000 n 0000062341 00000 n 0000062398 00000 n 0000062455 00000 n 0000065868 00000 n 0000066023 00000 n 0000066480 00000 n 0000065728 00000 n 0000062645 00000 n 0000066194 00000 n 0000066251 00000 n 0000066304 00000 n 0000066366 00000 n 0000066423 00000 n 0000070784 00000 n 0000070268 00000 n 0000066621 00000 n 0000070380 00000 n 0000070437 00000 n 0000070494 00000 n 0000070551 00000 n 0000070608 00000 n 0000070665 00000 n 0000070722 00000 n 0000238395 00000 n 0000074077 00000 n 0000073795 00000 n 0000070925 00000 n 0000073907 00000 n 0000073964 00000 n 0000074021 00000 n 0000077099 00000 n 0000077270 00000 n 0000077426 00000 n 0000077574 00000 n 0000077924 00000 n 0000076943 00000 n 0000074230 00000 n 0000077743 00000 n 0000077800 00000 n 0000077862 00000 n 0000081031 00000 n 0000081438 00000 n 0000080899 00000 n 0000078053 00000 n 0000081258 00000 n 0000081320 00000 n 0000081377 00000 n 0000085487 00000 n 0000085641 00000 n 0000086018 00000 n 0000085347 00000 n 0000081579 00000 n 0000085791 00000 n 0000085848 00000 n 0000085905 00000 n 0000085962 00000 n 0000088793 00000 n 0000088624 00000 n 0000086147 00000 n 0000088736 00000 n 0000091266 00000 n 0000090927 00000 n 0000088898 00000 n 0000091039 00000 n 0000091096 00000 n 0000091153 00000 n 0000091210 00000 n 0000238512 00000 n 0000093473 00000 n 0000093304 00000 n 0000091371 00000 n 0000093416 00000 n 0000096021 00000 n 0000096275 00000 n 0000095889 00000 n 0000093566 00000 n 0000096161 00000 n 0000096218 00000 n 0000100295 00000 n 0000100615 00000 n 0000100163 00000 n 0000096368 00000 n 0000100444 00000 n 0000100501 00000 n 0000100558 00000 n 0000104048 00000 n 0000104310 00000 n 0000103916 00000 n 0000100744 00000 n 0000104196 00000 n 0000104253 00000 n 0000123139 00000 n 0000107696 00000 n 0000107846 00000 n 0000108174 00000 n 0000107556 00000 n 0000104427 00000 n 0000108055 00000 n 0000108117 00000 n 0000110903 00000 n 0000111162 00000 n 0000110771 00000 n 0000108303 00000 n 0000111100 00000 n 0000238629 00000 n 0000114199 00000 n 0000114792 00000 n 0000114067 00000 n 0000111291 00000 n 0000114731 00000 n 0000115623 00000 n 0000115454 00000 n 0000114909 00000 n 0000115566 00000 n 0000116077 00000 n 0000115908 00000 n 0000115728 00000 n 0000116020 00000 n 0000117277 00000 n 0000117109 00000 n 0000116147 00000 n 0000117382 00000 n 0000243413 00000 n 0000117427 00000 n 0000117478 00000 n 0000243295 00000 n 0000117523 00000 n 0000117569 00000 n 0000243216 00000 n 0000117614 00000 n 0000117703 00000 n 0000243137 00000 n 0000117748 00000 n 0000117797 00000 n 0000243004 00000 n 0000117842 00000 n 0000117883 00000 n 0000242925 00000 n 0000117928 00000 n 0000117969 00000 n 0000242832 00000 n 0000118014 00000 n 0000118055 00000 n 0000242700 00000 n 0000118100 00000 n 0000118172 00000 n 0000242621 00000 n 0000118217 00000 n 0000118248 00000 n 0000242528 00000 n 0000118293 00000 n 0000118322 00000 n 0000242449 00000 n 0000118367 00000 n 0000118399 00000 n 0000242356 00000 n 0000118444 00000 n 0000118550 00000 n 0000242263 00000 n 0000118595 00000 n 0000118690 00000 n 0000242170 00000 n 0000118735 00000 n 0000118824 00000 n 0000242077 00000 n 0000118869 00000 n 0000118948 00000 n 0000241984 00000 n 0000118993 00000 n 0000119080 00000 n 0000241891 00000 n 0000119125 00000 n 0000119201 00000 n 0000241798 00000 n 0000119246 00000 n 0000119311 00000 n 0000241705 00000 n 0000119356 00000 n 0000119423 00000 n 0000241612 00000 n 0000119468 00000 n 0000119581 00000 n 0000241480 00000 n 0000119626 00000 n 0000119698 00000 n 0000241401 00000 n 0000119743 00000 n 0000119792 00000 n 0000241308 00000 n 0000119837 00000 n 0000119915 00000 n 0000241229 00000 n 0000119960 00000 n 0000120018 00000 n 0000241111 00000 n 0000120063 00000 n 0000120146 00000 n 0000241032 00000 n 0000120191 00000 n 0000120251 00000 n 0000240939 00000 n 0000120296 00000 n 0000120338 00000 n 0000240860 00000 n 0000120383 00000 n 0000120452 00000 n 0000240728 00000 n 0000120497 00000 n 0000120564 00000 n 0000240610 00000 n 0000120609 00000 n 0000120696 00000 n 0000240531 00000 n 0000120741 00000 n 0000120812 00000 n 0000240452 00000 n 0000120857 00000 n 0000120889 00000 n 0000240320 00000 n 0000120934 00000 n 0000121358 00000 n 0000240241 00000 n 0000121403 00000 n 0000121654 00000 n 0000240148 00000 n 0000121699 00000 n 0000121940 00000 n 0000240069 00000 n 0000121985 00000 n 0000122038 00000 n 0000239976 00000 n 0000122083 00000 n 0000122155 00000 n 0000239883 00000 n 0000122200 00000 n 0000122277 00000 n 0000239790 00000 n 0000122322 00000 n 0000122380 00000 n 0000239697 00000 n 0000122425 00000 n 0000122477 00000 n 0000239618 00000 n 0000122522 00000 n 0000122572 00000 n 0000239525 00000 n 0000122617 00000 n 0000122707 00000 n 0000239432 00000 n 0000122752 00000 n 0000122799 00000 n 0000239339 00000 n 0000122844 00000 n 0000122897 00000 n 0000239221 00000 n 0000122942 00000 n 0000122978 00000 n 0000239156 00000 n 0000123023 00000 n 0000123069 00000 n 0000239077 00000 n 0000123114 00000 n 0000235752 00000 n 0000123169 00000 n 0000123532 00000 n 0000124094 00000 n 0000124565 00000 n 0000124628 00000 n 0000125109 00000 n 0000125688 00000 n 0000126214 00000 n 0000126790 00000 n 0000127114 00000 n 0000127679 00000 n 0000129453 00000 n 0000129714 00000 n 0000139769 00000 n 0000140068 00000 n 0000159130 00000 n 0000159718 00000 n 0000162819 00000 n 0000163054 00000 n 0000173199 00000 n 0000173653 00000 n 0000178055 00000 n 0000178323 00000 n 0000192430 00000 n 0000192837 00000 n 0000202633 00000 n 0000202933 00000 n 0000221999 00000 n 0000222562 00000 n 0000235372 00000 n 0000238738 00000 n 0000238853 00000 n 0000238930 00000 n 0000239000 00000 n 0000243531 00000 n 0000243762 00000 n 0000244043 00000 n 0000244331 00000 n 0000244629 00000 n 0000244937 00000 n 0000245200 00000 n 0000245464 00000 n 0000245760 00000 n 0000246039 00000 n 0000246299 00000 n 0000246612 00000 n 0000246928 00000 n 0000247229 00000 n 0000247552 00000 n 0000247848 00000 n 0000248054 00000 n 0000248221 00000 n 0000248391 00000 n 0000248561 00000 n 0000248730 00000 n 0000248897 00000 n 0000248994 00000 n 0000249114 00000 n 0000249248 00000 n 0000249369 00000 n 0000249462 00000 n 0000249557 00000 n 0000249595 00000 n 0000249704 00000 n trailer << /Size 515 /Root 513 0 R /Info 514 0 R /ID [<99E3ABE3BA91A55407CF032B7C684962> <99E3ABE3BA91A55407CF032B7C684962>] >> startxref 250085 %%EOF pydb-1.26/Doc/paper-letter/lib.ps0000644000175000017500000054776111167754473013607 00000000000000%!PS-Adobe-2.0 %%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software %%Title: paper-letter/lib.dvi %%CreationDate: Fri Apr 10 19:41:47 2009 %%Pages: 41 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: Helvetica Helvetica-Oblique Times-Roman CMSY10 %%+ Times-Bold Courier Helvetica-Bold Times-BoldItalic Times-Italic %%+ Courier-Bold %%DocumentPaperSizes: Letter %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -N0 -t letter -o paper-letter/lib.ps %+ paper-letter/lib.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2009.04.10:1941 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: 8r.enc 0 0 % File 8r.enc TeX Base 1 Encoding Revision 2.0 2002-10-30 % % @@psencodingfile@{ % author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, % W. Schmidt, P. Lehman", % version = "2.0", % date = "27nov06", % filename = "8r.enc", % email = "tex-fonts@@tug.org", % docstring = "This is the encoding vector for Type1 and TrueType % fonts to be used with TeX. This file is part of the % PSNFSS bundle, version 9" % @} % % The idea is to have all the characters normally included in Type 1 fonts % available for typesetting. This is effectively the characters in Adobe % Standard encoding, ISO Latin 1, Windows ANSI including the euro symbol, % MacRoman, and some extra characters from Lucida. % % Character code assignments were made as follows: % % (1) the Windows ANSI characters are almost all in their Windows ANSI % positions, because some Windows users cannot easily reencode the % fonts, and it makes no difference on other systems. The only Windows % ANSI characters not available are those that make no sense for % typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen % (173). quotesingle and grave are moved just because it's such an % irritation not having them in TeX positions. % % (2) Remaining characters are assigned arbitrarily to the lower part % of the range, avoiding 0, 10 and 13 in case we meet dumb software. % % (3) Y&Y Lucida Bright includes some extra text characters; in the % hopes that other PostScript fonts, perhaps created for public % consumption, will include them, they are included starting at 0x12. % These are /dotlessj /ff /ffi /ffl. % % (4) hyphen appears twice for compatibility with both ASCII and Windows. % % (5) /Euro was assigned to 128, as in Windows ANSI % % (6) Missing characters from MacRoman encoding incorporated as follows: % % PostScript MacRoman TeXBase1 % -------------- -------------- -------------- % /notequal 173 0x16 % /infinity 176 0x17 % /lessequal 178 0x18 % /greaterequal 179 0x19 % /partialdiff 182 0x1A % /summation 183 0x1B % /product 184 0x1C % /pi 185 0x1D % /integral 186 0x81 % /Omega 189 0x8D % /radical 195 0x8E % /approxequal 197 0x8F % /Delta 198 0x9D % /lozenge 215 0x9E % /TeXBase1Encoding [ % 0x00 /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash /ogonek /ring /.notdef /breve /minus /.notdef /Zcaron /zcaron % 0x10 /caron /dotlessi /dotlessj /ff /ffi /ffl /notequal /infinity /lessequal /greaterequal /partialdiff /summation /product /pi /grave /quotesingle % 0x20 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash % 0x30 /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question % 0x40 /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O % 0x50 /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore % 0x60 /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o % 0x70 /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef % 0x80 /Euro /integral /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /Omega /radical /approxequal % 0x90 /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /Delta /lozenge /Ydieresis % 0xA0 /.notdef /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron % 0xB0 /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown % 0xC0 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis % 0xD0 /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls % 0xE0 /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis % 0xF0 /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /circlecopyrt put dup 15 /bullet put dup 102 /braceleft put dup 103 /braceright put readonly def /FontBBox{-29 -960 1116 775}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57030ACE57A0A31C99BEDB251A0ECAD78 253AB320C099669BFED2878A6C4038A5BCEB5B4C28040BB8B4AC2C167BB2C999 ED93E2F4AE3E4B44B7B6B469C36A24080D4BEDB5523D202E920D8898DEBD5EB0 CAC3C5D5F01A87F7B15BD1C197B344F7D94E965CBFE73E8A65A2AA6A6F93B878 03E30E60F1390C2FB671C8D36E7D6E516A20079B48CA9BE632F5A8D1250F01EE 6809D6C5B51AE3D1B4C244195E4AB5E68F2AF1D7556B9D03035E08B962A33B44 426A3B5BEF3BA86E4BFE8C823D42816B59DAE9EBD42C115A1E75B0E6427720BF 773EA85158709B4DF3065233F27ABA8B9C2A08836C709D0EA9398CF5390BA7F1 C0090EDBE1341070EF06FBE8A3883CE2BA449345BD309D7A3E92012E550D1EBB 5E181951EB8A711C9F8C5458A781EF88F745DCAD2673DB8275DE88B1D3D8755C 031E739FC739613C7F971A91C8DF6B853006AB7054F4526F46808BD3005FB838 6AEDEAD0FF3186925EC6968D050B12AF2B0706C2A518813BDAFAE671EC302FBE 13663F378DEF187673479F19470EE537B9085501189B0A0A13E976B127FA5C14 BB610001611B1E0F45675C7A0CE2C692C5D869CC92D05AE80520187FD25C54F0 96BAA48612DD7A6255645213503284EAD599260E903794957EC5E64B98450E32 7C4F233A5A15B17456CFC2856B9665A4499F1A77D0448FC63D0EA28B247B4129 DD06D1EEA14FD95229A4D4B78493FE33DFA2F13A2E8236BCD6DD0ACBB4211005 3A97E68C19CD6C9BB69700D4492C3502187B6C16EC8B6E77AC066FADAA1D3AA7 69D84EC85239598287A77AFE4A2D10ACE92E98433CA550F3492EAAD0F60225D1 B5245CB029B1F7C0D16F7D74574EDD9C8B6A80C53869AEA0A027C745A6F1B975 C2336403D5BD9F4C0E1BC339488055F4CC1B08D36BC7FA25336FA6A86EEF3BF7 0C11727965C871E4024585C9D97BA0312DFFAC33F79413505A5825292FD1BCFB B856B4C1EA73B36662A85726DD1C761E5B3546EAFAC917B22293F43D219D4ECF 8471 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 40258431 52099146 1000 600 600 (paper-letter/lib.dvi) @start /Fa 135[50 1[50 50 50 50 50 1[50 50 50 50 50 50 1[50 50 50 1[50 50 50 50 50 1[50 14[50 8[50 4[50 26[50 39[{TeXBase1Encoding ReEncodeFont}25 83.022 /Courier-Bold rf /Fb 134[72 4[72 1[72 1[72 72 72 2[72 1[72 3[72 72 1[72 72 16[72 13[72 66[{TeXBase1Encoding ReEncodeFont}14 119.552 /Courier rf /Fc 104[120 34[40 47 53 12[53 101[{ TeXBase1Encoding ReEncodeFont}5 119.552 /Times-Bold rf /Fd 131[72 124[{TeXBase1Encoding ReEncodeFont}1 119.552 /Courier-Bold rf /Fe 134[60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 1[60 27[60 20[60 60 11[60 33[{TeXBase1Encoding ReEncodeFont}30 99.6264 /Courier rf /Ff 134[50 50 1[50 55 28 50 33 1[55 55 55 83 22 50 1[22 55 55 28 55 55 50 55 55 7[66 4[61 66 72 1[66 78 1[83 55 2[28 2[61 66 72 72 66 66 6[28 55 55 55 55 55 55 55 55 55 55 28 28 33 28 2[33 33 37[50 2[{ TeXBase1Encoding ReEncodeFont}55 99.6264 /Helvetica rf /Fg 134[45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 1[45 1[45 45 45 1[45 1[45 1[45 45 45 45 1[45 45 45 45 3[45 45 45 45 45 45 45 45 45 1[45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 1[45 45 45 45 45 33[{ TeXBase1Encoding ReEncodeFont}78 74.7198 /Courier rf /Fh 134[40 3[40 2[40 1[40 40 7[40 1[40 40 1[40 10[40 40[40 40 45[{TeXBase1Encoding ReEncodeFont}12 66.4176 /Courier rf /Fi 140[26 9[18 105[{TeXBase1Encoding ReEncodeFont}2 66.4176 /Times-Italic rf /Fj 134[33 1[48 33 33 18 26 22 1[33 33 33 52 18 33 18 18 33 33 22 29 33 29 33 29 12[41 37 2[37 48 5[22 48 6[48 13[33 33 33 2[17 1[17 4[22 36[37 2[{TeXBase1Encoding ReEncodeFont}37 66.4176 /Times-Roman rf /Fk 204[25 25 25 49[{TeXBase1Encoding ReEncodeFont}3 49.8132 /Times-Roman rf /Fl 162[40 1[40 91[{ TeXBase1Encoding ReEncodeFont}2 119.552 /Times-Roman rf /Fm 204[29 29 29 49[{TeXBase1Encoding ReEncodeFont}3 58.1154 /Times-Roman rf /Fn 107[40 40 25[60 1[86 60 66 33 60 40 1[66 66 66 100 27 60 1[27 66 66 1[66 66 60 66 66 9[113 1[86 73 80 86 1[80 2[100 3[33 86 93 73 80 86 86 80 10[66 66 66 66 66 66 66 2[33 4[40 40 40[{ TeXBase1Encoding ReEncodeFont}48 119.552 /Helvetica rf /Fo 107[46 46 24[32 37 37 55 37 42 23 32 32 42 42 42 42 60 23 37 1[23 42 42 23 37 42 37 42 42 11[60 46 42 51 2[60 55 1[46 2[28 2[51 8[56 10[42 42 2[21 28 21 4[28 36[42 2[{TeXBase1Encoding ReEncodeFont}44 83.022 /Times-Italic rf /Fp 134[37 42 55 37 46 23 32 32 1[42 42 46 65 23 42 1[23 46 42 28 37 42 37 42 42 50[21 28 42[46 2[{ TeXBase1Encoding ReEncodeFont}26 83.022 /Times-BoldItalic rf /Fq 176[93 86 8[80 69[{TeXBase1Encoding ReEncodeFont}3 119.552 /Helvetica-Bold rf /Fr 134[42 42 60 42 46 23 42 28 1[46 46 46 69 18 42 1[18 46 46 23 46 46 42 46 46 9[78 2[51 55 60 65 55 2[69 46 2[23 60 2[55 60 60 1[55 7[46 46 46 46 46 46 46 46 46 46 1[23 28 23 2[28 28 40[{ TeXBase1Encoding ReEncodeFont}52 83.022 /Helvetica rf /Fs 103[50 27[50 1[50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 1[50 1[50 1[50 50 50 1[50 50 50 50 50 50 50 50 50 50 50 50 2[50 50 50 50 50 50 50 50 50 2[50 50 50 50 50 50 2[50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 1[50 1[50 50 50 33[{ TeXBase1Encoding ReEncodeFont}80 83.022 /Courier rf /Ft 105[42 27[37 42 42 60 42 46 28 32 37 46 46 42 46 69 23 46 28 23 46 42 28 37 46 37 46 42 8[60 3[55 3[51 65 60 1[55 2[32 2[51 55 60 2[60 1[42 1[47 2[28 4[42 1[42 1[42 2[21 28 21 2[28 28 6[28 30[46 2[{TeXBase1Encoding ReEncodeFont}51 83.022 /Times-Bold rf /Fu 152[42 42 86[42 1[83 13[{}4 83.022 /CMSY10 rf /Fv 104[83 42 1[37 37 24[37 42 42 60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28 37 42 37 42 37 28 2[28 1[28 1[60 60 78 1[60 51 46 55 60 46 60 60 74 51 2[28 60 60 46 51 60 55 55 60 1[37 3[23 23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 42 28 28 28 5[28 29[46 46 2[{TeXBase1Encoding ReEncodeFont}80 83.022 /Times-Roman rf /Fw 134[37 3[42 21 37 25 1[42 42 42 1[17 2[17 42 42 21 42 42 37 42 42 32[76 17[21 25 45[{TeXBase1Encoding ReEncodeFont}21 74.7198 /Helvetica rf /Fx 141[33 1[50 2[78 28 2[28 7[44 27[61 3[72 6[28 50 6[50 50 50 3[25 44[{TeXBase1Encoding ReEncodeFont}14 99.6264 /Times-Roman rf /Fy 134[72 2[72 1[40 72 48 2[80 80 2[72 1[32 3[80 80 72 80 15[104 15[96 66[{ TeXBase1Encoding ReEncodeFont}15 143.462 /Helvetica rf /Fz 134[72 5[72 2[80 3[32 6[80 80 1[80 80 14[104 28[80 2[80 3[40 46[{TeXBase1Encoding ReEncodeFont}12 143.462 /Helvetica-Oblique rf /FA 134[103 103 2[115 57 1[69 2[115 115 4[46 115 115 57 115 115 103 115 115 8[138 3[126 138 149 1[138 161 149 1[115 2[57 3[138 149 149 67[{ TeXBase1Encoding ReEncodeFont}28 206.559 /Helvetica rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: Letter /setpagedevice where { pop << /PageSize [612 792] >> setpagedevice } { /letter where { pop letter } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 0 83 3901 9 v 0 446 a FA(Python)56 b(Libr)n(ar)6 b(y)55 b(Ref)-6 b(erence)56 b(f)-6 b(or)56 b(the)g(Extended)2297 695 y(Python)h(Deb)l(ugger)2828 925 y Fz(Release)38 b(2.5p)l(ydb)2113 2125 y Fy(Re)l(vised)f(b)m(y)j (Roc)m(ky)e(Ber)t(nstein)3316 4183 y Fx(April)24 b(10,)h(2009)2434 5317 y(Email:)k Fw(bashdb-p)n(ydb@lists)o(.sourcef)n(orge)n(.ne)o(t)p eop end %%Page: 2 2 TeXDict begin 2 1 bop 0 83 a Fv(Cop)o(yright)380 80 y(c)357 83 y Fu(\015)20 b Fv(2001-2004)d(Python)i(Softw)o(are)h(F)o(oundation.) i(All)f(rights)f(reserv)o(ed.)0 230 y(Cop)o(yright)380 227 y(c)357 230 y Fu(\015)g Fv(2000)f(BeOpen.com.)24 b(All)c(rights)g(reserv)o(ed.)0 377 y(Cop)o(yright)380 374 y(c)357 377 y Fu(\015)g Fv(1995-2000)d(Corporation)h(for)h (National)h(Research)g(Initiati)n(v)o(es.)k(All)d(rights)f(reserv)o (ed.)0 524 y(Cop)o(yright)380 521 y(c)357 524 y Fu(\015)g Fv(1991-1995)d(Stichting)j(Mathematisch)f(Centrum.)24 b(All)d(rights)f(reserv)o(ed.)0 671 y(See)h(the)f(end)f(of)h(this)h (document)d(for)i(complete)f(license)h(and)g(permissions)f (information.)p eop end %%Page: 1 3 TeXDict begin 1 2 bop 1796 2559 a Ft(Abstract)0 2789 y Fv(Python)20 b(is)i(an)g(e)o(xtensible,)e(interpreted,)f (object-oriented)g(programming)f(language.)26 b(It)c(supports)e(a)i (wide)f(range)f(of)h(applications,)0 2889 y(from)e(simple)h(te)o(xt)g (processing)f(scripts)i(to)f(interacti)n(v)o(e)f(W)-7 b(eb)21 b(bro)n(wsers.)0 3036 y(W)-7 b(e)23 b(describe)d(here)h(only)g (the)g(Extended)f(Python)g(Deb)n(ugger)-5 b(.)28 b(The)21 b(rest)h(of)f(the)h(The)f Fs(Python)49 b(Reference)f(Manual)21 b Fv(should)0 3135 y(be)f(consulted)f(for)h(other)f(standard)g(Python)g (modules)g(including)g(the)h(original)f Fs(Python)49 b(Debugger)19 b Fv(\()p Fs(pdb.py\).)p eop end %%Page: 2 4 TeXDict begin 2 3 bop eop end %%Page: 1 5 TeXDict begin 1 4 bop 2764 747 a FA(CONTENTS)0 1594 y Ft(1)83 b(The)21 b(Extended)f(Python)g(Deb)n(ugger)2597 b(1)125 1694 y Fv(1.1)110 b(In)m(v)n(oking)18 b(the)i(Deb)n(ugger)98 b(.)41 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)g(.)143 b(2)125 1793 y(1.2)110 b(Deb)n(ugger)19 b(Commands)75 b(.)41 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)143 b(4)125 1893 y(1.3)110 b(The)20 b(Deb)n(ugger)f(Module)g(\()p Fs(pydb)p Fv(\))g(and)h(Class)h(\()p Fs(Pdb)p Fv(\))75 b(.)42 b(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)102 b(22)125 1993 y(1.4)110 b(The)20 b(\223Basic\224)h(Deb)n(ugger)e(module)f(\()p Fs(bdb)p Fv(\))i(and)g(Classes)h Fs(Bdb)g Fv(and)e Fs(Breakpoint)53 b Fv(.)41 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)102 b(30)125 2092 y(1.5)110 b(Ho)n(w)20 b(the)h(Deb)n(ugger)d(W)-7 b(orks)62 b(.)41 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)102 b(31)125 2192 y(1.6)110 b(Files)22 b(making)c(up)i(the)g(Deb)n(ugger)45 b(.)c(.)g(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)102 b(32)125 2291 y(1.7)110 b(Installation)53 b(.)41 b(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)g(.)102 b(32)0 2474 y Ft(Index)3614 b(35)p 0 5549 3901 4 v 3882 5649 a Fr(i)p eop end %%Page: 2 6 TeXDict begin 2 5 bop 0 5549 3901 4 v 0 5649 a Fr(ii)p eop end %%Page: 1 7 TeXDict begin 1 6 bop 0 83 3901 9 v 3503 230 a Fr(CHAPTER)3641 427 y Fq(ONE)p 0 515 V 896 978 a FA(The)57 b(Extended)g(Python)h(Deb)l (ugger)0 1468 y Fv(The)16 b(e)o(xtended)e(Python)g(deb)n(ugger)g(b)n (uilds)i(on)f(w)o(ork)h(done)e(in)j(the)e(standard)g Fs(Python)49 b(Debugger)15 b Fv(\()p Fs(pdb.py)p Fv(\).)22 b(Ho)n(we)n(v)o(er)14 b(unless)0 1568 y(there)k(is)i(reason)e(not)g (to,)h(we)g(follo)n(w)f(the)h(the)f(GNU)h(deb)n(ugger)e(\()p Fs(gdb)p Fv(\))h(command)e(set)k(and)e(semantics)h(rather)e(than)i Fs(pdb)p Fv(')-5 b(s.)24 b(In)19 b(some)0 1667 y(cases)i(where)f (semantics)g(dif)n(fer)m(,)e(e.g)i(for)g Fs(clear)f Fv(and)h(noted)f (in)i(belo)n(w)e(in)i(conte)o(xt,)d(the)i Fs(gdb)h Fv(semantics)f(is)h (used.)0 1814 y Ft(On)g Fp(not)f Ft(in)m(v)o(enting)g(y)o(et)g(another) f(interface)p Fv(:)0 1914 y(In)24 b(e)o(xtending)d(the)j(command)e(set) j(and)e(functionality)-5 b(,)22 b(we')l(v)o(e)h(used)h(the)f(GNU)i(deb) n(ugger)c(\()p Fs(gdb)p Fv(\))j(as)g(a)g(guide)f(for)h(man)o(y)e (reasons.)0 2013 y(Because)f(of)f(gdb')-5 b(s)20 b(longe)n(vity)f(and)h (perv)n(asi)n(v)o(eness,)f(the)h(command)f(set)i(is)h(lik)o(ely)e(to)h (be)g(complete)e(and)h(it)i(is)f(lik)o(ely)g(to)f(be)h(f)o(amiliar)-5 b(.)0 2113 y(\(I)25 b(also)h(base)f(my)g(GNU)h(Bash)g(deb)n(ugger)d Fs(bashdb)i Fv(on)g(this)g(command)f(set)i(and)e(to)i(some)f(e)o(xtent) g(my)g(GNU)g(Mak)o(e)g(deb)n(ugger\).)0 2213 y(Thus)19 b(the)h(learning)f(curv)o(e)g(is)h(reduced)f(for)g(people)g(f)o (amiliar)g(with)h(one)f(of)h(these,)g(and)f(the)o(y)h(are)f(less)i(lik) o(ely)f(to)g(get)g(confused)e(when)0 2312 y(switching)i(between)f(deb)n (uggers.)0 2459 y(But)i(it)g(may)e(mak)o(e)h(it)h(easier)f(to)h(teach)f Fo(pr)l(o)o(gr)o(ams)f Fv(as)i(well.)26 b(I)20 b(digress)g(for)g(a)g (little)h(history)-5 b(.)0 2606 y(When)22 b(I)h(\002rst)g(thought)e (about)h(adding)f(the)h(bash)h(deb)n(ugger)d(into)i(the)h(GUI)f(interf) o(ace,)g(I)h(look)o(ed)e(around)g(and)h(sa)o(w)h(the)f(GNU/GPL)0 2706 y(program)g Fs(ddd)i Fv(which)f(already)g(supported)f(a)i(number)f (of)g(deb)n(uggers)f(already)-5 b(,)24 b(such)f(as)i Fs(gdb)p Fv(,)g(and)e(the)h(deb)n(ugger)e(for)h(Perl,)i(and)0 2805 y(e)n(v)o(en)c(one)h(for)g(Python!)29 b(\(In)22 b(f)o(act)g(this)h(deb)n(ugger')-5 b(s)21 b(name)g(comes)h(from)f(that) i(deb)n(ugger\).)28 b(T)-7 b(o)23 b(instruct)f Fs(ddd)g Fv(for)g(a)g(ne)n(w)g(deb)n(ugger)m(,)0 2905 y(there)30 b(are)g(a)g(myriad)f(of)h(little)h(details)g Fs(ddd)f Fv(needs)g(to)g(kno)n(w)f(about.)54 b(Basically)31 b(you)e(need)g(tell) i Fs(ddd)f Fv(ho)n(w)g(to)g(issue)h(a)g(\223step\224)0 3004 y(command,)f(or)f(ho)n(w)g(to)h(set)h(a)f(breakpoint)d(and)i(ho)n (w)h(\002nd)f(out)g(if)h(the)g(command)e(it)i(issued)g(w)o(ork)o(ed.)52 b(Since)30 b(I)g(copied)f Fs(gdb)p Fv(,)i(I)0 3104 y(basically)d(told)g Fs(ddd)h Fv(to)f(handle)g(a)g(number)f(of)h(these)h(constructs)e (\(e.g.,)j(stepping\))d(lik)o(e)h Fs(gdb)p Fv(,)j(which)d(it)h(already) e(kne)n(w)h(about.)0 3204 y(There)22 b(were)i(a)f(fe)n(w)g(places)h (where)e(I)i(told)f Fs(ddd)g Fv(not)g(to)g(follo)n(w)g Fs(gdb)g Fv(b)n(ut)g(Perl)h(instead)f(because)f(the)i(paradigm)d(w)o (as)j(more)f(lik)o(e)g(a)0 3303 y(scripting)h(language)e(than)i(a)h (compiled)e(language.)36 b(But)25 b(in)g(the)f(end,)h(adding)e(support) g(for)h(the)g(bash)h(deb)n(ugger)d(inside)i Fs(ddd)h Fv(w)o(as)0 3403 y(much)19 b(more)h(straightforw)o(ard)d(and)j (required)e(much)i(less)h(thought)d(than)i(if)h(I)f(had)g(in)m(v)o (ented)e(my)i(o)n(wn)f(deb)n(ugger)f(command)g(set.)0 3550 y(After)k(this)h(w)o(as)h(done)d(and)h(I)h(\002red)f(up)g Fs(ddd)p Fv(,)h(I)g(noticed)f(that,)h(when)e(my)i(cursor)e(w)o(as)j(ho) o(v)o(ering)19 b(o)o(v)o(er)i(some)i(of)f(the)h(b)n(uttons,)f(short)0 3649 y(descriptions)15 b(for)h(the)g(command)f(were)h(gi)n(v)o(en.)23 b(Furthermore)14 b(it)j(created)e(a)i(b)n(utton)f(called)g (\223customize)f(bash\224)h(which)g(when)g(click)o(ed)0 3749 y(w)o(ould)25 b(pop)f(up)h(a)h(windo)n(w)f(to)g(set)h(v)n(arious)f (deb)n(ugger)e(parameters!)39 b(But)26 b(I)g(hadn')o(t)e(added)g(a)i (box)e(widget)h(for)g(customization)f(or)0 3849 y(modi\002ed)19 b(an)o(y)g(code)h(for)f(using)h(tool)g(tips.)25 b(Ho)n(w)c(did)e Fs(ddd)i Fv(do)e(this?)0 3996 y(Because)j(I)g(had)g(copied)f(the)h (output)e(format)h(of)h Fs(gdb)p Fv(')-5 b(s)22 b Fs(info)p Fv(,)g Fs(set)g Fv(and)g Fs(show)g Fv(commands,)e Fs(ddd)i Fv(ran)g(these)g(commands)e(on)i(its)0 4095 y(o)n(wn)e(and)f(parsed)h (the)g(output;)f(it)i(then)f(used)g(that)g(output)f(to)h(form)f(tool)h (tips)h(and)f(create)f(customization)g(box)o(es.)0 4242 y(In)j(responses)f(to)h(a)g(preliminary)e(posting)h(to)h Fs(comp.lang.python)d Fv(asking)i(why)g(the)h(Python)f(deb)n(ugger)f(w) o(as)i(dif)n(ferent)f(from)0 4342 y(other)16 b(deb)n(uggers,)f(a)i (number)e(of)h(people)f(indicated)h(that)h(it)g(didn')o(t)e(matter)h (since)h(the)o(y)f(did)g(not)g(use)h(the)f(standard)g(Python)f(deb)n (ugger)m(,)0 4441 y(or)21 b(did)h(not)f(use)h(it)g(much.)29 b(T)-7 b(o)22 b(some)f(e)o(xtent,)g(I)h(w)o(onder)f(if)h(this)g(is)g (not)g(a)g(chick)o(en-and-e)o(gg)17 b(problem:)27 b(is)c(the)e(deb)n (ugger)f(lacking)g(in)0 4541 y(usefulness)g(because)f(people)g(don')o (t)g(use)h(it)h(much)e(or)h(do)g(people)f(not)h(use)g(the)h(deb)n (ugger)d(because)h(it)i(is)g(lacking)e(in)i(usefulness?)0 4688 y(I'm)f(not)f(sure,)h(b)n(ut)h(if)f(the)g(standard)f(Python)g(deb) n(ugger)f(is)j(little)g(used,)f(k)o(eeping)f(compatibility)f(is)k(not)d (important.)0 4835 y(So,)h(in)h(cases)f(where)g(the)g(standard)f (Python)g(deb)n(ugger)f(w)o(as)j(incompatible)e(with)h Fs(gdb)p Fv(,)g(the)g Fs(gdb)g Fv(commands)f(ha)n(v)o(e)g(been)h(used.) 0 4982 y Ft(Least)g(action:)25 b(a)20 b(design)h(principle)g(f)n(or)e (deb)n(uggers)i(in)g(general)p Fv(:)0 5081 y(By)27 b(necessity)-5 b(,)26 b(deb)n(uggers)f(change)f(the)i(operation)f(of)g(the)i(program)c (the)o(y)j(are)g(deb)n(ugging.)40 b(And)25 b(this)i(can)f(lead)g(to)g (une)o(xpected)0 5181 y(and)c(unw)o(anted)g(dif)n(ferences.)32 b(It)23 b(has)g(happened)e(so)i(often)f(that)h(the)g(term)g (http://en.wikipedia.or)o(g/wiki/Heisenb)n(ug)17 b(w)o(as)24 b(coined)0 5280 y(to)g(describe)f(the)h(situation)f(where)h(the)g (adding)e(the)i(use)g(of)g(a)g(the)g(deb)n(ugger)e(\(among)g(other)h (possibilities\))h(changes)f(beha)n(vior)f(of)0 5380 y(the)e(program)e(so)j(that)f(the)g(b)n(ug)g(doesn')o(t)f(manifest)g (itself)i(an)o(ymore.)p 0 5549 3901 4 v 3854 5649 a Fr(1)p eop end %%Page: 2 8 TeXDict begin 2 7 bop 0 83 a Fv(Of)17 b(course)f(a)i(deb)n(ugger)m(,)d (and)h(this)h(one)g(in)g(particular)m(,)f(tries)h(hard)f(to)h(mak)o(e)g (itself)g(transparent)f(when)g(not)h(ask)o(ed)f(to)h(do)g(its)h(thing.) 23 b(But)0 183 y(there)f(can)g(be)h(una)n(v)n(oidable)e(dif)n (ferences.)30 b(One)22 b(such)g(noticeable)g(dif)n(ference,)f (mentioned)f(in)j(conjunction)d(with)j Fs(debugger\(\))0 282 y Fv(\(see)e(1.3.7\),)d(is)j(the)g(speed)f(at)h(which)f(the)g(deb)n (ugger)e(runs.)25 b(Another)19 b(dif)n(ference)g(in)m(v)n(olv)o(es)g (name-space)f(issues)k(since)e(some)g(of)h(the)0 382 y(deb)n(ugger)d(may)i(li)n(v)o(e)g(inside)g(the)g(deb)n(ugged)e (program.)0 529 y(Consequently)-5 b(,)26 b(a)g(general)g(principle)f (as)i(a)g(deb)n(ugger)d(writer)i(\(and)g(a)h(principle)e(used)h(in)h (this)g(deb)n(ugger\))c(is:)39 b Fo(bring)26 b(in)h(services)0 628 y(only)19 b(when)g(needed)f(or)i(r)m(equested.)k Fv(F)o(or)19 b(e)o(xample,)f(in)i(out-of-process)c(deb)n(ugging)h(some) i(sort)h(of)f(communication)d(mechanism)j(is)0 728 y(needed,)c(e.g.)24 b(a)16 b(sock)o(et.)24 b(Ho)n(we)n(v)o(er)14 b(there)i(are)g(man)o(y)f (programs)f(that)j(one)e(might)h(w)o(ant)g(to)g(deb)n(ug)f(which)h (might)g(not)f(use)i(sock)o(ets)f(and)0 828 y(might)23 b(not)h(need)f(out-of-process)f(deb)n(ugging.)34 b(F)o(or)23 b(those,)i(a)f(deb)n(ugger)e(should)h(therefore)g(not)g(add)h(a)g (requirement)e(on)i(sock)o(ets.)0 927 y(And)c(e)n(v)o(en)f(then,)g (perhaps)g(not)h Fo(until)g Fv(the)g(service)g(which)g(uses)h(it)g (\(remote)e(deb)n(ugging\))e(is)k(requested.)0 1255 y Fn(1.1)121 b(In)n(v)m(oking)34 b(the)g(Deb)n(ugger)0 1488 y Fv(It)20 b(should)e(be)h(noted)g(that)g(in)h(v)n(arious)e (situations)h(and)g(for)g(v)n(arious)f(reasons)h(you)g(might)g(not)g (be)g(able)g(to)h(call)g(the)f(deb)n(ugger)e(directly)0 1587 y(from)22 b(a)h(command)e(line)i(or)f(at)i(the)e(outset)h(of)g (the)g(program.)30 b(That')-5 b(s)23 b(okay)-5 b(.)32 b(See)23 b(section)f(1.3.1)g(for)g(ho)n(w)g(to)h(in)m(v)n(ok)o(e)f(the) h(deb)n(ugger)0 1687 y(from)d(inside)g(your)g(running)f(Python)g (program.)25 b(Also,)c(see)g(section)g(1.3.2)e(for)i(ho)n(w)f(to)h(in)m (v)n(ok)o(e)e(after)i(an)g(error)e(is)j(encountered)c(and)0 1786 y(you)h(ha)n(v)o(e)h(a)h(traceback.)0 1933 y(The)16 b(deb)n(ugger)e(traps)i(all)g(e)o(xceptions.)22 b(So)17 b(if)f(the)g(program)e(raises)j(an)f(e)o(xception)e(that)i(it)h(doesn') o(t)d(handle)h(you)g(will)i(be)f(left)h(inside)f(the)0 2033 y(deb)n(ugger)-5 b(.)24 b(The)c(deb)n(ugger)e(also)i(installs)i (some)e(def)o(ault)f(signal)i(handlers\227see)e(1.2.13.)k(If)d(the)h (program)d(is)j(running)d(inde\002nitely)-5 b(,)0 2133 y(you)19 b(may)h(be)g(able)g(to)h(go)e(back)h(into)g(the)g(deb)n(ugger) e(by)i(sending)f(an)h Fs(INT)g Fv(\(interrupt\))e(signal.)0 2279 y(After)23 b(normal)g(e)o(xit)g(of)h(the)g(program)d(or)j (post-mortem)d(deb)n(ugging,)h(the)i(deb)n(ugger)d(will)k(gi)n(v)o(e)e (a)h(message)f(that)h(the)g(program)d(has)0 2379 y(ended.)45 b(After)27 b(soliciting)g(input,)h(the)g(program)d(will)j(restart)f (the)h(program)d(unless)i(directed)g(otherwise.)46 b(Restarting)27 b(preserv)o(es)0 2479 y(deb)n(ugger)18 b(state)j(such)f(as)h (breakpoints.)0 2626 y(Of)f(the)h(man)o(y)e(additions)g(to)h(the)g (standard)f(Python)g(deb)n(ugger)m(,)f Fs(pdb)i Fv(three)g(will)h(be)f (mentioned)e(here.)0 2772 y(First,)31 b(this)e(deb)n(ugger)d(should)i (install)h(itself)g(some)n(where)e(in)i(your)e(command)f(path,)k (usually)e(as)h Fs(pydb)f Fv(so)h(you)f(don')o(t)f(ha)n(v)o(e)g(to)0 2872 y(in)m(v)n(ok)o(e)19 b(it)i(as)g(an)f(ar)o(gument)e(to)i(the)g Fs(python)g Fv(command.)1708 2842 y Fm(1)0 3019 y Fv(Second)i(the)h(e)o (xtended)e(deb)n(ugger)f(supports)i(command)f(switches)i(courtesy)f(of) h Fs(optparse)p Fv(.)32 b(In)22 b(particular)g Fs(pydb)g Fv(has)h(the)g(tw)o(o)0 3119 y(v)o(ery)g(common)e(options)i(`)p Fs(--help)p Fv(')g(to)g(sho)n(w)h(what)g(options)e(are)i(a)n(v)n (ailable)f(and)g(`)p Fs(--version)p Fv(')f(to)i(report)f(the)g(v)o (ersion)g(that)h(is)0 3218 y(installed.)0 3365 y(Third,)e(you)g(need)g (not)g(supply)g(a)h(script)f(name)g(to)h(deb)n(ug)f(at)h(the)f(outset.) 32 b(Usually)23 b(though)e(you)g(will)j(w)o(ant)f(to)f(gi)n(v)o(e)g (the)h(name)f(of)g(a)0 3465 y(script)e(to)h(deb)n(ug)e(and)g(after)h (that)g(you)g(may)f(w)o(ant)i(to)f(pass)h(options)e(for)h(this)g (script.)0 3612 y(Thus)g(the)g(general)f(form)g(of)h(in)m(v)n(oking)e (the)i(deb)n(ugger)e(is:)0 3758 y Fs(pydb)i Fl([)p Fo(deb)n(ug)o(g)o (er)n(-options)p Fv(.)12 b(.)g(.)21 b Fl(])26 b([)p Fo(python-script)19 b Fl([)p Fo(script-options)p Fv(.)12 b(.)g(.)23 b Fl(])12 b(])0 3905 y Fo(python-script)18 b Fv(should)e(be)i(the)g(Python)f (source)g(\(usually)g(has)h(e)o(xtension)e Fs(.py)i Fv(if)g(an)o(y\),)f (and)g(not)h(a)g(compiled)f(or)g(optimized)g(Python)0 4005 y(program.)0 4152 y(If)i Fo(python-script)g Fv(doesn')o(t)e (contain)h(path)g(elements,)h(then)f(path)h(searching)f(is)h(performed) e(on)h Fo(python-script)h Fv(if)g(the)g(\002le)h(isn')o(t)e(in)i(the)0 4251 y(current)f(w)o(orking)g(directory)-5 b(.)22 b(\(This)e(is)h(e)o (xactly)f(the)g(same)g(beha)n(vior)f(as)i Fs(gdb)p Fv(.\))0 4398 y(Ho)n(we)n(v)o(er)c(the)h(location)f(of)i(the)f(Python)f (interpreter)g(used)h(for)f(the)i(script)f(will)h(not)f(necessarily)g (be)g(the)g(one)g(speci\002ed)g(in)h(the)f(magic)0 4498 y(\002eld)25 b(\(the)f(\002rst)h(line)f(of)g(the)h(Python)e(script)i (to)f(be)g(deb)n(ugged\),)f(b)n(ut)h(will)i(be)e(the)g(Python)g (interpreter)e(that)j(the)f(deb)n(ugger)m(,)f Fs(pydb)p Fv(,)0 4597 y(speci\002es.)i(\(In)20 b(most)g(cases)h(the)o(y')o(ll)f (be)g(the)g(same)g(and/or)f(it)i(w)o(on')o(t)e(matter)-5 b(.\))0 4744 y(If)21 b(you)e(are)i(f)o(amiliar)f(with)h(the)g(stock)g (deb)n(ugger)d Fs(pdb)p Fv(,)j(you)f(may)g(feel)h(the)f(ur)o(ge)g(to)g (write)h(a)g(wrapper)f(script.)26 b(As)c(indicated)d(abo)o(v)o(e,)0 4844 y(you)g(shouldn')o(t)f(ha)n(v)o(e)i(to)g(if)h Fs(pydb)f Fv(got)f(installed)i(properly)d(and)h(a)i(symbolic)e(link)h(w)o(as)h (inserted.)0 4991 y(That)k(said,)h(if)f(installation)f(didn')o(t)f(w)o (ork)h(or)h(you)f(w)o(ant)h(to)f(create)h(a)g(shell)g(wrapper)f (script,)h(sure,)h(you)e(can.)38 b(Here')-5 b(s)25 b(an)g(e)o(xample)0 5090 y(from)19 b(a)i(SUSE)g(GNU/Linux)e(box.)p 0 5145 1560 4 v 90 5200 a Fk(1)120 5224 y Fj(Ho)n(we)n(v)o(er)f(there)g Fi(is)f Fj(one)g(special)i(case)f(where)g(you)f(may)g(w)o(ant)h(to)f (in)m(v)o(ok)o(e)h(via)g(Python.)j(If)c(you)g(w)o(ant)h(w)o(arnings)g (to)f(appear)i(as)d(errors,)h(one)h(w)o(ay)f(to)g(do)g(this)h(is)e(to)0 5303 y(run)h(the)h Fh(pydb.py)d Fj(program)j(passing)g(the)g Fh(-Werror)d Fj(option)k(to)e(Python.)k(See)d(also)f(1.2.3.)p 0 5549 3901 4 v 0 5649 a Fr(2)2207 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 3 9 TeXDict begin 3 8 bop 0 83 a Fv(Looking)150 b(at)j(the)f(output)e(from) h Fs(make)50 b(install)151 b Fv(I)h(see)h Fs(pydb)f Fv(w)o(as)g (installed)g(in)0 183 y Fs(/usr/lib/python2.4/site-packages)p Fv(.)71 b(Therefore)35 b(sa)n(v)o(e)j(the)f(follo)n(wing)f(in)i(a)g (script)f(and)g(put)g(it)h(some)n(where)0 282 y(in)20 b(your)f Fs(PATH)h Fv(\(and)g(mak)o(e)f(it)i(e)o(x)o(ecutable\):)326 520 y Fg(#!/bin/sh)326 612 y(export)44 b (PYTHONPATH="/usr/lib/python2.4/site-p)o(ackage)o(s/:$PY)o(THONPA)o (TH:")326 703 y(/usr/lib/python2.4/site-packages/pydb/)o(pydb.p)o(y)39 b($)2433 716 y(*)0 990 y Fv(A)21 b(detailed)e(list)j(of)d(options)h(is) h(gi)n(v)o(en)e(ne)o(xt.)0 1269 y Ff(1.1.1)100 b(Deb)n(ugger)30 b(Command)g(Options)e(\()p Fe(--trace)p Ff(,)e Fe(--output)p Ff(,)f Fe(--command)p Ff(,)g Fe(--nx)p Ff(,)i(.)17 b(.)g(.)g(\))0 1472 y Fv(Man)o(y)i(options)f(ha)n(v)o(e)h(both)g(a)h(short)g(and)f(a)h (long)f(v)o(ersion.)k(F)o(or)c(e)o(xample,)f(`)p Fs(-x)p Fv(')i(is)g(the)g(short)f(v)o(ersion)f(while)i(`)p Fs(--command)p Fv(')e(is)j(the)0 1571 y(long)e(v)o(ersion.)0 1770 y Ft(\226\226annotate=)p Fp(lev)o(el)39 b Fv(])208 1896 y(This)26 b(option)f(sets)i(the)g(\224annotation)d(le)n(v)o(el\224)i (inside)g(the)g(deb)n(ugger)-5 b(.)42 b(Its)27 b(ef)n(fect)e(is)j (identical)d(to)i(using)f(`)p Fs(set)48 b(annotate)208 1996 y Fo(le)o(vel)p Fv('.)55 b(The)31 b(annotation)d Fo(le)o(vel)p Fv(L)j(controls)e(ho)n(w)h(much)g(information)e(the)i (deb)n(ugger)f(prints)h(together)f(with)i(its)g(prompt,)208 2095 y(v)n(alues)26 b(of)g(e)o(xpressions,)g(source)g(lines,)i(and)e (other)f(types)i(of)f(output.)42 b(Le)n(v)o(el)26 b(0)g(is)i(the)e (normal,)h(le)n(v)o(el)f(1)g(is)i(for)e(use)g(when)208 2195 y(GDB)21 b(is)g(run)e(as)i(a)g(subprocess)e(of)h(GNU)g(Emacs.)0 2348 y Ft(\226\226basename)40 b Fv(Report)23 b(\002le)h(locations)f(as) h(only)e(the)h(base)h(\002lename,)f(and)g(omit)g(the)g(directory)f (name.)34 b(This)23 b(is)h(useful)f(in)h(running)208 2448 y(re)o(gression)18 b(tests.)0 2601 y Ft(\226\226batch)40 b Fv(Normally)30 b(the)i(deb)n(ugger)e(is)j(entered)d(before)h(the)h (deb)n(ugged)d(script)j(is)h(e)o(x)o(ecuted.)58 b(The)31 b(user)h(sets)h(breakpoints)d(or)208 2701 y(starts)23 b(interacti)n(v)o(ely)e(stepping)h(through)f(the)i(program.)31 b(Ho)n(we)n(v)o(er)m(,)21 b(if)i(you)f(w)o(ant)h(to)g(start)h(the)f (script)f(running)f(without)h(an)o(y)208 2801 y(interacti)n(v)o(e)16 b(beha)n(vior)h(from)g(the)h(deb)n(ugger)m(,)d(use)j(this)h(option)e (for)g(e)o(xample,)g(if)h(you)f(kno)n(w)g(that)h(a)h(script)f(will)g (terminate)f(with)208 2900 y(an)24 b(e)o(xception)f(which)h(causes)h (the)g(deb)n(ugger)d(to)j(be)g(entered)e(at)j(that)e(point.)38 b(The)25 b Fs(--trace)f Fv(option)f(implicitly)h(sets)i(this)208 3000 y(option.)0 3153 y Ft(\226\226cd)20 b Fp(directory)41 b Fv(Run)20 b Fs(pydb)g Fv(using)f Fo(dir)m(ectory)i Fv(as)f(its)i(w)o(orking)c(directory)-5 b(,)18 b(instead)i(of)g(the)g (current)f(directory)-5 b(.)0 3323 y Ft(\226\226command=)p Fp(\002lename)p Fd(|)p Ft(\226x)18 b Fp(\002lename)40 b Fv(Run)20 b(deb)n(ugger)e(script)j Fo(\002lename)p Fv(.)i(This)e(script)f(is)h(run)f(after)f(the)i(user')-5 b(s)20 b Fs(.pydbrc)g Fv(\002le.)0 3505 y Ft(\226\226exec=)p Fp(command-list)p Fd(|)p Ft(\226e)c Fp(command-list)40 b Fv(Run)26 b(deb)n(ugger)e(commands)g Fo(command-list)q Fv(.)41 b(Commands)25 b(should)g(be)h(separated)208 3604 y(by)15 b(\223)p Fs(;;)p Fv(\224\227the)g(same)i(as)f(you)f(w)o(ould)h (do)f(inside)h(the)g(deb)n(ugger)-5 b(.)22 b(Y)-9 b(ou)15 b(may)h(need)f(to)h(quote)f(this)i(option)d(to)i(pre)n(v)o(ent)f (command)208 3704 y(shell)20 b(interpretation,)e(e.g.)25 b Fs(--exec)48 b("break)h(20;;)g(continue")p Fv(.)0 3874 y Ft(\226\226n)p Fd(|)20 b Ft(\226nx)40 b Fv(Before)17 b(e)o(x)o(ecution)e(is)j(started,)g(a)f(deb)n(ugger)f(con\002guration)e (\002le)k Fs(.pydbrc)f Fv(is)h(run.)23 b(In)17 b(some)g(situations,)g (for)g(e)o(xample)208 3973 y(re)o(gression)j(testing)i(the)h(deb)n (ugger)m(,)d(you)h(w)o(ant)h(to)g(mak)o(e)g(sure)g(that)h(such)e (con\002guration)f(\002les)j(are)f(not)g(run)f(and)h(this)h(option)208 4073 y(will)d(do)g(that.)0 4226 y Ft(\226\226output=)p Fp(\002lename)39 b Fv(Write)25 b(the)f(normal)f(output)g(\(`)p Fs(stdout)p Fv('\))g(to)h(the)g(\002le)h Fo(\002lename)p Fv(.)36 b(Useful)24 b(when)g(running)e(a)i(Python)g(script)208 4326 y(without)19 b(access)i(to)f(a)h(terminal.)0 4479 y Ft(\226\226err)o(or=)p Fp(\002lename)39 b Fv(Write)30 b(the)f(error)g(output)f(\(`)p Fs(stderr)p Fv('\))f(to)j(\002le)g Fo(\002lename)p Fv(.)52 b(Useful)29 b(in)h(running)d(a)j(Python)f (script)g(without)208 4579 y(access)20 b(to)h(a)f(terminal.)0 4732 y Ft(\226\226thr)o(eading)39 b Fv(Allo)n(w)20 b(thread)f(deb)n (ugging.)k(See)d(1.2.14.)0 4902 y Ft(\226\226trace)f Fd(|)p Ft(\226X)40 b Fv(POSIX-style)25 b(line)g(tracing)f(is)i(a)n(v)n (ailable.)39 b(In)25 b(POSIX)h(shells)f(the)g(short)g(option)f(for)g (this)i(is)g Fs(-x)p Fv(;)h(ho)n(we)n(v)o(er)c(since)208 5001 y(we)d(follo)n(w)g Fs(gdb)g Fv(con)m(v)o(entions)d Fs(-x)k Fv(is)g(used)f(as)h(a)g(short)f(option)f(for)g Fs(--command)p Fv(.)24 b(When)c(line)h(tracing)e(is)i(turned)e(on,)h (each)208 5101 y(location)26 b(\(\002le)h(name)f(and)h(line)g(number\)) e(is)j(printed)e(before)f(the)i(command)e(is)j(e)o(x)o(ecuted.)44 b(This)27 b(option)f(can)h(be)g(used)f(in)208 5201 y(conjunction)e (with)i(the)h Fs(--output)e Fv(and)h Fs(--error)g Fv(options)g (described)f(abo)o(v)o(e)g(when)h(a)g(terminal)g(is)i(not)e(a)n(v)n (ailable)g(or)208 5300 y(when)21 b(not)h(running)e(interacti)n(v)o(ely) -5 b(.)29 b(The)22 b(corresponding)c(deb)n(ugger)i(command)g(is)k(`)p Fs(set)48 b(linetrace)h(on)p Fv('.)30 b(See)23 b(1.2.3)208 5400 y(for)c(an)h(e)o(xample)f(of)h(output)f(from)g(such)h(a)h(trace.)p 0 5549 3901 4 v 0 5649 a Fr(1.1.)52 b(In)n(v)n(oking)24 b(the)f(Deb)n(ugger)2835 b(3)p eop end %%Page: 4 10 TeXDict begin 4 9 bop 0 90 a Ft(\226\226fntrace)18 b Fd(|)p Ft(\226F)41 b Fv(If)27 b(line)g(tracing)f(produces)f(too)h(much) g(output,)h(there)g(is)g(also)h(function)d(call/return)g(tracing.)45 b(When)26 b(function)208 189 y(tracing)c(is)i(turned)e(on,)h(each)g (call)h(and)f(return)f(are)h(printed)f(with)h(the)g(nesting)g(le)n(v)o (el.)34 b(On)23 b(a)h(return)e(we)h(sho)n(w)g(a)h(return)e(type)208 289 y(and/or)c(return)h(v)n(alue)h(if)g(it)h(is)g(a)g(scalar)f(or)g (string.)25 b(See)c(1.2.3)d(for)i(an)g(e)o(xample)f(of)h(such)g(a)g (trace.)0 574 y Ff(1.1.2)100 b(Star)t(tup)29 b(\002les)f(\()p Fe(.pydbrc)p Ff(\))0 777 y Fv(If)e(a)h(\002le)g Fs(.pydbrc)53 b Fv(e)o(xists)27 b(in)f(the)g(user')-5 b(s)27 b(home)f(directory)e(or) i(in)h(the)f(current)f(directory)-5 b(,)26 b(it)h(is)g(read)f(in)h(and) f(e)o(x)o(ecuted)e(as)j(if)g(it)0 876 y(had)22 b(been)h(typed)f(at)h (the)g(deb)n(ugger)e(prompt.)32 b(This)23 b(is)h(particularly)d(useful) i(for)f(aliases.)34 b(If)23 b(tw)o(o)g(\002les)h(e)o(xist,)g(the)f(one) f(in)i(the)f(home)0 976 y(directory)18 b(is)j(read)f(\002rst)h(and)e (aliases)i(de\002ned)f(there)f(can)h(be)g(o)o(v)o(erridden)d(by)j(the)g (local)g(\002le.)25 b(Finally)20 b(you)g(can)g(specify)f(a)i(command)0 1076 y(\002le)g(to)f(be)g(read)g(when)g(in)m(v)n(oking)e Fs(pydb)i Fv(and)f(this)i(is)g(run)e(last.)26 b(See)21 b(1.1.1)e(for)g(information)f(on)i(ho)n(w)f(to)i(run)e(a)i(command)d (\002le.)0 1222 y(Sometimes)24 b(you)f(may)h(not)f(w)o(ant)i(to)f(run)f (a)i(startup)e(\002le.)38 b(F)o(or)23 b(e)o(xample,)h(you)f(may)h(ha)n (v)o(e)f(a)i(special)f(installation)g(script)g(that)g(uses)0 1322 y(the)c(deb)n(ugger)e(and)i(w)o(ant)g(to)h(mak)o(e)e(sure)h(a)h (user')-5 b(s)20 b(pro\002le)g(doesn')o(t)f(get)h(in)g(the)g(w)o(ay)-5 b(.)25 b(See)c(the)f(`)p Fs(--nx)p Fv(')f(command)f(option,)h(1.1.1.)0 1469 y(F)o(or)g(tracking)f(do)n(wn)g(problems)f(with)j(command)d (\002les,)j(see)g(the)f(`)p Fs(set)49 b(trace-commands)e(on)p Fv(')19 b(deb)n(ugger)e(command,)g(1.2.3.)0 1569 y(T)-7 b(o)20 b(run)g(a)g(deb)n(ugger)e(command)h(script)h(inside)g(the)g(deb) n(ugger)e(see)j(the)f(`)p Fs(source)p Fv(')f(command,)f(1.2.12.)0 1896 y Fn(1.2)121 b(Deb)n(ugger)36 b(Commands)0 2129 y Fv(In)19 b(this)g(section)g(we)g(describe)f(deb)n(ugger)e(commands)i (which)g(can)h(be)f(used)h(when)f(the)h(deb)n(ugger)e(is)j(run)e(as)h (a)g(standalone)f(program.)0 2276 y(Most)h(commands)f(can)g(be)h(abbre) n(viated)e(to)i(one)g(or)g(tw)o(o)g(letters;)h(e.g.,)e(`)p Fs(h\(elp\))p Fv(')g(means)h(that)g(either)f(`)p Fs(h)p Fv(')h(or)g(`)p Fs(help)p Fv(')f(can)h(be)g(used)0 2375 y(to)f(enter)g(the)g(help)g(command)e(\(b)n(ut)i(not)g(`)p Fs(he)p Fv(',)g(`)p Fs(hel)p Fv(',)g(`)p Fs(H)p Fv(',)g(`)p Fs(Help)p Fv(',)f(or)h(`)p Fs(HELP)p Fv('\).)f(Ar)o(guments)f(to)i (commands)f(must)h(be)h(separated)0 2475 y(by)k(white)h(space)g (\(spaces)f(or)h(tabs\).)35 b(Optional)23 b(ar)o(guments)f(are)i (enclosed)e(in)i(square)f(brack)o(ets)g(\(`)p Fs([])p Fv('\))g(in)h(the)f(command)f(syntax;)0 2575 y(the)e(square)g(brack)o (ets)f(must)h(not)g(be)g(typed.)k(Alternati)n(v)o(es)c(in)g(the)g (command)e(syntax)i(are)g(separated)f(by)h(a)h(v)o(ertical)e(bar)h(\(`) p Fs(|)p Fv('\).)0 2721 y(Entering)f(a)j(blank)e(line)h(repeats)g(the)f (last)i(command)d(entered.)26 b(Exception:)f(if)d(the)f(last)g(command) e(w)o(as)j(a)g(`)p Fs(list)p Fv(')e(command,)f(the)0 2821 y(ne)o(xt)g(11)h(lines)h(are)f(listed.)0 2968 y(Commands)h(that)h (the)g(deb)n(ugger)e(doesn')o(t)g(recognize)h(are)h(assumed)f(to)h(be)g (Python)f(statements)h(and)g(are)f(e)o(x)o(ecuted)g(in)h(the)g(conte)o (xt)0 3068 y(of)e(the)g(program)f(being)g(deb)n(ugged.)k(Python)c (statements)h(can)h(also)f(be)h(pre\002x)o(ed)d(with)j(an)f(e)o (xclamation)e(point)i(\(`)p Fs(!)p Fv('\).)k(This)d(may)f(be)0 3167 y(a)j(good)e(w)o(ay)i(to)g(inspect)f(the)h(program)d(being)i(deb)n (ugged;)f(it)j(is)f(e)n(v)o(en)f(possible)g(to)h(change)e(a)i(v)n (ariable)f(or)g(call)h(a)g(function.)31 b(When)0 3267 y(an)20 b(e)o(xception)e(occurs)i(in)g(such)g(a)h(statement,)e(the)i(e) o(xception)d(name)i(is)h(printed)e(b)n(ut)h(the)g(deb)n(ugger')-5 b(s)18 b(state)j(is)h(not)d(changed.)0 3414 y(The)i(deb)n(ugger)f (supports)g(aliases.)31 b(Aliases)22 b(can)g(ha)n(v)o(e)f(parameters)f (which)h(allo)n(w)h(a)g(certain)f(le)n(v)o(el)h(of)f(adaptability)f(to) i(the)g(conte)o(xt)0 3513 y(under)d(e)o(xamination.)j(See)f(1.2.12.)0 3798 y Ff(1.2.1)100 b(Deb)n(ugger)30 b(Prompt)0 4001 y Fv(By)18 b(def)o(ault)f(the)h(deb)n(ugger')-5 b(s)16 b(prompt)g(string)h(is)i(`)p Fs(\(Pydb\))48 b Fv(')18 b(with)g(a)g(trailing)f(blank.)24 b(Recursi)n(v)o(e)17 b(in)m(v)n(ocations)f(using)h(the)h(`)p Fs(debug)p Fv(')0 4101 y(command)28 b(strip)i(of)n(f)f(the)h(trailing)f(blanks,)j(add)d (a)i(layer)e(of)h(parenthesis)f(around)f(the)i(string,)h(and)f(add)f(a) h(trailing)g(blank.)53 b(F)o(or)0 4200 y(e)o(xample,)19 b(for)g(the)h(def)o(ault)g(prompt)e(the)j(\002rst)g(deb)n(ug)e(in)m(v)n (ocation)f(will)j(be)f(`)p Fs(\(\(Pydb\)\))48 b Fv('.)0 4347 y Fo(Ther)m(e')m(s)20 b(curr)m(ently)g(a)h(b)n(ug)f(in)g(the)h (code)e(wher)m(e)i(speci\002ed)f(tr)o(ailing)f(blanks)h(ar)m(e)h(c)o (hopped.)i(Furthermor)m(e)d(the)g(pr)l(ompt)g(may)g(c)o(hang)o(e)0 4447 y(in)g(the)h(futur)m(e)f(to)g(add)f(a)h(history)h(number)-9 b(.)24 b(It)c(is)h(g)o(ener)o(ally)f(not)f(advisable)g(to)i(c)o(hang)o (e)d(the)i(pr)l(ompt.)0 4594 y Fv(If)g(you)f(do)h(need)g(to)g(change)f (the)h(prompt)f(see)h(1.2.3.)0 4879 y Ff(1.2.2)100 b(Command)29 b(P)l(arsing)0 5082 y Fv(P)o(arameters)19 b(to)g(commands)f(are)h (separated)g(by)g(white)g(space.)25 b(No)19 b(sophisticated)g(parsing)f (to)i(\002gure)e(out)h(parameter)f(boundaries)g(is)0 5181 y(done.)0 5328 y(Multiple)26 b(commands)e(may)i(be)g(entered)f(on) h(a)g(single)g(line,)i(separated)d(by)h(`)p Fs(;;)p Fv('.)42 b(\(A)26 b(single)g(`)p Fs(;)p Fv(')j(is)e(not)f(used)g(because)g(it)g (is)i(the)p 0 5549 3901 4 v 0 5649 a Fr(4)2207 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 5 11 TeXDict begin 5 10 bop 0 83 a Fv(separator)19 b(for)g(multiple)g (commands)f(in)i(a)g(line)g(that)g(is)h(passed)f(to)g(the)g(Python)e (parser)-5 b(.\))25 b(No)19 b(intelligence)g(is)i(applied)e(to)h (separating)0 183 y(the)g(commands;)f(the)h(input)f(is)j(split)e(at)h (the)f(\002rst)h(`)p Fs(;;)p Fv(')f(pair)m(,)f(e)n(v)o(en)g(if)i(it)g (is)g(in)f(the)g(middle)g(of)g(a)g(quoted)f(string.)0 330 y(Man)o(y)c(commands)f(tak)o(e)i(an)g(inte)o(ger)f(parameter)-5 b(.)22 b(In)16 b(most)g(cases)h(a)f(Python)f(e)o(xpression)g(which)g(e) n(v)n(aluates)g(to)h(an)g(inte)o(ger)f(e)o(xpression)0 429 y(can)20 b(be)g(used.)25 b(F)o(or)20 b(e)o(xample)f(the)h Fs(6)p Fv(,)g Fs(0x6)h Fv(and)e Fs(2+4)p Fv(,)h(or)g Fs(int\(2)1925 444 y(*)1975 429 y(3.1\))f Fv(\(among)g(man)o(y)g (others\))g(represent)g(the)i(same)f(v)n(alue,)f(six.)0 529 y(Y)-9 b(ou)18 b(can)g(e)n(v)o(en)f(use)i(v)n(alues)f(from)g(v)n (ariables)f(in)i(your)e(program)f(if)j(you)f(w)o(ant)g(\226)h(although) d(I'm)i(not)g(sure)g(why)g(this)h(w)o(ould)f(be)g(a)h(good)0 628 y(thing)k(to)h(do.)34 b(Ho)n(we)n(v)o(er)22 b(again)h(be)h(mindful) e(of)h(using)g(white)h(space)f(since)h(that)g(is)g(used)g(to)f (separate)h(parameters.)34 b(So)23 b Fs(2)50 b(+)g(4)24 b Fv(is)0 728 y(not)c(read)f(the)i(same)f(as)h Fs(2+4)p Fv(.)0 1013 y Ff(1.2.3)100 b(Status)28 b(and)h(Deb)n(ugger)h(Settings)f (\()p Fe(info)p Ff(,)e Fe(set)p Ff(,)f Fe(show)p Ff(\))0 1216 y Fv(An)17 b Fs(info)g Fv(command)e(sho)n(ws)i(things)g(about)f (the)h(program)e(being)h(deb)n(ugged.)22 b(A)c Fs(set)f Fv(command)e(modi\002es)i(parts)g(of)g(the)g(deb)n(ugger)0 1315 y(en)m(vironment.)22 b(Y)-9 b(ou)19 b(can)h(see)h(these)g(en)m (vironment)c(settings)j(with)g(the)h Fs(show)f Fv(command.)0 1462 y(The)g(subobptions)f(to)i Fs(info)p Fv(,)f(or)h Fs(set)g Fv(\(or)f Fs(show)p Fv(\))g(don')o(t)f(can)i(be)f(abbre)n (viated)f(to)i(an)o(y)f(pre\002x)g(that)h(uniquely)d(speci\002es)k (them.)k(F)o(or)0 1562 y(e)o(xample)19 b Fs(info)49 b(li)20 b Fv(is)h(a)f(v)n(alid)g(abbre)n(viation)d(for)i Fs(info)49 b(line)20 b Fv(while)g Fs(info)49 b(l)21 b Fv(is)g(not)e(since)h(there) g(is)h(another)d(subcommand)0 1662 y(\()p Fs(locals)p Fv(\))h(which)h(also)g(starts)h(with)f(an)h(`l'.)0 1808 y(In)f(all)h(of)f(the)g(set)h(options)e(that)h(tak)o(e)h(\223on\224)e (or)h(\223of)n(f)5 b(\224)19 b(parameters,)f(you)i(can)g(also)g(use)h (1)f(for)g(\223on\224)f(and)h(0)g(for)f(\223of)n(f.)-6 b(\224)0 1955 y(Each)20 b(command)e(has)i(a)h(corresponding)c Fs(show)j Fv(command)e(to)i(sho)n(w)g(the)g(current)f(v)n(alue.)24 b(See)d(1.2.3)e(for)g(these)i(counterparts.)0 2102 y(If)d(a)h Fs(readline)f Fv(module)f(is)i(a)n(v)n(ailable,)f Fs(pydb)h Fv(can)f(k)o(eep)g(track)g(of)g(the)h(commands)e(you)g(type)h(during)f (your)g(deb)n(ugging)f(sessions,)0 2202 y(so)30 b(that)f(you)f(can)h (be)h(certain)e(of)h(precisely)g(what)g(happened.)50 b(The)29 b Fs(set)49 b(history)28 b Fv(commands)g(to)h(manage)f(the)i (command)0 2301 y(history)19 b(f)o(acility)-5 b(.)0 2448 y(POSIX-style)24 b(line)h(tracing)e(is)j(a)n(v)n(ailable)e(and)g(the)g Fs(set)49 b(linetrace)23 b Fv(commands)g(can)h(be)h(used)f(to)g (control)g(that.)37 b(Call)26 b(return)0 2548 y(tracing)19 b(is)i(a)n(v)n(ailable)f(via)g Fs(set)50 b(fntrace)p Fv(.)0 2695 y(Y)-9 b(ou)20 b(may)f(w)o(ant)i(to)f(sa)n(v)o(e)g(the)h (output)e(of)h Fs(pydb)g Fv(commands)e(to)j(a)f(\002le.)26 b(See)21 b(the)f Fs(set)49 b(logging)20 b Fv(commands)e(to)i(control)f Fs(pydb)p Fv(')-5 b(s)0 2794 y(logging.)0 3063 y Fr(Inf)n(o)23 b(\()p Fs(info)p Fr(\))0 3266 y Fv(Running)g(this)i(command)d(without)h (parameters)g(will)j(print)d(the)h(list)i(of)e(a)n(v)n(ailable)g(info)f (commands.)36 b(Belo)n(w)24 b(is)h(a)g(description)e(of)0 3365 y(the)d(indi)n(vidual)f(commands.)0 3595 y Ft(inf)n(o)h(ar)o(gs)41 b Fv(Sho)n(w)20 b(function/method)c(parameters.)24 b(See)d(1.2.6.)0 3761 y Ft(inf)n(o)f(br)o(eakpoints)40 b Fv(Sho)n(w)30 b(the)g(status)h(of)e(user)n(-settable)h(breakpoints.)52 b(W)m(ithout)29 b(ar)o(gument,)h(list)h(info)e(about)g(all)i (breakpoints.)208 3861 y(W)m(ith)20 b(an)g(inte)o(ger)f(ar)o(gument,)f (list)j(info)f(on)f(that)i(breakpoint.)208 3994 y(The)e(short)h (command)e(for)i(this)h(is)g Fs(L)p Fv(.)0 4160 y Ft(inf)n(o)f(globals) 41 b Fv(Sho)n(w)20 b(the)g(global)f(v)n(ariables.)24 b(See)d(1.2.7.)0 4326 y Ft(inf)n(o)f(handle)42 b Fv(Sho)n(w)19 b(the)i(signal)f(handling)e(status.)26 b(See)20 b(1.2.13.)0 4492 y Ft(inf)n(o)g(line)42 b Fv(Sho)n(w)22 b(the)h(current)f(line)g (number)f(in)i(source)g(\002le.)33 b(If)23 b(a)g(function)e(name)h(is)i (gi)n(v)o(en,)e(the)h(starting)f(line)h(of)g(the)g(function)e(is)208 4591 y(reported.)0 4757 y Ft(inf)n(o)f(locals)41 b Fv(Sho)n(w)20 b(the)g(local)g(v)n(ariables.)k(See)d(1.2.6.)0 4924 y Ft(inf)n(o)f(pr)o(ogram)40 b Fv(Sho)n(w)22 b(the)g(e)o(x)o(ecution)e (status)j(of)f(the)h(program.)29 b(The)22 b(possible)g(status)h(is)g (that)g(the)f(program)e(is)j(not)f(running)e(\(e.g.)208 5023 y(in)g(post-mortem)e(dump\),)g(or)i(the)g(program)e(is)k (\223stopped\224)c(and)i(if)g(stopped)f(at)i(a)g(breakpoint)d(that)i (is)h(sho)n(wn)e(as)i(well.)0 5189 y Ft(inf)n(o)f(signal)41 b Fv(Alias)21 b(for)f Fs(info)49 b(handle)p Fv(.)24 b(See)d(1.2.13.)0 5355 y Ft(inf)n(o)f(sour)o(ce)41 b Fv(Information)17 b(about)i(the)h(current)f(Python)g(\002le.)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2854 b(5)p eop end %%Page: 6 12 TeXDict begin 6 11 bop 0 83 a Fr(Set)24 b(\()p Fs(set)p Fr(\))0 286 y Fv(As)g(with)f(subobptions)e(to)i Fs(info)p Fv(,)h(or)f Fs(set)p Fv(,)g Fs(show)g Fv(subcommands)e(can)i(be)g (abbre)n(viated)e(to)i(an)o(y)f(pre\002x)h(that)g(uniquely)e (speci\002es)0 386 y(them.)j(F)o(or)19 b(e)o(xample)f Fs(set)49 b(lis)g(5)20 b Fv(is)g(a)f(v)n(alid)g(abbre)n(viation)e(for)h Fs(info)49 b(listsize)g(5)19 b Fv(while)g Fs(set)49 b(li)20 b Fv(is)g(not)f(since)g(there)g(is)0 485 y(another)g(subcommand)e(\()p Fs(linetrace)p Fv(\))i(which)g(also)i(starts)g(with)f(`li'.)0 709 y Ft(set)h(basename)f(on)p Fd(|)p Ft(off)40 b Fv(When)23 b(sho)n(wing)f(\002lenames)h(print)f(only)g(the)i(basename.)32 b(This)24 b(option)e(is)i(useful)f(in)g(re)o(gression)f(testing)208 809 y(where)17 b(the)g(base)h(\002le)g(names)f(are)h(the)g(same)f(on)g (dif)n(ferent)f(installations)i(e)n(v)o(en)e(though)g(the)i(directory)e (path)h(may)g(be)g(dif)n(ferent.)208 908 y(Y)-9 b(ou)22 b(may)h(w)o(ant)g(to)g(use)h(this)g(in)f(other)f(situations)h(as)h (well,)g(lik)o(e)g(sho)n(wing)e(a)i(deb)n(ugger)d(session)i(in)g(a)h (manual)e(such)h(as)h(this)208 1008 y(one.)0 1166 y Ft(set)d(deftrace)e (on)p Fd(|)p Ft(off)39 b Fv(In)21 b(contrast)f(to)h(the)f(stock)h(p)o (ython)e(deb)n(ugger)m(,)f(we)j(don')o(t)e(sho)n(w)i(or)f(stop)h(at)g (`def)5 b(')19 b(\(method)g(creation\))g(lines)208 1266 y(by)j(def)o(ault,)g(because)g(this)h(mak)o(es)g(stepping)e(more)h (cumbersome.)30 b(Ho)n(we)n(v)o(er)21 b(should)h(you)g(w)o(ant)g(to)h (change)e(this,)j(you)e(can)208 1365 y(set)f(this)f(of)n(f.)0 1524 y Ft(set)h(trace-commands)e(on)p Fd(|)p Ft(off)39 b Fv(Sho)n(w)23 b(lines)h(as)g(the)o(y)f(are)h(read)f(from)f(the)i(deb) n(ugger)d(command)g(\002le)k(\(or)d(`)p Fs(source)p Fv(')h(deb)n(ugger) 208 1623 y(command\).)i(This)d(is)g(useful)f(in)g(running)f(re)o (gression)f(tests,)k(b)n(ut)e(it)h(may)f(be)g(helpful)f(in)i(tracking)e (do)n(wn)g(a)i(problem)d(in)j(your)208 1723 y Fs(.pydbrc)d Fv(\002le.)0 1893 y Ft(set)i(deb)n(ug-pydb)f(on)p Fd(|)p Ft(off)40 b Fv(Set)28 b(whether)f(we)h(allo)n(w)g(tracing)f(the)g(deb)n (ugger)-5 b(.)46 b(This)28 b(is)h(used)e(for)g(deb)n(ugging)f(p)o(ydb)g (and)h(getting)208 1992 y(access)20 b(to)h(some)f(of)g(its)h(object)e (v)n(ariables.)208 2121 y(When)d Fs(debug-pydb)f Fv(is)j(\223on\224,)e (the)h(most)f(recent)g(side)h(of)f(the)h(stack)g(frame)e(will)j(be)e (located)g(some)n(where)f(in)i(the)g(deb)n(ugger;)208 2221 y(you')o(ll)28 b(need)h(to)g(adjust)h(the)f(frame)g(\223up\224)f (to)i(get)f(where)g(the)g(program)f(w)o(as)i(before)e(entering)g(the)h (deb)n(ugger)-5 b(.)51 b(\(In)29 b(some)208 2320 y(v)o(ersions)19 b(this)h(and)g(some)g(situations)g Fs(frame)49 b(6)21 b Fv(gets)f(you)f(out)h(of)g(the)g(deb)n(ugger)e(and)i(into)g(the)g (deb)n(ugged)e(program.)0 2495 y Ft(set)j(fntrace)e(on)p Fd(|)p Ft(off)40 b Fv(If)23 b(this)h(is)h(set)g(on,)f(e)n(v)o(ery)e (call)i(and)f(return)g(of)h(a)g(function)e(or)h(method)g(will)h(be)g (indicated)e(with)i(the)g(nesting)208 2595 y(le)n(v)o(el.)46 b(Return)27 b(sho)n(w)h(the)f(return)g(type)g(and/or)f(v)n(alue)h(if)h (the)f(v)n(alue)g(is)i(a)f(scalar)f(or)h(string.)46 b(By)28 b(def)o(ault)f(this)h(is)h(of)n(f.)46 b(Us-)208 2694 y(ing)23 b(the)i(command-line)c(option)i(`)p Fs(--fntrace)p Fv(')f(when)i(in)m(v)n(oking)e Fs(pydb)i Fv(implicitly)g(sets)h(this)g (on.)36 b(F)o(or)24 b(information)e(on)208 2794 y(`)p Fs(--fntrace)p Fv(',)c(see)i(1.1.1.)444 3014 y Fg($)44 b(pydb)h(--basename)e(--fntrace)g(gcd.py)h(4)h(10)444 3106 y(--Call)f(level)g(0)g(check_args\(\))444 3197 y(\(gcd.py:13\):)87 b(check_args)444 3288 y(+)i(13)45 b(def)f(check_args\(\):)444 3380 y(--Return)f(from)h(level)g(0)h(\(\))444 3471 y(--Call)g(level)g(0)g(gcd\(a=4,)g(b=10\))444 3562 y(\(gcd.py:24\):)87 b(gcd)444 3654 y(+)i(24)45 b(def)f(gcd\(a,b\):)444 3745 y(----Call)f(level)h(1)h(gcd\(a=6,)e(b=4\))444 3836 y(\(gcd.py:24\):)87 b(gcd)444 3928 y(+)i(24)45 b(def)f(gcd\(a,b\):)444 4019 y(------Call)f(level)h(2)h(gcd\(a=2,)e(b=4\))444 4110 y(\(gcd.py:24\):)87 b(gcd)444 4202 y(+)i(24)45 b(def)f (gcd\(a,b\):)444 4293 y(--------Call)f(level)h(3)g(gcd\(a=2,)g(b=2\)) 444 4384 y(\(gcd.py:24\):)87 b(gcd)444 4476 y(+)i(24)45 b(def)f(gcd\(a,b\):)444 4567 y(--------Return)e(from)i(level)g(3)h(=>)g (2)f(\(\))444 4658 y(------Return)f(from)h(level)g(2)g (=>)h(2)g(\(\))444 4749 y(----Return)g(from)h(level)g(1)h (=>)f(2)h(\(\))444 4841 y(--Return)f(from)h(level)g(0)h (=>)g(2)f(\(\))444 4932 y(The)g(GCD)g(of)h(4)g(and)f(10)g (is)h(2)208 5201 y Fv(Adding)21 b(function)g(tracing)h(output)g(will)i (slo)n(w)f(do)n(wn)f(your)g(program.)31 b(Unless)23 b(single)g (stepping)f(through)f(a)i(program,)e(nor)n(-)208 5300 y(mally)c(the)h(deb)n(ugger)e(is)j(called)f(only)f(at)h(breakpoints)e (or)i(at)g(the)g(call)h(and)e(return)g(of)h(a)g(function)e(or)i (method.)23 b(Ho)n(we)n(v)o(er)16 b(when)208 5400 y(line)k(tracing)f (is)i(turned)e(on,)h(the)g(deb)n(ugger)e(is)j(called)f(on)g(e)o(x)o (ecution)e(of)i(e)n(v)o(ery)f(statement.)p 0 5549 3901 4 v 0 5649 a Fr(6)2207 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 7 13 TeXDict begin 7 12 bop 0 83 a Ft(set)21 b(history)e(\002lename)i Fp(\002lename)41 b Fv(Set)26 b(the)g(\002lename)g(in)g(which)f(to)i (record)d(the)i(command)e(history)-5 b(.)41 b(\(the)26 b(list)h(of)f(pre)n(vious)e(com-)208 183 y(mands)19 b(of)h(which)g(a)g (record)f(is)i(k)o(ept\).)j(The)c(def)o(ault)g(\002le)h(is)g Fs(\230/.pydbhist)p Fv(.)0 365 y Ft(set)g(history)e(sa)n(v)o(e)h(on)p Fd(|)p Ft(off)40 b Fv(Set)22 b(sa)n(ving)g(of)f(the)h(history)f(record) f(on)h(e)o(xit.)29 b(Use)23 b(\223on\224)e(to)h(enable)e(the)i(sa)n (ving,)g(and)f(\223of)n(f)5 b(\224)20 b(to)i(disable)208 465 y(it.)j(W)m(ithout)20 b(an)g(ar)o(gument,)d(sa)n(ving)j(is)h (enabled.)0 631 y Ft(set)g(history)e(size)i Fp(number)41 b Fv(Set)21 b(the)g(size)g(of)f(the)g(command)e(history)-5 b(,)19 b(i.e.)i(the)f(number)f(of)h(pre)n(vious)e(commands)h(to)h(k)o (eep)g(a)h(record)208 730 y(of.)j(This)d(def)o(aults)e(to)i(the)f(v)n (alue)f(of)h(the)h(en)m(vironment)c(v)n(ariable)i Fs(HISTSIZE)p Fv(,)g(or)h(to)g(256)f(if)i(this)f(v)n(ariable)g(is)h(not)f(set.)0 906 y Ft(set)h(linetrace)e(on)p Fd(|)p Ft(off)40 b Fv(If)23 b(this)i(is)f(set)h(on,)f(the)f(position)g(\(\002le)h(and)f(line)h (number\))e(is)i(sho)n(wn)f(before)f(e)o(x)o(ecuting)g(a)i(statement.) 35 b(By)208 1006 y(def)o(ault)18 b(this)h(is)h(of)n(f.)j(Using)c(the)g (command-line)d(option)i(`)p Fs(--trace)p Fv(')f(when)h(in)m(v)n(oking) f Fs(pydb)h Fv(implicitly)h(sets)h(this)f(on.)24 b(F)o(or)208 1106 y(information)17 b(on)j(`)p Fs(--trace)p Fv(',)f(see)h(1.1.1.)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2854 b(7)p eop end %%Page: 8 14 TeXDict begin 8 13 bop 444 174 a Fg($)44 b(pydb)h(--basename)e(--trace) g(hanoi.py)h(2)444 266 y(\(hanoi.py:2\):)87 b()444 357 y(+)i(2)45 b("""Towers)e(of)i(Hanoi""")444 448 y(\(hanoi.py:3\):)87 b()444 540 y(+)i(3)45 b(import)f(sys)444 631 y(\(hanoi.py:5\):)87 b()444 722 y(+)i(5)45 b(def)f (hanoi\(n,a,b,c\):)444 814 y(\(hanoi.py:12\):)87 b()444 905 y(+)i(12)45 b(if)f(__name__=='__main__':)444 996 y(\(hanoi.py:13\):)87 b()444 1088 y(+)i(13)224 b(i_args=len\(sys.argv\))444 1179 y(\(hanoi.py:14\):)87 b()444 1270 y(+)i(14)224 b(if)45 b(i_args)e(!=)i(1)g(and)f (i_args)g(!=)g(2:)444 1362 y(\(hanoi.py:18\):)87 b()444 1453 y(+)i(18)224 b(n=3)444 1544 y(\(hanoi.py:20\):)87 b()444 1636 y(+)i(20)224 b(if)45 b(i_args)e(>)i(1:)444 1727 y(\(hanoi.py:21\):)87 b()444 1818 y(+)i(21)314 b(try:)444 1910 y(\(hanoi.py:22\):)87 b()444 2001 y(+)i(22)403 b(n)45 b(=)g(int\(sys.argv[1]\))444 2092 y(\(hanoi.py:27\):)87 b()444 2183 y(+)i(27)224 b(if)45 b(n)f(<)h(1)g(or)f(n)h(>)f(100:)444 2275 y(\(hanoi.py:31\):)87 b()444 2366 y(+)i(31)224 b(hanoi\(n,)44 b("a",)g("b",)g("c"\)) 444 2457 y(--Call)g(level)g(0)g(hanoi\(n=2,)f(a='a',)h(b='b',)g (c='c'\))444 2549 y(\(hanoi.py:5\):)87 b(hanoi)444 2640 y(+)i(5)45 b(def)f(hanoi\(n,a,b,c\):)444 2731 y(\(hanoi.py:6\):)87 b(hanoi)444 2823 y(+)i(6)224 b(if)45 b(n-1)f(>)h(0:)444 2914 y(\(hanoi.py:7\):)87 b(hanoi)444 3005 y(+)i(7)359 b(hanoi\(n-1,)43 b(a,)h(c,)h(b\))444 3097 y(----Call)e(level)h(1)h (hanoi\(n=1,)e(a='a',)h(b='c',)g(c='b'\))444 3188 y(\(hanoi.py:5\):)87 b(hanoi)444 3279 y(+)i(5)45 b(def)f(hanoi\(n,a,b,c\):)444 3371 y(\(hanoi.py:6\):)87 b(hanoi)444 3462 y(+)i(6)224 b(if)45 b(n-1)f(>)h(0:)444 3553 y(\(hanoi.py:8\):)87 b(hanoi)444 3645 y(+)i(8)224 b(print)44 b("Move)g(disk)g(\045s)h(to)f (\045s")h(\045)f(\(a,)h(b\))444 3736 y(Move)f(disk)g(a)h(to)f(c)444 3827 y(\(hanoi.py:9\):)87 b(hanoi)444 3919 y(+)i(9)224 b(if)45 b(n-1)f(>)h(0:)444 4010 y(----Return)e(from)h(level)g(1)h (\(\))444 4101 y(\(hanoi.py:9\):)87 b(hanoi)444 4193 y(+)i(9)224 b(if)45 b(n-1)f(>)h(0:)444 4284 y(\(hanoi.py:8\):)87 b(hanoi)444 4375 y(+)i(8)224 b(print)44 b("Move)g(disk)g(\045s)h(to)f(\045s")h(\045)f(\(a,)h(b\))444 4467 y(Move)f(disk)g(a)h(to)f(b)444 4558 y(\(hanoi.py:9\):)87 b(hanoi)444 4649 y(+)i(9)224 b(if)45 b(n-1)f(>)h(0:)444 4741 y(\(hanoi.py:10\):)87 b(hanoi)444 4832 y(+)i(10)359 b(hanoi\(n-1,)43 b(c,)h(b,)h(a\))444 4923 y(----Call)e(level)h(1)h (hanoi\(n=1,)e(a='c',)h(b='b',)g(c='a'\))444 5015 y(\(hanoi.py:5\):)87 b(hanoi)444 5106 y(+)i(5)45 b(def)f(hanoi\(n,a,b,c\):)444 5197 y(\(hanoi.py:6\):)87 b(hanoi)444 5289 y(+)i(6)224 b(if)45 b(n-1)f(>)h(0:)444 5380 y(\(hanoi.py:8\):)87 b(hanoi)444 5471 y(+)i(8)224 b(print)44 b("Move)g(disk)g(\045s)h(to)f (\045s")h(\045)f(\(a,)h(b\))444 5562 y(Move)f(disk)g(c)h(to)f(b)444 5654 y(\(hanoi.py:9\):)87 b(hanoi)444 5745 y(+)i(9)224 b(if)45 b(n-1)f(>)h(0:)444 5836 y(----Return)e(from)h(level)g(1)h (\(\))444 5928 y(\(hanoi.py:9\):)87 b(hanoi)444 6019 y(+)i(9)224 b(if)45 b(n-1)f(>)h(0:)444 6110 y(--Return)e(from)h(level)g(0)h(\(\))444 6202 y(\(hanoi.py:10\):)87 b(hanoi)444 6293 y(+)i(10)359 b(hanoi\(n-1,)43 b(c,)h(b,)h(a\))444 6384 y(\(hanoi.py:31\):)87 b()444 6476 y(+)i(31)224 b(hanoi\(n,)44 b("a",)g("b",)g("c"\)) 444 6567 y(\(:1\):)87 b()444 6658 y(+)p 0 5549 3901 4 v 0 5649 a Fr(8)2207 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 9 15 TeXDict begin 9 14 bop 208 83 a Fv(Adding)22 b(linetracing)g(output)h (will)h(slo)n(w)g(do)n(wn)f(your)f(program.)34 b(Unless)24 b(single)g(stepping)e(through)g(a)i(program,)e(normally)208 183 y(the)f(deb)n(ugger)e(is)j(called)f(only)f(at)i(breakpoints)d(or)i (at)h(the)f(call)g(and)g(return)f(of)h(a)g(function)f(or)h(method.)26 b(Ho)n(we)n(v)o(er)20 b(when)g(line)208 282 y(tracing)f(is)i(turned)e (on,)g(the)i(deb)n(ugger)d(is)j(called)f(on)g(e)o(x)o(ecution)e(of)i(e) n(v)o(ery)e(statement.)208 410 y(That)28 b(said,)j(e)o(x)o(ecution)26 b(may)i(still)i(be)f(pretty)f(f)o(ast.)51 b(If)28 b(you)g(w)o(ant)h(to) g(slo)n(w)g(do)n(wn)e(e)o(x)o(ecution)g(further)m(,)h(see)i(the)e (follo)n(wing)208 509 y(option.)0 665 y Ft(set)21 b(linetrace)e(delay)h Fp(time)41 b Fv(One)24 b(of)f(the)h(useful)f(things)g(you)g(can)g(do)g (with)h(this)g(deb)n(ugger)d(if)j(you)f(run)g(it)h(via)g(a)g(front-end) d(GUI)j(is)208 765 y(w)o(atch)g(your)g(program)f(as)i(it)h(e)o(x)o (ecutes.)38 b(T)-7 b(o)25 b(do)f(this,)i(use)g(`)p Fs(set)48 b(linetrace)h(on)p Fv(')24 b(which)h(prints)f(the)h(location)f(before) 208 864 y(each)19 b(Python)g(statement)h(is)h(run.)j(Man)o(y)19 b(front-end)f(GUIs)j(lik)o(e)f(the)g(one)g(in)g(GNU)g(Emacs)g(and)g Fs(ddd)g Fv(will)h(read)e(the)i(location)208 964 y(and)e(update)g(the)h (display)g(accordingly)-5 b(.)208 1091 y(There)30 b(is)i(ho)n(we)n(v)o (er)d(one)h(catch\227Python)f(runs)h(too)h(f)o(ast.)58 b(So)31 b(by)f(using)h(this)g(option)f(you)g(can)h(set)h(a)f(delay)f (after)h(each)208 1191 y(statement)18 b(is)i(run)f(in)g(order)f(for)g (GNU)i(and)e(your)g(e)o(yes)h(to)g(catch)g(up)g(with)g(Python.)k (Specify)c(a)g(\003oating)f(point)h(indicating)f(the)208 1291 y(number)g(of)i(seconds)f(to)i(w)o(ait.)k(F)o(or)20 b(e)o(xample:)444 1510 y Fg(set)44 b(linetrace)f(delay)h(0.5)h(#)f(1/2) h(a)f(second)208 1777 y Fv(In)19 b(my)h(e)o(xperience)e(half)i(a)h (second)e(is)i(about)f(right.)0 1932 y Ft(set)h(listsize)g Fp(lines)41 b Fv(Sets)22 b(ho)n(w)d(man)o(y)g(lines)i(are)f(sho)n(wn)f (by)h(the)g Fs(list)g Fv(command.)j(See)e(1.2.11.)0 2088 y Ft(set)g(logging)39 b Fv(Prints)21 b Fs(set)49 b(logging)20 b Fv(usage.)0 2260 y Ft(set)h(logging)e(on)p Fd(|)p Ft(off)39 b Fv(Enable)20 b(or)g(disable)g(logging.)0 2415 y Ft(set)h(logging)e (\002le)i Fp(\002lename)40 b Fv(By)21 b(def)o(ault,)f Fs(pydb)g Fv(output)g(will)h(go)f(to)h(both)f(the)g(terminal)g(and)g (the)h(log\002le.)26 b(Set)21 b Fs(redirect)f Fv(if)g(you)208 2515 y(w)o(ant)g(output)f(to)h(go)g(only)f(to)i(the)f(log)g(\002le.)0 2686 y Ft(set)h(logging)e(o)o(v)o(erwrite)g(on)p Fd(|)p Ft(off)40 b Fv(By)34 b(def)o(ault,)j Fs(pydb)e Fv(will)g(append)d(to)j (the)f(log\002le.)68 b(Set)35 b Fs(overwrite)e Fv(if)i(you)e(w)o(ant)i Fs(set)208 2786 y(logging)48 b(on)20 b Fv(to)h(o)o(v)o(erwrite)d(the)i (log\002le)g(instead.)0 2958 y Ft(set)h(logging)e(r)o(edir)o(ect)g(on)p Fd(|)p Ft(off)39 b Fv(By)22 b(def)o(ault,)f Fs(pydb)g Fv(output)f(will)i(go)f(to)g(both)g(the)g(terminal)g(and)g(the)g (log\002le.)28 b(Set)22 b Fs(redirect)e Fv(if)208 3058 y(you)f(w)o(ant)h(output)f(to)h(go)g(only)g(to)g(the)g(log)g(\002le.)0 3213 y Ft(set)h(pr)o(ompt)e Fp(prompt-string)40 b Fv(Set)34 b(deb)n(ugger')-5 b(s)30 b(prompt)h(string.)62 b(By)33 b(def)o(ault)f(it)h(is)g(`)p Fs(\(Pydb\))49 b Fv(')32 b(with)h(a)g(trailing)f(space.)62 b(F)o(or)208 3313 y(information)17 b(on)j(ho)n(w)g(the)g(prompt)f(changes,)f(see)j(1.2.1.)208 3440 y Fo(Ther)m(e')m(s)30 b(curr)m(ently)g(a)g(b)n(ug)g(in)h(the)f (code)g(wher)m(e)g(speci\002ed)g(tr)o(ailing)f(blanks)h(speci\002ed.)55 b(Furthermor)m(e)29 b(the)i(pr)l(ompt)f(may)208 3540 y(c)o(hang)o(e)18 b(in)i(the)h(futur)m(e)f(to)g(add)f(a)h(history)h (number)-9 b(.)24 b(It)c(is)h(g)o(ener)o(ally)f(not)f(advisable)g(to)i (c)o(hang)o(e)d(the)i(pr)l(ompt.)0 3711 y Ft(set)h(sigcheck)f(on)p Fd(|)p Ft(off)40 b Fv(T)l(urning)18 b(this)i(on)f(causes)g(the)h(deb)n (ugger)d(to)j(check)e(after)h(e)n(v)o(ery)f(statement)i(whether)e(a)i (signal)f(handler)f(has)208 3810 y(changed)h(from)g(one)h(of)h(those)g (that)f(is)i(to)f(be)g(handled)e(by)h(the)h(deb)n(ugger)-5 b(.)25 b(Because)c(this)g(may)g(add)f(a)h(bit)g(of)g(o)o(v)o(erhead)d (to)j(the)208 3910 y(running)c(of)h(the)h(deb)n(ugged)e(program,)g(by)i (def)o(ault)f(it)i(is)g(set)g(of)n(f.)k(Ho)n(we)n(v)o(er)17 b(if)j(you)e(w)o(ant)h(to)h(ensure)e(that)h(the)g(deb)n(ugger)e(tak)o (es)208 4010 y(control)i(when)g(a)i(particular)e(signal)h(is)h (encountered)c(you)j(should)f(set)i(this)f(on.)0 4165 y Ft(set)h(war)o(noptions)e Fl([)p Fp(w)o(arnoption)h(.)12 b(.)g(.)24 b Fl(])42 b Fv(Set)28 b(the)g(Python)e(w)o(arning)h(options) f(that)i(are)g(in)g(ef)n(fect)f(when)g(a)h(program)e(is)i(started)g(or) 208 4265 y(restarted.)c(On)19 b(the)h(command)d(line,)i(these)h(are)f (the)h Fs(-W)f Fv(options,)g(e.g.)24 b Fs(-Werror)p Fv(,)19 b(or)g Fs(-We::Deprecation)p Fv(.)j(Ho)n(we)n(v)o(er)208 4364 y(the)e(list)i(should)e(not)g(contain)g(the)h(leading)e Fs(-W)i Fv(and)f(options)g(should)g(be)h(separated)e(with)i(white)g (space)g(only)-5 b(,)19 b(e.g.)26 b(don')o(t)19 b(use)208 4464 y(commas.)208 4592 y(Examples:)444 4811 y Fg(\(Pydb\))44 b(set)g(warn)g(error)g(e::Deprecation)444 4902 y(Warning)f(options)h (used)g(in)h(running)e(a)i(Python)f(program:)489 4993 y(-Werror,)f(-We::Deprecation)444 5085 y(\(Pydb\))h(set)g(warnoptions) 444 5176 y(No)g(warning)g(options)g(have)g(been)g(set.)444 5267 y(\(Pydb\))p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2854 b(9)p eop end %%Page: 10 16 TeXDict begin 10 15 bop 0 83 a Ft(set)21 b(width)f Fp(columns)41 b Fv(Set)21 b(number)e(of)h(characters)f(the)h(deb)n(ugger)e(thinks)i (are)g(in)g(a)h(line.)208 216 y(W)-7 b(e)21 b(also)f(change)f(OS)i(en)m (vironment)c(v)n(ariable)i(COLUMNS.)0 484 y Fr(Sho)o(w)k(\()p Fs(show)p Fr(\))0 687 y Fv(All)j(of)g(the)f(\223sho)n(w\224)g(commands) f(report)h(some)g(sort)h(of)f(status)h(and)f(all)i(ha)n(v)o(e)e(a)h (corresponding)c(\223set\224)k(command)e(to)h(change)g(the)0 787 y(v)n(alue.)f(See)d(1.2.3)e(for)g(the)h(\223set\224)h (counterparts.)0 1017 y Ft(sho)o(w)g(ar)o(gs)41 b Fv(Sho)n(w)19 b(the)i(ar)o(gument)d(list)j(that)f(w)o(as)h(gi)n(v)o(en)e(the)h (program)e(being)i(deb)n(ugged)d(or)j(it)h(is)g(restarted)0 1183 y Ft(sho)o(w)g(basename)41 b Fv(Sho)n(w)20 b(short)f(or)h(long)g (\002lenames)0 1349 y Ft(sho)o(w)h(deftrace)40 b Fv(Sho)n(w)20 b(whither)f(we)h(should)g(step/stop)g(at)g(\223def)5 b(\224)19 b(\(method)g(creation\))g(commands.)0 1515 y Ft(sho)o(w)i(trace-commands)40 b Fv(Sho)n(w)19 b(the)i(deb)n(ugger)d (commands)g(before)h(running)0 1681 y Ft(sho)o(w)i(commands)41 b Fv(Sho)n(w)24 b(the)f(history)g(of)h(commands)e(you)h(typed.)35 b(Y)-9 b(ou)23 b(can)h(supply)f(a)h(command)e(number)g(to)i(start)g (with,)h(or)e(a)208 1780 y(`+')c(to)i(start)f(after)g(the)h(pre)n (vious)d(command)g(number)h(sho)n(wn.)24 b(A)d(ne)o(gati)n(v)o(e)d (number)g(starts)j(from)e(the)h(end.)208 1913 y(This)g(command)e(is)j (a)n(v)n(ailable)f(only)f(if)i(a)f Fs(readline)g Fv(module)f(is)i(a)n (v)n(ailable)e(and)h(supports)f(the)h(history)g(sa)n(ving.)0 2079 y Ft(sho)o(w)h(deb)n(ug-pydb)41 b Fv(Sho)n(w)20 b(whether)f(the)h(deb)n(ugging)e(the)i(deb)n(ugger)e(is)j(set.)26 b(See)21 b(also)f(1.2.3)0 2245 y Ft(sho)o(w)h(history)40 b Fv(Generic)24 b(command)f(for)h(sho)n(wing)f(command)g(history)h (parameters.)36 b(The)25 b(command)d(history)i(\002lename,)h(sa)n(ving) 208 2345 y(of)19 b(history)h(on)g(e)o(xit)g(and)f(size)i(of)f(history)f (\002le)i(are)f(sho)n(wn.)0 2511 y Ft(sho)o(w)h(linetrace)40 b Fv(Sho)n(w)20 b(the)g(line)h(tracing)e(status.)0 2677 y Ft(sho)o(w)i(linetrace)f(delay)40 b Fv(Sho)n(w)20 b(the)g(delay)g (after)g(tracing)f(each)h(line.)0 2843 y Ft(sho)o(w)h(listsize)42 b Fv(Sho)n(w)19 b(the)i(number)d(of)i(source)f(lines)i Fs(pydb)f Fv(will)h(list)g(by)f(def)o(ault.)0 3009 y Ft(sho)o(w)h(logging)40 b Fv(Sho)n(w)20 b(summary)e(information)g(of)i (logging)e(v)n(ariables)i(which)f(can)h(be)h(set)g(via)f Fs(set)49 b(logging)p Fv(.)0 3175 y Ft(sho)o(w)21 b(logging)e(\002le)42 b Fv(Sho)n(w)19 b(the)i(current)d(logging)h(\002le.)0 3341 y Ft(sho)o(w)i(logging)e(o)o(v)o(erwrite)40 b Fv(Sho)n(w)20 b(whether)f(logging)f(o)o(v)o(erwrites)h(or)h(appends)f(to)h(the)g(log) g(\002le.)0 3507 y Ft(sho)o(w)h(pr)o(ompt)40 b Fv(Sho)n(w)20 b(the)g(current)f(deb)n(ugger)f(prompt.)0 3673 y Ft(sho)o(w)j(sigcheck) 41 b Fv(Sho)n(w)20 b(whether)f(the)h(deb)n(ugger)e(checks)i(for)g (reassignment)e(of)i(signal)g(handlers.)k(See)d(also)f(1.2.3)f(and)h (1.2.13.)0 3839 y Ft(sho)o(w)h(v)o(ersion)0 4005 y(sho)o(w)g(war)o (noptions)40 b Fv(Sho)n(w)33 b(the)g(W)-7 b(arning)32 b(options)g(that)i(are)f(in)g(ef)n(fect)g(when)f(a)i(program)c(is)35 b(started)e(or)f(restarted.)63 b(On)34 b(the)208 4105 y(command-line)17 b(these)j(are)g(the)h Fs(-W)f Fv(options,)f(e.g.)25 b Fs(-Werror)p Fv(,)19 b(or)h Fs(-We::Deprecation)p Fv(.)0 4271 y Ft(sho)o(w)h(width)41 b Fv(Sho)n(w)20 b(number)f(of)g (characters)h(the)g(deb)n(ugger)e(thinks)i(are)g(in)g(a)h(line.)0 4556 y Ff(1.2.4)100 b(Breakpoints)c(\()p Fe(break)p Ff(,)108 b Fe(tbreak)p Ff(,)g Fe(clear)p Ff(,)g Fe(commands)p Ff(,)g Fe(delete)p Ff(,)g Fe(disable)p Ff(,)321 4672 y Fe(condition)p Ff(,)26 b Fe(ignore)p Ff(\))0 4875 y Fv(A)k(breakpoint)e(mak)o(es)i(your)e(program)g(stop)i(at)h(that)f (point.)53 b(Y)-9 b(ou)29 b(can)h(set)h(breakpoints)d(with)i(the)g Fs(break)f Fv(command)f(and)i(its)0 4975 y(v)n(ariants.)24 b(Y)-9 b(ou)20 b(can)g(specify)f(the)i(place)e(where)h(your)f(program)f (should)h(stop)h(by)g(\002le)h(and)f(line)g(number)e(or)i(by)g (function)e(name.)0 5122 y(The)j(deb)n(ugger)e(assigns)j(a)g(number)e (to)h(each)g(breakpoint)e(when)i(you)g(create)g(it;)h(these)g(numbers)e (are)h(successi)n(v)o(e)g(inte)o(gers)g(starting)0 5221 y(with)d(1.)24 b(In)17 b(man)o(y)f(of)h(the)h(commands)e(for)h (controlling)e(v)n(arious)h(features)h(of)g(breakpoints)f(you)h(use)g (this)h(number)-5 b(.)23 b(Each)17 b(breakpoint)0 5321 y(may)j(be)g(enabled)f(or)h(disabled;)f(if)i(disabled,)e(it)i(has)f(no) g(ef)n(fect)g(on)f(your)g(program)f(until)i(you)g(enable)f(it)i(again.) p 0 5549 3901 4 v 0 5649 a Fr(10)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 11 17 TeXDict begin 11 16 bop 0 83 a Fv(The)16 b(deb)n(ugger)f(allo)n(ws)i (you)e(to)i(set)h(an)o(y)e(number)e(of)j(breakpoints)d(at)k(the)e(same) h(place)g(in)f(your)g(program.)21 b(There)16 b(is)i(nothing)d(unusual)0 183 y(about)k(this)i(because)e(dif)n(ferent)g(breakpoints)f(can)i(ha)n (v)o(e)g(dif)n(ferent)e(conditions)h(associated)h(with)g(them.)0 330 y(The)27 b(simplest)i(sort)e(of)h(breakpoint)d(breaks)i(e)n(v)o (ery)g(time)h(your)e(program)g(reaches)h(a)h(speci\002ed)g(place.)47 b(Y)-9 b(ou)27 b(can)h(also)g(specify)f(a)0 429 y Fo(condition)d Fv(for)h(a)i(breakpoint.)39 b(A)27 b(condition)d(is)j(just)f(a)h (Boolean)e(e)o(xpression)f(in)i(your)f(programming)d(language.)41 b(A)26 b(breakpoint)0 529 y(with)31 b(a)g(condition)f(e)n(v)n(aluates)g (the)h(e)o(xpression)e(each)i(time)g(your)e(program)g(reaches)h(it,)k (and)d(your)e(program)g(stops)i(only)f(if)i(the)0 628 y(condition)18 b(is)k Fo(true)p Fv(.)0 775 y(This)h(is)g(the)f(con)m(v) o(erse)f(of)h(using)f(assertions)i(for)f(program)e(v)n(alidation;)i(in) g(that)h(situation,)f(you)f(w)o(ant)i(to)f(stop)h(when)e(the)i (assertion)0 875 y(is)e(violated\226that)d(is,)j(when)f(the)g (condition)f(is)i Fo(false)p Fv(.)0 1022 y(Break)e(conditions)f(can)i (ha)n(v)o(e)e(side)i(ef)n(fects,)f(and)g(may)g(e)n(v)o(en)g(call)h (functions)e(in)h(your)g(program.)j(This)e(can)f(be)h(useful,)e(for)h (e)o(xample,)0 1121 y(to)25 b(acti)n(v)n(ate)f(functions)g(that)g(log)h (program)d(progress,)j(or)f(to)h(use)g(your)f(o)n(wn)g(print)g (functions)f(to)i(format)f(special)h(data)f(structures.)0 1221 y(The)g(ef)n(fects)g(are)g(completely)f(predictable)f(unless)j (there)f(is)h(another)e(enabled)g(breakpoint)e(at)k(the)f(same)h (address.)36 b(\(In)24 b(that)g(case,)0 1321 y Fs(pydb)17 b Fv(might)f(see)i(the)f(other)f(breakpoint)f(\002rst)i(and)g(stop)g (your)f(program)e(without)j(checking)e(the)i(condition)e(of)i(this)h (one.\))23 b(Note)16 b(that)0 1420 y(breakpoint)22 b(commands)g(are)i (usually)f(more)h(con)m(v)o(enient)d(and)i(\003e)o(xible)h(than)f (break)g(conditions)g(for)g(the)h(purpose)f(of)g(performing)0 1520 y(side)e(ef)n(fects)e(when)h(a)h(breakpoint)c(is)22 b(reached.)0 1667 y(Break)31 b(conditions)f(can)h(be)h(speci\002ed)f (when)g(a)h(breakpoint)d(is)j(set,)j(by)c(adding)f(a)i(comma)e(in)i (the)f(ar)o(guments)f(to)h(the)h Fs(break)0 1766 y Fv(command.)23 b(The)o(y)c(can)h(also)h(be)f(changed)e(at)j(an)o(y)e(time)i(with)f (the)g Fs(condition)f Fv(command.)0 2013 y Ft(b\(r)o(eak\))g Fl([[)p Fp(\002lename)p Ft(:)12 b Fl(])p Fp(lineno)p Fd(|)p Fp(function)p Fl([)p Ft(,)18 b Fp(condition)12 b Fl(])g(])39 b Fv(W)m(ith)21 b(a)g Fo(lineno)f Fv(ar)o(gument,)e(set)j (a)g(break)f(at)h(that)f(line)h(number)e(in)i(the)208 2112 y(current)c(\002le.)25 b(W)m(ith)20 b(a)f Fo(function)f Fv(ar)o(gument,)e(set)k(a)f(break)f(at)i(the)f(\002rst)g(e)o(x)o (ecutable)f(statement)g(within)h(that)g(function.)k(The)18 b(line)208 2212 y(number)j(may)i(be)g(pre\002x)o(ed)e(with)j(a)g (\002lename)e(and)h(a)h(colon)e(to)h(specify)g(a)g(breakpoint)e(in)j (another)d(\002le)j(\(probably)d(one)h(that)208 2311 y(hasn')o(t)d(been)h(loaded)f(yet\).)26 b(The)20 b(\002le)h(is)h (searched)d(on)h Fs(sys.path)p Fv(.)25 b(Note)20 b(that)h(each)f (breakpoint)e(is)k(assigned)e(a)h(number)d(to)208 2411 y(which)h(all)i(the)f(other)g(breakpoint)d(commands)i(refer)-5 b(.)208 2544 y(If)18 b(a)h(second)e(ar)o(gument)f(is)k(present,)d(it)j (is)f(an)f(e)o(xpression)f(which)h(must)g(e)n(v)n(aluate)g(to)g(true)g (before)f(the)i(breakpoint)d(is)j(honored.)208 2677 y(W)m(ithout)g(an)i (ar)o(gument,)d(a)j(breakpoint)d(is)k(set)f(at)g(the)f(current)g (location.)25 b(Note)20 b(that)h(this)g(is)g(a)g(dif)n(ferent)e(beha)n (vior)g(from)h Fs(pdb)208 2776 y Fv(\(b)n(ut)f(the)i(same)f(beha)n (vior)f(as)h Fs(gdb)p Fv(\).)208 2909 y(If)g(threading)e(is)j(enabled,) e(you)g(can)h(also)h(specify)e(a)i(thread)e(name.)24 b(See)d(1.2.14.)0 3092 y Ft(tbr)o(eak)e Fl([[)p Fp(\002lename)p Ft(:)12 b Fl(])p Fp(lineno)p Fd(|)p Fp(function)p Fl([)p Ft(,)18 b Fp(condition)12 b Fl(])g(])40 b Fv(T)-6 b(emporary)21 b(breakpoint,)h(which)h(is)i(remo)o(v)o(ed)c(automatically)h(when)208 3191 y(it)e(is)i(\002rst)f(hit.)k(The)20 b(ar)o(guments)e(are)i(the)g (same)g(as)h(those)f(for)g Fs(break)p Fv(.)208 3324 y(If)g(threading)e (is)j(enabled,)e(you)g(can)h(also)h(specify)e(a)i(thread)e(name.)24 b(See)d(1.2.14.)0 3506 y Ft(cl\(ear\))e Fl([[)p Fp(\002lename)p Ft(:)12 b Fl(])p Fp(lineno)p Fd(|)p Fp(function)g Fl(])39 b Fv(Clear)16 b(breakpoint)e(at)i(speci\002ed)g(line)g(or)f(function.) 22 b(Ar)o(gument)14 b(may)h(be)h(line)g(number)m(,)208 3606 y(function)23 b(name,)i(or)f(`*')g(and)h(an)g(address.)38 b(If)25 b(a)g(line)g(number)e(is)i(speci\002ed,)h(all)f(breakpoints)e (in)i(that)g(line)g(are)g(cleared.)38 b(If)208 3706 y(a)24 b(function)f(is)i(speci\002ed,)g(the)g(breakpoints)d(at)j(the)f(be)o (ginning)e(of)i(the)h(function)d(are)j(cleared.)36 b(If)25 b(an)f(address)g(is)h(speci\002ed,)208 3805 y(breakpoints)18 b(at)i(that)h(address)e(are)i(cleared.)208 3938 y(W)m(ith)f(no)g(ar)o (gument,)d(clears)k(all)g(breakpoints)d(in)i(the)g(line)h(where)e(the)h (selected)g(frame)g(is)h(e)o(x)o(ecuting.)208 4071 y(See)i(also)g(the)g Fs(delete)f Fv(command)f(belo)n(w)h(which)g(clears)h(breakpoints)d(by)j (number)-5 b(.)31 b(Note)23 b(that)g Fs(delete)f Fv(handles)g(some)208 4171 y(cases)e(that)h(were)f(pre)n(viously)e(handled)h(by)g Fs(pdb)p Fv(')-5 b(s)21 b Fs(clear)f Fv(command.)0 4337 y Ft(commands)h Fl([[)p Fp(bpnumber)12 b Fl(])g(])39 b Fv(Set)24 b(commands)d(to)j(be)f(e)o(x)o(ecuted)f(when)h(a)g (breakpoint)f(is)i(hit.)35 b(Gi)n(v)o(e)23 b(breakpoint)e(number)g(as)k (the)208 4436 y(ar)o(gument)16 b(after)j(\224commands\224.)k(W)m(ith)c (no)g(bpnumber)d(ar)o(gument,)h(commands)g(refers)i(to)g(the)g(last)i (one)d(set.)25 b(The)19 b(commands)208 4536 y(themselv)o(es)g(follo)n (w)g(starting)h(on)g(the)g(ne)o(xt)g(line.)25 b(T)-7 b(ype)19 b(a)i(line)f(containing)f(\224end\224)g(to)h(terminate)g(the)g (commands.)208 4669 y(Here')-5 b(s)20 b(an)g(e)o(xample:)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(11)p eop end %%Page: 12 18 TeXDict begin 12 17 bop 444 174 a Fg(\(Pydb\))44 b(break)g(gcd)444 266 y(Breakpoint)f(1)i(set)f(in)g(file)h(gcd.py,)e(line)h(24.)444 357 y(\(Pydb\))g(commands)444 448 y(Type)g(commands)f(for)i(when)f (breakpoint)f(1)i(is)f(hit,)g(one)h(per)f(line.)444 540 y(End)g(with)g(a)h(line)f(saying)g(just)g("end".)444 631 y(>info)g(locals)444 722 y(>end)444 814 y(\(Pydb\))g(c)444 905 y(a)g(=)h(3)444 996 y(b)f(=)h(5)444 1088 y(\(gcd.py:28\):)87 b(gcd)444 1179 y(28)224 b(if)44 b(a)h(>)f(b:)444 1270 y(\(Pydb\))g(c)444 1362 y(a)g(=)h(2)444 1453 y(b)f(=)h(3)444 1544 y(\(gcd.py:28\):)87 b(gcd)444 1636 y(28)224 b(if)44 b(a)h(>)f(b:)444 1727 y(\(Pydb\))208 1999 y Fv(T)-7 b(o)22 b(remo)o(v)o(e)e(all)i(commands)e(from)h(a)i(breakpoint,)d(type)h (commands)f(and)i(follo)n(w)f(it)i(immediately)d(with)i Fs(end)p Fv(;)h(that)f(is,)h(gi)n(v)o(e)208 2099 y(no)c(commands.)208 2231 y(Specifying)25 b(an)o(y)h(command)f(resuming)g(e)o(x)o(ecution)g (\(currently)g Fs(continue)p Fv(,)j Fs(step)p Fv(,)g Fs(next)p Fv(,)g Fs(return)p Fv(,)g Fs(jump)p Fv(,)g Fs(skip)p Fv(,)208 2331 y(and)18 b Fs(quit)p Fv(\))h(terminates)g(the)g (command)e(list)j(as)g(if)g(that)f(command)e(w)o(as)j(immediately)e (follo)n(wed)g(by)h Fs(end)p Fv(.)25 b(This)19 b(is)h(because)208 2430 y(an)o(y)15 b(time)i(you)f(resume)g(e)o(x)o(ecution)f(\(e)n(v)o (en)g(with)i(a)g(simple)g(ne)o(xt)f(or)g(step\),)h(you)f(may)g (encounter)f(another)g(breakpoint\227which)208 2530 y(could)k(ha)n(v)o (e)g(its)j(o)n(wn)d(command)f(list,)j(leading)f(to)g(ambiguities)f (about)g(which)h(list)h(to)g(e)o(x)o(ecute.)208 2662 y(If)g(you)f(use)i(the)f Fs(silent)g Fv(command)e(in)j(the)f(command)e (list,)k(the)e(usual)h(message)f(about)f(stopping)g(at)i(a)g (breakpoint)d(is)j(not)208 2762 y(printed.)i(This)c(may)g(be)h (desirable)e(for)h(breakpoints)f(that)h(are)g(to)h(print)f(a)h (speci\002c)f(message)g(and)g(then)g(continue.)k(If)c(none)g(of)208 2862 y(the)g(other)f(commands)g(print)g(an)o(ything,)f(you)h(see)i(no)f (sign)g(that)g(the)h(breakpoint)c(w)o(as)k(reached.)0 3027 y Ft(delete)f Fl([)p Fp(bpnumber)f Fl([)p Fp(bpnumber)h(.)12 b(.)g(.)24 b Fl(])12 b(])41 b Fv(W)m(ith)33 b(a)g(space-separated)e (list)j(of)e(breakpoint)f(numbers,)j(clear)e(those)h(breakpoints.)208 3127 y(W)m(ithout)19 b(ar)o(gument,)f(clear)i(all)h(breaks)e(\(b)n(ut)h (\002rst)h(ask)f(con\002rmation\).)0 3292 y Ft(disable)h Fl([)p Fp(bpnumber)e Fl([)p Fp(bpnumber)g(.)12 b(.)g(.)25 b Fl(])12 b(])41 b Fv(Disable)17 b(the)g(breakpoints)e(gi)n(v)o(en)h (as)h(a)h(space-separated)d(list)j(of)f(breakpoint)d(numbers.)208 3392 y(Disabling)19 b(a)h(breakpoint)e(means)i(it)g(cannot)f(cause)h (the)g(program)e(to)i(stop)g(e)o(x)o(ecution,)e(b)n(ut)i(unlik)o(e)f (clearing)g(a)h(breakpoint,)e(it)208 3491 y(remains)h(in)i(the)f(list)h (of)f(breakpoints)e(and)i(can)g(be)g(\(re-\)enabled.)0 3656 y Ft(enable)g Fl([)p Fp(bpnumber)g Fl([)p Fp(bpnumber)f(.)12 b(.)g(.)24 b Fl(])12 b(])41 b Fv(Enable)19 b(the)i(breakpoints)d (speci\002ed.)0 3822 y Ft(ignor)o(e)h Fp(bpnumber)h Fl([)p Fp(count)12 b Fl(])41 b Fv(Set)18 b(the)g(ignore)e(count)h(for)g(the)g (gi)n(v)o(en)g(breakpoint)e(number)-5 b(.)23 b(If)17 b(count)g(is)h(omitted,)g(the)f(ignore)g(count)208 3921 y(is)g(set)g(to)g(0.)24 b(A)17 b(breakpoint)d(becomes)i(acti)n(v)o(e)g (when)g(the)h(ignore)e(count)g(is)j(zero.)23 b(When)16 b(non-zero,)f(the)i(count)e(is)j(decremented)208 4021 y(each)25 b(time)h(the)g(breakpoint)d(is)k(reached,)e(the)h(breakpoint) d(is)k(not)f(disabled,)g(and)f(an)o(y)g(associated)g(condition)f(e)n(v) n(aluates)h(to)208 4121 y(true.)0 4286 y Ft(condition)20 b Fp(bpnumber)f Fl([)p Fp(condition)12 b Fl(])40 b Fv(Condition)27 b(is)i(an)f(e)o(xpression)f(which)h(must)g(e)n(v)n(aluate)f(to)i(true)f (before)e(the)j(breakpoint)d(is)208 4386 y(honored.)c(If)e(condition)f (is)i(absent,)e(an)o(y)h(e)o(xisting)f(condition)g(is)i(remo)o(v)o(ed;) d(i.e.,)h(the)i(breakpoint)d(is)j(made)e(unconditional.)0 4670 y Ff(1.2.5)100 b(Resuming)29 b(Ex)m(ecution)g(\()p Fe(step)p Ff(,)e Fe(next)p Ff(,)g Fe(finish)p Ff(,)f Fe(return)p Ff(,)g Fe(continue)p Ff(,)f Fe(jump)p Ff(,)i Fe(skip)p Ff(\))0 4873 y Fv(\223Continuing\224)14 b(means)i(resuming)e (program)g(e)o(x)o(ecution)g(until)h(the)h(program)e(completes)h (normally)-5 b(.)22 b(In)15 b(contrast,)h(\223stepping\224)f(means)0 4973 y(e)o(x)o(ecuting)j(just)j(one)f(statement)g(of)h(the)f(program.)j (When)e(continuing)d(or)i(stepping,)f(the)i(program)d(may)i(stop)g(e)n (v)o(en)g(sooner)m(,)f(due)g(to)0 5072 y(a)i(breakpoint)c(or)j(an)g(e)o (xception.)0 5300 y Ft(s\(tep\))g Fl([)p Fp(count)12 b Fl(])41 b Fv(Ex)o(ecute)19 b(the)g(current)g(line,)h(stop)f(at)i(the) f(\002rst)g(possible)g(occasion)f(\(either)g(in)h(a)g(function)e(that)i (is)h(called)f(or)f(on)h(the)208 5400 y(ne)o(xt)f(line)h(in)h(the)f (current)f(function\).)p 0 5549 3901 4 v 0 5649 a Fr(12)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 13 19 TeXDict begin 13 18 bop 208 83 a Fv(Note)20 b(that)g(if)g(thread)g(deb) n(ugging)d(is)k(enabled,)e(the)h(ne)o(xt)g(statement)g(may)g(be)g(in)g (a)h(dif)n(ferent)d(thread.)0 249 y Ft(n\(ext\))h Fl([)p Fp(count)12 b Fl(])41 b Fv(Continue)22 b(e)o(x)o(ecution)e(until)j(the) f(ne)o(xt)g(line)h(in)g(the)g(current)e(function)g(is)i(reached)f(or)g (the)h(function)e(returns.)31 b(The)208 349 y(dif)n(ference)23 b(between)i(`)p Fs(next)p Fv(')g(and)g(`)p Fs(step)p Fv(')f(is)j(that)f(`)p Fs(step)p Fv(')e(stops)i(inside)g(a)g(called)f (function,)g(while)h(`)p Fs(next)p Fv(')f(e)o(x)o(ecutes)208 448 y(called)20 b(functions)e(at)j(\(nearly\))e(full)h(speed,)f (stopping)g(only)g(at)i(the)f(ne)o(xt)g(line)g(in)g(the)h(current)d (function.)208 581 y(Note)24 b(that)g(if)g(thread)g(deb)n(ugging)d(is)k (enabled,)f(the)g(ne)o(xt)f(statement)h(may)g(be)g(in)g(a)h(dif)n (ferent)d(thread.)36 b(There)24 b(currently)e(is)j(a)208 681 y(b)n(ug)19 b(only)h(in)g(thread)f(deb)n(ugging)f(where)h Fs(next)h Fv(can)g(act)h(lik)o(e)f Fs(step)p Fv(.)0 847 y Ft(\002nish)42 b Fv(Continue)20 b(e)o(x)o(ecution)e(until)i(the)g (current)f(function)f(returns.)208 980 y(See)i(also)h(1.2.5.)0 1146 y Ft(r)o(etur)o(n)40 b Fv(Mak)o(e)20 b(selected)f(stack)h(frame)f (return)f(to)i(its)h(caller)-5 b(.)25 b(Control)19 b(remains)g(in)g (the)h(deb)n(ugger)m(,)d(b)n(ut)i(when)g(you)g(continue)f(e)o(x)o(ecu-) 208 1245 y(tion)k(will)i(resume)f(at)h(the)f(return)f(statement)h (found)e(inside)i(the)g(subroutine)f(or)h(method.)32 b(At)24 b(present)e(we)i(are)f(only)f(able)h(to)208 1345 y(perform)18 b(this)i(if)h(we)f(are)h(in)f(a)h(subroutine)d(that)i(has) h(a)f Fs(return)g Fv(statement)g(in)g(it.)26 b(See)20 b(also)h(1.2.5)0 1527 y Ft(c\(ontinue\))e Fl([[)p Fp(\002lename)p Ft(:)12 b Fl(])p Fp(lineno)p Fd(|)p Fp(function)g Fl(])39 b Fv(Continue)27 b(e)o(x)o(ecution;)j(only)e(stop)g(when)g(a)g (breakpoint)e(is)k(encountered.)46 b(If)28 b(a)208 1627 y(line)23 b(position)g(is)h(gi)n(v)o(en,)f(continue)f(until)h(that)h (line)f(is)i(reached.)33 b(This)24 b(is)g(e)o(xactly)e(the)i(same)g (thing)e(as)i(setting)g(a)g(temporary)208 1727 y(breakpoint)17 b(at)k(that)f(position)g(before)e(running)h(an)h(\(unconditional\))c Fs(continue)p Fv(.)0 1893 y Ft(jump)21 b Fp(lineno)41 b Fv(Set)19 b(the)f(ne)o(xt)g(line)g(that)g(will)h(be)f(e)o(x)o (ecuted.)k(a)n(v)n(ailable)c(only)f(in)i(the)f(bottom-most)e(frame.)23 b(This)c(lets)g(you)e(jump)g(back)208 1992 y(and)i(e)o(x)o(ecute)g (code)h(again,)e(or)i(jump)g(forw)o(ard)e(to)j(skip)f(code)f(that)i (you)e(don')o(t)g(w)o(ant)h(to)g(run.)208 2125 y(Not)25 b(all)i(jumps)e(are)g(allo)n(wed\227for)f(instance)i(it)g(is)h(not)e (possible)g(to)h(jump)f(into)g(the)h(middle)f(of)g(a)h Fs(for)g Fv(loop,)g(into)f(a)i Fs(try)208 2225 y Fv(block)19 b(or)h(out)g(of)f(a)i Fs(finally)f Fv(clause.)208 2358 y(One)h(common)e(use)j(for)f(the)g Fs(jump)h Fv(statement)f(is)h(to)g (get)f(out)g(of)g(a)h(loop.)28 b(Sometimes)21 b(the)g(bounds)f(of)h (loops)g(are)h(computed)208 2457 y(in)e(adv)n(ance)f(so)h(you)f(can')o (t)h(lea)n(v)o(e)g(a)g(loop)g(early)f(by)h(say)h(setting)f(the)g(v)n (alue)f(of)h(the)h(loop)e(v)n(ariable)208 2590 y(Here')-5 b(s)20 b(an)g(e)o(xample)f(demonstrating)f(this:)444 2814 y Fg(pydb)44 b(ptest.py)444 2905 y(\(ptest.py:2\):)444 2997 y(\(Pydb\))g(list)533 3088 y(1)135 b(#!/bin/python)533 3179 y(2)90 b(->for)44 b(i)h(in)f(range\(1,10\):)533 3271 y(3)314 b(print)44 b(i)533 3362 y(4)135 b(print)44 b("tired)g(of)g(this")444 3453 y([EOF])444 3545 y(\(Pydb\))g(step)444 3636 y(\(ptest.py:3\):)444 3727 y(\(Pydb\))g(i=1000)444 3819 y(\(Pydb\))g(step)444 3910 y(1000)444 4001 y(\(ptest.py:2\):)444 4093 y(\(Pydb\))g(jump)g(4)444 4184 y(\(ptest.py:4\):)444 4275 y(\(Pydb\))g(step)444 4367 y(tired)g(of)g(this)444 4458 y(--Return--)444 4549 y(--Return--)444 4641 y(The)g(program)g (finished)f(and)i(will)f(be)g(restarted)444 4732 y(\(ptest.py:2\):)444 4823 y(\(Pydb\))208 5096 y Fv(Note)19 b(that)g(the)g(assignment)f(of)h (1,000)e(to)i Fs(i)h Fv(took)e(ef)n(fect,)g(although)g(it)h(had)g(no)f (ef)n(fect)h(on)g(terminating)e(the)i Fs(for)g Fv(loop;)g Fs(jump)208 5195 y Fv(w)o(as)i(needed)d(to)j(get)f(out)g(of)g(the)g (loop)f(early)-5 b(.)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(13)p eop end %%Page: 14 20 TeXDict begin 14 19 bop 0 83 a Ft(skip)21 b Fl([)p Fp(count)12 b Fl(])41 b Fv(Set)22 b(the)g(ne)o(xt)f(line)g(that)h(will)g(be)f(e)o (x)o(ecuted)f(to)h(be)h(the)f(line)g(number)f(which)h(is)h Fo(count)f Fv(line)g(boundaries)f(a)o(w)o(ay)h(from)208 183 y(the)f(current)f(line.)25 b(By)20 b(def)o(ault,)g Fo(count)f Fv(is)i(one)f(which)f(will)i(skip)f(the)g(current)f(line)i (about)e(to)h(be)g(e)o(x)o(ecuted.)208 310 y(This)j(command)e(w)o(orks) i(by)g(disassembling)f(instructions)g(from)g(the)h(current)f(line)h (until)g(a)h(ne)n(w)f(line)g(number)e(boundary)g(is)208 410 y(found)d(and)i(does)g(in)g(ef)n(fect)g(a)g Fs(jump)g Fv(to)h(that)f(line.)25 b(So)20 b(be)n(w)o(are,)g(we)g Fo(ar)m(e)g(not)g Fv(statement)g(boundaries.)208 538 y(Since)k(this)i(w)o(orks)e(underneath)e(the)j(same)g(as)h Fs(jump)p Fv(,)f(the)g(same)g(ca)n(v)o(eats)g(mentioned)e(apply)h(wiht) h(respect)f(to)h(where)f(you)208 637 y(cannot)19 b(jump)g(to.)0 918 y Ff(1.2.6)100 b(Examining)30 b(Call)e(F)l(r)o(ames)g(\()p Fe(info)59 b(args)p Ff(,)27 b Fe(info)58 b(locals)p Ff(,)27 b Fe(down)p Ff(,)f Fe(frame)p Ff(,)g Fe(up)p Ff(\))0 1121 y Fv(Each)20 b(line)g(in)h(the)f(backtrace)f(sho)n(ws)h(the)g (frame)g(number)e(and)i(the)g(function)f(name,)g(if)i(it)g(e)o(xists)g (and)e(the)i(place)f(in)g(a)h(\002le)g(where)f(the)0 1220 y(statement)g(is)h(located.)0 1367 y(Here)f(is)h(an)f(e)o(xample)f (of)h(a)h(backtrace)d(from)i(a)g(sample)g(T)-7 b(o)n(wers)20 b(of)g(Hanoi)g(program)e(that)i(is)h(used)f(in)g(re)o(gression)f (testing:)236 1605 y Fg(##)45 b(0)f(hanoi\(\))g(called)g(from)g(file)g ('/tmp/pydb/test/hanoi.py')d(at)j(line)g(5)236 1697 y(->)h(1)f (hanoi\(\))g(called)g(from)g(file)g('/tmp/pydb/test/hanoi.py')d(at)j (line)g(6)236 1788 y(##)h(2)f(in)h(file)f('/tmp/pydb/test/hanoi.py')d (at)j(line)g(29)236 1879 y(##)h(3)f(in)h(file)f('')f(at)i(line) f(1)236 1971 y(##)h(4)f(run\(\))g(called)g(from)g(file)h ('/usr/lib/python2.4/bdb.py')40 b(at)k(line)g(366)0 2257 y Fv(The)24 b Fs(->)g Fv(arro)n(w)g(indicates)g(the)g(focus.)36 b(In)24 b(the)g(e)o(xample,)g(I)h(issued)f(an)g(`)p Fs(up)p Fv(')g(command)e(which)i(is)h(why)e(the)h(focus)g(is)h(on)f(1)g(rather) 0 2357 y(than)c(0)g(as)h(it)g(w)o(ould)e(normally)g(be)h(after)g(a)g (stop.)0 2504 y(There)g(are)h(tw)o(o)h(\223hanoi\224)e(frames)h(listed) g(because)g(this)g(is)i(a)e(hanoi)f(called)i(itself)f(recursi)n(v)o (ely)-5 b(.)26 b(In)21 b(frame)f(2)i(and)e(3)h(we)h(don')o(t)e(ha)n(v)o (e)g(a)0 2603 y(function)g(name)h(listed.)30 b(That')-5 b(s)22 b(because)f(there)g(is)h(none.)29 b(Furthermore)19 b(in)j(frame)e(3)i(there)f(is)i(a)f(funn)o(y)e(\223in)h(\002le)i Fs('')d Fv(at)0 2703 y(line)g(1.)-6 b(\224)25 b(That')-5 b(s)21 b(because)e(there)h(isn')o(t)g(e)n(v)o(en)f(a)i (\002le)f(associated)g(with)h(the)f(command.)j(The)d(command)e(issued:) 371 2941 y Fg(exec)44 b(cmd)g(in)h(globals,)e(locals)0 3228 y Fv(This)20 b(statement)g(can)g(be)g(seen)h(in)f(frame)f(4.)25 b(This)c(is)g(a)g(b)n(ug)e(which)h(I)g(hope)f(to)i(\002x)f(with)h(a)f (more)g(informati)n(v)o(e)d(message.)0 3374 y(Finally)-5 b(,)18 b(note)g(that)h(frames)g(2)f(and)h(3)f(really)h(are)f(not)h (part)f(of)h(the)f(program)f(to)i(be)f(deb)n(ugged)f(b)n(ut)i(are)f (part)h(of)f(the)h(internal)f(w)o(orkings)0 3474 y(of)i(the)g(deb)n (ugger)-5 b(.)23 b(It')-5 b(s)21 b(possible)f(to)g(hide)g(this,)h(b)n (ut)f(in)g(the)g(open)g(spirit)g(of)g(Python)f(for)g(no)n(w)h(it)h (hasn')o(t)e(been)h(hidden.)0 3679 y Ft(inf)n(o)g(ar)o(gs)41 b Fv(Sho)n(w)20 b(the)g(method)f(or)h(function)e(parameters)h(and)h (their)g(v)n(alues.)208 3806 y(Here)g(is)h(an)f(e)o(xample)f(of)h(the)g (output)f(for)g(the)i(backtrace)d(of)i(the)g(hanoi)g(program)e(sho)n (wn)h(at)i(the)f(be)o(ginning)e(of)i(this)g(section:)444 4025 y Fg(\(Pydb\))44 b(info)g(args)444 4117 y(n=)g(3)444 4208 y(a=)g(a)444 4299 y(b=)g(b)444 4391 y(c=)g(c)444 4482 y(\(Pydb\))0 4778 y Ft(inf)n(o)20 b(locals)41 b Fv(Sho)n(w)20 b(all)h(local)f(v)n(ariables)g(for)f(the)i(gi)n(v)o(en)e (stack)h(frame.)25 b(This)c(will)g(include)e(the)h(v)n(ariables)g(that) g(w)o(ould)g(be)g(sho)n(wn)g(by)208 4878 y(`)p Fs(info)48 b(args)p Fv('.)0 5045 y Ft(wher)o(e)p Fd(|)p Ft(T)p Fd(|)p Ft(bt)20 b Fl([)p Fp(count)12 b Fl(])41 b Fv(Print)17 b(a)h(backtrace,)e(with)h(the)h(most)f(recent)g(frame)f(at)i(the)f (top.)24 b(An)17 b(arro)n(w)f(indicates)h(the)h(current)e(frame,)208 5145 y(which)j(determines)g(the)h(conte)o(xt)f(of)h(most)h(commands.) 208 5272 y(W)m(ith)f(a)h(positi)n(v)o(e)e(number)f Fo(count)q Fv(,)i(print)f(at)i(most)f(man)o(y)f(entries.)208 5400 y(An)h(e)o(xample)f(of)g(a)i(backtrace)e(is)i(gi)n(v)o(en)e(at)i(the)f (be)o(ginning)d(of)j(this)h(section.)p 0 5549 3901 4 v 0 5649 a Fr(14)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h (Python)f(Deb)n(ugger)p eop end %%Page: 15 21 TeXDict begin 15 20 bop 0 83 a Ft(do)o(wn)21 b Fl([)p Fp(count)12 b Fl(])41 b Fv(Mo)o(v)o(e)18 b(the)h(current)f(frame)h(one) g(le)n(v)o(el)g(do)n(wn)f(in)i(the)f(stack)h(trace)f(\(to)g(a)h(ne)n (wer)f(frame\).)k(W)m(ith)d(a)g(count,)e(which)h(can)208 183 y(be)h(positi)n(v)o(e)f(or)h(ne)o(gati)n(v)o(e,)e(mo)o(v)o(e)h (that)h(man)o(y)f(positions.)208 315 y(Note)h(this)g(is)i(the)e (opposite)f(of)h(ho)n(w)f Fs(pdb)p Fv(')-5 b(s)21 b Fs(down)f Fv(command)e(w)o(orks.)0 482 y Ft(up)j Fl([)p Fp(count)12 b Fl(])41 b Fv(Mo)o(v)o(e)22 b(the)i(current)e(frame)h(one)g(le)n(v)o (el)g(up)g(in)h(the)g(stack)f(trace)h(\(to)f(an)h(older)e(frame\).)34 b(W)m(ith)24 b(a)g(count,)f(which)g(can)h(be)208 581 y(positi)n(v)o(e)19 b(or)h(ne)o(gati)n(v)o(e,)e(mo)o(v)o(e)g(that)j (man)o(y)e(positions.)208 714 y(Note)h(this)g(is)i(the)e(opposite)f(of) h(ho)n(w)f Fs(pdb)p Fv(')-5 b(s)21 b Fs(up)f Fv(command)f(w)o(orks.)0 880 y Ft(frame)h Fl([)p Fp(position)12 b Fl(])40 b Fv(Mo)o(v)o(e)19 b(the)i(current)e(frame)h(to)h(the)f(speci\002ed)h(frame)e(number)-5 b(.)25 b(A)c(ne)o(gati)n(v)o(e)e(number)g(indicates)h(position)g(from) 208 980 y(the)g(end,)f(so)i Fs(frame)49 b(-1)20 b Fv(mo)o(v)o(es)f(to)h (the)h(ne)n(west)f(frame,)f(and)h Fs(frame)48 b(0)21 b Fv(mo)o(v)o(es)e(to)h(the)h(oldest)f(frame.)208 1112 y(If)g(threading)e(is)j(enabled,)e(you)g(can)h(also)h(specify)e(a)i (thread)e(name.)24 b(See)d(1.2.14.)0 1397 y Ff(1.2.7)100 b(Examining)30 b(Data)e(\()p Fe(print)p Ff(,)e Fe(pprint)p Ff(,)h Fe(examine)p Ff(,)e Fe(info)59 b(globals)p Ff(\))0 1597 y Ft(display)21 b Fl([)p Fp(f)o(ormat)12 b Fl(])19 b Fp(expression)41 b Fv(Print)21 b(v)n(alue)g(of)g(e)o(xpression)f Fo(e)n(xpr)m(ession)i Fv(each)f(time)g(the)h(program)d(stops.)29 b Fo(format)23 b Fv(may)e(be)h(used)208 1697 y(before)h Fo(e)n(xpr)m(ession)i Fv(as)h(in)f(the)g(\224print\224)f(command.)37 b Fo(format)26 b Fv(\224i\224)f(or)g(\224s\224)h(or)e(including)f(a)j (size-letter)f(is)g(allo)n(wed,)h(and)e(then)208 1796 y Fo(e)n(xpr)m(ession)c Fv(is)h(used)f(to)g(get)g(the)g(address)g(to)h (e)o(xamine.)208 1929 y(W)m(ith)i(no)f(ar)o(gument,)f(display)h(all)h (currently)e(requested)h(auto-display)e(e)o(xpressions.)32 b(Use)23 b(\224undisplay\224)e(to)i(cancel)f(display)208 2029 y(requests)d(pre)n(viously)g(made.)0 2195 y Ft(undisplay)i Fl([)p Fp(f)o(ormat)12 b Fl(])19 b Fp(expression)41 b Fv(Ev)n(aluate)25 b(the)h Fo(e)n(xpr)m(ession)g Fv(in)h(the)f(current)f (conte)o(xt)g(and)g(print)h(its)h(v)n(alue.)42 b Ft(Note:)37 b Fv(`)p Fs(print)p Fv(')208 2294 y(can)20 b(also)g(be)g(used,)g(b)n (ut)g(is)h(not)f(a)h(deb)n(ugger)d(command\227it)g(e)o(x)o(ecutes)h (the)h(Python)f Fs(print)h Fv(statement.)0 2460 y Ft(p)h Fp(expression)41 b Fv(Ev)n(aluate)18 b(the)i Fo(e)n(xpr)m(ession)f Fv(in)g(the)h(current)e(conte)o(xt)g(and)h(print)g(its)h(v)n(alue.)k (One)c(can)f(also)g(often)g(ha)n(v)o(e)g(an)g(e)o(xpression)208 2560 y(printed)c(by)i(just)h(typing)e(the)h(e)o(xpression.)22 b(If)17 b(the)g(\002rst)h(tok)o(en)e(doesn')o(t)g(con\003ict)g(with)i (a)f(deb)n(ugger)e(b)n(uilt-in)i(command)e(Python)208 2660 y(will,)25 b(by)f(def)o(ault,)g(print)g(the)g(result)g(same)h(as)g (if)f(you)f(did)h(this)h(inside)f(a)h(Python)e(interpreter)f(shell.)38 b(T)-7 b(o)24 b(mak)o(e)g(things)g(e)n(v)o(en)208 2759 y(more)18 b(confused,)f(a)j(special)f(case)g(of)g(running)e(an)i (arbitrary)f(Python)g(command)f(is)j(the)f(`)p Fs(print)p Fv(')f(command.)k(But)e(note)e(that)208 2859 y(the)i(deb)n(ugger)e (command)g(is)j(just)g(`)p Fs(p)p Fv('.)208 2992 y(So)28 b(what')-5 b(s)28 b(the)f(dif)n(ference?)46 b(The)28 b(deb)n(ugger')-5 b(s)26 b(print)h(command)f(encloses)h(e)n(v)o (erything)e(in)j(a)g(`)p Fs(repr\(\))p Fv(',)h(to)f(ensure)f(the)208 3091 y(resulting)16 b(output)h(is)i(not)e(too)g(long.)24 b Ft(Note:)f Fo(Should)16 b(add)h(info)g(as)h(to)g(how)g(to)g (customize)f(what)h(\223too)g(long\224)f(means)p Fv(.)23 b(So)18 b(if)g(you)208 3191 y(w)o(ant)e(abbre)n(viated)e(output,)i(or)g (are)g(not)g(sure)g(if)h(the)f(e)o(xpression)e(may)i(ha)n(v)o(e)g(an)g (arbitrarily)f(long)h(\(or)f(in\002nite\))h(representation,)208 3291 y(then)21 b(use)i(`)p Fs(p)p Fv('.)31 b(If)22 b(you)f(w)o(ant)i (the)f(output)f(as)i(Python)f(w)o(ould)f(print)h(it,)h(just)g(gi)n(v)o (e)f(the)g(e)o(xpression)f(or)h(possibly)f(use)i(p)o(ython')-5 b(s)208 3390 y(`)p Fs(print)p Fv(')19 b(command.)0 3556 y Ft(pp)i Fp(expression)41 b Fv(Lik)o(e)19 b(the)g(`)p Fs(p)p Fv(')g(command,)e(e)o(xcept)h(the)h(v)n(alue)f(of)h(the)g(e)o (xpression)e(is)j(pretty-printed)c(using)j(the)g Fs(pprint)f Fv(module.)0 3722 y Ft(examine)i Fp(expression)41 b Fv(Print)27 b(the)g(type)g(of)g(the)g(e)o(xpression,)g(pretty-print)e(its)j(v)n (alue)e(and)h(print)f(it')-5 b(s)29 b(class)f(members)e(v)n(alue.)45 b(F)o(or)208 3822 y(functions,)19 b(methods,)g(classes,)j(and)e (modules)f(print)h(out)g(the)h(documentation)d(string)i(if)h(an)o(y)-5 b(.)25 b(F)o(or)20 b(functions)f(also)i(sho)n(w)g(the)208 3922 y(ar)o(gument)c(list.)208 4054 y(The)k(e)o(xamine)f(deb)n(ugger)g (command)f(in)j(Perl)g(is)h(the)f(model)f(here.)28 b(Note)22 b(that)g(`)p Fs(x)p Fv(')f(is)i(a)f(short)f(name)h(for)f(\223e)o (xpression\224)e(as)k(it)208 4154 y(is)e(in)f(Perl')-5 b(s)21 b(deb)n(ugger)-5 b(.)0 4320 y Ft(whatis)20 b Fp(expression)41 b Fv(Print)21 b(just)f(the)g(type)g(name)g(of)g(the)g(e)o(xpression.)0 4486 y Ft(inf)n(o)g(globals)41 b Fv(Sho)n(w)21 b(all)h(global)f(v)n (ariables.)28 b(These)21 b(v)n(ariables)g(are)g(not)h(just)g(the)f(v)n (ariables)g(that)h(a)g(programs)d(sees)k(via)e(a)h Fs(global)208 4586 y Fv(statement,)d(b)n(ut)h(all)h(of)f(them)g(that)g(can)g(be)g (accessible.)0 4871 y Ff(1.2.8)100 b(Running)30 b(Arbitr)o(ar)s(y)f (Python)g(Commands)g(\()p Fe(debug)p Ff(,)d Fe(!)p Ff(,)h Fe(ipython)p Ff(,)f Fe(python)p Ff(\))0 5074 y Fv(Y)-9 b(ou)18 b(can)g(run)g(arbitrary)f(commands)g(that)h(change)f(state.)25 b(Ho)n(we)n(v)o(er)17 b(there)h(are)h(some)f(ca)n(v)o(eats.)24 b(An)19 b(assignment)f(to)g(a)h(local)g(v)n(ariable)0 5173 y(doesn')o(t)h(ha)n(v)o(e)g(an)i(ef)n(fect,)e(although)g(changes)g (to)h(instance)g(v)n(ariables)g(and)f(globals)h(do.)28 b(This)21 b(seems)h(to)f(be)h(an)f(artif)o(act)g(of)g(ho)n(w)g(the)0 5273 y(interpreter)16 b(is)j(written)f(to)g(speed)g(up)g(name)f (look-up)f(for)h(access)i(to)f(local)g(v)n(ariables.)24 b(As)19 b(a)f(result,)g(the)g(locals)h(dictionary)d(seen)i(may)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(15)p eop end %%Page: 16 22 TeXDict begin 16 21 bop 0 83 a Fv(be)20 b(created)g(on)g(the)h(\003y)-5 b(.)25 b(\(I)c(could)e(v)o(ery)h(well)h(ha)n(v)o(e)f(the)g(reason)g (wrong,)f(b)n(ut)h(net)h(ef)n(fect)f(is)h(the)g(same\227modifying)c(a)k (local)g(v)n(ariable)0 183 y(doesn')o(t)e(still)i(does)f(not)g(change)f (the)h(v)n(alue)f(after)h(the)g(command)f(is)i(\002nished.\))236 421 y Fg(\(Pydb\))44 b(list)281 512 y(23)281 603 y(24)134 b(def)45 b(gcd\(a,b\):)281 695 y(25)314 b(""")44 b(GCD.)g(We)h(assume)e (positive)h(numbers""")281 786 y(26)281 877 y(27)314 b(#)44 b(Make:)g(a)h(<=)f(b)281 969 y(28)89 b(->)179 b(if)45 b(a)g(>)f(b:)281 1060 y(29)448 b(\(a,)44 b(b\))h(=)g(\(b,)f (a\))281 1151 y(30)281 1243 y(31)314 b(if)44 b(a)h(<=)f(0:)281 1334 y(32)493 b(return)44 b(None)236 1425 y(\(Pydb\))g(p)h(a)236 1517 y(3)236 1608 y(\(Pydb\))f(a=5;)g(print)g(a)236 1699 y(5)236 1791 y(\(Pydb\))g(p)h(a)236 1882 y(3)0 2169 y Fv(Another)22 b(thing)g(to)h(k)o(eep)g(in)g(mind)f(is)i(the)f(scope)g (of)f(setting)h Fo(ne)o(w)h Fv(local)e(v)n(ariables.)33 b(The)o(y)22 b(persist)h(as)h(long)e(as)i(the)f(deb)n(ugger)e(stays)0 2268 y(inside)f(the)g(same)h(scope.)j(Furthermore)18 b(you)h Fo(can)h Fv(change)f(these.)25 b(Continuing)18 b(from)h(abo)o(v)o(e:)236 2506 y Fg(\(Pydb\))44 b(d)h(=)f(5)236 2598 y(\(Pydb\))g(p)h(d)236 2689 y(5)236 2780 y(\(Pydb\))f(n)236 2872 y(31)224 b(if)45 b(a)f(<=)h(0:)236 2963 y(\(Pydb\))f(p)h(d)236 3054 y(5)236 3146 y(\(Pydb\))f(d)h(=)f(6)236 3237 y(\(Pydb\))g(p)h(d) 236 3328 y(6)236 3420 y(finish)236 3511 y(--Return)f(from)g(level)g(4)h (=>)f(1)h(\(\))236 3602 y(35)224 b(return)44 b(gcd\(b-a,)f(a\))236 3694 y(\(Pydb\))h(p)h(d)236 3785 y(6)236 3876 y(\(Pydb\))f(n)236 3968 y(34)403 b(return)44 b(a)236 4059 y(\(Pydb\))g(p)h(d)236 4163 y(***)416 4150 y(NameError:)e(d)0 4543 y Fl([)p Ft(!)12 b Fl(])p Fp(statement)40 b Fv(Ex)o(ecute)23 b(the)h(\(one-line\))d Fo(statement)k Fv(in)f(the)g(conte)o(xt)f(of)g(the)h(current)f(stack)g(frame.)35 b(The)24 b(e)o(xclamation)e(point)h(can)208 4643 y(be)e(omitted)g (unless)h(the)f(\002rst)h(w)o(ord)f(of)h(the)f(statement)h(resembles)f (a)h(deb)n(ugger)d(command.)27 b(T)-7 b(o)22 b(set)g(a)g(global)f(v)n (ariable,)f(you)208 4742 y(can)g(pre\002x)f(the)h(assignment)g(command) e(with)i(a)h(`)p Fs(global)p Fv(')e(command)f(on)i(the)g(same)g(line,)g (e.g.:)444 4966 y Fg(\(Pydb\))44 b(global)f(list_options;)g (list_options)g(=)i(['-l'])444 5058 y(\(Pydb\))0 5363 y Ft(deb)n(ug)21 b Fp(statement)41 b Fv(Enter)24 b(a)g(recursi)n(v)o(e) f(deb)n(ugger)f(that)j(steps)f(through)e(the)j(code)e(ar)o(gument)f (\(which)h(is)i(an)g(arbitrary)d(e)o(xpression)p 0 5549 3901 4 v 0 5649 a Fr(16)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 17 23 TeXDict begin 17 22 bop 208 83 a Fv(or)18 b(statement)g(to)h(be)g(e)o (x)o(ecuted)d(in)j(the)g(current)e(en)m(vironment\).)k(The)d(prompt)f (is)j(changed)d(to)i(indicate)f(nested)g(beha)n(vior)-5 b(.)23 b(See)208 183 y(1.2.1)0 349 y Ft(ipython)d Fp(options...)40 b Fv(Run)20 b(ip)o(ython)f(as)i(a)f(subshell.)25 b(Y)-9 b(ou)19 b(need)h(to)g(ha)n(v)o(e)g(ip)o(ython)f(\(IPython\))f (installed)i(for)f(this)i(command.)208 482 y Fo(options)e Fv(are)h(the)g(options)f(passed)h(to)h(ip)o(ython.)i(If)d(not)g(are)g (gi)n(v)o(en)f(the)h(follo)n(wing)f(options)g(are)h(passed:)533 706 y Fg(-noconfirm_exit)43 b(-prompt_in1)g('Pydb)h(In)g([\\#]:)g(')0 1011 y Ft(python)d Fv(Run)20 b(p)o(ython)e(as)j(a)g(subshell.)0 1296 y Ff(1.2.9)100 b(Star)t(ting/Restar)t(ting)30 b(a)e(Python)h(Scr)q (ipt)g(\()p Fe(restart)p Ff(,)d Fe(run)p Ff(\))0 1496 y Ft(\002le)21 b Fl([)p Fp(\002lename)12 b Fl(])40 b Fv(Use)30 b Fo(\002lename)e Fv(as)i(the)f(Python)f(program)f(to)i(be)h (deb)n(ugged.)49 b(It)30 b(is)g(compiled)e(and)g(becomes)g(is)j(the)e (program)208 1595 y(e)o(x)o(ecuted)e(when)h(you)g(use)i(the)f(`run')e (command.)50 b(If)29 b(no)g(\002lename)f(is)i(gi)n(v)o(en,)g(this)f (means)g(to)g(set)h(things)f(so)g(there)g(is)h(no)208 1695 y(Python)19 b(\002le.)0 1861 y Ft(r)o(estart)g Fp(args...)40 b Fv(Restart)19 b(deb)n(ugger)c(and)i(program)e(via)i(an)h Fs(exec)f Fv(call.)24 b(All)18 b(state)h(is)f(lost,)g(and)f(ne)n(w)g (cop)o(y)g(of)g(the)g(deb)n(ugger)f(is)i(used.)208 1994 y(Sometimes)26 b(in)g(deb)n(ugging)e(it)k(is)f(necessary)f(to)h(modify) e(module)g(code)h(when)g(one)g(\002nds)h(a)g(b)n(ugs)f(in)h(them.)43 b(Python)26 b(will)208 2094 y(not)k(notice)g(dynamically)e(that)j(a)g (module)e(has)i(changed)e(and)h(thus)g(not)g(reimport)f(it)j(\(which)d (also)i(means)f(that)h(module)208 2193 y(initialization)19 b(code)h(is)h(not)f(rerun)e(either\).)25 b(So)20 b(in)g(such)g(a)h (situation)f(one)f(must)i(use)f Fs(restart)f Fv(rather)h(than)g Fs(run)p Fv(.)3592 2163 y Fm(2)0 2359 y Ft(run)h Fp(args...)40 b Fv(Run)29 b(or)e(\223soft\224)h(restart)h(the)f(deb)n(ugged)e(Python) h(program.)47 b(If)28 b(a)g(string)g(is)i(supplied,)e(it)h(is)h(split)e (with)h Fs(shlex)f Fv(b)n(ut)208 2459 y(preserving)g(embedded)g (quotes.)55 b(The)30 b(result)g(is)h(used)g(as)g(the)f(ne)n(w)g Fs(sys.argv)p Fv(.)55 b(History)-5 b(,)31 b(breakpoints,)g(actions)f (and)208 2559 y(deb)n(ugger)18 b(options)h(are)h(preserv)o(ed.)j Fs(R)d Fv(is)i(a)e(short)g(command)e(alias)j(for)f Fs(run)p Fv(.)208 2691 y(Y)-9 b(ou)23 b(may)h(notice)g(that)g(the)g(sometimes)g (you)f(can)h Fs(step)g Fv(into)g(modules)f(included)g(via)h(an)g Fs(import)g Fv(statement,)h(b)n(ut)f(after)208 2791 y(a)i Fs(run)f Fv(this)i(stepping)d(skips)i(o)o(v)o(er)e(the)i(import)f (rather)f(than)i(goes)f(into)g(it.)43 b(A)26 b(similar)g(situation)f (is)h(that)g(you)f(may)g(ha)n(v)o(e)g(a)208 2891 y(breakpoint)19 b(set)j(inside)g(class)h Fs(__init__)e Fv(code,)g(b)n(ut)g(after)h (issuing)f Fs(run)h Fv(this)g(doesn')o(t)f(seem)g(to)h(get)g (called\227and)f(in)g(f)o(act)208 2990 y(it)f(isn')o(t)g(run)g(again!) 208 3123 y(That')-5 b(s)24 b(because)g(in)g(Python)f(the)i Fs(import)f Fv(occurs)f(only)h(once.)36 b(In)25 b(f)o(act,)g(if)g(the)f (module)f(w)o(as)i(imported)e Fo(befor)m(e)h Fv(in)m(v)n(oking)208 3223 y(the)c(program,)e(you)h(might)g(not)h(be)g(able)g(to)h(step)f (inside)g(an)g Fs(import)g Fv(the)g(\002rst)h(time)g(as)g(well.)208 3356 y(In)d(such)h(a)g(situation)f(or)h(other)f(situations)h(where)f Fs(run)h Fv(doesn')o(t)e(seem)i(to)g(ha)n(v)o(e)f(the)h(ef)n(fect)f(of) h(getting)f(module)f(initialization)208 3455 y(code)i(e)o(x)o(ecuted,)f (you)h(might)h(try)g(using)g Fs(restart)f Fv(rather)g(than)h Fs(run)p Fv(.)0 3740 y Ff(1.2.10)101 b(Interf)m(acing)28 b(to)g(the)g(OS)g(\()p Fe(cd)p Ff(,)f Fe(pwd)p Ff(,)g Fe(shell)p Ff(\))0 3929 y Ft(cd)21 b Fp(directory)41 b Fv(Set)20 b(w)o(orking)f(directory)g(to)h Fo(dir)m(ectory)g Fv(for)g(deb)n(ugger)e(and)h(program)f(being)h(deb)n(ugged.)0 4095 y Ft(pwd)42 b Fv(Print)20 b(w)o(orking)f(directory)-5 b(.)0 4261 y Ft(shell)21 b Fp(statement)42 b Fv(Ex)o(ecute)18 b(the)j(rest)f(of)g(the)g(line)h(as)g(a)f(shell)h(command.)0 4546 y Ff(1.2.11)101 b(Listing)28 b(Prog)o(r)o(am)i(Code)f(\()p Fe(list)p Ff(,)d Fe(disassemble)p Ff(\))0 4745 y Ft(disassemble)c Fl([)p Ft(object-or)m(-class)12 b Fl(])17 b([)p Fp (starting-line-number)j Fl([)p Fp(ending-line-number)12 b Fl(])g(])39 b Fv(W)m(ith)25 b(no)g(ar)o(gument,)f(disassemble)i(the) 208 4845 y(current)14 b(frame.)23 b(W)m(ith)17 b(one)e(inte)o(ger)g(ar) o(gument,)f(the)j(disassembly)e(is)i(narro)n(wed)d(to)j(not)f(sho)n(w)f (lines)i(before)e(that)h(line)g(number)-5 b(.)208 4945 y(W)m(ith)17 b(a)g(second)f(inte)o(ger)g(ar)o(gument,)f(disassembly)h (ends)h(as)g(soon)g(a)g(the)g(the)g(line)g(number)e(e)o(xceeds)h(the)h (ending)e(line)i(number)-5 b(.)208 5078 y(W)m(ith)20 b(a)h(class,)g(method,)d(function,)g(code)i(or)g(string)g(ar)o(gument)d (disassemble)j(that.)p 0 5149 1560 4 v 90 5204 a Fk(2)120 5228 y Fj(It)c(may)h(be)g(possible)h(to)e(unimport)i(by)f(remo)o(ving)g (a)g(the)g(module)h(from)e(a)h(namespace,)h(b)o(ut)f(if)f(there)i(are)g (shared)f(dynamically)j(loaded)e(objects)g(those)g(don')o(t)f(get)0 5307 y(unloaded.)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(17)p eop end %%Page: 18 24 TeXDict begin 18 23 bop 0 90 a Ft(l\(ist\))20 b Fl([)p Ft(-)g Fd(|)h Fp(\002rst)p Fl([)p Ft(,)g Fp(last)12 b Fl(])g(])41 b Fv(List)19 b(source)f(code.)24 b(W)m(ithout)17 b(ar)o(guments,)g(list)i Fo(n)g Fv(lines)f(centered)g(around)e(the)i (current)g(line)g(or)g(continue)208 189 y(the)28 b(pre)n(vious)e (listing,)k(where)e Fo(n)g Fv(is)h(the)f(v)n(alue)f(set)i(by)f(`)p Fs(set)48 b(listsize)p Fv(')27 b(or)h(sho)n(wn)f(by)h(`)p Fs(show)49 b(listsize)p Fv('.)e(The)208 289 y(def)o(ault)19 b(v)n(alue)h(is)h(10.)208 422 y(`)p Fs(list)48 b(-)p Fv(')23 b(lists)g Fo(n)g Fv(lines)f(before)f(a)i(pre)n(vious)e (listing.)31 b(W)m(ith)23 b(one)f(ar)o(gument)d(other)j(than)g(`-',)g (list)h Fo(n)g Fv(lines)f(centered)f(around)208 521 y(the)h (speci\002ed)g(position.)31 b(W)m(ith)23 b(tw)o(o)g(ar)o(guments,)d (list)k(the)e(gi)n(v)o(en)f(range;)i(if)g(the)f(second)g(ar)o(gument)e (is)j(less)h(than)e(the)g(\002rst,)i(it)208 621 y(is)d(a)f(count.)k Fo(\002r)o(st)f Fv(and)d Fo(last)i Fv(can)e(be)g(either)g(a)g(function) f(name,)g(a)i(line)f(number)m(,)e(or)i Fo(\002lename)p Fv(:)p Fo(line-number)r Fv(.)0 906 y Ff(1.2.12)101 b(Interf)m(acing)52 b(to)f(the)g(deb)n(ugger)j(\()p Fe(alias)p Ff(,)i Fe(complete)p Ff(,)e Fe(help)p Ff(,)i Fe(quit)p Ff(,)g Fe(kill)p Ff(,)f Fe(save)p Ff(,)377 1022 y Fe(source)p Ff(,)26 b Fe(unalias)p Ff(\))0 1220 y Ft(alias)20 b Fl([)p Fp(name)g Fl([)p Ft(command)12 b Fl(])g(])40 b Fv(Create)19 b(an)g(alias)h(called)f Fo(name)g Fv(that)g(e)o(x)o(ecutes)f Fo(command)r Fv(.)23 b(The)c(command)e(must)i(not)f(be)i(enclosed)208 1320 y(in)i(quotes.)31 b(Replaceable)22 b(parameters)f(can)h(be)g(indicated) g(by)g(`)p Fs(\0451)p Fv(',)g(`)p Fs(\0452)p Fv(',)g(and)g(so)h(on,)f (while)g(`)p Fs(\045)3104 1335 y(*)3154 1320 y Fv(')g(is)h(replaced)f (by)g(all)h(the)208 1420 y(parameters.)28 b(If)21 b(no)g(command)f(is)i (gi)n(v)o(en,)f(the)h(current)e(alias)i(for)f Fo(name)g Fv(is)i(sho)n(wn.)28 b(If)22 b(no)f(ar)o(guments)e(are)j(gi)n(v)o(en,)e (all)j(aliases)208 1519 y(are)d(listed.)208 1652 y(Aliases)e(may)g(be)g (nested)f(and)h(can)g(contain)e(an)o(ything)g(that)i(can)g(be)g(le)o (gally)f(typed)g(at)h(the)g Fs(pydb)g Fv(prompt.)k(Note)c(that)g (internal)208 1752 y Fs(pydb)29 b Fv(commands)e(can)j(be)f(o)o(v)o (erridden)d(by)j(aliases.)54 b(Such)29 b(a)g(command)f(is)i(then)f (hidden)f(until)h(the)h(alias)g(is)g(remo)o(v)o(ed.)208 1851 y(Aliasing)20 b(is)h(recursi)n(v)o(ely)d(applied)h(to)i(the)f (\002rst)h(w)o(ord)e(of)h(the)g(command)f(line;)h(all)h(other)e(w)o (ords)h(in)g(the)g(line)h(are)f(left)g(alone.)208 1984 y(As)h(an)f(e)o(xample,)e(here)i(are)g(tw)o(o)g(useful)g(aliases)h (\(especially)f(when)f(placed)h(in)g(the)g Fs(.pydbrc)g Fv(\002le\):)444 2208 y Fg(\(Pydb\))44 b(list)489 2300 y(23)489 2391 y(24)134 b(def)44 b(gcd\(a,b\):)489 2482 y(25)313 b(""")44 b(GCD.)h(We)f(assume)g(positive)f(numbers""")489 2574 y(26)489 2665 y(27)313 b(#)45 b(Make:)f(a)g(<=)h(b)489 2756 y(28)89 b(->)179 b(if)44 b(a)h(>)g(b:)489 2848 y(29)448 b(\(a,)44 b(b\))g(=)h(\(b,)f(a\))489 2939 y(30)489 3030 y(31)313 b(if)45 b(a)f(<=)h(0:)489 3122 y(32)492 b(return)44 b(None)444 3213 y(\(Pydb\))g(p)g(a)444 3304 y(3)444 3395 y(\(Pydb\))g(a=5;)g(print)g(a)444 3487 y(5)444 3578 y(\(Pydb\))g(p)g(a) 444 3669 y(3)208 3909 y Fv(So)22 b(inside)g(the)g(command)e(the)i(v)n (alue)f(of)h Fs(a)h Fv(is)g(changed.)28 b(After)22 b(the)g(command)e (\002nishes)j(the)f(v)n(alue)f(re)n(v)o(erts)g(back)h(to)g(its)h(old) 208 4008 y(v)n(alue.)0 4174 y Ft(complete)d Fp(command-pre\002x)38 b Fv(If)22 b Fs(readline)g Fv(or)g(one)g(of)g(readline-compatible)d (interf)o(aces)j(such)g(as)h Fs(pyreadline)e Fv(are)i(a)n(v)n(ail-)208 4274 y(able)d(on)f(your)g(OS,)i(the)f Fs(complete)f Fv(command)g(will)i (print)e(a)i(list)g(of)f(command)e(names)i(that)g(start)h(with)f Fo(command-pr)m(e\002x)p Fv(.)208 4407 y Fs(complete)f Fv(will)i(also)f(w)o(ork)g(on)g Fs(info)p Fv(,)f Fs(set)p Fv(,)h(and)g Fs(show)g Fv(sub-command.)208 4540 y(In)26 b(addition)g(the)h(command-completion)22 b(k)o(e)o(y)27 b(\(usually)f(the)h(tab)g(k)o(e)o(y\))f(can)h(be)g(used)g(to)g (complete)f(command)f(names,)j(or)208 4639 y Fs(info)p Fv(,)19 b Fs(set)p Fv(,)h(and)g Fs(show)g Fv(subcommands.)0 4815 y Ft(h\(elp\))g Fl([)p Fp(command)g Fl([)p Fp(subcommand)13 b Fl(])p Fd(|)p Fp(expression)f Fl(])38 b Fv(W)m(ithout)19 b(ar)o(gument,)f(print)i(the)g(list)h(of)f(a)n(v)n(ailable)g(deb)n (ugger)e(commands.)208 4948 y(When)23 b(an)h(ar)o(gument)d(is)k(gi)n(v) o(en,)e(it)h(is)h(\002rst)f(check)o(ed)f(to)h(see)g(if)g(it)h(is)f (command)e(name;)j(`)p Fs(help)49 b(exec)p Fv(')23 b(gi)n(v)o(es)g (help)g(on)h(the)208 5048 y(`)p Fs(!)p Fv(')g(command.)208 5181 y(W)m(ith)g(the)f(ar)o(gument)f(is)i(an)g(e)o(xpression)e(or)i (object)f(name,)h(you)f(get)g(the)h(same)g(help)f(that)h(you)f(w)o (ould)g(get)h(inside)g(a)g(Python)208 5280 y(shell)c(running)e(the)i(b) n(uilt-in)g(help\(\))f(command.)p 0 5549 3901 4 v 0 5649 a Fr(18)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n (ugger)p eop end %%Page: 19 25 TeXDict begin 19 24 bop 208 83 a Fv(If)23 b(the)g(en)m(vironment)d(v)n (ariable)i(P)-8 b(A)m(GER)24 b(is)g(de\002ned,)f(the)g(\002le)h(is)g (piped)f(through)e(that)i(command.)32 b(Y)-9 b(ou')o(ll)23 b(notice)g(this)g(only)208 183 y(for)c(long)g(help)h(output.)208 315 y(W)m(ithout)29 b(ar)o(gument,)h(print)f(the)h(list)h(of)f(a)n(v)n (ailable)f(commands.)53 b(W)m(ith)30 b Fo(command)g Fv(as)h(ar)o (gument,)f(print)f(help)g(about)g(that)208 415 y(command.)h(`)p Fs(help)49 b(pydb)p Fv(')22 b(displays)g(the)h(full)f(documentation)e (\002le;)25 b(if)e(the)g(en)m(vironment)c(v)n(ariable)j(P)-8 b(A)m(GER)23 b(is)h(de\002ned,)208 514 y(the)17 b(\002le)g(is)i(piped)d (through)f(that)i(command.)22 b(Since)17 b(the)g Fo(command)h Fv(ar)o(gument)c(must)k(be)f(an)g(identi\002er)m(,)f(`)p Fs(help)49 b(exec)p Fv(')17 b(must)208 614 y(be)j(entered)f(to)h(get)g (help)g(on)g(the)g(`)p Fs(!)p Fv(')25 b(command.)208 747 y(Some)i(commands,)g Fs(info)p Fv(,)j Fs(set)p Fv(,)f(and)e Fs(show)g Fv(can)h(accept)f(an)h(additional)e(subcommand)f(to)j(gi)n(v) o(e)e(help)i(just)g(about)e(that)208 846 y(particular)18 b(subcommand.)23 b(F)o(or)d(e)o(xample)e Fs(help)49 b(info)g(line)20 b Fv(gi)n(v)o(e)g(help)g(about)f(the)h Fs(info)49 b(line)20 b Fv(command.)208 979 y(See)g(also)h(1.2.7)d(and)i(1.2.7.)0 1144 y Ft(q\(uit\))41 b Fv(Quit)20 b(the)g(deb)n(ugger)-5 b(.)24 b(The)19 b(program)f(being)i(e)o(x)o(ecuted)e(is)j(aborted.)0 1309 y Ft(kill)g Fl([)p Ft(unconditional)12 b Fl(])40 b Fv(A)28 b(non-maskable)c(or)j(\223hard\224)f(kill.)46 b(Basically)-5 b(,)28 b(the)f(program)e(sends)i(itself)h Fs(kill)49 b(-9)p Fv(.)d(This)27 b(may)g(be)208 1409 y(needed)18 b(to)j(get)f(out)g(of)g(the)g(deb)n(ugger)e(when)i(doing)e (thread)i(deb)n(ugging.)208 1542 y(Since)j(this)h(is)g(drastic,)g (normally)e(we)i(prompt)e(in)h(interacti)n(v)o(e)f(sessions)j(whether)d (this)i(is)g(really)f(what)h(you)e(w)o(ant)i(to)f(do.)35 b(If)208 1641 y(ho)n(we)n(v)o(er)18 b(\223unconditional\224)f(is)k (added,)e(no)h(questions)f(are)h(ask)o(ed.)0 1823 y Ft(sa)n(v)o(e)g Fl([)p Fp(all)h Fd(|)g Fp(break)e Fd(|)i Fp(settings)12 b Fl(])20 b([)p Fp(\002lename)12 b Fl(])41 b Fv(Sa)n(v)o(e)25 b(the)g(breakpoint)e(settings)j(to)f(a)h(\002le)g(which)f(can)g(be)g (read)g(back)g(in)g(another)208 1923 y(session)k(using)f Fs(source)p Fv(.)51 b(If)28 b Fo(\002lename)g Fv(is)i(gi)n(v)o(en)d (the)i(commands)e(are)i(sa)n(v)o(ed)g(that)g(\002le.)51 b(Otherwise)29 b(the)o(y)f(are)h(sa)n(v)o(ed)f(to)208 2022 y Fs(\230/pydb-restart.txt)p Fv(.)0 2188 y Ft(sour)o(ce)20 b Fl([)p Ft(-v)12 b Fl(])19 b Fp(\002lename)41 b Fv(Read)28 b(deb)n(ugger)f(commands)f(from)i(a)g(\002le)h(named)f Fo(\002lename)p Fv(.)48 b(Note)28 b(that)h(the)f(\002le)h Fs(.pydbrc)f Fv(is)h(read)208 2287 y(automatically)18 b(this)j(w)o(ay)f(when)g Fs(pydb)g Fv(is)h(started.)208 2420 y(`-v',)e(for)h(v)o(erbose)g(mode,)f(is)j(gi)n(v)o(en)d(then)i Fs(pydb)f Fv(displays)h(each)f(command)f(as)i(it)h(is)g(e)o(x)o (ecuted.)i(The)d(option)e(must)i(be)g(gi)n(v)o(en)208 2519 y(before)d Fo(\002lename)p Fv(,)h(and)h(is)h(interpreted)d(as)j (part)f(of)g(the)g(\002lename)g(an)o(ywhere)e(else.)208 2652 y(An)i(error)f(in)h(an)o(y)g(command)e(terminates)h(e)o(x)o (ecution)f(of)i(the)h(command)d(and)h(control)g(is)i(returned)e(to)h (the)g(console.)208 2784 y(F)o(or)e(tracking)g(do)n(wn)g(problems)g (with)h(command)e(\002les,)j(see)g(the)f(`)p Fs(set)49 b(trace-commands)e(on)p Fv(')19 b(deb)n(ugger)e(command.)208 2884 y(See)j(1.2.3.)208 3016 y(A)i(command)d(\002le)k(for)d Fs(pydb)i Fv(is)g(a)g(te)o(xt)g(\002le)g(made)f(of)g(lines)h(that)g (are)g Fs(pydb)f Fv(commands.)28 b(Comments)21 b(\(lines)g(starting)g (with)208 3116 y Fs(#)28 b Fv(may)f(also)h(be)f(included.)46 b(An)27 b(empty)g(line)h(in)g(a)g(command)d(\002le)j(does)g(nothing;)h (it)g(does)e(not)g(mean)g(to)h(repeat)f(the)h(last)208 3216 y(command,)18 b(as)i(it)h(w)o(ould)f(from)f(the)h(terminal.)0 3381 y Ft(unalias)h Fp(name)40 b Fv(Delete)21 b(the)f(speci\002ed)g (alias.)0 3666 y Ff(1.2.13)101 b(Signal)29 b(handling)h(\()p Fe(handle)p Ff(,)d Fe(info)59 b(handle)p Ff(,)26 b Fe(signal)p Ff(\))0 3869 y Fv(P)o(artly)g(as)i(a)f(result)f(of)h(the)f(Matthe)n(w)h (Fleming')-5 b(s)26 b(Google)g(2006)f(Summer)h(of)g(Code)g(project,)h Fs(pydb)g Fv(contains)f(signal)g(handling)0 3968 y(similar)20 b(to)h Fs(gdb)p Fv(.)0 4115 y(A)g(signal)f(is)h(an)g(asynchronous)c(e)n (v)o(ent)i(that)i(can)f(happen)f(in)h(a)h(program.)i(Note:)j(only)19 b(the)i(main)e(thread)h(can)g(intercept)f(a)i(signal,)f(so)0 4215 y(if)g(the)h(main)e(thread)h(is)h(block)o(ed,)d(handling)h(of)h (the)g(signal)g(will)h(be)f(delayed.)0 4362 y(The)f(operating)e(system) j(de\002nes)f(the)g(possible)g(kinds)g(of)g(signals,)h(and)e(gi)n(v)o (es)h(each)g(kind)f(a)i(name)f(and)g(a)g(number)-5 b(.)24 b(F)o(or)19 b(e)o(xample,)e(in)0 4461 y(Unix)j Fs(SIGINT)f Fv(is)i(the)f(signal)f(a)i(program)d(gets)i(when)f(you)g(type)g(an)h (interrupt)f(character)f(\(often)h Fs(C-c)p Fv(\);)h Fs(SIGALRM)f Fv(occurs)g(when)0 4561 y(the)h(alarm)g(clock)g(timer)g (goes)g(of)n(f)f(\(which)g(happens)g(only)g(if)i(your)e(program)f(has)i (requested)f(an)h(alarm\).)0 4708 y(When)g Fs(pydb)g Fv(changes)f(signal)h(handlers,)f(it)i(sa)n(v)o(es)g(an)o(y)e(v)n(alue) h(that)g(the)g(deb)n(ugged)e(script)i(might)g(ha)n(v)o(e)f(installed.)0 4855 y(The)k(deb)n(ugger)e(also)j(installs)g(an)f(interrupt)f(handler)g Fs(SIGINT)h Fv(so)g(that)h(errant)e(programs)g(can)h(be)g(interrupted)e (and)i(you)g(can)g(\002nd)0 4954 y(out)d(where)f(the)i(program)d(w)o (as)j(when)e(you)h(interrupted)e(it.)0 5101 y(Some)i(signals,)h (including)d Fs(SIGALRM)p Fv(,)i(are)g(a)h(normal)f(part)g(of)g(the)h (functioning)d(of)i(your)f(program.)24 b(Others,)c(such)g(as)i Fs(SIGSEGV)p Fv(,)0 5201 y(indicate)d(errors;)h(these)g(signals)g(are)g (f)o(atal\226the)o(y)e(kill)i(your)f(program)f(immediately)h(if)h(the)g (program)e(has)i(not)f(speci\002ed)h(in)g(adv)n(ance)0 5300 y(some)g(other)f(w)o(ay)h(to)h(handle)e(the)h(signal.)k Fs(SIGINT)c Fv(does)g(not)f(indicate)h(an)g(error)f(in)h(your)f (program,)f(b)n(ut)i(it)h(is)g(normally)d(f)o(atal)i(so)h(it)0 5400 y(can)f(carry)f(out)h(the)g(purpose)f(of)h(the)g(interrupt:)k(to)c (kill)h(the)f(program.)p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(19)p eop end %%Page: 20 26 TeXDict begin 20 25 bop 0 83 a Fs(pydb)23 b Fv(has)g(the)g(ability)g (to)g(detect)g(an)o(y)f(occurrence)e(of)j(a)g(signal)g(in)g(your)f (program.)31 b(Y)-9 b(ou)23 b(tell)g Fs(pydb)g Fv(in)g(adv)n(ance)f (what)h(to)g(do)f(for)0 183 y(each)f(kind)g(of)h(signal.)29 b(In)22 b(the)f(course)g(of)h(running)d(the)j(program,)e(signal)i (handlers)e(may)h(be)h(changed,)e(and)h(the)h(deb)n(ugger)e(has)i(the)0 282 y(ability)h(to)g(w)o(atch)h(for)e(this)i(possibility)f(and)f(act)i (accordingly)-5 b(.)31 b(Ho)n(we)n(v)o(er)22 b(since)h(this)h(adds)f(a) h(bit)f(of)g(o)o(v)o(erhead)d(it)k(is)h(turned)c(of)n(f)i(by)0 382 y(def)o(ault.)h Fs(set)49 b(sigcheck)20 b Fv(and)f Fs(show)49 b(sigcheck)20 b Fv(can)g(be)g(used)g(to)g(set/sho)n(w)g (whether)g(this)g(checking)f(is)i(done.)0 529 y(Normally)-5 b(,)25 b Fs(pydb)g Fv(is)h(set)g(up)f(to)g(let)h(the)f(non-erroneous)d (signals)j(lik)o(e)h Fs(SIGALRM)e Fv(be)i(silently)f(passed)g(to)g (your)f(program)g(\(so)h(as)0 628 y(not)c(to)g(interfere)f(with)h (their)g(role)g(in)g(the)h(program')-5 b(s)19 b(functioning\))f(b)n(ut) j(to)h(stop)f(your)f(program)f(immediately)g(whene)n(v)o(er)h(an)h (error)0 728 y(signal)f(happens.)k(Y)-9 b(ou)19 b(can)h(change)f(these) h(settings)h(with)f(the)g Fs(handle)g Fv(command.)0 996 y Fr(Intercepting)k(Signals)g(\()p Fs(handle)p Fr(\))0 1199 y Ft(handle)d Fp(signal)g(k)n(eyw)o(ords)p Ft(.)12 b(.)g(.)53 b Fv(Change)19 b(the)i(w)o(ay)f(the)h(deb)n(ugger)d(handles) i(signal)g Fo(signal)p Fv(.)26 b Fo(signal)20 b Fv(can)g(be)g(the)h (number)e(of)h(a)h(signal)208 1299 y(or)e(its)j(name)d(\(with)h(or)g (without)g(the)g Fs(SIG)g Fv(at)h(the)f(be)o(ginning\);)d(The)j Fo(k)o(e)n(ywor)m(ds)g Fv(say)g(what)h(change)e(to)h(mak)o(e.)0 1527 y(The)g(k)o(e)o(yw)o(ords)e(allo)n(wed)i(by)g(the)g Fs(handle)g Fv(command)e(can)i(be)g(abbre)n(viated.)j(Their)c(full)h (names)g(are:)0 1755 y Ft(stop)41 b Fv(The)20 b(deb)n(ugger)e(should)h (stop)h(your)f(program)f(when)i(this)h(signal)f(happens.)j(This)e (implies)f(the)g Fs(print)g Fv(k)o(e)o(yw)o(ord)e(as)j(well.)0 1920 y Ft(nostop)41 b Fv(The)19 b(deb)n(ugger)e(should)i(not)g(stop)g (your)g(program)e(when)i(this)h(signal)f(happens.)24 b(It)19 b(may)g(still)i(print)e(a)h(message)f(telling)g(you)208 2020 y(that)h(the)g(signal)g(has)h(come)e(in.)0 2185 y Ft(print)41 b Fv(The)20 b(deb)n(ugger)e(should)h(print)h(a)h(message) f(when)f(this)i(signal)f(happens.)0 2351 y Ft(noprint)41 b Fv(The)20 b(deb)n(ugger)e(should)h(not)h(mention)f(the)h(occurrence)e (of)i(the)g(signal)g(at)h(all.)0 2516 y Ft(pass)42 b Fv(The)22 b(deb)n(ugger)f(should)g(allo)n(w)i(your)e(program)g(to)h (see)i(this)f(signal;)h(your)d(program)f(can)j(handle)e(the)i(signal,)g (or)f(else)i(it)f(may)208 2616 y(terminate)c(if)h(the)h(signal)f(is)h (f)o(atal)f(and)g(not)g(handled.)j Fs(pass)d Fv(and)g Fs(noignore)f Fv(are)h(synon)o(yms.)0 2781 y Ft(nopass)41 b Fv(The)20 b(deb)n(ugger)e(should)h(not)h(allo)n(w)g(your)f(program)f (to)j(see)g(this)f(signal.)25 b Fs(nopass)20 b Fv(and)f Fs(ignore)h Fv(are)g(synon)o(yms.)0 2946 y Ft(stack)41 b Fv(The)17 b(deb)n(ugger)e(should)h(print)h(a)g(stack)h(trace)f(when)f (it)i(recei)n(v)o(es)f(the)g(signal.)24 b(When)17 b(used)g(with)g (\223nostop\224,)f(this)i(can)f(be)g(useful)208 3046 y(if)k(you')l(v)o(e)e(got)h(a)i(program)d(that)i(seems)g(\223hung\224)f (and)g(you)g(w)o(ant)h(to)g(\002nd)g(out)g(where)f(it)i(is,)g(b)n(ut)f (continue)e(after)i(sho)n(wing)f(this)208 3146 y(information.)0 3311 y Ft(nostack)41 b Fv(The)20 b(deb)n(ugger)e(should)h(not)h(print)f (a)i(stack)f(trace)g(when)g(it)h(recei)n(v)o(es)e(the)h(signal.)0 3579 y Fr(Sho)o(wing)k(Signal-handling)i(status)d(\()p Fs(info)49 b(handle)p Fr(,)22 b Fs(info)49 b(signals)p Fr(\))0 3799 y Ft(inf)n(o)20 b(handle)h Fl([)p Fp(signal-name)p Fd(|)p Fp(signal-number)12 b Fl(])38 b Fv(If)21 b(a)h(signal)g(name)f (or)g(number)f(is)i(gi)n(v)o(en)f(just)h(the)g(information)d(re)o (garding)f(that)208 3898 y(signal)i(is)h(sho)n(wn.)j(Here')-5 b(s)20 b(an)h(e)o(xample:)533 4122 y Fg(\(Pydb\))44 b(info)g(handle)g (INT)533 4213 y(Signal)358 b(Stop)44 b(Print)g(Print)g(Stack)g(Pass)g (to)h(program)533 4305 y(SIGINT)358 b(True)44 b(True)g(False)313 b(False)208 4577 y Fv(If)18 b(no)g(signal)h(name)f(or)g(number)f(is)i (gi)n(v)o(en,)f(print)g(a)h(table)f(of)h(all)g(the)g(kinds)f(of)g (signals)h(and)f(ho)n(w)g(the)h(deb)n(ugger)d(has)j(been)f(told)208 4677 y(to)i(handle)f(each)h(one.)k(Y)-9 b(ou)20 b(can)g(use)g(this)h (to)f(see)h(the)f(signal)g(numbers)f(of)h(all)h(the)f(de\002ned)f (types)h(of)g(signals.)208 4809 y Fs(info)49 b(signal)19 b Fv(is)i(an)g(alias)f(for)g Fs(info)49 b(handle)p Fv(.)0 5077 y Fr(Sending)25 b(y)n(our)e(prog)o(r)o(am)g(a)g(signal)h(\()p Fs(signal)p Fr(\))0 5282 y Ft(signal)c Fu(f)p Fp(signal-name)f Fd(|)i Fp(signal-number)p Fu(g)39 b Fv(Y)-9 b(ou)22 b(can)f(use)h(the)g Fs(signal)g Fv(command)e(send)h(a)h(signal)g(to)g(your)f(program.)28 b(Supply)208 5382 y(either)19 b(the)i(signal)f(name,)f(e.g.)25 b Fs(SIGINT)p Fv(,)19 b(or)h Fs(INT)g Fv(or)g(the)g(signal)g(number)m (,)e(e.g.)25 b Fs(15)p Fv(.)p 0 5549 3901 4 v 0 5649 a Fr(20)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n (ugger)p eop end %%Page: 21 27 TeXDict begin 21 26 bop 0 83 a Ff(1.2.14)101 b(Thread)29 b(deb)n(ugging)i(\()p Fe(thread)p Ff(,)26 b Fe(info)59 b(thread)p Ff(,)26 b Fe(qt)p Ff(,)h Fe(frame)p Ff(,)f Fe(break)p Ff(\))0 286 y Fv(Thread)19 b(deb)n(ugging)e(is)22 b(a)e(bit)h(e)o(xperimental.)h(By)f(def)o(ault)e(it)i(is)h(not)d (turned)g(on,)h(since)g(it)h(adds)f(a)h(bit)f(of)g(additional)f(comple) o(xity)-5 b(.)0 433 y(T)e(o)20 b(turn)g(thread)f(deb)n(ugging)f(on,)h (pass)i(the)f Fs(--threading)f Fv(option)g(on)h(the)g Fs(pydb)g Fv(in)m(v)n(ocation.)0 580 y(T)-6 b(ests)20 b(ha)n(v)o(e)e(sho)n(wn)g(that)g(one)g(can)h(easily)g(cause)f(a)h (deadlock)e(in)i(trying)f(to)h(change)e(the)i(beha)n(vior)e(if)i(one)f (is)h(not)g(careful.)k(At)c(present)0 679 y(we)f(don')o(t)f(ha)n(v)o(e) g(a)i(w)o(ay)f(to)g(issue)h(a)g Fs(run)f Fv(command,)e(although)g(the)i (hard)g Fs(restart)f Fv(w)o(orks.)24 b(See)18 b(1.2.9.)23 b(Also,)c(to)f(quit)g(we)g(ha)n(v)o(en')o(t)0 779 y(w)o(ork)o(ed)23 b(out)h(a)h(sure-\002re)f(method)f(to)i(terminate)e(gracefully)g(lik)o (e)i(you)e(can)i(do)f(when)f(there)h(are)h(no)f(threads.)37 b(W)-7 b(e)26 b(ha)n(v)o(e)e(ho)n(we)n(v)o(er)0 879 y(added)19 b(a)i Fs(kill)f Fv(command.)j(See)d(1.2.12)e(for)i(information)e(on)h Fs(kill)p Fv(.)25 b(This)c(is)g(a)f(little)h(brutal,)e(b)n(ut)i(at)f (present)g(it)h(is)g(about)e(the)h(best)0 978 y(that)g(can)g(be)g (done.)0 1125 y(One)26 b(will)i(get)e(the)h(most)f(information)f(using) h(Python)f(2.5)h(or)g(ha)n(ving)f Fs(threadframe)h Fv(installed)g(with) h(v)o(ersions)e(prior)h(to)g(2.5.)0 1225 y(Ho)n(we)n(v)o(er)20 b(since)h(the)g(deb)n(ugger)f(k)o(eeps)h(its)h(o)n(wn)f(information)e (about)h(threads,)h(one)f(can)h(still)i(get)e(some)g(information)e (when)i(this)h(is)0 1324 y(not)e(the)g(case.)0 1471 y(The)15 b(deb)n(ugger)f(also)i(relies)g(on)f(the)h Fs(threading)f Fv(module,)g(especially)g(to)h(assist)h(in)f(tracing.)22 b(If)16 b(the)f(program)f(uses)i(the)g(lo)n(wer)n(-le)n(v)o(el)0 1571 y Fs(thread)k Fv(routines,)f(some)h(deb)n(ugging)d(can)j(be)g (done)g(b)n(ut)g(it)h(will)g(be)f(much)f(more)g(limited.)0 1833 y Fr(Sho)o(wing)24 b(thread)g(inf)n(or)r(mation)g(\()p Fs(info)49 b(thread)p Fr(\))0 2015 y Ft(inf)n(o)20 b(thr)o(ead)g Fl([)p Fp(thread-name)p Fc(\227)p Fp(thread-number)12 b Fl(][)p Ft(v)o(erbose)p Fc(\227ters)o(e)g Fl(])36 b Fv(List)21 b(all)f(currently-kno)n(wn)c(thread)k(name\(s\).)208 2140 y(If)i(no)h(thread)e(name)i(or)f(thread)g(number)f(is)j(gi)n(v)o (en,)e(we)h(list)h(info)e(for)g(all)i(threads.)32 b(Unless)23 b(a)g(terse)g(listing,)h(for)e(each)h(thread)208 2240 y(we)d(gi)n(v)o(e:)307 2401 y Fu(\017)41 b Fv(the)20 b(class,)h(thread)f(name,)f(and)h(status)g(as)h Fs()307 2520 y Fu(\017)41 b Fv(the)28 b(top-most)f(call-stack)h (information)d(for)i(that)h(thread.)48 b(Generally)26 b(the)i(top-most)f(calls)i(into)e(the)h(deb)n(ugger)e(and)390 2620 y(dispatcher)19 b(are)h(omitted)g(unless)g Fs(set)49 b(debug-pydb)19 b Fv(is)i(set)g(to)g Fs(True)p Fv(.)208 2781 y(The)31 b(speci\002c)i(output)e(you)g(get)h(depends)f(on)h (whether)f(you)g(are)h(using)g(Python)f(2.5)g(or)h(later)g(or)g(\(when) g(not\))f(ha)n(v)o(e)h(the)208 2881 y Fs(threadframe)18 b Fv(module)h(installed.)208 3007 y(Here)h(is)h(an)f(e)o(xample)f (assuming)g(Python)g(2.5)h(is)h(installed:)444 3224 y Fg(\(Pydb\))44 b(info)g(thread)444 3315 y (--------------------------------------)o(--)578 3406 y(<_MainThread\(MainThread,)d(started\)>)623 3498 y(\(\))i (called)h(from)g(file)g('/src/external-cvs/pydb/test/thread/q.py')38 b(at)45 b(line)f(52)444 3589 y(--------------------------------------)o (--)578 3680 y()623 3772 y(run\(self=\))j(called)h(from)g (file)h('/src/external-cvs/pydb/test/thread/)o(q.py')38 b(at)45 b(line)f(19)444 3863 y(--------------------------------------)o (--)444 3954 y(->)g()623 4046 y(run\(self=\))j(called)h(from)g (file)h('/src/external-cvs/pydb/test/thread/)o(q.py')38 b(at)45 b(line)f(39)444 4137 y(--------------------------------------)o (--)578 4228 y()623 4320 y(run\(self=\))j(called)h(from)g (file)h('/src/external-cvs/pydb/test/thread/)o(q.py')38 b(at)45 b(line)f(38)208 4585 y Fv(The)26 b(arro)n(w)f Fs(->)i Fv(indicates)f(which)g(thread)f(is)j(current.)42 b(Here)26 b(it)h(is)h(Thread-2.)41 b(If)26 b Fs(terse)g Fv(is)i(appended,)d(we)i(just)g(list)h(the)208 4685 y(thread)19 b(name)g(and)h(thread)f(id.)25 b(Here')-5 b(s)21 b(an)f(e)o(xample:)444 4902 y Fg(\(Pydb\))44 b(info)g(thread)g(terse)578 4993 y(MainThread:)f(-1210480976)578 5085 y(Thread-3:)h(-1231336544)444 5176 y(->)g(Thread-2:)g(-1222943840)578 5267 y(Thread-1:)g(-1214551136) p 0 5549 3901 4 v 0 5649 a Fr(1.2.)52 b(Deb)n(ugger)24 b(Commands)2808 b(21)p eop end %%Page: 22 28 TeXDict begin 22 27 bop 208 83 a Fv(The)20 b(arro)n(w)h(indicates)g (the)g(current)f(thread;)h(again)f(it)i(is)g(Thread-2.)k(This)c (listing)f(is)h(a)n(v)n(ailable)f(on)g(all)h(Python)e(v)o(ersions)g (and)208 183 y(without)f(threadframe)f(installed.)208 314 y(T)-7 b(o)24 b(get)g(the)g(full)g(stack)g(trace)g(for)f(a)h (speci\002c)h(thread)e(pass)h(in)g(the)g(thread)f(name)h(\(assuming)f (Python)f(2.5)i(or)g(threadframe\).)208 413 y(Here')-5 b(s)20 b(an)g(e)o(xample:)444 635 y Fg(\(Pydb\))44 b(info)g(thread)g (Thread-3)623 727 y(trace_dispatch_gdb\(self=)45 b(x=5)236 3814 y(\(/tmp/hardtodebug.py:9\):)236 3905 y(\(Pydb\))f(restart)236 3996 y(Re)h(exec'ing)236 4088 y(['pydb',)f('hardtodebug.py',)e('a',)i ('b',)g('c'])236 4179 y(\(/tmp/hardtodebug.py:1\):)236 4270 y(\(Pydb\))0 4557 y Fv(The)30 b(\002rst)h Fs(--Return--)f Fv(line)g(printed)g(is)h(a)g(result)g(of)f(the)g Fs(debugger\(\))g Fv(e)o(xiting.)55 b(But)31 b(note)f(that)g(we)h(stopped)f Fo(after)j Fv(the)0 4657 y(return)22 b(from)g Fs(test\(\))p Fv(,)h(which)g(e)o(xplains)f(the)h Fo(second)h Fs(--Return--)e Fv(line.)34 b(Because)23 b(the)g(ne)o(xt)g(e)o(x)o(ecutable)e (statement)i(is)h(after)0 4756 y(the)g(implicit)h(return.)36 b(If)25 b(you)e(w)o(ant)i(to)f(stop)h(inside)f Fs(test\(\))g Fv(put)g(a)h(statement)f(after)g(the)h Fs(debugger\(\))p Fv(,)f(such)g(as)h(a)g Fs(return)0 4856 y Fv(statement.)h(Furthermore,) 18 b(if)j(the)g(program)e(had)h(ended)g(at)h(line)g(8,)f(then)g Fo(no)h Fv(stopping)e(w)o(ould)h(ha)n(v)o(e)g(occurred)f(because)h(the) h(end)f(of)0 4955 y(the)g(program)e(is)j(reached)e(\002rst.)929 4925 y Fm(3)0 5102 y Fv(Also)i(note)e(that)i(we)f(can)g(issue)h(a)g Fs(restart)e Fv(which)h(in)m(v)n(olv)o(es)f(some)h(hack)o(ery)-5 b(.)23 b(But)d(at)h(least)g(in)f(this)h(case)g(it)g(gets)f(things)g (right.)p 0 5163 1560 4 v 90 5219 a Fk(3)120 5242 y Fj(Perhaps)h(this)f (is)h(a)f(de\002cienc)o(y)j(of)d(the)h(deb)o(ugger)l(.)32 b(I'm)19 b(not)i(sure)f(what)h(the)g(right)h(w)o(ay)e(to)h(address)g (though.)31 b(One)21 b(could)g(ha)o(v)o(e)g(another)h(routine)g(to)e (stop)h(at)g(a)0 5321 y(return)e(which)f(w)o(ould)h(then)f(skip)g (interv)o(ening)j(statements.)j(Another)19 b(possibility)h(is)d(to)h (add)g(a)g(routine)h(to)f(ha)o(v)o(e)g(deb)o(ugger)h(stop)f(inside)h (the)f(call,)h(e.g.)j Fh(debugger)0 5400 y Fj(abo)o(v)o(e.)g(This)17 b(is)f(not)i(hard)g(to)f(code)h(and)f(I')m(v)o(e)h(done)f(so,)f(b)o(ut) i(I'm)e(not)i(sure)f(that)h(doesn')o(t)g(just)g(confuse)g(things)g (more.)p 0 5549 3901 4 v 0 5649 a Fr(24)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 25 31 TeXDict begin 25 30 bop 0 83 a Fv(There)21 b(is)h(one)f(\002nal)h(adv)n (antage)d(of)i(using)g Fs(debugger\(\))p Fv(.)28 b(When)21 b(one)g(is)h(stepping)e(code)h(or)g(has)h(put)f(a)h(breakpoint)d(in)j (code,)f(the)0 183 y(interpreter)15 b(has)j(to)f(be)g(in)m(v)n(olv)o (ed)e(and)h(calls)i(deb)n(ugger)n(-checking)13 b(code)j(written)h(in)g (Python)f(for)g(e)n(v)o(ery)g(statement)h(that)g(he)g(deb)n(ugged)0 282 y(program)k(runs.)33 b(And)23 b(this)g(has)h(a)f(noticeable)f(ef)n (fect.)33 b(W)m(ith)23 b Fs(debugger\(\))f Fv(there)h(is)h(absolutely)e (no)g(o)o(v)o(erhead)f(\(pro)o(vided)f(there)0 382 y(are)g(no)g(other)f (breakpoints)f(set)j(in)g(the)f(program\).)0 648 y Fr(T)-10 b(ur)r(ning)24 b(the)f(deb)n(ugger)h(on)g(an)f(off)g(and)h(using)g Fs(Pdb.precmd)0 851 y Fv(Since)i(the)f(deb)n(ugger)f(slo)n(ws)i(things) f(do)n(wn)f(looking)g(for)h(stoppoing)f(points.)40 b(If)26 b(you)e(w)o(ant)i(to)g(remo)o(v)o(e)d(this)j(o)o(v)o(erhead)d(and)i(ha) n(v)o(e)0 951 y(Python)19 b(run)g(closer)h(to)h(full)f(speed,)f(here') -5 b(s)20 b(ho)n(w)g(you)f(can)h(remo)o(v)o(e)f(the)h(deb)n(ugger)e (hook:)416 1189 y Fg(sys.settrace\(None\))0 1476 y Fv(If)i(you)f(need)h (to)g(turn)g(it)h(on)e(subsequently:)416 1714 y Fg (pydb.debugger\(status='continue'\))0 2000 y Fv(If)h(there')-5 b(s)20 b(something)f(you)g(w)o(ant)h(to)h(run)e(before)g(stepping)g (you)g(can)h(do)g(that)g(by)g(monk)o(e)o(y-patching)c Fs(Pdb.precmd)p Fv(:)236 2238 y Fg(import)44 b(pydb)236 2330 y(def)h(myprecmd\(obj,)d(debug_cmd\):)416 2421 y("""Hook)h(method) h(executed)g(just)g(after)g(a)g(command)g(dispatch)f(is)i(finished.""") 416 2512 y(global)e(_pydb_trace)416 2604 y(obj.do_list\(''\))416 2695 y(obj.do_where\('10'\))86 b(#)45 b(limit)f(stack)g(to)g(at)h(most) f(10)g(entries)416 2786 y(return)f(obj.old_precmd\(debug_cmd\))86 b(#)44 b(is)h(always)f(string)g('s')g(in)g(example)g(below)236 2969 y(_pydb_trace)f(=)i(pydb.Pdb\(\))236 3060 y(pydb.Pdb.old_precmd)d (=)j(pydb.Pdb.precmd)236 3152 y(pydb.Pdb.precmd)e(=)h(myprecmd)236 3243 y(pydb.debugger\(dbg_cmds=['s'])1536 3256 y(*)1626 3243 y(30\))0 3652 y Fr(Line)24 b(tr)o(acing)0 3855 y Fv(Rather)d(than)f(trace)h(the)g(entire)g(program,)e(if)i(there)f(is)i (a)g(speci\002c)f(portion)e(that)j(you)e(w)o(ant)h(traced)f(that)h(can) g(be)g(done)f(too,)h(passing)f(a)0 3955 y(list)h(of)f(deb)n(ugger)e (commands)h(to)h Fs(debugger)p Fv(.)236 4102 y Fg(import)44 b(pydb)236 4193 y(#)h(some)f(code)g(here)g(...)236 4284 y(pydb.debugger\(["set)e(linetrace)h(on",)h("continue"]\))236 4376 y(#)h(This)f(and)g(subsequent)g(lines)g(will)g(be)g(traced)236 4467 y(#)h(more)f(code)g(...)236 4558 y(pydb.debugger\(["set)e (linetrace)h(off",)h("continue"]\))0 4981 y Ff(1.3.2)100 b(Calling)50 b(the)f(Deb)n(ugger)h(after)f(a)g(Cr)o(ash:)76 b(P)-5 b(ost-Mor)t(tem)49 b(Deb)n(ugging)i(\()p Fe(pydb.post_-)321 5097 y(mortem)p Ff(,)26 b Fe(pydb.pm)p Ff(,)g Fe(pydb.exception_hook)p Ff(\))0 5300 y Fv(It)21 b(is)h(also)g(to)f(possible)g(enter)f(the)h (deb)n(ugger)e(after)i(a)g(crash)g(or)g(traceback)e(e)n(v)o(en)h (though)g(the)h(program)d(w)o(as)k(not)f(started)g(via)g Fs(pydb)p Fv(.)0 5400 y(This)29 b(is)g(called)f Fo(post-mortem)g(deb)n (ug)o(ging)p Fv(.)47 b(In)28 b(this)h(state)g(man)o(y)e(of)h(the)h(deb) n(ugger)d(commands)h(for)g(e)o(xamining)g(v)n(ariables)g(and)p 0 5549 3901 4 v 0 5649 a Fr(1.3.)52 b(The)23 b(Deb)n(ugger)h(Module)h (\()p Fs(pydb)p Fr(\))c(and)j(Class)e(\()p Fs(Pdb)p Fr(\))1895 b(25)p eop end %%Page: 26 32 TeXDict begin 26 31 bop 0 83 a Fv(mo)o(ving)24 b(around)f(in)j(the)g (stack)g(will)g(still)h(w)o(ork.)41 b(Ho)n(we)n(v)o(er)24 b(some)h(commands)f(such)i(as)g(those)f(which)g(imply)g(a)i (continuation)c(of)0 183 y(running)18 b(code)i(will)g(no)g(longer)f(w)o (ork.)0 330 y(There)24 b(are)g(in)h(f)o(act)f(three)g(possibilities.)38 b(The)24 b(\002rst)h(w)o(ay)g(does)f(not)g(require)f(modi\002cation)g (to)i(your)e(program)f(b)n(ut)j(it)g(does)f(require)0 429 y(that)e(the)g(program)e(be)i(run)f(from)g(the)h(Python)e (interpreter)h(shell.)30 b(The)22 b(second)f(possibility)g(doesn')o(t)g (require)f(one)i(to)g(be)g(inside)g(the)0 529 y(Python)16 b(interpreter)g(shell,)i(b)n(ut)f(does)g(require)f(modi\002cation)f(to) i(your)f(program.)22 b(The)17 b(third)g(possibility)f(is)j(if)e(you)f (had)h(started)g(using)0 628 y Fs(pydb)p Fv(.)0 897 y Fr(P)l(ost-Mor)s(tem)23 b(Deb)n(ugging)i(within)g(a)e(Python)g(Inter)r (preter)h(Shell)h(\()p Fs(pydb.post_mortem)p Fr(,)19 b Fs(pydb.pm\(\))p Fr(\))0 1100 y Fv(Here,)d(all)g(you)e(do)h(is)h Fs(import)49 b(pydb)15 b Fv(\(if)g(that)g(hasn')o(t)f(been)h(done)f (already\),)h(and)f(call)i Fs(pydb.pm\(\))e Fv(or)h Fs (pydb.post_mortem)0 1199 y Fv(if)20 b(you)g(ha)n(v)o(e)f(a)i (speci\002c)f(traceback)f(object)h(you)f(w)o(ant)h(to)h(use.)0 1346 y(T)-7 b(o)20 b(mak)o(e)g(this)h(more)e(concrete)g(we)i(will)g(gi) n(v)o(e)e(an)h(e)o(xample.)k(W)-7 b(e)21 b(ha)n(v)o(e)f(the)g(follo)n (wing)e(te)o(xt)i Fs(mymodule.py)236 1584 y Fg(def)45 b(test\(\):)416 1676 y(print)f(spam)0 1962 y Fv(No)n(w)20 b(here')-5 b(s)20 b(a)h(sample)f(session)236 2200 y Fg(>>>)45 b(import)e(mymodule)236 2292 y(>>>)i(mymodule.test\(\))236 2383 y(Traceback)f(\(most)g(recent)f(call)i(last\):)326 2474 y(File)f("",)f(line)h(1,)h(in)f(?)326 2566 y(File)g("mymodule.py",)f(line)h(2,)g(in)h(test)416 2657 y(print)f(spam)236 2748 y(NameError:)f(global)h(name)g('spam')g(is)h (not)f(defined)236 2840 y(>>>)h(import)e(pydb)236 2931 y(>>>)i(pydb.pm\(\))236 3022 y (\(/home/src/external-cvs/pydb/test/mymodu)o(le.py:)o(2\):)84 b(test)236 3114 y(\(Pydb\))44 b(where)236 3205 y(->)h(0)f(test\(\))g (called)g(from)g(file)g('/tmp/mymodule.py')e(at)j(line)f(2)236 3296 y(##)h(1)f(in)h(file)f('')f(at)i(line)f(1)236 3388 y(\(Pydb\))g(list)326 3479 y(1)224 b(def)44 b(test\(\):)326 3570 y(2)89 b(->)224 b(print)44 b(spam)236 3662 y([EOF])236 3753 y(\(Pydb\))g(quit)236 3844 y(>>>)0 4131 y Fv(At)21 b(present)e(if)i(you)e(are)h(using)g Fs(ipython)p Fv(,)f(that)h (captures)g(the)g(e)o(xception)e(and)i Fs(sys.last_traceback)d Fv(will)k(not)f(be)g(de\002ned.)0 4278 y(If)g(you)f(ha)n(v)o(e)h(a)h (traceback)d(stored)i(say)g(in)h(v)n(ariable)e Fs(t)p Fv(,)h(instead)g(of)g Fs(pydb.pm\(\))f Fv(abo)o(v)o(e,)f(use)j Fs(pydb.post_mortem\(t\))p Fv(.)0 4546 y Fr(P)l(ost-Mor)s(tem)i(Deb)n (ugging)i(arr)o(anged)f(within)g(a)f(Python)h(Scr)q(ipt)f(\()p Fs(pydb.exception_hook)p Fr(\))0 4749 y Fv(If)i(you)g(didn')o(t)f (start)i(your)f(program)e(inside)j(a)g(Python)e(interpreter)g(shell,)j (there)f(you)e(can)i(still)g(get)g(into)g(the)f(deb)n(ugger)f(when)h (an)0 4848 y(e)o(xception)18 b(occurs.)24 b(Here)d(you)e(need)g(to)i (arrange)d(for)i(this)h(possibility)e(adding)g(to)h(the)h(script)f (these)g(lines:)326 4995 y Fg(import)44 b(pydb,)g(sys)326 5087 y(sys.excepthook)e(=)j(pydb.exception_hook)p 0 5549 3901 4 v 0 5649 a Fr(26)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 27 33 TeXDict begin 27 32 bop 0 83 a Fr(P)l(ost-Mor)s(tem)23 b(Deb)n(ugging)i(within)g Fs(pydb)0 286 y Fv(When)19 b(in)m(v)n(ok)o(ed)e(as)j(a)g(script,)f Fs(pydb)g Fv(will)g (automatically)f(enter)h(post-mortem)e(deb)n(ugging)f(if)j(the)h (program)d(being)h(deb)n(ugged)e(e)o(xits)0 386 y(abnormally)-5 b(.)0 532 y(After)19 b(post-mortem)e(deb)n(ugging)f(\(or)i(after)h (normal)f(e)o(xit)h(of)f(the)h(program\),)e Fs(pydb)i Fv(will)g(restart)g(the)g(program.)k(Automatic)18 b(restart-)0 632 y(ing)h(preserv)o(es)g Fs(pydb)p Fv(')-5 b(s)19 b(state)i(\(such)e (as)h(breakpoints\))d(and)i(in)h(most)g(cases)g(is)h(more)e(useful)g (than)g(quitting)f(the)i(deb)n(ugger)d(upon)i(the)0 732 y(program')-5 b(s)18 b(e)o(xit.)0 1017 y Ff(1.3.3)100 b(Enter)q(ing)30 b(the)f(Deb)n(ugger)h(from)e(Outside)g(the)g(Prog)o(r) o(am)0 1219 y Fv(It')-5 b(s)27 b(possible)e(to)h(set)h(things)e(up)h (so)g(that)g(when)f(you)g(send)g(a)i(signal)e(to)h(your)f(program)f (you)h(enter)g(the)h(deb)n(ugger)-5 b(.)40 b(Up)26 b(until)f(that)0 1319 y(point)19 b(though)g(there)h(will)g(be)h(no)e(o)o(v)o(erhead)f (associated)i(with)g(the)g(deb)n(ugger)-5 b(.)0 1466 y(T)e(o)28 b(do)e(this,)k(you)c(need)h(to)h(create)f(an)g(instance)g (of)g(the)g Fs(SignalManager)f Fv(object)h(and)g(call)g(that)h(object') -5 b(s)27 b Fs(action)g Fv(method)0 1566 y(passing)20 b(a)g(string)g(e)o(xactly)g(lik)o(e)g(you)f(w)o(ould)h(for)f(the)i(deb) n(ugger')-5 b(s)18 b Fs(handle)i Fv(command.)j(Here')-5 b(s)20 b(an)g(e)o(xample:)326 1804 y Fg(...)326 1895 y(from)44 b(pydb.sighandler)e(import)i(SignalManager)326 1986 y(...)326 2078 y(h)h(=)f(SignalManager\(\))326 2169 y(h.action\('SIGUSR1)e(stack)i(print)g(stop'\))326 2260 y(...)0 2638 y Fv(In)24 b(the)h(abo)o(v)o(e)e(e)o(xample,)i(a)g(signal) g(handler)e(is)j(set)f(up)g(so)g(that)g(when)f(the)h Fs(SIGUSR1)f Fv(signal)g(is)i(sent,)g(we)f(will)h(print)e(a)h(message,) 0 2738 y(sho)n(w)i(the)g(stack)g(trace)g(and)f(then)g(stop)h(inside)g (the)g(deb)n(ugger)-5 b(.)43 b(If)27 b(you)f(don')o(t)g(w)o(ant)h(to)g (stop)g(inside)f(the)h(deb)n(ugger)e(b)n(ug)i(just)g(see)0 2838 y(where)20 b(you)f(are)h(omit)g(the)g(\223stop\224)g(k)o(e)o(yw)o (ord)e(or)i(change)f(it)i(it)g(\223nostop\224.)0 2984 y(See)g(1.2.13)d(for)i(information)d(parameters)i(names)h(used)g(in)g (the)h(string)e(and)h(their)g(meanings.)0 3269 y Ff(1.3.4)100 b(Enter)q(ing)30 b(the)f(Deb)n(ugger)h(from)e(Python)g(or)h(a)f(Python) h(Shell)0 3472 y Fv(If)h(you)f(w)o(ant)h(to)h(deb)n(ug)d(a)j(Python)e (script)h(from)f(inside)h(another)f(Python)f(program)g(\(often)h(a)i (Python)e(shell)h(program)e(such)i(as)0 3572 y(IPython\),)18 b(the)i Fs(runl\(\))p Fv(,)g(and)f Fs(runv\(\))h Fv(function)e(calls)j (can)f(be)g(of)g(help.)25 b(See)20 b(1.3.7)f(for)h(information)e(about) h(these)h(calls.)0 3719 y(The)i(')o(l',)i(and)e(')l(v')g(suf)n(\002x)o (es)g(ha)n(v)o(e)h(meanings)e(analogous)g(that)i(used)g(in)g Fs(os.spawnv\(\))p Fv(,)e Fs(os.execv\(\))p Fv(,)h Fs(os.spawnl\(\))p Fv(,)g(or)0 3818 y Fs(os.execl\(\))d Fv(\(and)g(other)h(Python)f (library)g(functions\).)0 4103 y Ff(1.3.5)100 b(Y)-14 b(et)28 b(Another)i(Method)f(of)f(In)n(v)n(ocation)0 4306 y Fv(W)m(ith)22 b(the)f(ca)n(v)o(eat)g(mentioned)f(in)h(1.3.1)f (about)h(problems)f(with)h(using)g Fs(pydb)g Fv(initially)g(to)h(run)f (a)g(script,)h(I)f(think)g(most)h(people)e(will)0 4406 y(probably)e(use)i(the)h Fs(pydb)f Fv(command)e(described)h(in)h(1.1.)k (Ho)n(we)n(v)o(er)19 b(for)g(completeness)g(here)h(we)h(gi)n(v)o(e)e (another)g(alternati)n(v)o(e.)0 4553 y(Here')-5 b(s)20 b(another)f(w)o(ay)h(run)g(a)g(program)e(under)h(control)g(of)h(the)g (deb)n(ugger:)236 4791 y Fg(>>>)45 b(import)e(pydb)236 4882 y(>>>)i(import)e(mymodule)236 4973 y(>>>)i (pydb.run\('mymodule.test\(\)'\))236 5065 y(\(:1\):)236 5156 y(\(/usr/lib/python2.4/bdb.py:366\):)85 b(run)236 5247 y(\(Pydb\))44 b(continue)p 0 5549 3901 4 v 0 5649 a Fr(1.3.)52 b(The)23 b(Deb)n(ugger)h(Module)h(\()p Fs(pydb)p Fr(\))c(and)j(Class)e(\()p Fs(Pdb)p Fr(\))1895 b(27)p eop end %%Page: 28 34 TeXDict begin 28 33 bop 0 83 a Fv(One)24 b(dif)n(ference)e(between)h (this)i(kind)e(of)h(in)m(v)n(ocation)e(that)i(of)g(Section)f(1.1)h(is)g (that)h(statements)f(may)f(get)h(e)o(x)o(ecuted)e(in)j(the)f(import)0 183 y(of)30 b Fs(mymodule)f Fv(will)h(not)g(be)g(deb)n(ugged.)52 b(F)o(or)30 b(e)o(xample)e(if)i Fs(mymodule)f Fv(implements)g(a)i (standalone)d(program)g(and/or)h(has)h(a)0 282 y Fs(__name__)48 b(=)i('__main__')69 b Fv(clause,)20 b(you)f(probably)f(don')o(t)g(w)o (ant)j(to)f(use)g(this)h(method.)0 567 y Ff(1.3.6)100 b(Inher)q(itance)30 b(from)e(class)g Fe(Cmd)0 770 y Fv(Because)20 b Fs(Pdb)h Fv(inherits)e(from)h Fs(Cmd)p Fv(,)f(the)i(follo)n(wing)d (con)m(v)o(entions)g(are)i(used.)0 917 y(All)j(of)f(the)g(deb)n(ugger)e (commands)h(listed)i(in)f Ft(??)g Fv(are)g(methods)g(of)g(a)g Fs(Pdb)h Fv(object.)30 b(The)22 b(method)f(names)h(are)h(the)f(command) e(name)0 1017 y(pre\002x)o(ed)i(by)g Fs(do_)p Fv(.)35 b(F)o(or)23 b(e)o(xample)e(the)j(method)e(handling)f(the)i(`)p Fs(step)p Fv(')g(command)e(is)j Fs(do_step)p Fv(,)f(and)g(the)g (command)e(handling)0 1116 y(the)f(`)p Fs(frame)p Fv(')f(command)g(is)i Fs(do_frame)p Fv(.)0 1263 y(If)i(you)g(ha)n(v)o(e)g(a)h Fs(Pdb)g Fv(object,)g(it)g(is)h(possible)e(to)h(call)g(an)o(y)e(of)i (the)f(commands)f(listed)i(in)g(1.2)f(directly)-5 b(.)34 b(P)o(arameters)23 b(needed)f(by)i(the)0 1363 y(methods)g(\(for)g(e)o (xample)f(breakpoint)g(numbers)g(for)h(the)h Fs(enable)f Fv(command\),)g(are)g(passed)h(as)h(a)f(single)g(string)f(ar)o(gument.) 37 b(The)0 1462 y(string)20 b(contains)g(the)g(v)n(alues)g(of)h(the)f (parameters)f(and)h(multiple)g(parameters)f(are)i(separated)e(by)h (spaces.)26 b(Each)20 b(method)f(parses)i(out)0 1562 y(parameters)e(and)g(performs)g(needed)f(con)m(v)o(ersions.)23 b(F)o(or)d(e)o(xample,)e(a)i Fs(Pdb)g Fv(object,)g Fs(p)p Fv(,)g(can)g(enable)f(breakpoint)f(numbers)g(3,)i(5,)g(and)0 1662 y(10)f(lik)o(e)i(this:)k Fs(p.do_enable\("3)47 b(5)j(10"\))p Fv(,)20 b(and)f(this)h(has)g(the)g(same)g(ef)n(fect)g(as)g(if)g Fs("enable)49 b(3)g(5)h(10")20 b Fv(were)g(issued)g(as)g(a)0 1761 y(deb)n(ugger)c(command.)22 b(String)c(parameters)f(should)h(not)g (ha)n(v)o(e)f(additional)g(quotes)h(in)g(the)g(string.)24 b(F)o(or)18 b(e)o(xample)f(to)i(set)g(the)f(\002lename)0 1861 y(where)28 b(history)g(commands)f(are)i(to)g(be)g(sa)n(v)o(ed)f (\(1.2.3\),)h(the)f(method)g(call)h(w)o(ould)f(be)h Fs (p.do_set\("history)46 b(filename)0 1960 y(/tmp/myhistfile"\))18 b Fv(without)h(an)o(y)g(quotes)h(around)e Fs(/tmp/myhistfile)p Fv(.)0 2107 y(Also)26 b(inherited)d Fs(Cmd)p Fv(,)k(is)f(the)f(help)f (mechanism,)h(although)f(some)g(customization)g(has)h(been)g(made)f(to) i(allo)n(w)f(for)f(subcommand)0 2207 y(help.)g(See)d(the)f(Python)f (cmd)h(module)f(for)g(more)h(information.)0 2354 y(If)25 b(readline)e(support)h(is)h(a)n(v)n(ailable)f(on)h(your)e(OS,)i Fs(Cmd)g Fv(will)g(use)g(that)g(and)f(both)g(command)f(history)h(and)g (command)e(completion)0 2453 y(will)g(be)e(a)n(v)n(ailable.)27 b(In)21 b(addition,)e(the)i(deb)n(ugger)e Fs(complete)h Fv(command)f(is)i(de\002ned)f(\(see)h(1.2.12\).)k(The)c Fs(complete)f Fv(command)0 2553 y(for)g(e)o(xample)e(is)j(used)f (internally)f(by)h(GNU)h(Emacs)f(deb)n(ugger)e Fs(gud)p Fv(.)0 2838 y Ff(1.3.7)100 b(Deb)n(ugger)30 b(Entr)s(y)f(Functions)0 3041 y Fv(The)20 b Fs(pydb)g Fv(module)f(de\002nes)h(the)g(follo)n (wing)e(functions,)h(and)h(each)f(enters)h(the)h(deb)n(ugger)d(in)i(a)h (slightly)e(dif)n(ferent)g(w)o(ay:)0 3188 y Fa(debugger)p Fs(\()p Fl([)p Fo(dbg)p 621 3188 25 4 v 27 w(cmds=None)o(,)g(add)p 1216 3188 V 29 w(e)n(xception)p 1563 3188 V 28 w(hook=T)-5 b(rue)o(,)19 b(add)p 2127 3188 V 29 w(thr)m(eaddbg=F)-6 b(alse)o(,)17 b(status=')m(start')12 b Fl(])p Fs(\))208 3287 y Fv(Enter)18 b(the)i(deb)n(ugger)d(at)j(the)f(statement)g(which)g (follo)n(ws)g(\(in)g(e)o(x)o(ecution\))e(the)i Fs(debugger\(\))f Fv(statement.)24 b(This)c(hard-codes)208 3387 y(a)28 b(call)g(to)h(the)f(deb)n(ugger)e(at)i(a)h(gi)n(v)o(en)d(point)i(in)g (a)g(program,)g(e)n(v)o(en)f(if)h(the)g(code)g(is)h(not)e(otherwise)h (being)f(deb)n(ugged.)46 b(F)o(or)208 3487 y(e)o(xample)18 b(you)i(might)f(w)o(ant)h(to)h(do)f(this)g(when)g(an)g(assertion)g(f)o (ails.)208 3619 y(It)j(is)g(useful)g(in)g(a)g(couple)f(of)g(other)g (situations.)33 b(First,)24 b(there)f(may)f(be)h(some)g(problem)e(in)i (getting)f(the)h(deb)n(ugger)d(to)j(stop)g(at)208 3719 y(this)f(particular)e(place)i(for)f(whate)n(v)o(er)f(reason)h(\(lik)o (e)h(\003akiness)f(in)h(the)g(deb)n(ugger\).)27 b(Alternati)n(v)o(ely) -5 b(,)20 b(using)h(the)h(deb)n(ugger)d(and)208 3819 y(setting)i(a)g(breakpoint)e(can)i(slo)n(w)g(do)n(wn)f(a)h(program)e(a) j(bit.)27 b(But)22 b(if)f(you)f(use)i(this)f(instead,)g(the)g(code)f (will)i(run)f(as)g(though)f(the)208 3918 y(deb)n(ugger)e(is)j(not)f (present.)208 4051 y(When)j(the)g(deb)n(ugger)e(is)j(quitting,)f(this)g (causes)h(the)f(program)e(to)i(be)g(terminated.)33 b(If)23 b(you)f(w)o(ant)i(the)f(program)e(to)i(continue)208 4151 y(instead,)c(use)i(the)f Fs(debugger)f Fv(function.)208 4284 y(Y)-9 b(ou)19 b(can)h(run)g(deb)n(ugger)e(commands)g(by)i (passing)g(this)g(as)h(a)g(list)g(in)g(parameter)d Fs(dbg_cmds)p Fv(.)208 4416 y(Unless)23 b Fs(add_exception_hook)e Fv(is)j(set)g(to)f Fs(False)p Fv(,)h(we)f(install)h(an)f(e)o(xception)e(hook)h(to)i(enter) e(the)i(deb)n(ugger)d(on)h(an)o(y)208 4516 y(otherwise)d(not)h(handled) f(e)o(xception.)208 4649 y(If)h(you)f(w)o(ant)h(e)o(xperimental)e (thread)h(deb)n(ugging)f(support,)h(set)i Fs(add_threaddbg)d Fv(to)i Fs(True)p Fv(.)208 4782 y(Setting)i(the)g(parameter)e Fs(status)i Fv(to)g(the)h(string)f('ne)n(w')f(will)i(cause)f(a)g(ne)n (w)g(instance)g(to)h(be)f(created)f(which)h(might)f(wiping)208 4881 y(out)e(other)h(instances)g(which)g(might)f(contain)g(information) f(lik)o(e)i(breakpoints)f(or)h(deb)n(ugger)e(settings.)208 5014 y(If)23 b(instead)g Fs(status)g Fv(is)h(set)g(to)g('continue',)d (an)j(e)o(xisting)e(instance)h(will)i(resume.)33 b(Omitting)23 b(status)h(or)f(setting)h(it)g(to)f(')-5 b(start')208 5114 y(will)20 b(start)h(the)f(deb)n(ugger)e(which)i(might)g(be)g(a)g ('ne)n(w')g(depending)d(on)j(whether)f(or)h(not)g(an)g(instance)g(has)g (been)g(created.)0 5261 y(If)h(instead)f(`status')h(is)h(set)f(to)g ('continue',)e(an)h(e)o(xisting)g(instance)h(will)g(resume.)26 b(Omitting)20 b(status)i(or)e(setting)h(it)h(to)f(')-5 b(start')21 b(will)g(start)0 5360 y(the)f(deb)n(ugger)e(which)i(might)f (be)i(a)f('ne)n(w')f(depending)f(on)i(whether)f(or)h(not)g(an)g (instance)g(has)g(been)g(created.)p 0 5549 3901 4 v 0 5649 a Fr(28)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f (Deb)n(ugger)p eop end %%Page: 29 35 TeXDict begin 29 34 bop 0 83 a Fa(exception_hook)p Fs(\()p Fo(type)o(,)17 b(value)o(,)j(tb,)g(dbg)p 1384 83 25 4 v 28 w(cmds=None)o(,)g(cmd\002le=None)p Fs(\))208 183 y Fv(An)g(e)o(xception)e(hook)h(to)h(call)h Fs(pydb)p Fv(')-5 b(s)20 b(post-mortem)e(deb)n(ugger)-5 b(.)208 310 y Fs(cmdfile)19 b Fv(is)i(an)f(optional)f(deb)n(ugger)f(command)g (\002le)j(you)f(w)o(ant)g(to)g Fs(source)g Fv(commands)e(on.)208 437 y Fs(dbg_cmds)h Fv(is)i(a)g(list)g(of)f(deb)n(ugger)e(commands)g (you)i(w)o(ant)g(to)g(run.)208 564 y(T)-7 b(o)20 b(use)g(add)g(this)h (to)f(your)f(Python)g(program:)758 782 y Fg(import)43 b(sys)758 873 y(sys.excepthook)f(=)j(pydb.exception_hook)0 1100 y Fa(pm)p Fs(\()p Fl([)p Fo(dbg)p 321 1100 V 28 w(cmds=None)12 b Fl(])p Fs(\))208 1200 y Fv(Enter)17 b(post-mortem)g(deb)n(ugging)e(of)j(the)h(traceback)e(found)f(in)j Fs(sys.last_traceback)p Fv(.)i(Note)e(you)e(may)h(need)g(to)g(ha)n(v)o (e)208 1299 y Fs(sys)i Fv(imported)e(prior)h(to)i(ha)n(ving)e(the)h (error)f(raised)h(to)g(ha)n(v)o(e)g(sys.last)p 2241 1299 V 30 w(traceback)f(set.)208 1426 y(Y)-9 b(ou)23 b(can)h(run)f(deb)n (ugger)f(commands)g(by)i(passing)g(this)g(as)h(a)g(list)g(as)f (parameter)f Fs(dbg_cmds)p Fv(.)36 b(F)o(or)23 b(e)o(xample)g(if)h(you) f(w)o(ant)208 1526 y(the)d(display)f(listsize)j(to)e(be)g(20)g(by)g (def)o(ault)f(on)h(entry)f(pass)i Fs(["set)49 b(listsize)f(20",])p Fv(.)0 1673 y Fa(post_mortem)p Fs(\()p Fo(tr)o(acebac)n(k)18 b Fl([)p Fo(,)j(dbg)p 1157 1673 V 28 w(cmds=None)o(,)f(cmd\002le=None) 12 b Fl(])p Fs(\))208 1772 y Fv(Enter)19 b(post-mortem)f(deb)n(ugging)g (of)i(the)g(gi)n(v)o(en)f Fo(tr)o(acebac)n(k)h Fv(object.)208 1899 y(Y)-9 b(ou)23 b(can)h(run)f(deb)n(ugger)f(commands)g(by)i (passing)g(this)g(as)h(a)g(list)g(as)f(parameter)f Fs(dbg_cmds)p Fv(.)36 b(F)o(or)23 b(e)o(xample)g(if)h(you)f(w)o(ant)208 1999 y(the)d(display)f(listsize)j(to)e(be)g(20)g(by)g(def)o(ault)f(on)h (entry)f(pass)i Fs(["set)49 b(listsize)f(20",])p Fv(.)0 2146 y Fa(run)p Fs(\()p Fo(statement)q Fl([)p Fo(,)19 b(globals)p Fl([)p Fo(,)g(locals)12 b Fl(])g(])p Fs(\))208 2245 y Fv(Ex)o(ecute)22 b(the)i Fo(statement)h Fv(\(gi)n(v)o(en)d(as)j (a)f(string\))f(under)g(deb)n(ugger)f(control)g(starting)i(with)g(the)g (statement)f(subsequent)g(to)h(the)208 2345 y(place)19 b(that)i(the)f(this)h(appears)e(in)h(your)f(program.)208 2472 y(The)28 b(deb)n(ugger)f(prompt)g(appears)h(before)g(an)o(y)g (code)h(is)g(e)o(x)o(ecuted;)j(you)c(can)h(set)h(breakpoints)d(and)h (type)g(`)p Fs(continue)p Fv(',)208 2572 y(or)e(you)f(can)i(step)f (through)f(the)h(statement)g(using)g(`)p Fs(step)p Fv(')g(or)g(`)p Fs(next)p Fv(')g(See)h(1.2.5)e(and)h(1.2.5)f(for)h(e)o(xplanations)e (of)i(these)208 2671 y(commands.)j(The)21 b(optional)g Fo(globals)g Fv(and)h Fo(locals)g Fv(ar)o(guments)e(specify)i(the)g(en) m(vironment)d(in)j(which)g(the)g(code)f(is)i(e)o(x)o(ecuted;)208 2771 y(by)d(def)o(ault)h(the)g(dictionary)f(of)h(the)g(module)f Fs(__main__)h Fv(is)h(used.)28 b(\(See)21 b(the)h(e)o(xplanation)d(of)i (the)g Fs(exec)g Fv(statement)g(or)h(the)208 2871 y Fs(eval\(\))d Fv(b)n(uilt-in)h(function.\))208 2998 y(Note)h(that)h(this)g(is)g(not)f (at)h(all)g(lik)o(e)g(p)o(ydb')-5 b(s)21 b(\(or)f(GDB')-5 b(s\))23 b Fs(run)e Fv(\(see)h(1.2.9\))e(deb)n(ugger)f(command.)27 b(This)21 b(function)f(should)h(be)208 3097 y(called)f(from)f(inside)h (the)g(program)e(you)h(are)h(trying)g(to)g(deb)n(ug.)0 3244 y Fa(runcall)p Fs(\()p Fo(function)p Fl([)p Fo(,)d(ar)m(gument,)i (...)12 b Fl(])p Fs(\))208 3344 y Fv(Call)19 b(the)g Fo(function)e Fv(\(a)i(function)e(or)h(method)g(object,)g(not)g(a)h (string\))f(with)h(the)g(gi)n(v)o(en)e(ar)o(guments)g(starting)h(with)h (the)g(statement)208 3443 y(subsequent)f(to)j(the)f(place)g(that)g(the) g(this)h(appears)e(in)i(your)e(program..)208 3570 y(When)27 b Fs(runcall\(\))g Fv(returns,)i(it)g(returns)e(whate)n(v)o(er)f(the)j (function)d(call)i(returned.)47 b(The)27 b(deb)n(ugger)f(prompt)h (appears)g(as)208 3670 y(soon)19 b(as)i(the)f(function)f(is)i(entered.) 0 3817 y Fa(runeval)p Fs(\()p Fo(e)n(xpr)m(ession)p Fl([)p Fo(,)d(globals)p Fl([)p Fo(,)h(locals)12 b Fl(])g(])p Fs(\))208 3916 y Fv(Ev)n(aluate)19 b(the)i Fo(e)n(xpr)m(ession)f Fv(\(gi)n(v)o(en)f(as)i(a)g(string\))f(under)f(deb)n(ugger)g(control)g (starting)h(with)h(the)f(statement)h(subsequent)e(to)i(the)208 4016 y(place)e(that)i(the)f(this)h(appears)e(in)h(your)f(program.)208 4143 y(When)g Fs(runeval\(\))g Fv(returns,)g(it)i(returns)e(the)h(v)n (alue)g(of)g(the)g(e)o(xpression.)j(Otherwise)d(this)g(function)f(is)i (similar)f(to)g Fs(run\(\))p Fv(.)0 4290 y Fa(runl)p Fs(\()p Fo(ar)m(g1)f Fl([)p Fo(,)h(ar)m(g2.)12 b(.)g(.)23 b Fl(])p Fs(\))208 4390 y Fv(This)i(is)h(a)g(w)o(ay)g(to)f(call)h(the)g (deb)n(ugger)d(on)i(a)h(Python)e(script)h(\(usually)g(not)g(the)g(same) h(one)f(as)h(is)g(currently)e(running\))f(from)208 4489 y(inside)c(Python.)24 b(In)19 b(particular)g(this)h(is)g(useful)g (inside)f(Python)g(shells.)25 b(The)20 b(parameters)e(form)h(the)g (options)g(to)h(the)g(deb)n(ugger)208 4589 y(as)g(well)h(as)g(the)f (Python)f(script)i(to)f(deb)n(ug)f(and)h(options)f(to)h(pass)h(to)f (that.)208 4716 y(F)o(or)f(e)o(xample:)802 4934 y Fg(import)44 b(pydb)802 5025 y(pydb.runl\("--threading",)d("--nx",)1251 5117 y("myscript",)i("--my-first-option")e("myfirstarg"\))208 5300 y Fv(Here)21 b Fs(--threading)e Fv(and)i Fs(--nx)g Fv(go)f(to)i(the)f(deb)n(ugger)e(and)h Fs(myscript)g Fv(is)j(the)e(name)f(of)h(the)g(Python)f(program)f(to)i(run)208 5400 y(which)e(gets)i(the)f(remaining)e(parameters,)h Fs(--my-first-option)f Fv(and)h Fs(myfirstarg)p Fv(.)p 0 5549 3901 4 v 0 5649 a Fr(1.3.)52 b(The)23 b(Deb)n(ugger)h(Module)h (\()p Fs(pydb)p Fr(\))c(and)j(Class)e(\()p Fs(Pdb)p Fr(\))1895 b(29)p eop end %%Page: 30 36 TeXDict begin 30 35 bop 208 83 a Fv(The)19 b(')o(l',)h(suf)n(\002x)g (to)h(indicate)e(a)i(list)g(parameter)e(is)i(analogous)d(to)j(the)f (use)g(in)h Fs(os.spawnl\(\))p Fv(,)d(or)i Fs(os.execl\(\))p Fv(.)208 216 y(If)g(you)f(w)o(ant)h(to)h(deb)n(ug)e(the)h(current)f (Python)g(script,)h(use)g Fs(debugger\(\))f Fv(described)g(belo)n(w)-5 b(.)0 363 y Fa(runv)p Fs(\()p Fo(ar)m(gs)p Fs(\))208 462 y Fv(This)25 b(is)h(a)g(w)o(ay)g(to)f(call)h(the)g(deb)n(ugger)d (on)i(a)h(Python)e(script)h(\(usually)g(not)g(the)g(same)h(one)f(as)h (is)g(currently)e(running\))f(from)208 562 y(inside)18 b(Python.)23 b(In)c(particular)e(this)i(is)g(useful)f(inside)h(Python)e (shells.)25 b(The)19 b(single)f(parameter)f(is)j(a)f(list)g(of)g(the)f (options)g(to)h(the)208 662 y(deb)n(ugger)f(as)i(well)h(as)g(the)f (Python)f(script)i(to)f(deb)n(ug)f(and)h(options)f(to)h(pass)h(to)f (that.)208 794 y Fs(runl\()458 809 y(*)508 794 y(args\))e Fv(is)j(also)g(the)f(same)g(as)h Fs(runv\(\(args\)\))p Fv(.)208 927 y(F)o(or)e(e)o(xample:)802 1060 y Fg(import)44 b(pydb)802 1151 y(args=\("--threading",)e("--nx",)1071 1243 y("myscript",)h("--my-first-option")f("myfirstarg"\))802 1334 y(pydb.runv\(args\))208 1524 y Fv(Here)21 b Fs(--threading)e Fv(and)i Fs(--nx)g Fv(go)f(to)i(the)f(deb)n(ugger)e(and)h Fs(myscript)g Fv(is)j(the)e(name)f(of)h(the)g(Python)f(program)f(to)i (run)208 1623 y(which)e(gets)i(the)f(remaining)e(parameters,)h Fs(--my-first-option)f Fv(and)h Fs(myfirstarg)p Fv(.)208 1756 y(The)32 b(')l(v',)j(suf)n(\002x)e(to)g(indicate)f(a)h(v)n (ariable)f(number)f(of)i(parameters)e(is)j(analogous)d(to)i(the)g(use)g (in)h Fs(os.spawnv\(\))p Fv(,)g(or)208 1856 y Fs(os.execv\(\))p Fv(.)208 1988 y(If)20 b(you)f(w)o(ant)h(to)h(deb)n(ug)e(the)h(current)f (Python)g(script,)h(use)g Fs(debugger\(\))f Fv(described)g(belo)n(w)-5 b(.)0 2135 y Fa(set_trace)p Fs(\()p Fl([)p Fo(dbg)p 671 2135 25 4 v 26 w(cmds=None)o(,)20 b(add)p 1266 2135 V 28 w(e)n(xception)p 1612 2135 V 29 w(hook=T)-5 b(rue)o(,)19 b(add)p 2177 2135 V 29 w(thr)m(eaddbg=F)-6 b(alse)o(,)17 b(ne)o(w)p 2952 2135 V 29 w(instance=F)-6 b(alse)12 b Fl(])p Fs(\))208 2235 y Fv(Another)20 b(name)h(for)g(deb)n(ugger)-5 b(.)28 b(This)21 b(is)i(the)f(older)f(name)g(and)g(is)h(k)o(ept)g(for)f (backw)o(ard)f(compatibility)g(with)i(pdb)m(.)28 b(Also)22 b(it)h(is)208 2335 y(analogous)18 b(to)i(the)h(underlying)c(command)h (used)i(in)g(the)h Fs(sys)f Fv(of)g(the)g(same)g(name.)0 2662 y Fn(1.4)121 b(The)99 b(\223Basic\224)f(Deb)n(ugger)j(module)e(\() p Fb(bdb)p Fn(\))e(and)j(Classes)f Fb(Bdb)f Fn(and)286 2811 y Fb(Breakpoint)0 3044 y Fv(As)21 b(mentioned)c(in)j(the)g(pre)n (vious)e(section)i(the)f Fs(Pdb)h Fv(class)h(is)f(really)g(an)f (inheritance)f(of)i(tw)o(o)g(other)f(classes,)h Fs(Cmd)g Fv(and)f Fs(Bdb)p Fv(.)25 b(While)0 3144 y(the)j Fs(Cmd)g Fv(class)h(handles)e(command-lik)o(e)f(interaction,)i(the)g Fs(Bdb)g Fv(handles)g(basic)g(deb)n(ugger)e(functions.)47 b(It)28 b(is)h(the)f(meat)g(of)g(this)0 3244 y(deb)n(ugger)21 b(or)h(an)o(y)g(deb)n(ugger)-5 b(.)32 b(Thus,)23 b(you)f(will)h(\002nd) g(other)f(deb)n(uggers)f(such)i(as)h(Eric)e(or)h(Idle)g(using)f(the)h Fs(bdb)g Fv(module)e(\(not)i Fs(pdb)0 3343 y Fv(or)d Fs(pydb)p Fv(\).)0 3490 y(The)j(module)f(de\002nes)h(an)g(e)o(xception) f(used)h(for)g(quitting)f(the)h(deb)n(ugger)e Fs(BdbQuit)p Fv(.)34 b(It)24 b(de\002nes)f(tw)o(o)g(other)g(classes:)33 b Fs(Bdb)p Fv(,)23 b(basic)0 3590 y(deb)n(ugger)18 b(routines,)h(and)h Fs(Breakpoint)f Fv(a)h(class)h(for)f(handling)e(deb)n(ugger)g (breakpoints.)0 3737 y Ft(class)j Fa(Bdb)p Fs(\(\))3463 b Fa(canonic)p Fs(\()p Fo(\002lename)p Fs(\))390 3836 y Fv(Re)o(gularizes)25 b(or)h(canonicalizes)e(\002lename)i(in)g(some)f (sort)h(of)g(standard)e(form.)41 b(This)26 b(may)f(in)m(v)n(olv)o(e)f (re)o(gularizing)g(the)390 3936 y(case)d(of)f(letters,)g(using)g(the)g (absolute)f(pathname)208 4069 y Fa(reset)p Fs(\(\))390 4168 y Fv(The)28 b(deb)n(ugger)e(k)o(eeps)i(track)g(of)g(frames)g(it)h (needs)f(to)g(stop)g(at.)50 b(This)28 b(routine)f(resets)i(this)g (information)d(so)j(that)f(no)390 4268 y(frames)20 b(are)g(recorded)e (as)j(places)f(to)h(enter)e(the)i(deb)n(ugger)-5 b(.)208 4401 y Fa(trace_dispatch)p Fs(\(\))390 4500 y Fv(This)20 b(gets)f(called)g(on)g(e)n(v)o(ery)f(deb)n(ugger)f(e)n(v)o(ent)h(and)h (reroutes)f(or)h(dispatches)g(the)g(call)h(based)e(on)h(the)g(e)n(v)o (ent.)24 b(Ev)o(ents)19 b(are)390 4600 y(described)g(in)h(the)h(ne)o (xt)e(section)h(1.5.)208 4733 y Fa(dispatch_exception)p Fs(\(\))390 4832 y Fv(Called)i(from)e(trace)p 979 4832 V 30 w(dispatch)g(on)h(an)h(\223e)o(xception\224)d(e)n(v)o(ent.)28 b(Generally)20 b(you)g(don')o(t)g(change)g(this)i(b)n(ut)g(instead)f(o) o(v)o(erride)390 4932 y Fs(user_exception)p Fv(.)208 5065 y Fa(dispatch_line)p Fs(\(\))390 5164 y Fv(Called)34 b(from)f(trace)p 1004 5164 V 29 w(dispatch)g(on)h(an)f(\223line\224)h (e)n(v)o(ent.)64 b(Generally)33 b(you)g(don')o(t)f(change)g(this)j(b)n (ut)e(instead)h(o)o(v)o(erride)390 5264 y Fs(user_line)p Fv(.)p 0 5549 3901 4 v 0 5649 a Fr(30)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 31 37 TeXDict begin 31 36 bop 208 83 a Fa(dispatch_return)p Fs(\(\))390 183 y Fv(Called)32 b(from)e(trace)p 999 183 25 4 v 30 w(dispatch)g(on)h(an)h(\223return)e(e)n(v)o(ent.)58 b(Generally)30 b(you)g(don')o(t)g(change)g(this)i(b)n(ut)g(instead)f(o) o(v)o(erride)390 282 y Fs(user_return)p Fv(.)208 415 y Fa(user_exception)p Fs(\(\))390 515 y Fv(Called)21 b(on)f(an)g(\223e)o(xception\224)e(e)n(v)o(ent.)24 b(Deb)n(uggers)18 b(may)i(o)o(v)o(erride)e(this)j(method.)208 648 y Fa(user_line)p Fs(\(\))390 747 y Fv(Called)g(on)f(a)g(\223line\224)g(e)n(v)o(ent.)k (Deb)n(uggers)19 b(may)h(o)o(v)o(erride)d(this)k(method.)208 880 y Fa(user_return)p Fs(\(\))390 980 y Fv(Called)g(on)f(a)g (\223return\224)f(e)n(v)o(ent.)24 b(Deb)n(uggers)19 b(may)g(o)o(v)o (erride)f(this)j(method.)0 1307 y Fn(1.5)121 b(Ho)n(w)34 b(the)h(Deb)n(ugger)g(W)l(or)r(ks)0 1540 y Fv(Some)20 b(changes)f(were)h(made)g(to)g(the)g(interpreter:)125 1770 y Fu(\017)41 b Fs(sys.settrace\()p Fo(func)p Fs(\))17 b Fv(sets)k(the)f(global)f(trace)i(function)125 1936 y Fu(\017)41 b Fv(there)19 b(can)h(also)h(be)f(a)h(local)f(trace)g (function)e(\(see)j(belo)n(w\))0 2166 y(T)m(race)29 b(functions)f(ha)n (v)o(e)h(three)g(ar)o(guments:)42 b Fo(fr)o(ame)p Fv(,)31 b Fo(e)o(vent)q Fv(,)h(and)d Fo(ar)m(g)p Fv(.)52 b Fo(fr)o(ame)30 b Fv(is)g(the)f(current)g(stack)g(frame.)52 b Fo(e)o(vent)31 b Fv(is)f(a)g(string:)0 2265 y Fs('call')p Fv(,)21 b Fs('line')p Fv(,)h Fs('return')p Fv(,)f Fs('exception')p Fv(,)g Fs('c_call')p Fv(,)g Fs('c_return')p Fv(,)g(or)g Fs('c_exception')p Fv(.)28 b Fo(ar)m(g)22 b Fv(depends)0 2365 y(on)e(the)g(e)n(v)o(ent)f(type.)0 2512 y(The)24 b(global)f(trace)h(function)e(is)j(in)m(v)n(ok)o(ed)e(\(with)h Fo(e)o(vent)h Fv(set)g(to)f Fs('call')p Fv(\))f(whene)n(v)o(er)f(a)i (ne)n(w)g(local)g(scope)g(is)h(entered;)g(it)g(returns)e(a)0 2611 y(reference)c(to)h(the)g(local)g(trace)g(function)f(to)h(be)g (used)g(in)g(that)h(scope,)e(or)h Fs(None)g Fv(if)h(the)f(scope)g (couldn')o(t)e(be)i(traced.)0 2758 y(The)h(local)f(trace)h(function)e (returns)h(a)i(reference)d(to)i(itself)g(\(or)g(to)g(another)e (function)g(for)i(further)e(tracing)h(in)h(that)g(scope\),)f(or)h Fs(None)0 2858 y Fv(to)f(turn)g(of)n(f)f(tracing)h(in)g(that)g(scope.)0 3005 y(Instance)f(methods)g(are)i(accepted)e(\(and)g(v)o(ery)g (useful\))g(as)i(trace)f(functions.)0 3152 y(The)g(e)n(v)o(ents)f(ha)n (v)o(e)h(the)g(follo)n(wing)f(meanings:)0 3382 y Fa('call')40 b Fv(A)25 b(function)d(is)i(called)g(\(or)f(some)h(other)e(code)i (block)e(entered\).)34 b(The)24 b(global)f(trace)g(function)f(is)j (called;)g Fo(ar)m(g)f Fv(is)h Fs(None)p Fv(;)208 3481 y(the)20 b(return)f(v)n(alue)g(speci\002es)i(the)f(local)g(trace)g (function.)0 3647 y Fa('line')40 b Fv(The)27 b(interpreter)e(is)i (about)f(to)h(e)o(x)o(ecute)e(a)i(ne)n(w)g(line)f(of)h(code)f (\(sometimes)g(multiple)g(line)g(e)n(v)o(ents)h(on)f(one)g(line\).)44 b(The)208 3747 y(local)20 b(trace)g(function)e(is)j(called;)f Fo(ar)m(g)g Fv(is)i Fs(None)p Fv(;)e(the)g(return)f(v)n(alue)g (speci\002es)i(the)f(ne)n(w)g(local)g(trace)g(function.)0 3913 y Fa('return')40 b Fv(A)19 b(function)e(\(or)h(other)f(code)h (block\))f(is)i(about)f(to)h(return.)k(The)18 b(local)g(trace)h (function)d(is)k(called;)f Fo(ar)m(g)f Fv(is)h(the)g(v)n(alue)e(that) 208 4013 y(will)j(be)h(returned.)i(The)d(trace)g(function')-5 b(s)18 b(return)i(v)n(alue)f(is)i(ignored.)0 4179 y Fa('exception')39 b Fv(An)26 b(e)o(xception)e(has)i(occurred.)39 b(The)25 b(local)h(trace)f(function)f(is)j(called;)h Fo(ar)m(g)d Fv(is)i(a)f(triple)f Fs(\()p Fo(e)n(xception)p Fs(,)48 b Fo(value)p Fs(,)208 4278 y Fo(tr)o(acebac)n(k)q Fs(\))p Fv(;)19 b(the)h(return)f(v)n(alue)h(speci\002es)g(the)h(ne)n(w)f(local) g(trace)g(function.)0 4444 y Fa('c_call')40 b Fv(A)21 b(C)h(function)c(is)k(about)d(to)i(be)g(called.)k(This)c(may)f(be)h(an) f(e)o(xtension)f(function)g(or)h(a)h(b)n(uilt-in)f(function.)k Fo(ar)m(g)d Fv(is)g(the)g(C)208 4544 y(function)d(object.)0 4710 y Fa('c_return')40 b Fv(A)20 b(C)h(function)e(has)h(returned.)j Fo(ar)m(g)d Fv(is)i Fs(None)p Fv(.)0 4876 y Fa('c_exception')39 b Fv(A)21 b(C)g(function)d(has)j(thro)n(wn)e(an)h(e)o(xception.)j Fo(ar)m(g)d Fv(is)h Fs(None)p Fv(.)0 5106 y(Since)f(an)g(e)o(xception)f (is)i(propagated)c(do)n(wn)i(the)h(chain)g(of)g(callers,)g(an)g Fs('exception')f Fv(e)n(v)o(ent)g(is)i(generated)e(at)h(each)g(le)n(v)o (el.)0 5253 y(F)o(or)g(more)f(information)f(on)i(code)f(and)h(frame)f (objects,)h(see)h(to)f(the)g(Python)f(Reference)h(Manual.)p 0 5549 3901 4 v 0 5649 a Fr(1.5.)52 b(Ho)o(w)23 b(the)g(Deb)n(ugger)h (W)n(or)q(ks)2671 b(31)p eop end %%Page: 32 38 TeXDict begin 32 37 bop 0 86 a Fn(1.6)121 b(Files)32 b(making)i(up)g(the)g(Deb)n(ugger)0 319 y Fv(Here)20 b(are)g(the)g(\002les)h(making)d(up)i(the)g(deb)n(ugger)e(and)h(what)h (is)h(in)f(them.)k(Currently)19 b(we)i(use)f(GNU)g(automak)o(e)f(in)h (the)g(b)n(uild)f(process,)0 419 y(and)e(this)h(allo)n(ws)g(for)g (substitution)e(to)i(tak)o(e)g(place)f(in)h(the)g(\002les)h(and)e (Python)g(programs)e(which)j(get)f(installed.)24 b(In)18 b(particular)e(the)i(path)0 518 y(to)25 b(the)f(Python)g(interpreter)e (is)k(used)e(that)h(the)f(deb)n(ugger)f(con\002gured)f(and)i(tested)g (with.)38 b(A)25 b(\002le)h(with)e(a)h Fs(.in)g Fv(suf)n(\002x)f(is)h (a)g(\002le)g(that)0 618 y(is)e(the)g(input)e(for)h(the)g (substitution.)30 b(The)22 b(corresponding)d(output)i(\002le)i(has)g (the)f Fs(.in)g Fv(stripped)g(of)n(f.)30 b(F)o(or)22 b(e)o(xample)f Fs(pydb.py.in)0 718 y Fv(becomes)e Fs(pydb.py)h Fv(after)g(a)g(Python)f(interpreter)g(and)g(package)g(name)h(\(p)o (ydb\))e(is)j(substituted)f(inside)g(it.)0 948 y Ft(pydb)m(.py)-6 b(.in)41 b Fv(Python)19 b(deb)n(ugger)-5 b(.)23 b(Contains)d(user)n (-callable)f(routines,)g(e.g.)25 b Fs(run)p Fv(,)20 b Fs(debugger)p Fv(,)f Fs(runeval)p Fv(.)0 1114 y Ft(display)-6 b(.py)41 b Fv(Classes)21 b(to)e(support)f(gdb-lik)o(e)g (display/undisplay)e(for)j(p)o(ydb,)f(the)h(Extended)e(Python)h(deb)n (ugger)-5 b(.)23 b(Class)e(Display)e(and)208 1213 y(DisplayNode)f(are)j (de\002ned.)0 1379 y Ft(fns.py)41 b Fv(Functions)19 b(to)i(support)d (the)j(Deb)n(ugger)-5 b(.)0 1545 y Ft(gdb)m(.py)f(.in)41 b Fv(Handles)19 b(gdb-lik)o(e)g(command)f(processing.)0 1711 y Ft(inf)n(o.py)40 b Fv(Info)19 b(subcommands.)k(\(W)-7 b(ell,)21 b(most)f(of)g(them\).)0 1877 y Ft(pydb)o(bdb)m(.py)41 b Fv(Routines)22 b(here)g(ha)n(v)o(e)g(to)g(do)g(with)h(the)f (subclassing)g(of)g(bdb)m(.)30 b(De\002nes)23 b(Python)e(deb)n(ugger)f (Basic)k(Deb)n(ugger)c(\(Bdb\))208 1977 y(class.)25 b(This)c(\002le)g (could/should)c(probably)h(get)i(mer)o(ged)f(into)h(bdb)m(.p)o(y)0 2143 y Ft(pydbcmd.py)41 b Fv(Routines)20 b(here)f(ha)n(v)o(e)h(to)g(do) f(with)i(parsing)d(or)i(processing)f(commands,)f(generally)g(\(b)n(ut)i (not)g(al)o(w)o(ays\))g(the)o(y)f(are)h(not)208 2243 y(speci\002c)j(to)h(p)o(ydb)m(.)34 b(The)o(y)22 b(are)i(sort)f(of)h (more)e(oriented)h(to)n(w)o(ards)g(an)o(y)f(gdb-lik)o(e)g(deb)n(ugger) -5 b(.)34 b(Also)24 b(routines)e(that)i(need)f(to)h(be)208 2342 y(changed)18 b(from)h(cmd)h(are)g(here.)0 2508 y Ft(set.py)41 b Fv(Set)21 b(subcommands.)h(\(W)-7 b(ell,)21 b(most)f(of)g(them\).)0 2674 y Ft(sho)o(w)-6 b(.py)41 b Fv(Sho)n(w)20 b(subcommands.)j(\(W)-7 b(ell,)20 b(most)h(of)f (them\).)0 2840 y Ft(sighandler)-8 b(.py)40 b Fv(Classes)27 b(and)d(routines)f(which)h(help)h(in)f(signal)h(handling.)36 b(Of)25 b(the)g(classes)h(there)e(is)h(a)g(signal)g(handler)e(manager) 208 2940 y(class,)d Fs(SignalManager)p Fv(,)f(and)g(a)i(class)g(that)f (is)h(used)f(by)g(the)g(signal)g(handler)f(that)h(the)h(program)d (sees,)i Fs(SigHandler)p Fv(.)0 3106 y Ft(subcmd.py)42 b Fv(Implements)19 b(a)h(sub-command)d(class)k(for)f(handling)e Fs(info)p Fv(,)i Fs(set)p Fv(,)g(and)g Fs(show)g Fv(subcommand)d (processing.)0 3272 y Ft(thr)o(eaddbg)o(.py)39 b Fv(Implements)19 b(thread)g(deb)n(ugging.)0 3600 y Fn(1.7)121 b(Installation)0 3832 y Fv(The)26 b(Python)e(code)i(is)h(a)n(v)n(ailable)e(from)g(the)h (p)o(ydb)f(\002les)h(section)g(on)g(sourcefor)o(ge.net.)38 b Fo(If)26 b(you)g(have)f(made)g(an)h(OS)g(pac)n(ka)o(g)o(e)e(and)0 3932 y(would)c(lik)o(e)h(you')n(r)m(e)e(URL)h(listed)h(her)m(e)o(,)f (let)h(me)g(know)p Fv(.)0 4217 y Ff(1.7.1)100 b(Installation)29 b(options)0 4420 y Fv(The)24 b(program)e(is)j(not)e(con\002gured)f (using)i Fs(setup.py)f Fv(yet,)h(b)n(ut)h Fs(configure)p Fv(.)35 b(Some)24 b(con\002guration)d(options)i(that)h(may)g(be)g(of)0 4519 y(interest.)0 4749 y Ft(\226\226with\226\226python)39 b Fv(Normally)29 b(the)i Fs(configure)e Fv(uses)j(your)d(e)o(x)o (ecution)g(search-path)g(v)n(ariable)g(\()p Fs(PATH)p Fv(\))h(to)h(\002nd)f(the)h(p)o(ython)208 4849 y(interpreter)-5 b(.)43 b(Ho)n(we)n(v)o(er)25 b(it)i(is)h(possible)e(that)h(you)e(might) h(no)n(w)g(ha)n(v)o(e)g(p)o(ython)f(or)i(the)f(right)h(p)o(ython)e(in)h (your)g Fs(PATH)p Fv(.)g(Some)208 4949 y(installations)c(may)g(ha)n(v)o (e)h(se)n(v)o(eral)f(v)o(ersions)f(of)i(Python)e(may)i(be)f(installed)h (or)g(may)f(ha)n(v)o(e)g(Python)g(installed)g(in)h(an)g(unusual)208 5048 y(place.)h(Use)d(this)g(con\002guration)c(in)k(such)f(cases.)0 5214 y Ft(\226\226with\226\226lispdir)40 b Fv(This)20 b(option)e(o)o(v)o(errides)f(where)i(to)h(put)f(\002les)h(which)f(can)h (be)f(used)g(by)g(GNU)h(Emacs.)25 b(It)20 b(should)e(be)h(a)h(place)f (that)208 5314 y(GNU)h(Emacs)g(users)h(will)g(ha)n(v)o(e)e(listed)i(in) f(the)g Fs(load-path)f Fv(inside)h(GNU)h(Emacs.)p 0 5549 3901 4 v 0 5649 a Fr(32)2161 b(Chapter)24 b(1.)52 b(The)23 b(Extended)h(Python)f(Deb)n(ugger)p eop end %%Page: 33 39 TeXDict begin 33 38 bop 0 83 a Ft(\226\226with\226\226site-packages)38 b Fv(This)22 b(option)g(o)o(v)o(errides)e(where)i(to)g(put)g(\002les)i (the)e Fs(pydb)g Fv(package.)30 b(It)23 b(should)e(be)i(a)g(place)f (that)g(p)o(ython)208 183 y(searches)e(when)f(modules)g(are)h Fs(import)p Fv('ed.)0 349 y Ft(\226\226enable\226\226pyr)o(eadline)38 b Fv(If)20 b(you)f(don')o(t)g(ha)n(v)o(e)g(readline)h(b)n(ut)g(ha)n(v)o (e)f Fs(pyreadline)g Fv(or)h(prefer)f(to)h(use)h(that,)f(use)g(this)h (option.)p 0 5549 3901 4 v 0 5649 a Fr(1.7.)52 b(Installation)3223 b(33)p eop end %%Page: 34 40 TeXDict begin 34 39 bop 0 5549 3901 4 v 0 5649 a Fr(34)p eop end %%Page: 35 41 TeXDict begin 35 40 bop 3269 564 a FA(INDEX)0 1317 y Fn(Symbols)0 1440 y Fv(.p)o(ydbrc)166 1540 y(\002le,)21 b(4)0 1722 y Fn(B)0 1845 y Fs(Bdb)f Fv(\(class)h(in)f(\),)g(30)0 1945 y(breakpoints,)e(10)0 2142 y Fn(C)0 2266 y Fs(canonic\(\))h Fv(\(Bdb)h(method\),)e(30)0 2365 y(con\002guration)166 2465 y(\002le,)j(deb)n(ugger)m(,)c(4)0 2661 y Fn(D)0 2784 y Fv(deb)n(ugger)166 2883 y(con\002guration)h(\002le,)i(4)0 2983 y Fs(debugger\(\))f Fv(\(in)h(module)f(\),)h(28)0 3083 y(deb)n(ugging,)d(22)0 3182 y Fs(dispatch_exception\(\))g Fv(\(Bdb)j(method\),)e(30)0 3282 y Fs(dispatch_line\(\))g Fv(\(Bdb)i(method\),)e(30)0 3382 y Fs(dispatch_return\(\))g Fv(\(Bdb)h(method\),)g(31)0 3574 y Fn(E)0 3697 y Fv(en)m(vironment)e(v) n(ariables)166 3797 y(P)-8 b(A)m(GER,)21 b(19)0 3897 y Fs(exception_hook\(\))d Fv(\(in)i(module)f(\),)h(29)0 4089 y Fn(F)0 4212 y Fv(\002le)166 4312 y(.p)o(ydbrc,)e(4)166 4411 y(deb)n(ugger)g(con\002guration,)f(4)0 4609 y Fn(G)0 4732 y Fs(Gdb)j Fv(\(class)h(in)f(\),)g(23)0 4925 y Fn(P)0 5048 y Fv(P)-8 b(A)m(GER,)21 b(19)0 5147 y Fs(Pdb)166 5247 y Fv(class)g(in)g(,)f(23)166 5347 y(class)h(in)g(p)o(ydb,)d(23) 1992 1312 y Fs(pm\(\))i Fv(\(in)g(module)e(\),)i(29)1992 1411 y Fs(post_mortem\(\))e Fv(\(in)i(module)f(\),)h(29)1992 1511 y Fs(pydb)g Fv(\(standard)e(module\),)g Ft(1)1992 1703 y Fn(R)1992 1826 y Fs(reset\(\))h Fv(\(Bdb)h(method\),)e(30)1992 1926 y Fs(run\(\))h Fv(\(in)h(module)f(\),)h(29)1992 2026 y Fs(runcall\(\))f Fv(\(in)h(module)e(\),)j(29)1992 2125 y Fs(runeval\(\))e Fv(\(in)h(module)e(\),)j(29)1992 2225 y Fs(runl\(\))e Fv(\(in)h(module)f(\),)h(29)1992 2325 y Fs(runv\(\))f Fv(\(in)h(module)f(\),)h(30)1992 2519 y Fn(S)1992 2642 y Fs(set_trace\(\))e Fv(\(in)i(module)f(\),)h(30) 1992 2834 y Fn(T)1992 2958 y Fs(trace_dispatch\(\))d Fv(\(Bdb)j(method\),)e(30)1992 3150 y Fn(U)1992 3273 y Fs(user_exception\(\))f Fv(\(Bdb)j(method\),)e(31)1992 3373 y Fs(user_line\(\))g Fv(\(Bdb)i(method\),)e(31)1992 3473 y Fs(user_return\(\))g Fv(\(Bdb)i(method\),)e(31)p 0 5549 3901 4 v 3808 5649 a Fr(35)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF pydb-1.26/Doc/Makefile.deps0000664000175000017500000000221110366674720012431 00000000000000# -*- Makefile -*- # LaTeX source dependencies. COMMONSTYLES= $(PYTHON_DOC)/texinputs/python.sty \ $(PYTHON_DOC)/texinputs/pypaper.sty INDEXSTYLES=$(PYTHON_DOC)/texinputs/python.ist COMMONTEX=$(PTYHON_DOC)/commontex/copyright.tex \ $(PTYHON_DOC)/commontex/license.tex \ $(PTYHON_DOC)/commontex/patchlevel.tex \ $(PTYHON_DOC)/commontex/boilerplate.tex MANSTYLES= $(PYTHON_DOC)/texinputs/fncychap.sty \ $(PYTHON_DOC)/texinputs/manual.cls \ $(COMMONSTYLES) HOWTOSTYLES= APIFILES= # These files are generated from those listed above, and are used to # generate the typeset versions of the manuals. The list is defined # here to make it easier to ensure parallelism. ANNOAPIFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \ $(PTYHON_DOC)/commontex/reportingbugs.tex DOCFILES= $(HOWTOSTYLES) \ $(PTYHON_DOC)/commontex/boilerplate.tex \ $(PYTHON_DOC)/texinputs/ltxmarkup.sty \ doc/doc.tex EXTFILES= TUTFILES= # LaTeX source files for the Python Reference Manual REFFILES= # LaTeX source files for the Python Library Reference LIBFILES= lib/libpydb.tex # LaTeX source files for Macintosh Library Modules. MACFILES= INSTFILES = DISTFILES = pydb-1.26/Doc/tools/0000777000175000017500000000000011167772525011267 500000000000000pydb-1.26/Doc/tools/indfix.py0000755000175000017500000000437510366704060013037 00000000000000#! /usr/bin/env python """Combine similar index entries into an entry and subentries. For example: \item {foobar} (in module flotz), 23 \item {foobar} (in module whackit), 4323 becomes \item {foobar} \subitem in module flotz, 23 \subitem in module whackit, 4323 Note that an item which matches the format of a collapsable item but which isn't part of a group of similar items is not modified. """ __version__ = '$Revision: 1.1 $' import re import StringIO import sys def cmp_entries(e1, e2): return cmp(e1[1].lower(), e2[1].lower()) or cmp(e1, e2) def dump_entries(write, entries): if len(entries) == 1: write(" \\item %s (%s)%s\n" % entries[0]) return write(" \item %s\n" % entries[0][0]) # now sort these in a case insensitive manner: if len(entries) > 0: entries.sort(cmp_entries) for xxx, subitem, pages in entries: write(" \subitem %s%s\n" % (subitem, pages)) breakable_re = re.compile( r" \\item (.*) [(](.*)[)]((?:(?:, \d+)|(?:, \\[a-z]*\{\d+\}))+)") def process(ifn, ofn=None): if ifn == "-": ifp = sys.stdin else: ifp = open(ifn) if ofn is None: ofn = ifn ofp = StringIO.StringIO() entries = [] match = breakable_re.match write = ofp.write while 1: line = ifp.readline() if not line: break m = match(line) if m: entry = m.group(1, 2, 3) if entries and entries[-1][0] != entry[0]: dump_entries(write, entries) entries = [] entries.append(entry) elif entries: dump_entries(write, entries) entries = [] write(line) else: write(line) del write del match ifp.close() data = ofp.getvalue() ofp.close() if ofn == "-": ofp = sys.stdout else: ofp = open(ofn, "w") ofp.write(data) ofp.close() def main(): import getopt outfile = None opts, args = getopt.getopt(sys.argv[1:], "o:") for opt, val in opts: if opt in ("-o", "--output"): outfile = val filename = args[0] outfile = outfile or filename process(filename, outfile) if __name__ == "__main__": main() pydb-1.26/Doc/tools/toc2bkm.py0000775000175000017500000000755510366703340013124 00000000000000#! /usr/bin/env python """Convert a LaTeX .toc file to some PDFTeX magic to create that neat outline. The output file has an extension of '.bkm' instead of '.out', since hyperref already uses that extension. """ import getopt import os import re import string import sys # Ench item in an entry is a tuple of: # # Section #, Title String, Page #, List of Sub-entries # # The return value of parse_toc() is such a tuple. cline_re = r"""^ \\contentsline\ \{([a-z]*)} # type of section in $1 \{(?:\\numberline\ \{([0-9.A-Z]+)})? # section number (.*)} # title string \{(\d+)}$""" # page number cline_rx = re.compile(cline_re, re.VERBOSE) OUTER_TO_INNER = -1 _transition_map = { ('chapter', 'section'): OUTER_TO_INNER, ('section', 'subsection'): OUTER_TO_INNER, ('subsection', 'subsubsection'): OUTER_TO_INNER, ('subsubsection', 'subsection'): 1, ('subsection', 'section'): 1, ('section', 'chapter'): 1, ('subsection', 'chapter'): 2, ('subsubsection', 'section'): 2, ('subsubsection', 'chapter'): 3, } INCLUDED_LEVELS = ("chapter", "section", "subsection", "subsubsection") def parse_toc(fp, bigpart=None): toc = top = [] stack = [toc] level = bigpart or 'chapter' lineno = 0 while 1: line = fp.readline() if not line: break lineno = lineno + 1 m = cline_rx.match(line) if m: stype, snum, title, pageno = m.group(1, 2, 3, 4) title = clean_title(title) entry = (stype, snum, title, int(pageno), []) if stype == level: toc.append(entry) else: if stype not in INCLUDED_LEVELS: # we don't want paragraphs & subparagraphs continue direction = _transition_map[(level, stype)] if direction == OUTER_TO_INNER: toc = toc[-1][-1] stack.insert(0, toc) toc.append(entry) else: for i in range(direction): del stack[0] toc = stack[0] toc.append(entry) level = stype else: sys.stderr.write("l.%s: " + line) return top hackscore_rx = re.compile(r"\\hackscore\s*{[^}]*}") raisebox_rx = re.compile(r"\\raisebox\s*{[^}]*}") title_rx = re.compile(r"\\([a-zA-Z])+\s+") title_trans = string.maketrans("", "") def clean_title(title): title = raisebox_rx.sub("", title) title = hackscore_rx.sub(r"\\_", title) pos = 0 while 1: m = title_rx.search(title, pos) if m: start = m.start() if title[start:start+15] != "\\textunderscore": title = title[:start] + title[m.end():] pos = start + 1 else: break title = title.translate(title_trans, "{}") return title def write_toc(toc, fp): for entry in toc: write_toc_entry(entry, fp, 0) def write_toc_entry(entry, fp, layer): stype, snum, title, pageno, toc = entry s = "\\pdfoutline goto name{page%03d}" % pageno if toc: s = "%s count -%d" % (s, len(toc)) if snum: title = "%s %s" % (snum, title) s = "%s {%s}\n" % (s, title) fp.write(s) for entry in toc: write_toc_entry(entry, fp, layer + 1) def process(ifn, ofn, bigpart=None): toc = parse_toc(open(ifn), bigpart) write_toc(toc, open(ofn, "w")) def main(): bigpart = None opts, args = getopt.getopt(sys.argv[1:], "c:") if opts: bigpart = opts[0][1] if not args: usage() sys.exit(2) for filename in args: base, ext = os.path.splitext(filename) ext = ext or ".toc" process(base + ext, base + ".bkm", bigpart) if __name__ == "__main__": main() pydb-1.26/Doc/tools/patchlevel.h0000644000175000017500000000253710610456675013507 00000000000000 /* Newfangled version identification scheme. This scheme was added in Python 1.5.2b2; before that time, only PATCHLEVEL was available. To test for presence of the scheme, test for defined(PY_MAJOR_VERSION). When the major or minor version changes, the VERSION variable in configure.in must also be changed. There is also (independent) API version information in modsupport.h. */ /* Values for PY_RELEASE_LEVEL */ #define PY_RELEASE_LEVEL_ALPHA 0xA #define PY_RELEASE_LEVEL_BETA 0xB #define PY_RELEASE_LEVEL_GAMMA 0xC /* For release candidates */ #define PY_RELEASE_LEVEL_FINAL 0xF /* Serial should be 0 here */ /* Higher for patch releases */ /* Version parsed out into numeric values */ #define PY_MAJOR_VERSION 2 #define PY_MINOR_VERSION 5 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA #define PY_RELEASE_SERIAL 0 /* Version as a string */ #define PY_VERSION "pydb" /* Subversion Revision number of this file (not of the repository) */ #define PY_PATCHLEVEL_REVISION "$Revision: 1.3 $" /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ #define PY_VERSION_HEX ((PY_MAJOR_VERSION << 24) | \ (PY_MINOR_VERSION << 16) | \ (PY_MICRO_VERSION << 8) | \ (PY_RELEASE_LEVEL << 4) | \ (PY_RELEASE_SERIAL << 0)) pydb-1.26/Doc/tools/mkhowto0000555000175000017500000005631210366674152012623 00000000000000#! /usr/bin/env python # -*- Python -*- """usage: %(program)s [options...] file ... Options specifying formats to build: --html HyperText Markup Language (default) --pdf Portable Document Format --ps PostScript --dvi 'DeVice Indepentent' format from TeX --text ASCII text (requires lynx) More than one output format may be specified, or --all. HTML options: --address, -a Specify an address for page footers. --dir Specify the directory for HTML output. --link Specify the number of levels to include on each page. --split, -s Specify a section level for page splitting, default: %(max_split_depth)s. --iconserver, -i Specify location of icons (default: ./). --image-type Specify the image type to use in HTML output; values: gif, png (default). --numeric Don't rename the HTML files; just keep node#.html for the filenames. --style Specify the CSS file to use for the output (filename, not a URL). --up-link URL to a parent document. --up-title Title of a parent document. --favicon Icon to display in the browsers location bar. Other options: --a4 Format for A4 paper. --letter Format for US letter paper (the default). --help, -H Show this text. --logging, -l Log stdout and stderr to a file (*.how). --debugging, -D Echo commands as they are executed. --keep, -k Keep temporary files around. --quiet, -q Do not print command output to stdout. (stderr is also lost, sorry; see *.how for errors) """ import getopt import glob import os import re import shutil import sys MYDIR = os.path.abspath(sys.path[0]) TOPDIR = os.path.dirname(MYDIR) ISTFILE = os.path.join(TOPDIR, "texinputs", "python.ist") NODE2LABEL_SCRIPT = os.path.join(MYDIR, "node2label.pl") L2H_INIT_FILE = os.path.join(TOPDIR, "perl", "l2hinit.perl") BIBTEX_BINARY = "bibtex" DVIPS_BINARY = "dvips" LATEX_BINARY = "latex" LATEX2HTML_BINARY = "latex2html" LYNX_BINARY = "lynx" MAKEINDEX_BINARY = "makeindex" PDFLATEX_BINARY = "pdflatex" PERL_BINARY = "perl" PYTHON_BINARY = "python" def usage(options, file): print >>file, __doc__ % options def error(options, message, err=2): print >>sys.stderr, message print >>sys.stderr usage(options, sys.stderr) sys.exit(2) class Options: program = os.path.basename(sys.argv[0]) # address = '' builddir = None debugging = 0 discard_temps = 1 have_temps = 0 icon_server = "." image_type = "png" logging = 0 max_link_depth = 3 max_split_depth = 6 paper = "letter" quiet = 0 runs = 0 numeric = 0 global_module_index = None style_file = os.path.join(TOPDIR, "html", "style.css") about_file = os.path.join(TOPDIR, "html", "about.dat") up_link = None up_title = None favicon = None # # 'dvips_safe' is a weird option. It is used mostly to make # LaTeX2HTML not try to be too smart about protecting the user # from a bad version of dvips -- some versions would core dump if # the path to the source DVI contained a dot, and it's appearantly # difficult to determine if the version available has that bug. # This option gets set when PostScript output is requested # (because we're going to run dvips regardless, and we'll either # know it succeeds before LaTeX2HTML is run, or we'll have # detected the failure and bailed), or the user asserts that it's # safe from the command line. # # So, why does LaTeX2HTML think it appropriate to protect the user # from a dvips that's only potentially going to core dump? Only # because they want to avoid doing a lot of work just to have to # bail later with no useful intermediates. Unfortunately, they # bail *before* they know whether dvips will be needed at all. # I've gone around the bush a few times with the LaTeX2HTML # developers over whether this is appropriate behavior, and they # don't seem interested in changing their position. # dvips_safe = 0 # DEFAULT_FORMATS = ("html",) ALL_FORMATS = ("dvi", "html", "pdf", "ps", "text") def __init__(self): self.formats = [] self.l2h_init_files = [] def __getitem__(self, key): # This is used when formatting the usage message. try: return getattr(self, key) except AttributeError: raise KeyError, key def parse(self, args): opts, args = getopt.getopt(args, "Hi:a:s:lDkqr:", ["all", "postscript", "help", "iconserver=", "address=", "a4", "letter", "l2h-init=", "link=", "split=", "logging", "debugging", "keep", "quiet", "runs=", "image-type=", "about=", "numeric", "style=", "paper=", "up-link=", "up-title=", "dir=", "global-module-index=", "dvips-safe", "favicon="] + list(self.ALL_FORMATS)) for opt, arg in opts: if opt == "--all": self.formats = list(self.ALL_FORMATS) self.dvips_safe = "ps" in self.formats elif opt in ("-H", "--help"): usage(self, sys.stdout) sys.exit() elif opt == "--iconserver": self.icon_server = arg elif opt in ("-a", "--address"): self.address = arg elif opt == "--a4": self.paper = "a4" elif opt == "--letter": self.paper = "letter" elif opt == "--link": self.max_link_depth = int(arg) elif opt in ("-s", "--split"): self.max_split_depth = int(arg) elif opt in ("-l", "--logging"): self.logging = self.logging + 1 elif opt in ("-D", "--debugging"): self.debugging = self.debugging + 1 elif opt in ("-k", "--keep"): self.discard_temps = 0 elif opt in ("-q", "--quiet"): self.quiet = 1 elif opt in ("-r", "--runs"): self.runs = int(arg) elif opt == "--image-type": self.image_type = arg elif opt == "--about": # always make this absolute: self.about_file = os.path.normpath( os.path.abspath(arg)) elif opt == "--numeric": self.numeric = 1 elif opt == "--style": self.style_file = os.path.abspath(arg) elif opt == "--l2h-init": self.l2h_init_files.append(os.path.abspath(arg)) elif opt == "--favicon": self.favicon = arg elif opt == "--up-link": self.up_link = arg elif opt == "--up-title": self.up_title = arg elif opt == "--global-module-index": self.global_module_index = arg elif opt == "--dir": if os.sep == "\\": arg = re.sub("/", "\\\\", arg) self.builddir = os.path.expanduser(arg) elif opt == "--paper": self.paper = arg elif opt == "--dvips-safe": self.dvips_safe = 1 # # Format specifiers: # elif opt[2:] in self.ALL_FORMATS: self.add_format(opt[2:]) elif opt == "--postscript": # synonym for --ps self.add_format("ps") self.initialize() # # return the args to allow the caller access: # return args def add_format(self, format): """Add a format to the formats list if not present.""" if not format in self.formats: if format == "ps": # assume this is safe since we're going to run it anyway self.dvips_safe = 1 self.formats.append(format) def initialize(self): """Complete initialization. This is needed if parse() isn't used.""" # add the default format if no formats were specified: if not self.formats: self.formats = self.DEFAULT_FORMATS # determine the base set of texinputs directories: texinputs = os.environ.get("TEXINPUTS", "").split(os.pathsep) if not texinputs: texinputs = [''] mydirs = [os.path.join(TOPDIR, "paper-" + self.paper), os.path.join(TOPDIR, "texinputs"), ] if '' in texinputs: i = texinputs.index('') texinputs[i:i] = mydirs else: texinputs += mydirs self.base_texinputs = texinputs if self.builddir: self.builddir = os.path.abspath(self.builddir) class Job: latex_runs = 0 def __init__(self, options, path): self.options = options self.doctype = get_doctype(path) self.filedir, self.doc = split_pathname(path) self.builddir = os.path.abspath(options.builddir or self.doc) if ("html" in options.formats or "text" in options.formats): if not os.path.exists(self.builddir): os.mkdir(self.builddir) self.log_filename = os.path.join(self.builddir, self.doc + ".how") else: self.log_filename = os.path.abspath(self.doc + ".how") if os.path.exists(self.log_filename): os.unlink(self.log_filename) l2hconf = self.doc + ".l2h" if os.path.exists(l2hconf): if os.path.exists(l2hconf + "~"): os.unlink(l2hconf + "~") os.rename(l2hconf, l2hconf + "~") self.l2h_aux_init_file = self.doc + ".l2h" self.write_l2h_aux_init_file() def build(self): self.setup_texinputs() formats = self.options.formats if "dvi" in formats or "ps" in formats: self.build_dvi() if "pdf" in formats: self.build_pdf() if "ps" in formats: self.build_ps() if "html" in formats: self.require_temps() self.build_html(self.builddir) if self.options.icon_server == ".": pattern = os.path.join(TOPDIR, "html", "icons", "*." + self.options.image_type) imgs = glob.glob(pattern) if not imgs: self.warning( "Could not locate support images of type %s." % `self.options.image_type`) for fn in imgs: new_fn = os.path.join(self.builddir, os.path.basename(fn)) shutil.copyfile(fn, new_fn) if "text" in formats: self.require_temps() tempdir = self.doc need_html = "html" not in formats if self.options.max_split_depth != 1: fp = open(self.l2h_aux_init_file, "a") fp.write("# re-hack this file for --text:\n") l2hoption(fp, "MAX_SPLIT_DEPTH", "1") fp.write("1;\n") fp.close() tempdir = self.doc + "-temp-html" need_html = 1 if need_html: self.build_html(tempdir, max_split_depth=1) self.build_text(tempdir) if self.options.discard_temps: self.cleanup() def setup_texinputs(self): texinputs = [self.filedir] + self.options.base_texinputs os.environ["TEXINPUTS"] = os.pathsep.join(texinputs) self.message("TEXINPUTS=" + os.environ["TEXINPUTS"]) def build_aux(self, binary=None): if binary is None: binary = LATEX_BINARY new_index( "%s.ind" % self.doc, "genindex") new_index("mod%s.ind" % self.doc, "modindex") self.run("%s %s" % (binary, self.doc)) self.use_bibtex = check_for_bibtex(self.doc + ".aux") self.latex_runs = 1 def build_dvi(self): self.use_latex(LATEX_BINARY) def build_pdf(self): self.use_latex(PDFLATEX_BINARY) def use_latex(self, binary): self.require_temps(binary=binary) if self.latex_runs < 2: if os.path.isfile("mod%s.idx" % self.doc): self.run("%s mod%s.idx" % (MAKEINDEX_BINARY, self.doc)) use_indfix = 0 if os.path.isfile(self.doc + ".idx"): use_indfix = 1 # call to Doc/tools/fix_hack omitted; doesn't appear necessary self.run("%s %s.idx" % (MAKEINDEX_BINARY, self.doc)) import indfix indfix.process(self.doc + ".ind") if self.use_bibtex: self.run("%s %s" % (BIBTEX_BINARY, self.doc)) self.process_synopsis_files() self.run("%s %s" % (binary, self.doc)) self.latex_runs = self.latex_runs + 1 if os.path.isfile("mod%s.idx" % self.doc): self.run("%s -s %s mod%s.idx" % (MAKEINDEX_BINARY, ISTFILE, self.doc)) if use_indfix: self.run("%s -s %s %s.idx" % (MAKEINDEX_BINARY, ISTFILE, self.doc)) indfix.process(self.doc + ".ind") self.process_synopsis_files() # # and now finish it off: # if os.path.isfile(self.doc + ".toc") and binary == PDFLATEX_BINARY: import toc2bkm if self.doctype == "manual": bigpart = "chapter" else: bigpart = "section" toc2bkm.process(self.doc + ".toc", self.doc + ".bkm", bigpart) if self.use_bibtex: self.run("%s %s" % (BIBTEX_BINARY, self.doc)) self.run("%s %s" % (binary, self.doc)) self.latex_runs = self.latex_runs + 1 def process_synopsis_files(self): synopsis_files = glob.glob(self.doc + "*.syn") for path in synopsis_files: uniqify_module_table(path) def build_ps(self): self.run("%s -N0 -o %s.ps %s" % (DVIPS_BINARY, self.doc, self.doc)) def build_html(self, builddir, max_split_depth=None): if max_split_depth is None: max_split_depth = self.options.max_split_depth texfile = None for p in os.environ["TEXINPUTS"].split(os.pathsep): fn = os.path.join(p, self.doc + ".tex") if os.path.isfile(fn): texfile = fn break if not texfile: self.warning("Could not locate %s.tex; aborting." % self.doc) sys.exit(1) # remove leading ./ (or equiv.); might avoid problems w/ dvips if texfile[:2] == os.curdir + os.sep: texfile = texfile[2:] # build the command line and run LaTeX2HTML: if not os.path.isdir(builddir): os.mkdir(builddir) else: for fname in glob.glob(os.path.join(builddir, "*.html")): os.unlink(fname) args = [LATEX2HTML_BINARY, "-init_file", self.l2h_aux_init_file, "-dir", builddir, texfile ] self.run(" ".join(args)) # XXX need quoting! # ... postprocess shutil.copyfile(self.options.style_file, os.path.join(builddir, self.doc + ".css")) shutil.copyfile(os.path.join(builddir, self.doc + ".html"), os.path.join(builddir, "index.html")) if max_split_depth != 1: label_file = os.path.join(builddir, "labels.pl") fp = open(label_file) about_node = None target = " = q/about/;\n" x = len(target) while 1: line = fp.readline() if not line: break if line[-x:] == target: line = fp.readline() m = re.search(r"\|(node\d+\.[a-z]+)\|", line) about_node = m.group(1) shutil.copyfile(os.path.join(builddir, about_node), os.path.join(builddir, "about.html")) break if not self.options.numeric: pwd = os.getcwd() try: os.chdir(builddir) self.run("%s %s *.html" % (PERL_BINARY, NODE2LABEL_SCRIPT)) finally: os.chdir(pwd) # These files need to be cleaned up here since builddir there # can be more than one, so we clean each of them. if self.options.discard_temps: for fn in ("images.tex", "images.log", "images.aux"): safe_unlink(os.path.join(builddir, fn)) def build_text(self, tempdir=None): if tempdir is None: tempdir = self.doc indexfile = os.path.join(tempdir, "index.html") self.run("%s -nolist -dump %s >%s.txt" % (LYNX_BINARY, indexfile, self.doc)) def require_temps(self, binary=None): if not self.latex_runs: self.build_aux(binary=binary) def write_l2h_aux_init_file(self): options = self.options fp = open(self.l2h_aux_init_file, "w") d = string_to_perl(os.path.dirname(L2H_INIT_FILE)) fp.write("package main;\n" "push (@INC, '%s');\n" "$mydir = '%s';\n" % (d, d)) fp.write(open(L2H_INIT_FILE).read()) for filename in options.l2h_init_files: fp.write("\n# initialization code incorporated from:\n# ") fp.write(filename) fp.write("\n") fp.write(open(filename).read()) fp.write("\n" "# auxillary init file for latex2html\n" "# generated by mkhowto\n" "$NO_AUTO_LINK = 1;\n" ) l2hoption(fp, "ABOUT_FILE", options.about_file) l2hoption(fp, "ICONSERVER", options.icon_server) l2hoption(fp, "IMAGE_TYPE", options.image_type) l2hoption(fp, "ADDRESS", options.address) l2hoption(fp, "MAX_LINK_DEPTH", options.max_link_depth) l2hoption(fp, "MAX_SPLIT_DEPTH", options.max_split_depth) l2hoption(fp, "EXTERNAL_UP_LINK", options.up_link) l2hoption(fp, "EXTERNAL_UP_TITLE", options.up_title) l2hoption(fp, "FAVORITES_ICON", options.favicon) l2hoption(fp, "GLOBAL_MODULE_INDEX", options.global_module_index) l2hoption(fp, "DVIPS_SAFE", options.dvips_safe) fp.write("1;\n") fp.close() def cleanup(self): self.__have_temps = 0 for pattern in ("%s.aux", "%s.log", "%s.out", "%s.toc", "%s.bkm", "%s.idx", "%s.ilg", "%s.ind", "%s.pla", "%s.bbl", "%s.blg", "mod%s.idx", "mod%s.ind", "mod%s.ilg", ): safe_unlink(pattern % self.doc) map(safe_unlink, glob.glob(self.doc + "*.syn")) for spec in ("IMG*", "*.pl", "WARNINGS", "index.dat", "modindex.dat"): pattern = os.path.join(self.doc, spec) map(safe_unlink, glob.glob(pattern)) if "dvi" not in self.options.formats: safe_unlink(self.doc + ".dvi") if os.path.isdir(self.doc + "-temp-html"): shutil.rmtree(self.doc + "-temp-html", ignore_errors=1) if not self.options.logging: os.unlink(self.log_filename) if not self.options.debugging: os.unlink(self.l2h_aux_init_file) def run(self, command): self.message(command) if sys.platform.startswith("win"): rc = os.system(command) else: rc = os.system("(%s) >%s 2>&1" % (command, self.log_filename)) if rc: self.warning( "Session transcript and error messages are in %s." % self.log_filename) result = 1 if hasattr(os, "WIFEXITED"): if os.WIFEXITED(rc): result = os.WEXITSTATUS(rc) self.warning("Exited with status %s." % result) else: self.warning("Killed by signal %s." % os.WSTOPSIG(rc)) else: self.warning("Return code: %s" % rc) sys.stderr.write("The relevant lines from the transcript are:\n") sys.stderr.write("-" * 72 + "\n") sys.stderr.writelines(get_run_transcript(self.log_filename)) sys.exit(result) def message(self, msg): msg = "+++ " + msg if not self.options.quiet: print msg self.log(msg + "\n") def warning(self, msg): msg = "*** %s\n" % msg sys.stderr.write(msg) self.log(msg) def log(self, msg): fp = open(self.log_filename, "a") fp.write(msg) fp.close() def get_run_transcript(filename): """Return lines from the transcript file for the most recent run() call.""" fp = open(filename) lines = fp.readlines() fp.close() lines.reverse() L = [] for line in lines: L.append(line) if line[:4] == "+++ ": break L.reverse() return L def safe_unlink(path): """Unlink a file without raising an error if it doesn't exist.""" try: os.unlink(path) except os.error: pass def split_pathname(path): path = os.path.abspath(path) dirname, basename = os.path.split(path) if basename[-4:] == ".tex": basename = basename[:-4] return dirname, basename _doctype_rx = re.compile(r"\\documentclass(?:\[[^]]*\])?{([a-zA-Z]*)}") def get_doctype(path): fp = open(path) doctype = None while 1: line = fp.readline() if not line: break m = _doctype_rx.match(line) if m: doctype = m.group(1) break fp.close() return doctype def main(): options = Options() try: args = options.parse(sys.argv[1:]) except getopt.error, msg: error(options, msg) if not args: # attempt to locate single .tex file in current directory: args = glob.glob("*.tex") if not args: error(options, "No file to process.") if len(args) > 1: error(options, "Could not deduce which files should be processed.") # # parameters are processed, let's go! # for path in args: Job(options, path).build() def l2hoption(fp, option, value): if value: fp.write('$%s = "%s";\n' % (option, string_to_perl(str(value)))) _to_perl = {} for c in map(chr, range(1, 256)): _to_perl[c] = c _to_perl["@"] = "\\@" _to_perl["$"] = "\\$" _to_perl['"'] = '\\"' def string_to_perl(s): return ''.join(map(_to_perl.get, s)) def check_for_bibtex(filename): fp = open(filename) pos = fp.read().find(r"\bibdata{") fp.close() return pos >= 0 def uniqify_module_table(filename): lines = open(filename).readlines() if len(lines) > 1: if lines[-1] == lines[-2]: del lines[-1] open(filename, "w").writelines(lines) def new_index(filename, label="genindex"): fp = open(filename, "w") fp.write(r"""\ \begin{theindex} \label{%s} \end{theindex} """ % label) fp.close() if __name__ == "__main__": main() pydb-1.26/Doc/tools/getversioninfo0000775000175000017500000000303010366630263014160 00000000000000#! /usr/bin/env python import os import re import sys try: __file__ except NameError: __file__ = sys.argv[0] tools = os.path.dirname(os.path.abspath(__file__)) Doc = os.path.dirname(tools) src = os.path.dirname(Doc) patchlevel_h = os.path.join(Doc, "tools", "patchlevel.h") # This won't pick out all #defines, but it will pick up the ones we # care about. rx = re.compile(r"\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)") d = {} f = open(patchlevel_h) for line in f: m = rx.match(line) if m is not None: name, value = m.group(1, 2) d[name] = value f.close() release = "%s.%s" % (d["PY_MAJOR_VERSION"], d["PY_MINOR_VERSION"]) micro = int(d["PY_MICRO_VERSION"]) shortversion = release if micro != 0: release += "." + str(micro) level = d["PY_RELEASE_LEVEL"] releaseinfo = "pydb" def write_file(name, text): """Write text to a file if the file doesn't exist or if text differs from any existing content.""" if os.path.exists(name): f = open(name, "r") s = f.read() f.close() if s == text: return f = open(name, "w") f.write(text) f.close() patchlevel_tex = os.path.join(Doc, "commontex", "patchlevel.tex") write_file(patchlevel_tex, "%% This file is generated by ../tools/getversioninfo;\n" "%% do not edit manually.\n" "\n" "\\release{%s}\n" "\\setreleaseinfo{%s}\n" "\\setshortversion{%s}\n" % (release, releaseinfo, shortversion)) print release + releaseinfo pydb-1.26/Doc/tools/node2label.pl0000775000175000017500000000362610366627076013563 00000000000000#! /usr/bin/env perl # On Cygwin, we actually have to generate a temporary file when doing # the inplace edit, or we'll get permission errors. Not sure who's # bug this is, except that it isn't ours. To deal with this, we # generate backups during the edit phase and remove them at the end. # use English; $INPLACE_EDIT = '.bak'; # read the labels, then reverse the mappings require "labels.pl"; %nodes = (); my $key; # sort so that we get a consistent assignment for nodes with multiple labels foreach $label (sort keys %external_labels) { # # If the label can't be used as a filename on non-Unix platforms, # skip it. Such labels may be used internally within the documentation, # but will never be used for filename generation. # if ($label =~ /^([-.a-zA-Z0-9]+)$/) { $key = $external_labels{$label}; $key =~ s|^/||; $nodes{$key} = $label; } } # This adds the "internal" labels added for indexing. These labels will not # be used for file names. require "intlabels.pl"; foreach $label (keys %internal_labels) { $key = $internal_labels{$label}; $key =~ s|^/||; if (defined($nodes{$key})) { $nodes{$label} = $nodes{$key}; } } # collect labels that have been used %newnames = (); while (<>) { # don't want to do one s/// per line per node # so look for lines with hrefs, then do s/// on nodes present if (/(HREF|href)=[\"\']node\d+\.html[\#\"\']/) { @parts = split(/(HREF|href)\=[\"\']/); shift @parts; for $node (@parts) { $node =~ s/[\#\"\'].*$//g; chomp($node); if (defined($nodes{$node})) { $label = $nodes{$node}; if (s/(HREF|href)=([\"\'])$node([\#\"\'])/href=$2$label.html$3/g) { s/(HREF|href)=([\"\'])$label.html/href=$2$label.html/g; $newnames{$node} = "$label.html"; } } } } print; } foreach $oldname (keys %newnames) { rename($oldname, $newnames{$oldname}); } foreach $filename (glob('*.bak')) { unlink($filename); } pydb-1.26/Doc/info/0000777000175000017500000000000011167772525011062 500000000000000pydb-1.26/Doc/info/Makefile0000644000175000017500000000214210572712613012424 00000000000000# Generate the Python "info" documentation. TOPDIR=.. TOOLSDIR=$(TOPDIR)/tools HTMLDIR=$(TOPDIR)/html # The emacs binary used to build the info docs. GNU Emacs 21 is required. EMACS=emacs MKINFO=$(TOOLSDIR)/mkinfo SCRIPTS=$(TOOLSDIR)/checkargs.pm $(TOOLSDIR)/mkinfo $(TOOLSDIR)/py2texi.el # set VERSION to code the VERSION number into the info file name # allowing installation of more than one set of python info docs # into the same directory VERSION= all: check-emacs-version \ lib # doc inst lib: python$(VERSION)-lib.info whatsnew: $(WHATSNEW) $(WHATSNEW): python$(VERSION)-$(WHATSNEW).info check-emacs-version: @v="`$(EMACS) --version 2>&1 | egrep '^(GNU |X)Emacs [12]*'`"; \ if `echo "$$v" | egrep '^GNU Emacs 2[1-3]' >/dev/null 2>&1`; then \ echo "Using $(EMACS) to build the info docs"; \ else \ echo "GNU Emacs 21 or greater is required to build the info docs"; \ echo "Found $$v"; \ false; \ fi python$(VERSION)-lib.info: ../lib/lib.tex $(SCRIPTS) EMACS=$(EMACS) $(MKINFO) $< $*.texi $@ clean: rm -f *.texi~ *.texi clobber: clean rm -f *.texi python*-*.info python*-*.info-[0-9]* pydb-1.26/Doc/texinputs/0000777000175000017500000000000011167772525012172 500000000000000pydb-1.26/Doc/texinputs/manual.cls0000664000175000017500000001060110366627251014061 00000000000000% % manual.cls for the Python documentation % \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{manual} [1998/03/03 Document class (Python manual)] \RequirePackage{pypaper} \RequirePackage{fancybox} % Change the options here to get a different set of basic options, but only % if you have to. Paper and font size should be adjusted in pypaper.sty. % \LoadClass[\py@paper,\py@ptsize,twoside,openright]{report} \setcounter{secnumdepth}{2} % Optional packages: % % If processing of these documents fails at your TeX installation, % these may be commented out (independently) to make things work. % These are both supplied with the current version of the teTeX % distribution. % % The "fancyhdr" package makes nicer page footers reasonable to % implement, and is used to put the chapter and section information in % the footers. % \RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.} % Required packages: % % The "fncychap" package is used to get the nice chapter headers. The % .sty file is distributed with Python, so you should not need to disable % it. You'd also end up with a mixed page style; uglier than stock LaTeX! % \RequirePackage[Bjarne]{fncychap}\typeout{Using fancy chapter headings.} % Do horizontal rules it this way to match: \newcommand{\py@doHorizontalRule}{\mghrulefill{\RW}} % % % This gives us all the Python-specific markup that we really want. % This should come last. Do not change this. % \RequirePackage{python} % support for module synopsis sections: \newcommand{\py@ModSynopsisFilename}{\jobname\thechapter.syn} \let\py@OldChapter=\chapter \renewcommand{\chapter}{ \py@ProcessModSynopsis \py@closeModSynopsisFile \py@OldChapter } % Change the title page to look a bit better, and fit in with the % fncychap ``Bjarne'' style a bit better. % \renewcommand{\maketitle}{% \begin{titlepage}% \let\footnotesize\small \let\footnoterule\relax \py@doHorizontalRule% \ifpdf \begingroup % This \def is required to deal with multi-line authors; it % changes \\ to ', ' (comma-space), making it pass muster for % generating document info in the PDF file. \def\\{, } \pdfinfo{ /Author (\@author) /Title (\@title) } \endgroup \fi \begin{flushright}% {\rm\Huge\py@HeaderFamily \@title \par}% {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par} \vfill {\LARGE\py@HeaderFamily \@author \par} \vfill\vfill {\large \@date \par \vfill \py@authoraddress \par }% \end{flushright}%\par \@thanks \end{titlepage}% \setcounter{footnote}{0}% \let\thanks\relax\let\maketitle\relax \gdef\@thanks{}\gdef\@author{}\gdef\@title{} } % Catch the end of the {abstract} environment, but here make sure the % abstract is followed by a blank page if the 'openright' option is used. % \let\py@OldEndAbstract=\endabstract \renewcommand{\endabstract}{ \if@openright \ifodd\value{page} \typeout{Adding blank page after the abstract.} \vfil\pagebreak \fi \fi \py@OldEndAbstract } % This wraps the \tableofcontents macro with all the magic to get the % spacing right and have the right number of pages if the 'openright' % option has been used. This eliminates a fair amount of crud in the % individual document files. % \let\py@OldTableofcontents=\tableofcontents \renewcommand{\tableofcontents}{% \setcounter{page}{1}% \pagebreak% \pagestyle{plain}% {% \parskip = 0mm% \py@OldTableofcontents% \if@openright% \ifodd\value{page}% \typeout{Adding blank page after the table of contents.}% \pagebreak\hspace{0pt}% \fi% \fi% \cleardoublepage% }% \pagenumbering{arabic}% \@ifundefined{fancyhf}{}{\pagestyle{normal}}% \py@doing@page@targetstrue% } % This is needed to get the width of the section # area wide enough in the % library reference. Doing it here keeps it the same for all the manuals. % \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}} \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}} \setcounter{tocdepth}{1} % Fix the theindex environment to add an entry to the Table of % Contents; this is much nicer than just having to jump to the end of % the book and flip around, especially with multiple indexes. % \let\py@OldTheindex=\theindex \renewcommand{\theindex}{ \cleardoublepage \py@OldTheindex \addcontentsline{toc}{chapter}{\indexname} } pydb-1.26/Doc/texinputs/pypaper.sty0000664000175000017500000000112510366627327014327 00000000000000% % Change this to say a4paper instead of letterpaper if you want A4. These % are the latex defaults. % \newcommand{\py@paper}{letterpaper} \newcommand{\py@ptsize}{10pt} % These set up the fonts for the documents. % % The "times" package makes the default font the PostScript Times % font, which makes for smaller PostScript and a font that more people % like. % % The "avant" package causes the AvantGarde font to be used for % sans-serif text, instead of the uglier Helvetica set up by the "times" % package. % \RequirePackage{times}\typeout{Using Times instead of Computer Modern.} pydb-1.26/Doc/texinputs/fncychap.sty0000664000175000017500000002416710366627366014460 00000000000000%%% Derived from the original fncychap.sty, %%% but changed ``TWELV'' to ``TWELVE''. %%% Copyright Ulf A. Lindgren %%% Department of Applied Electronics %%% Chalmers University of Technology %%% S-412 96 Gothenburg, Sweden %%% E-mail lindgren@ae.chalmers.se %%% %%% Note Permission is granted to modify this file under %%% the condition that it is saved using another %%% file and package name. %%% %%% Revision 1.1 %%% %%% Jan. 8th Modified package name base date option %%% Jan. 22th Modified FmN and FmTi for error in book.cls %%% \MakeUppercase{#}->{\MakeUppercase#} %%% Apr. 6th Modified Lenny option to prevent undesired %%% skip of line. %%% Nov. 8th Fixed \@chapapp for AMS %%% Feb. 11th Fixed appendix problem related to Bjarne %%% Last modified Feb. 11th 1998 \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesPackage{fncychap} [1997/04/06 v1.11 LaTeX package (Revised chapters)] %%%% DEFINITION OF Chapapp variables \newcommand{\CNV}{\huge\bfseries} \newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}} %%%% DEFINITION OF TheChapter variables \newcommand{\CNoV}{\huge\bfseries} \newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}} \newif\ifUCN \UCNfalse \newif\ifLCN \LCNfalse \def\ChNameLowerCase{\LCNtrue\UCNfalse} \def\ChNameUpperCase{\UCNtrue\LCNfalse} \def\ChNameAsIs{\UCNfalse\LCNfalse} %%%%% Fix for AMSBook 971008 \@ifundefined{@chapapp}{\let\@chapapp\chaptername}{} %%%%% Fix for Bjarne and appendix 980211 \newif\ifinapp \inappfalse \renewcommand\appendix{\par \setcounter{chapter}{0}% \setcounter{section}{0}% \inapptrue% \renewcommand\@chapapp{\appendixname}% \renewcommand\thechapter{\@Alph\c@chapter}} %%%%% \newcommand{\FmN}[1]{% \ifUCN {\MakeUppercase#1}\LCNfalse \else \ifLCN {\MakeLowercase#1}\UCNfalse \else #1 \fi \fi} %%%% DEFINITION OF Title variables \newcommand{\CTV}{\Huge\bfseries} \newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}} %%%% DEFINITION OF the basic rule width \newlength{\RW} \setlength{\RW}{1pt} \newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}} \newif\ifUCT \UCTfalse \newif\ifLCT \LCTfalse \def\ChTitleLowerCase{\LCTtrue\UCTfalse} \def\ChTitleUpperCase{\UCTtrue\LCTfalse} \def\ChTitleAsIs{\UCTfalse\LCTfalse} \newcommand{\FmTi}[1]{% \ifUCT {\MakeUppercase#1}\LCTfalse \else \ifLCT {\MakeLowercase#1}\UCTfalse \else #1 \fi \fi} \newlength{\mylen} \newlength{\myhi} \newlength{\px} \newlength{\py} \newlength{\pyy} \newlength{\pxx} \def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@} \newcommand{\DOCH}{% \CNV\FmN{\@chapapp}\space \CNoV\thechapter \par\nobreak \vskip 20\p@ } \newcommand{\DOTI}[1]{% \CTV\FmTi{#1}\par\nobreak \vskip 40\p@ } \newcommand{\DOTIS}[1]{% \CTV\FmTi{#1}\par\nobreak \vskip 40\p@ } %%%%%% SONNY DEF \DeclareOption{Sonny}{% \ChNameVar{\Large\sf} \ChNumVar{\Huge} \ChTitleVar{\Large\sf} \ChRuleWidth{0.5pt} \ChNameUpperCase \renewcommand{\DOCH}{% \raggedleft \CNV\FmN{\@chapapp}\space \CNoV\thechapter \par\nobreak \vskip 40\p@} \renewcommand{\DOTI}[1]{% \CTV\raggedleft\mghrulefill{\RW}\par\nobreak \vskip 5\p@ \CTV\FmTi{#1}\par\nobreak \mghrulefill{\RW}\par\nobreak \vskip 40\p@} \renewcommand{\DOTIS}[1]{% \CTV\raggedleft\mghrulefill{\RW}\par\nobreak \vskip 5\p@ \CTV\FmTi{#1}\par\nobreak \mghrulefill{\RW}\par\nobreak \vskip 40\p@} } %%%%%% LENNY DEF \DeclareOption{Lenny}{% \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont} \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont} \ChTitleVar{\Huge\bfseries\rm} \ChRuleWidth{1pt} \renewcommand{\DOCH}{% \settowidth{\px}{\CNV\FmN{\@chapapp}} \addtolength{\px}{2pt} \settoheight{\py}{\CNV\FmN{\@chapapp}} \addtolength{\py}{1pt} \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter} \addtolength{\mylen}{1pt} \settowidth{\pxx}{\CNoV\thechapter} \addtolength{\pxx}{-1pt} \settoheight{\pyy}{\CNoV\thechapter} \addtolength{\pyy}{-2pt} \setlength{\myhi}{\pyy} \addtolength{\myhi}{-1\py} \par \parbox[b]{\textwidth}{% \rule[\py]{\RW}{\myhi}% \hskip -\RW% \rule[\pyy]{\px}{\RW}% \hskip -\px% \raggedright% \CNV\FmN{\@chapapp}\space\CNoV\thechapter% \hskip1pt% \mghrulefill{\RW}% \rule{\RW}{\pyy}\par\nobreak% \vskip -\baselineskip% \vskip -\pyy% \hskip \mylen% \mghrulefill{\RW}\par\nobreak% \vskip \pyy}% \vskip 20\p@} \renewcommand{\DOTI}[1]{% \raggedright \CTV\FmTi{#1}\par\nobreak \vskip 40\p@} \renewcommand{\DOTIS}[1]{% \raggedright \CTV\FmTi{#1}\par\nobreak \vskip 40\p@} } %%%%%%% GLENN DEF \DeclareOption{Glenn}{% \ChNameVar{\bfseries\Large\sf} \ChNumVar{\Huge} \ChTitleVar{\bfseries\Large\rm} \ChRuleWidth{1pt} \ChNameUpperCase \ChTitleUpperCase \renewcommand{\DOCH}{% \settoheight{\myhi}{\CTV\FmTi{Test}} \setlength{\py}{\baselineskip} \addtolength{\py}{\RW} \addtolength{\py}{\myhi} \setlength{\pyy}{\py} \addtolength{\pyy}{-1\RW} \raggedright \CNV\FmN{\@chapapp}\space\CNoV\thechapter \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak} \renewcommand{\DOTI}[1]{% \addtolength{\pyy}{-4pt} \settoheight{\myhi}{\CTV\FmTi{#1}} \addtolength{\myhi}{\py} \addtolength{\myhi}{-1\RW} \vskip -1\pyy \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt \raggedleft\CTV\FmTi{#1}\par\nobreak \vskip 80\p@} \renewcommand{\DOTIS}[1]{% \setlength{\py}{10pt} \setlength{\pyy}{\py} \addtolength{\pyy}{\RW} \setlength{\myhi}{\baselineskip} \addtolength{\myhi}{\pyy} \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak % \addtolength{}{} \vskip -1\baselineskip \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt \raggedleft\CTV\FmTi{#1}\par\nobreak \vskip 60\p@} } %%%%%%% CONNY DEF \DeclareOption{Conny}{% \ChNameUpperCase \ChTitleUpperCase \ChNameVar{\centering\Huge\rm\bfseries} \ChNumVar{\Huge} \ChTitleVar{\centering\Huge\rm} \ChRuleWidth{2pt} \renewcommand{\DOCH}{% \mghrulefill{3\RW}\par\nobreak \vskip -0.5\baselineskip \mghrulefill{\RW}\par\nobreak \CNV\FmN{\@chapapp}\space \CNoV\thechapter \par\nobreak \vskip -0.5\baselineskip } \renewcommand{\DOTI}[1]{% \mghrulefill{\RW}\par\nobreak \CTV\FmTi{#1}\par\nobreak \vskip 60\p@ } \renewcommand{\DOTIS}[1]{% \mghrulefill{\RW}\par\nobreak \CTV\FmTi{#1}\par\nobreak \vskip 60\p@ } } %%%%%%% REJNE DEF \DeclareOption{Rejne}{% \ChNameUpperCase \ChTitleUpperCase \ChNameVar{\centering\Large\rm} \ChNumVar{\Huge} \ChTitleVar{\centering\Huge\rm} \ChRuleWidth{1pt} \renewcommand{\DOCH}{% \settoheight{\py}{\CNoV\thechapter} \addtolength{\py}{-1pt} \CNV\FmN{\@chapapp}\par\nobreak \vskip 20\p@ \setlength{\myhi}{2\baselineskip} \setlength{\px}{\myhi} \addtolength{\px}{-1\RW} \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip 10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip 10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak \vskip -1\p@ } \renewcommand{\DOTI}[1]{% \setlength{\mylen}{\textwidth} \addtolength{\mylen}{-2\RW} {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule width\RW}\par\nobreak \vskip -1pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip} \vskip 60\p@ } \renewcommand{\DOTIS}[1]{% \setlength{\py}{\fboxrule} \setlength{\fboxrule}{\RW} \setlength{\mylen}{\textwidth} \addtolength{\mylen}{-2\RW} \fbox{\parbox{\mylen}{\vskip 2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}} \setlength{\fboxrule}{\py} \vskip 60\p@ } } %%%%%%% BJARNE DEF \DeclareOption{Bjarne}{% \ChNameUpperCase \ChTitleUpperCase \ChNameVar{\raggedleft\normalsize\rm} \ChNumVar{\raggedleft \bfseries\Large} \ChTitleVar{\raggedleft \Large\rm} \ChRuleWidth{1pt} %% Note thechapter -> c@chapter fix appendix bug \newcounter{AlphaCnt} \newcounter{AlphaDecCnt} \newcommand{\AlphaNo}{% \ifcase\number\theAlphaCnt \ifnum\c@chapter=0 ZERO\else{}\fi \or ONE\or TWO\or THREE\or FOUR\or FIVE \or SIX\or SEVEN\or EIGHT\or NINE\or TEN \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi } \newcommand{\AlphaDecNo}{% \setcounter{AlphaDecCnt}{0} \@whilenum\number\theAlphaCnt>0\do {\addtocounter{AlphaCnt}{-10} \addtocounter{AlphaDecCnt}{1}} \ifnum\number\theAlphaCnt=0 \else \addtocounter{AlphaDecCnt}{-1} \addtocounter{AlphaCnt}{10} \fi \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi } \newcommand{\TheAlphaChapter}{% \ifinapp \thechapter \else \setcounter{AlphaCnt}{\c@chapter} \ifnum\c@chapter<20 \AlphaNo \else \AlphaDecNo\AlphaNo \fi \fi } \renewcommand{\DOCH}{% \mghrulefill{\RW}\par\nobreak \CNV\FmN{\@chapapp}\par\nobreak \CNoV\TheAlphaChapter\par\nobreak \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak \vskip 20\p@ } \renewcommand{\DOTI}[1]{% \CTV\FmTi{#1}\par\nobreak \vskip 40\p@ } \renewcommand{\DOTIS}[1]{% \CTV\FmTi{#1}\par\nobreak \vskip 40\p@ } } \DeclareOption*{% \PackageWarning{fancychapter}{unknown style option} } \ProcessOptions* \relax \def\@makechapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \ifnum \c@secnumdepth >\m@ne \DOCH \fi \interlinepenalty\@M \DOTI{#1} }} \def\@schapter#1{\if@twocolumn \@topnewpage[\@makeschapterhead{#1}]% \else \@makeschapterhead{#1}% \@afterheading \fi} \def\@makeschapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \interlinepenalty\@M \DOTIS{#1} \vskip 40\p@ }} \endinput pydb-1.26/Doc/texinputs/python.ist0000664000175000017500000000033410366703276014147 00000000000000line_max 100 headings_flag 1 heading_prefix " \\bigletter " preamble "\\begin{theindex} \\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}} " symhead_positive "{Symbols}" numhead_positive "{Numbers}" pydb-1.26/Doc/texinputs/underscore.sty0000664000175000017500000002370710366627446015034 00000000000000% underscore.sty 12-Oct-2001 Donald Arseneau asnd@triumf.ca % Make the "_" character print as "\textunderscore" in text. % Copyright 1998,2001 Donald Arseneau; Distribute freely if unchanged. % Instructions follow after the definitions. \ProvidesPackage{underscore}[2001/10/12] \begingroup \catcode`\_=\active \gdef_{% \relax % No relax gives a small vulnerability in alignments \ifx\if@safe@actives\iftrue % must be outermost test! \string_% \else \ifx\protect\@typeset@protect \ifmmode \sb \else \BreakableUnderscore \fi \else \ifx\protect\@unexpandable@protect \noexpand_% \else \protect_% \fi\fi \fi} \endgroup % At begin: set catcode; fix \long \ttdefault so I can use it in comparisons; \AtBeginDocument{% {\immediate\write\@auxout{\catcode\number\string`\_ \string\active}}% \catcode\string`\_\string=\active \edef\ttdefault{\ttdefault}% } \newcommand{\BreakableUnderscore}{\leavevmode\nobreak\hskip\z@skip \ifx\f@family\ttdefault \string_\else \textunderscore\fi \usc@dischyph\nobreak\hskip\z@skip} \DeclareRobustCommand{\_}{% \ifmmode \nfss@text{\textunderscore}\else \BreakableUnderscore \fi} \let\usc@dischyph\@dischyph \DeclareOption{nohyphen}{\def\usc@dischyph{\discretionary{}{}{}}} \DeclareOption{strings}{\catcode`\_=\active} \ProcessOptions \ifnum\catcode`\_=\active\else \endinput \fi %%%%%%%% Redefine commands that use character strings %%%%%%%% \@ifundefined{UnderscoreCommands}{\let\UnderscoreCommands\@empty}{} \expandafter\def\expandafter\UnderscoreCommands\expandafter{% \UnderscoreCommands \do\include \do\includeonly \do\@input \do\@iinput \do\InputIfFileExists \do\ref \do\pageref \do\newlabel \do\bibitem \do\@bibitem \do\cite \do\nocite \do\bibcite } % Macro to redefine a macro to pre-process its string argument % with \protect -> \string. \def\do#1{% Avoid double processing if user includes command twice! \@ifundefined{US\string_\expandafter\@gobble\string#1}{% \edef\@tempb{\meaning#1}% Check if macro is just a protection shell... \def\@tempc{\protect}% \edef\@tempc{\meaning\@tempc\string#1\space\space}% \ifx\@tempb\@tempc % just a shell: hook into the protected inner command \expandafter\do \csname \expandafter\@gobble\string#1 \expandafter\endcsname \else % Check if macro takes an optional argument \def\@tempc{\@ifnextchar[}% \edef\@tempa{\def\noexpand\@tempa####1\meaning\@tempc}% \@tempa##2##3\@tempa{##2\relax}% \edef\@tempb{\meaning#1\meaning\@tempc}% \edef\@tempc{\noexpand\@tempd \csname US\string_\expandafter\@gobble\string#1\endcsname}% \if \expandafter\@tempa\@tempb \relax 12\@tempa % then no optional arg \@tempc #1\US@prot \else % There is optional arg \@tempc #1\US@protopt \fi \fi }{}} \def\@tempd#1#2#3{\let#1#2\def#2{#3#1}} \def\US@prot#1#2{\let\@@protect\protect \let\protect\string \edef\US@temp##1{##1{#2}}\restore@protect\US@temp#1} \def\US@protopt#1{\@ifnextchar[{\US@protarg#1}{\US@prot#1}} \def\US@protarg #1[#2]{\US@prot{{#1[#2]}}} \UnderscoreCommands \let\do\relax \let\@tempd\relax % un-do %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput underscore.sty 12-Oct-2001 Donald Arseneau Features: ~~~~~~~~~ \_ prints an underscore so that the hyphenation of constituent words is not affected and hyphenation is permitted after the underscore. For example, "compound\_fracture" hyphenates as com- pound_- frac- ture. If you prefer the underscore to break without a hyphen (but still with the same rules for explicit hyphen-breaks) then use the [nohyphen] package option. A simple _ acts just like \_ in text mode, but makes a subscript in math mode: activation_energy $E_a$ Both forms use an underscore character if the font encoding contains one (e.g., "\usepackage[T1]{fontenc}" or typewriter fonts in any encoding), but they use a rule if the there is no proper character. Deficiencies: ~~~~~~~~~~~~~ The skips and penalties ruin any kerning with the underscore character (when a character is used). However, there doesn't seem to be much, if any, such kerning in the ec fonts, and there is never any kerning with a rule. You must avoid "_" in file names and in cite or ref tags, or you must use the babel package, with its active-character controls, or you must give the [strings] option, which attempts to redefine several commands (and may not work perfectly). Even without the [strings] option or babel, you can use occasional underscores like: "\include{file\string_name}". Option: [strings] ~~~~~~~~~~~~~~~~~ The default operation is quite simple and needs no customization; but you must avoid using "_" in any place where LaTeX uses an argument as a string of characters for some control function or as a name. These include the tags for \cite and \ref, file names for \input, \include, and \includegraphics, environment names, counter names, and placement parameters (like "[t]"). The problem with these contexts is that they are `moving arguments' but LaTeX does not `switch on' the \protect mechanism for them. If you need to use the underscore character in these places, the package option [strings] is provided to redefine commands taking a string argument so that the argument is protected (with \protect -> \string). The list of commands is given in "\UnderscoreCommands", with "\do" before each, covering \cite, \ref, \input, and their variants. Not included are many commands regarding font names, everything with counter names, environment names, page styles, and versions of \ref and \cite defined by external packages (e.g. \vref and \citeyear). You can add to the list of supported commands by defining \UnderscoreCommands before loading this package; e.g. \usepackage{chicago} \newcommand{\UnderscoreCommands}{% (\cite already done) \do\citeNP \do\citeA \do\citeANP \do\citeN \do\shortcite \do\shortciteNP \do\shortciteA \do\shortciteANP \do\shortciteN \do\citeyear \do\citeyearNP } \usepackage[strings]{underscore} Not all commands can be supported this way! Only commands that take a string argument *first* can be protected. One optional argument before the string argument is also permitted, as exemplified by \cite: both \cite{tags} and \cite[text]{tags} are allowed. A command like \@addtoreset which takes two counter names as arguments could not be protected by adding it to \UnderscoreCommands. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! When you use the [strings] option, you must load this package !! !! last (or nearly last). !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! There are two reasons: 1) The redefinitions done for protection must come after other packages define their customized versions of those commands. 2) The [strings] option requires the _ character to be activated immediately in order for the cite and ref tags to be read properly from the .aux file as plain strings, and this catcode setting might disrupt other packages. The babel package implements a protection mechanism for many commands, and will be a complete fix for most documents without the [strings] option. Many add-on packages are compatible with babel, so they will get the strings protection also. However, there are several commands that are not covered by babel, but can easily be supported by the [strings] and \UnderscoreCommands mechanism. Beware that using both [strings] and babel may lead to conflicts, but does appear to work (load babel last). Implementation Notes: ~~~~~~~~~~~~~~~~~~~~~ The first setting of "_" to be an active character is performed in a local group so as to not interfere with other packages. The catcode setting is repeated with \AtBeginDocument so the definition is in effect for the text. However, the catcode setting is repeated immediately when the [strings] option is detected. The definition of the active "_" is essentially: \ifmmode \sb \else \BreakableUnderscore \fi where "\sb" retains the normal subscript meaning of "_" and where "\BreakableUnderscore" is essentially "\_". The rest of the definition handles the "\protect"ion without causing \relax to be inserted before the character. \BreakableUnderscore uses "\nobreak\hskip\z@skip" to separate the underscore from surrounding words, thus allowing TeX to hyphenate them, but preventing free breaks around the underscore. Next, it checks the current font family, and uses the underscore character from tt fonts or otherwise \textunderscore (which is a character or rule depending on the font encoding). After the underscore, it inserts a discretionary hyphenation point as "\usc@dischyph", which is usually just "\-" except that it still works in the tabbing environment, although it will give "\discretionary{}{}{}" under the [nohyphen] option. After that, another piece of non-breaking interword glue is inserted. Ordinarily, the comparison "\ifx\f@family\ttdefault" will always fail because \ttdefault is `long' where \f@family is not (boooo hisss), but \ttdefault is redefined to be non-long by "\AtBeginDocument". The "\_" command is then defined to use "\BreakableUnderscore". If the [strings] option is not given, then that is all! Under the [strings] option, the list of special commands is processed to: - retain the original command as \US_command (\US_ref) - redefine the command as \US@prot\US_command for ordinary commands (\ref -> \US@prot\US_ref) or as \US@protopt\US_command when an optional argument is possible (\bibitem -> \US@protopt\US_bibitem). - self-protecting commands (\cite) retain their self-protection. Diagnosing the state of the pre-existing command is done by painful contortions involving \meaning. \US@prot and \US@protopt read the argument, process it with \protect enabled, then invoke the saved \US_command. Modifications: ~~~~~~~~~~~~~~ 12-Oct-2001 Babel (safe@actives) compatibility and [nohyphen] option. Test file integrity: ASCII 32-57, 58-126: !"#$%&'()*+,-./0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ pydb-1.26/Doc/Makefile.in0000644000175000017500000004675110607553007012113 00000000000000# Makefile for Python documentation # --------------------------------- # # See also the README file. # # This is a bit of a mess. The documents are identified by short names: # api -- Python/C API Reference Manual # doc -- Documenting Python # ext -- Extending and Embedding the Python Interpreter # lib -- Library Reference Manual # mac -- Macintosh Library Modules # ref -- Python Reference Manual # tut -- Python Tutorial # inst -- Installing Python Modules # dist -- Distributing Python Modules # # The LaTeX sources for each of these documents are in subdirectories # with the three-letter designations above as the directory names. # # The main target creates HTML for each of the documents. You can # also do "make lib" (etc.) to create the HTML versions of individual # documents. # # The document classes and styles are in the texinputs/ directory. # These define a number of macros that are similar in name and intent # as macros in Texinfo (e.g. \code{...} and \emph{...}), as well as a # number of environments for formatting function and data definitions. # Documentation for the macros is included in "Documenting Python"; see # http://www.python.org/doc/current/doc/doc.html, or the sources for # this document in the doc/ directory. # # Everything is processed by LaTeX. See the file `README' for more # information on the tools needed for processing. # # There's a problem with generating the index which has been solved by # a sed command applied to the index file. The shell script fix_hack # does this (the Makefile takes care of calling it). # # Additional targets attempt to convert selected LaTeX sources to # various other formats. These are generally site specific because # the tools used are all but universal. These targets are: # # ps -- convert all documents from LaTeX to PostScript # pdf -- convert all documents from LaTeX to the # Portable Document Format # # See the README file for more information on these targets. # # The formatted output is located in subdirectories. For PDF and # PostScript, look in the paper-$(PAPER)/ directory. For HTML, look in # the html/ directory. If you want to fix the GNU info process, look # in the info/ directory; please send patches to docs@python.org. # This Makefile only includes information on how to perform builds; for # dependency information, see Makefile.deps. srcdir=@srcdir@ DISTFILES=lib/lib.tex lib/libpydb.tex Makefile.in Makefile.deps \ html PYTHON_SRC=$(shell cd @top_srcdir@ && pwd) PYTHON_DOC=$(shell cd @srcdir@ && pwd) # Customization -- you *may* have to edit this # You could set this to a4: PAPER=letter # Ideally, you shouldn't need to edit beyond this point .PHONY: realclean distclean clean clobber test check INFODIR= $(srcdir)/info TOOLSDIR= $(srcdir)/tools # This is the *documentation* release, and is used to construct the # file names of the downloadable tarballs. It is initialized by the # getversioninfo script to ensure that the right version number is # used; the script will also write commontex/patchlevel.tex if that # doesn't exist or needs to be changed. Documents which depend on the # version number should use \input{patchlevel} and include # commontex/patchlevel.tex in their dependencies. RELEASE=$(shell $(PYTHON) $(PYTHON_DOC)/tools/getversioninfo) PYTHON= python DVIPS= dvips -N0 -t $(PAPER) # This is ugly! The issue here is that there are two different levels # in the directory tree at which we execute mkhowto, so we can't # define it just once using a relative path (at least not with the # current implementation and Makefile structure). We use the GNUish # $(shell) function here to work around that restriction by # identifying mkhowto and the commontex/ directory using absolute paths. # # If your doc build fails immediately, you may need to switch to GNU make. # (e.g. OpenBSD needs package gmake installed; use gmake instead of make) PWD=$(shell pwd) # (The trailing colon in the value is needed; TeX places its default # set of paths at the location of the empty string in the path list.) TEXINPUTS=$(PYTHON_DOC)/commontex: # The mkhowto script can be run from the checkout using the first # version of this variable definition, or from a preferred version # using the second version. The standard documentation is typically # built using the second flavor, where the preferred version is from # the Python CVS trunk. MKHOWTO= TEXINPUTS=$(TEXINPUTS) $(PYTHON) $(PYTHON_DOC)/tools/mkhowto MKDVI= $(MKHOWTO) --paper=$(PAPER) --dvi MKHTML= $(MKHOWTO) --html --about html/stdabout.dat \ --iconserver ../icons --favicon ../icons/pyfav.png \ --address $(PYTHONDOCS) --up-link ../index.html \ --up-title "Python Documentation Index" \ --global-module-index "../modindex.html" --dvips-safe MKPDF= $(MKHOWTO) --paper=$(PAPER) --pdf MKPS= $(MKHOWTO) --paper=$(PAPER) --ps BUILDINDEX=$(TOOLSDIR)/buildindex.py PYTHONDOCS="See About this document... for information on suggesting changes." HTMLBASE= file:`pwd` # The emacs binary used to build the info docs. GNU Emacs 21 is required. EMACS= emacs # The end of this should reflect the major/minor version numbers of # the release: WHATSNEW=whatsnew25 # what's what MANDVIFILES= paper-$(PAPER)/lib.dvi MANPDFFILES= paper-$(PAPER)/lib.pdf HOWTOPDFFILES= MANPSFILES= paper-$(PAPER)/lib.ps DVIFILES= $(MANDVIFILES) $(HOWTODVIFILES) PDFFILES= $(MANPDFFILES) $(HOWTOPDFFILES) PSFILES= $(MANPSFILES) $(HOWTOPSFILES) HTMLCSSFILES=html/lib/lib.css ISILOCSSFILES= ALLCSSFILES=$(HTMLCSSFILES) $(ISILOCSSFILES) INDEXFILES=html/lib/lib.html ALLHTMLFILES=$(INDEXFILES) COMMONPERL= $(PYTHON_DOC)/perl/manual.perl $(PYTHON_DOC)/perl/python.perl $(PYTHON_DOC)/perl/l2hinit.perl ANNOAPI=api/refcounts.dat tools/anno-api.py include @srcdir@/Makefile.deps # These must be declared phony since there # are directories with matching names: .PHONY: api doc lib ref tut inst dist install .PHONY: html info # Main target default: html all: html info dvi ps pdf dvi: $(DVIFILES) pdf: $(PDFFILES) ps: $(PSFILES) # For now, we don't install anything. install: # For now, we don't test/check anything. test check: world: ps pdf html distfiles # Rules to build PostScript and PDF formats .SUFFIXES: .dvi .ps .dvi.ps: $(DVIPS) -o $@ $< # Targets for each document: # Python/C API Reference Manual paper-$(PAPER)/api.dvi: $(ANNOAPIFILES) cd paper-$(PAPER) && $(MKDVI) api.tex paper-$(PAPER)/api.pdf: $(ANNOAPIFILES) cd paper-$(PAPER) && $(MKPDF) api.tex paper-$(PAPER)/api.tex: api/api.tex cp api/api.tex $@ paper-$(PAPER)/abstract.tex: api/abstract.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/abstract.tex paper-$(PAPER)/concrete.tex: api/concrete.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/concrete.tex paper-$(PAPER)/exceptions.tex: api/exceptions.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/exceptions.tex paper-$(PAPER)/init.tex: api/init.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/init.tex paper-$(PAPER)/intro.tex: api/intro.tex cp api/intro.tex $@ paper-$(PAPER)/memory.tex: api/memory.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/memory.tex paper-$(PAPER)/newtypes.tex: api/newtypes.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/newtypes.tex paper-$(PAPER)/refcounting.tex: api/refcounting.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/refcounting.tex paper-$(PAPER)/utilities.tex: api/utilities.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/utilities.tex paper-$(PAPER)/veryhigh.tex: api/veryhigh.tex $(ANNOAPI) $(PYTHON) $(TOOLSDIR)/anno-api.py -o $@ api/veryhigh.tex # Distributing Python Modules paper-$(PAPER)/dist.dvi: $(DISTFILES) cd paper-$(PAPER) && $(MKDVI) ../dist/dist.tex paper-$(PAPER)/dist.pdf: $(DISTFILES) cd paper-$(PAPER) && $(MKPDF) ../dist/dist.tex # Documenting Python paper-$(PAPER)/doc.dvi: $(DOCFILES) cd paper-$(PAPER) && $(MKDVI) ../doc/doc.tex paper-$(PAPER)/doc.pdf: $(DOCFILES) cd paper-$(PAPER) && $(MKPDF) ../doc/doc.tex # Extending and Embedding the Python Interpreter paper-$(PAPER)/ext.dvi: $(EXTFILES) cd paper-$(PAPER) && $(MKDVI) ../ext/ext.tex paper-$(PAPER)/ext.pdf: $(EXTFILES) cd paper-$(PAPER) && $(MKPDF) ../ext/ext.tex # Installing Python Modules paper-$(PAPER)/inst.dvi: $(INSTFILES) cd paper-$(PAPER) && $(MKDVI) ../inst/inst.tex paper-$(PAPER)/inst.pdf: $(INSTFILES) cd paper-$(PAPER) && $(MKPDF) ../inst/inst.tex # Python Library Reference paper-$(PAPER)/lib.dvi: $(LIBFILES) cd paper-$(PAPER) && $(MKDVI) ../lib/lib.tex paper-$(PAPER)/lib.pdf: $(LIBFILES) cd paper-$(PAPER) && $(MKPDF) ../lib/lib.tex # Macintosh Library Modules paper-$(PAPER)/mac.dvi: $(MACFILES) cd paper-$(PAPER) && $(MKDVI) ../mac/mac.tex paper-$(PAPER)/mac.pdf: $(MACFILES) cd paper-$(PAPER) && $(MKPDF) ../mac/mac.tex # Python Reference Manual paper-$(PAPER)/ref.dvi: $(REFFILES) cd paper-$(PAPER) && $(MKDVI) ../ref/ref.tex paper-$(PAPER)/ref.pdf: $(REFFILES) cd paper-$(PAPER) && $(MKPDF) ../ref/ref.tex # Python Tutorial paper-$(PAPER)/tut.dvi: $(TUTFILES) cd paper-$(PAPER) && $(MKDVI) ../tut/tut.tex paper-$(PAPER)/tut.pdf: $(TUTFILES) cd paper-$(PAPER) && $(MKPDF) ../tut/tut.tex # What's New in Python X.Y paper-$(PAPER)/$(WHATSNEW).dvi: whatsnew/$(WHATSNEW).tex cd paper-$(PAPER) && $(MKDVI) ../whatsnew/$(WHATSNEW).tex paper-$(PAPER)/$(WHATSNEW).pdf: whatsnew/$(WHATSNEW).tex cd paper-$(PAPER) && $(MKPDF) ../whatsnew/$(WHATSNEW).tex # The remaining part of the Makefile is concerned with various # conversions, as described above. See also the README file. info: cd $(INFODIR) && $(MAKE) EMACS=$(EMACS) WHATSNEW=$(WHATSNEW) # Targets to convert the manuals to HTML using Nikos Drakos' LaTeX to # HTML converter. For more info on this program, see # . # Note that LaTeX2HTML inserts references to an icons directory in # each page that it generates. I have placed a copy of this directory # in the distribution to simplify the process of creating a # self-contained HTML distribution; for this purpose I have also added # a (trivial) index.html. Change the definition of $ICONSERVER in # perl/l2hinit.perl to use a different location for the icons directory. # If you have the standard LaTeX2HTML icons installed, the versions shipped # with this documentation should be stored in a separate directory and used # instead. The standard set does *not* include all the icons used in the # Python documentation. $(ALLCSSFILES): html/style.css cp $< $@ $(INDEXFILES): $(COMMONPERL) \ $(PYTHON_DOC)/html/stdabout.dat $(PYTHON_DOC)/tools/node2label.pl html/acks.html: ACKS $(TOOLSDIR)/support.py $(TOOLSDIR)/mkackshtml $(PYTHON) $(TOOLSDIR)/mkackshtml --address $(PYTHONDOCS) \ --favicon icons/pyfav.png \ --output html/acks.html $@ html/modindex.html: $(TOOLSDIR)/support.py $(TOOLSDIR)/mkmodindex html/modindex.html: html/dist/dist.html html/modindex.html: html/lib/lib.html html/mac/mac.html cd html && \ $(PYTHON) ../$(TOOLSDIR)/mkmodindex --columns 3 \ --output modindex.html --address $(PYTHONDOCS) \ --favicon icons/pyfav.png \ dist/modindex.html \ lib/modindex.html mac/modindex.html html: $(ALLHTMLFILES) doc: html/doc/doc.html html/doc/doc.css html/doc/doc.html: $(DOCFILES) $(MKHTML) --dir html/doc doc/doc.tex lib: html/lib/lib.html html/lib/lib.css html/lib/lib.html: $(LIBFILES) $(MKHTML) --dir html/lib lib/lib.tex tut: html/tut/tut.html html/tut/tut.css html/tut/tut.html: $(TUTFILES) $(MKHTML) --dir html/tut --numeric --split 3 tut/tut.tex inst: html/inst/inst.html html/inst/inst.css html/inst/inst.html: $(INSTFILES) $(PYTHON_DOC)/perl/distutils.perl $(MKHTML) --dir html/inst --split 4 inst/inst.tex whatsnew: html/whatsnew/$(WHATSNEW).html html/whatsnew/$(WHATSNEW).html: whatsnew/$(WHATSNEW).tex $(MKHTML) --dir html/whatsnew --split 4 whatsnew/$(WHATSNEW).tex # The iSilo format is used by the iSilo document reader for PalmOS devices. ISILOINDEXFILES= $(ISILOINDEXFILES): $(COMMONPERL) html/stdabout.dat $(PYTHON_DOC)/perl/isilo.perl # webchecker needs an extra flag to process the huge index from the libref WEBCHECKER=$(PYTHON) ../Tools/webchecker/webchecker.py HTMLBASE= file:`pwd`/html webcheck: $(ALLHTMLFILES) $(WEBCHECKER) $(HTMLBASE)/api/ $(WEBCHECKER) $(HTMLBASE)/doc/ $(WEBCHECKER) $(HTMLBASE)/ext/ $(WEBCHECKER) -m290000 $(HTMLBASE)/lib/ $(WEBCHECKER) $(HTMLBASE)/mac/ $(WEBCHECKER) $(HTMLBASE)/ref/ $(WEBCHECKER) $(HTMLBASE)/tut/ $(WEBCHECKER) $(HTMLBASE)/dist/ $(WEBCHECKER) $(HTMLBASE)/inst/ $(WEBCHECKER) $(HTMLBASE)/whatsnew/ fastwebcheck: $(ALLHTMLFILES) $(WEBCHECKER) -x $(HTMLBASE)/api/ $(WEBCHECKER) -x $(HTMLBASE)/doc/ $(WEBCHECKER) -x $(HTMLBASE)/ext/ $(WEBCHECKER) -x -m290000 $(HTMLBASE)/lib/ $(WEBCHECKER) -x $(HTMLBASE)/mac/ $(WEBCHECKER) -x $(HTMLBASE)/ref/ $(WEBCHECKER) -x $(HTMLBASE)/tut/ $(WEBCHECKER) -x $(HTMLBASE)/dist/ $(WEBCHECKER) -x $(HTMLBASE)/inst/ $(WEBCHECKER) -x $(HTMLBASE)/whatsnew/ # Release packaging targets: paper-$(PAPER)/README: $(PSFILES) $(TOOLSDIR)/getpagecounts cd paper-$(PAPER) && ../$(TOOLSDIR)/getpagecounts -r $(RELEASE) >../$@ info-$(RELEASE).tgz: info cd $(INFODIR) && tar cf - README python.dir python-*.info* \ | gzip -9 >../$@ info-$(RELEASE).tar.bz2: info cd $(INFODIR) && tar cf - README python.dir python-*.info* \ | bzip2 -9 >../$@ latex-$(RELEASE).tgz: $(PYTHON) $(TOOLSDIR)/mksourcepkg --gzip $(RELEASE) latex-$(RELEASE).tar.bz2: $(PYTHON) $(TOOLSDIR)/mksourcepkg --bzip2 $(RELEASE) latex-$(RELEASE).zip: rm -f $@ $(PYTHON) $(TOOLSDIR)/mksourcepkg --zip $(RELEASE) pdf-$(PAPER)-$(RELEASE).tar: $(PDFFILES) rm -f $@ mkdir Python-Docs-$(RELEASE) cp paper-$(PAPER)/*.pdf Python-Docs-$(RELEASE) tar cf $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) pdf-$(PAPER)-$(RELEASE).tgz: pdf-$(PAPER)-$(RELEASE).tar gzip -9 <$? >$@ pdf-$(PAPER)-$(RELEASE).tar.bz2: pdf-$(PAPER)-$(RELEASE).tar bzip2 -9 <$? >$@ pdf-$(PAPER)-$(RELEASE).zip: pdf rm -f $@ mkdir Python-Docs-$(RELEASE) cp paper-$(PAPER)/*.pdf Python-Docs-$(RELEASE) zip -q -r -9 $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) postscript-$(PAPER)-$(RELEASE).tar: $(PSFILES) paper-$(PAPER)/README rm -f $@ mkdir Python-Docs-$(RELEASE) cp paper-$(PAPER)/*.ps Python-Docs-$(RELEASE) cp paper-$(PAPER)/README Python-Docs-$(RELEASE) tar cf $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) postscript-$(PAPER)-$(RELEASE).tar.bz2: postscript-$(PAPER)-$(RELEASE).tar bzip2 -9 <$< >$@ postscript-$(PAPER)-$(RELEASE).tgz: postscript-$(PAPER)-$(RELEASE).tar gzip -9 <$< >$@ postscript-$(PAPER)-$(RELEASE).zip: $(PSFILES) paper-$(PAPER)/README rm -f $@ mkdir Python-Docs-$(RELEASE) cp paper-$(PAPER)/*.ps Python-Docs-$(RELEASE) cp paper-$(PAPER)/README Python-Docs-$(RELEASE) zip -q -r -9 $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) HTMLPKGFILES=*.html */*.css */*.html */*.gif */*.png html-$(RELEASE).tar: $(ALLHTMLFILES) $(HTMLCSSFILES) mkdir Python-Docs-$(RELEASE) -find html -name '*.gif' -size 0 | xargs rm -f cd html && tar cf ../temp.tar $(HTMLPKGFILES) cd Python-Docs-$(RELEASE) && tar xf ../temp.tar rm temp.tar tar cf html-$(RELEASE).tar Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) html-$(RELEASE).tgz: html-$(RELEASE).tar gzip -9 <$? >$@ html-$(RELEASE).tar.bz2: html-$(RELEASE).tar bzip2 -9 <$? >$@ html-$(RELEASE).zip: $(ALLHTMLFILES) $(HTMLCSSFILES) rm -f $@ mkdir Python-Docs-$(RELEASE) cd html && tar cf ../temp.tar $(HTMLPKGFILES) cd Python-Docs-$(RELEASE) && tar xf ../temp.tar rm temp.tar zip -q -r -9 $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) isilo-$(RELEASE).zip: isilo rm -f $@ mkdir Python-Docs-$(RELEASE) cp isilo/python-*.pdb Python-Docs-$(RELEASE) zip -q -r -9 $@ Python-Docs-$(RELEASE) rm -r Python-Docs-$(RELEASE) # convenience targets: tarhtml: html-$(RELEASE).tgz tarinfo: info-$(RELEASE).tgz tarps: postscript-$(PAPER)-$(RELEASE).tgz tarpdf: pdf-$(PAPER)-$(RELEASE).tgz tarlatex: latex-$(RELEASE).tgz tarballs: tarpdf tarps tarhtml ziphtml: html-$(RELEASE).zip zipps: postscript-$(PAPER)-$(RELEASE).zip zippdf: pdf-$(PAPER)-$(RELEASE).zip ziplatex: latex-$(RELEASE).zip zips: zippdf zipps ziphtml bziphtml: html-$(RELEASE).tar.bz2 bzipinfo: info-$(RELEASE).tar.bz2 bzipps: postscript-$(PAPER)-$(RELEASE).tar.bz2 bzippdf: pdf-$(PAPER)-$(RELEASE).tar.bz2 bziplatex: latex-$(RELEASE).tar.bz2 bzips: bzippdf bzipps bziphtml disthtml: bziphtml ziphtml distinfo: bzipinfo distps: bzipps zipps distpdf: bzippdf zippdf distlatex: bziplatex ziplatex # We use the "pkglist" target at the end of these to ensure the # package list is updated after building either of these; this seems a # reasonable compromise between only building it for distfiles or # having to build it manually. Doing it here allows the packages for # distribution to be built using either of # make distfiles && make PAPER=a4 paperdist # make paperdist && make PAPER=a4 distfiles # The small amount of additional work is a small price to pay for not # having to remember which order to do it in. ;) paperdist: distpdf distps pkglist edist: disthtml distinfo zipisilo pkglist # The pkglist.html file is used as part of the download.html page on # python.org; it is not used as intermediate input here or as part of # the packages created. pkglist: $(TOOLSDIR)/mkpkglist >pkglist.html distfiles: paperdist edist $(TOOLSDIR)/mksourcepkg --bzip2 --zip $(RELEASE) $(TOOLSDIR)/mkpkglist >pkglist.html # Housekeeping targets # Remove temporary files; all except the following: # - sources: .tex, .bib, .sty, *.cls # - useful results: .dvi, .pdf, .ps, .texi, .info clean: -rm -f html-$(RELEASE).tar -rm -f $(INDEXFILES) # cd $(INFODIR) && $(MAKE) clean # Remove temporaries as well as final products clobber: clean -rm -f html-$(RELEASE).tgz info-$(RELEASE).tgz -rm -f pdf-$(RELEASE).tgz postscript-$(RELEASE).tgz -rm -f latex-$(RELEASE).tgz html-$(RELEASE).zip -rm -f pdf-$(RELEASE).zip postscript-$(RELEASE).zip -rm -f $(DVIFILES) $(PSFILES) $(PDFFILES) cd $(INFODIR) && $(MAKE) clobber -rm -f paper-$(PAPER)/*.tex paper-$(PAPER)/*.ind paper-$(PAPER)/*.idx -rm -f paper-$(PAPER)/*.l2h paper-$(PAPER)/*.how paper-$(PAPER)/README -rm -rf html/index.html html/lib/ realclean distclean: clobber distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done pydb-1.26/site-packages-path.py0000755000175000017500000000062610361102470013346 00000000000000#!/usr/bin/python #$Id: site-packages-path.py,v 1.1 2006/01/11 04:10:32 rockyb Exp $ """Find where site-path is located. We print the first location and exit with code 0. If we don't find the path, exit with code 1. """ import sys, os.path for dir in sys.path: short_dir=os.path.basename(dir) if short_dir == 'site-packages': print dir sys.exit(0) #Not found sys.exit(1) pydb-1.26/elisp-comp0000755000175000017500000000523011006750040011310 00000000000000#!/bin/sh # Copyright (C) 1995, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. scriptversion=2005-05-14.22 # Franc,ois Pinard , 1995. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No files. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: elisp-comp [--help] [--version] FILES... This script byte-compiles all `.el' files listed as FILES using GNU Emacs, and put the resulting `.elc' files into the current directory, so disregarding the original directories used in `.el' arguments. This script manages in such a way that all Emacs LISP files to be compiled are made visible between themselves, in the event they require or load-library one another. Report bugs to . EOF exit $? ;; -v | --v*) echo "elisp-comp $scriptversion" exit $? ;; esac if test -z "$EMACS" || test "$EMACS" = "t"; then # Value of "t" means we are running in a shell under Emacs. # Just assume Emacs is called "emacs". EMACS=emacs fi tempdir=elc.$$ # Cleanup the temporary directory on exit. trap 'ret=$?; rm -rf "$tempdir" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 mkdir $tempdir cp "$@" $tempdir ( cd $tempdir echo "(setq load-path (cons nil load-path))" > script $EMACS -batch -q -l script -f batch-byte-compile *.el || exit $? mv *.elc .. ) || exit $? (exit 0); exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pydb-1.26/INSTALL0000644000175000017500000002245011006750040010346 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 6. Often, you can also type `make uninstall' to remove the installed files again. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. pydb-1.26/AUTHORS0000644000175000017500000000147111167772450010406 00000000000000The Python community or whoever wrote pdb.py is largely responsible for this. Richard Wolff worked on the pydb.py that is in ddd. He also contributed a little to pdb.py. In email he relates: .. there was no attempt to make the two systems congruent. I haven't done any work on either for quite some time. I'm retired now and it's more than just unlikely that I'll ever do anything more on either. Which means that as far as ddd and pydb have anything to do with me, you're more than welcome to do whatever you like. This effort merges in changes that were in the ddd pydb.py but not in pdb.py. In particular, display expressions. The command interface is from GDB, and so much of the error messages and some parts of the documentation too. Coordination for putting this together is by Rocky Bernstein. pydb-1.26/emacs/0000777000175000017500000000000011167772526010513 500000000000000pydb-1.26/emacs/elk-test.el0000644000175000017500000002212610545265120012466 00000000000000;;; elk-test.el --- Emacs Lisp testing suite ;; Copyright (C) 2006 Nikolaj Schumacher ;;; License ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License ;; as published by the Free Software Foundation; either version 2 ;; of the License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ;;; Usage ;; Use `deftest' to define a test and `run-elk-test' to run it. ;; Create test bundles with `defsuite' or `build-suite'. ;; Verify your code with `assert-equal', `assert-eq', `assert-eql', ;; `assert-nonnil', `assert-t', `assert-nil' and `assert-error' ;; to verify your code. ;;; Examples ;; (deftest "test1" ;; (assert-equal t t) ;; (assert-eq t 'foo)) ;; (defsuite "suite1" ;; (deftest "test1" (assert-equal t t))) ;; (deftest "test2" ;; (assert-equal t t)) ;; (build-suite "combined-suite" "test1" "test2") ;; (run-elk-test "combined-suite") ;; (run-elk-test) (require 'cl) (defvar elk-test-run-on-define nil "If non-nil, run elk-test tests/suites immediately when defining them.") (defvar elk-test-map (make-hash-table :test 'equal) "A map of elk-test test/suite names to their implementation.") (defvar elk-test-list nil "A list of all defined elk-test tests/suites.") (defun elk-test-clear () "Remove all tests from memory." (setq elk-test-map (make-hash-table :test 'equal) elk-test-list nil)) (defun run-elk-test (name &optional string-result) "Run the test case defined as NAME. The result is a list of errors strings, unless STRING-RESULT is set, in which case a message describing the errors or success is displayed and returned." (interactive (list (completing-read "Test name: " elk-test-list nil t))) (let ((name name)) (let ((elk-test-errors nil) (test-or-suite (gethash name elk-test-map))) (if (not test-or-suite) (error "Undefined test <%s>" name) (if (equal (car test-or-suite) 'suite) ;; is test suite (let ((map (cadr test-or-suite))) (dolist (test (caddr test-or-suite)) (setq elk-test-errors (append elk-test-errors (run-elk-test-internal (gethash test map)))))) ;; is simple test (setq elk-test-errors (run-elk-test-internal test-or-suite))) (if (or string-result (interactive-p)) (message (if elk-test-errors (mapconcat 'identity elk-test-errors "\n") "Test run was successful.")) elk-test-errors))))) (defun run-elk-tests-buffer (&optional buffer) "Execute BUFFER as lisp code and run all tests therein." (interactive) (let* ((elk-test-list) (elk-test-map (make-hash-table :test 'equal)) (elk-test-run-on-define nil) (inhibit-read-only t) (buffer-name (buffer-name buffer)) (success t) (parse-res (condition-case err (eval-buffer buffer) (error err)))) (if parse-res (message "Parsing buffer <%s> failed:\n%s" buffer-name parse-res) (let ((out-buffer (get-buffer-create (concat "*elk-test run " buffer-name "*"))) failure) (with-current-buffer out-buffer (erase-buffer) (dolist (test elk-test-list) (message "running <%s>" test) (let ((results (run-elk-test test))) (when results (setq failure t) (insert "test <" test "> failed:\n") (dolist (result results) (insert "* " result "\n")))))) (if failure (display-buffer out-buffer) (kill-buffer out-buffer) (message "Test run was successful.")))))) (defun run-elk-test-internal (test) (let ((elk-test-errors nil)) (dolist (sexpr test) (let ((problem (condition-case err (progn (eval sexpr) nil) (error err)))) (when problem (push (message "%s" problem) elk-test-errors)))) elk-test-errors)) (defmacro elk-test-error (format-string &rest args) "Create an error string as the result of a failed elk-test assertion. The first argument is a format control string, and the rest are data to be formatted under control of the string. See `format' for details. The result will be displayed, returned and if called inside of `run-elk-test' added to the internal error list." `(let ((string (message ,format-string ,@args))) (when (boundp 'elk-test-errors) (push string elk-test-errors)) string)) (defmacro assert-equal (expected actual) "Assert that ACTUAL equals EXPECTED, or signal a warning." `(unless (equal ,expected ,actual) (elk-test-error "assert-equal for <%s> failed: expected <%s>, was <%s>" ',actual ,expected ,actual))) (defmacro assert-eq (expected actual) "Assert that ACTUAL equals EXPECTED, or signal a warning." `(unless (eq ,expected ,actual) (elk-test-error "assert-eq for <%s> failed: expected <%s>, was <%s>" ',actual ,expected ,actual))) (defmacro assert-eql (expected actual) "Assert that ACTUAL equals EXPECTED, or signal a warning." `(unless (eql ,expected ,actual) (elk-test-error "assert-eql for <%s> failed: expected <%s>, was <%s>" ',actual ,expected ,actual))) (defmacro assert-nonnil (value) "Assert that VALUE is not nil, or signal a warning." `(unless ,value (elk-test-error "assert-nonnil for <%s> failed: was <%s>" ',value ,value))) (defmacro assert-t (value) "Assert that VALUE is t, or signal a warning." `(unless (eq ,value t) (elk-test-error "assert-t for <%s> failed: was <%s>" ',value ,value))) (defmacro assert-nil (value) "Assert that VALUE is nil, or signal a warning." `(when ,value (elk-test-error "assert-nil for <%s> failed: was <%s>" ',value ,value))) (defmacro assert-error (error-message &rest body) "Assert that BODY raises an `error', or signal a warning. ERROR-MESSAGE is the expected error string, use nil to accept any error. Use nil with caution, as errors like 'wrong-number-of-arguments' (likely caused by typos) will also be caught!" `(let ((elk-test-error (condition-case elk-test-error (progn ,@body) (error (cons 'elk-test-error (cadr elk-test-error)))))) (if (not (eq (car elk-test-error) 'elk-test-error)) ;; no error (elk-test-error "assert-error for <%s> failed: did not raise an error" (append '(progn) ',body)) (when (and ,error-message (not (equal ,error-message (cdr elk-test-error)))) (elk-test-error (concat "assert-error for <%s> failed: expected <%s>, " "raised <%s>") (append '(progn) ',body) ,error-message (cdr elk-test-error)))))) (defmacro deftest (name &rest body) "Define a test case. Use `assert-equal', `assert-eq', `assert-eql', `assert-nonnil', `assert-t', `assert-nil' and `assert-error' to verify the code." `(progn (unless (gethash ,name elk-test-map) (push ,name elk-test-list)) (puthash ,name ',body elk-test-map) ,(if elk-test-run-on-define `(run-elk-test ',name ,t) name))) (defmacro defsuite (name &rest body) "Define a test suite using a collection of `deftest' forms. The resulting suite can be called with `run-elk-test' and parameter NAME." `(let ((suite (let ((elk-test-map (make-hash-table :test 'equal)) (elk-test-list nil)) ,@body (list 'suite elk-test-map (reverse elk-test-list))))) (unless (gethash ,name elk-test-map) (push ,name elk-test-list)) (puthash ,name suite elk-test-map) ,(if elk-test-run-on-define `(run-elk-test ,name t) name))) (defun build-suite (name &rest tests) "Define a test suite using a collection of test names. The resulting suite can be run by calling `run-elk-test' with parameter NAME." (unless (gethash name elk-test-map) (push name elk-test-list)) (puthash name (let ((map (make-hash-table :test 'equal)) (list nil)) (dolist (test-name tests) (push test-name list) (when (gethash test-name map) (error "Test used twice")) (let ((test (gethash test-name elk-test-map))) (unless test (error "Undefined test <%s>" test-name)) (puthash test-name test map))) (list 'suite map (reverse list))) elk-test-map) (if elk-test-run-on-define (run-elk-test "sample suite" t) name)) (provide 'elk-test) pydb-1.26/emacs/pydb-test.el.in0000644000175000017500000000737011012704013013247 00000000000000; -*- emacs-lisp -*- (load-file "@srcdir@/elk-test.el") (load-file "@srcdir@/pydb.el") (make-variable-buffer-local 'gud-pydb-marker-acc) (deftest "pydb-marker-filter-test" (assert-equal "Testing 1 2 3" (gud-pydb-marker-filter "Testing 1 2 3")) (assert-equal "ABC" (gud-pydb-marker-filter "breakpoints No breakpoints  ABC"))) (defun regexp-stack-test (location-str) "Test to see that location-str matches pydb--stack-frame-regexp" (assert-equal 0 (string-match pydb--stack-frame-regexp location-str)) ) (defun regexp-breakpoint-test (location-str) "Test to see that location-str matches pydb--breakpoint-regexp" (assert-equal 0 (string-match pydb--breakpoint-regexp location-str)) ) (defun regexp-file-test (location-str file-str) "Test to see that location-str matches gud-pydb-marker-regexp" (assert-equal 0 (string-match gud-pydb-marker-regexp location-str)) (assert-equal file-str (substring location-str (match-beginning gud-pydb-marker-regexp-file-group) (match-end gud-pydb-marker-regexp-file-group))) ) (deftest "pydb-marker-regexp-test" (regexp-breakpoint-test "1 breakpoint keep y at /src/external-cvs/pydb/test/gcd.py:24") (regexp-stack-test "-> 0 () called from file '/src/external-cvs/pydb/test/gcd.py' at line 10") (regexp-stack-test " 1 () called from file '' at line 1") (regexp-stack-test " 2 run(self=<__main__.Pdb instance at 0xb7d2cc6c>, cmd='execfile( \"../test/gcd.py\")\n', globals={'__builti...) called from file '/usr/local/lib/python2.5/site-packages/pydb/pydbbdb.py' at line 313") (regexp-file-test "(e:\\sources\\capfilterscanner\\capanalyzer.py:3): " "e:\\sources\\capfilterscanner\\capanalyzer.py" ) (regexp-file-test "(e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py:3): " "e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py" ) (regexp-file-test "(/tmp/gcd.py:29): gcd" "/tmp/gcd.py" ) (regexp-file-test "(/tmp/gcd.py:29)" "/tmp/gcd.py" ) ) (defun position-regexp-test (location-str file-str line-str) "Test to see that location-str matches position-regexp-test with the correct file and line submatches." (assert-equal 0 (string-match pydb-position-re location-str)) (assert-equal file-str (match-string pydb-marker-regexp-file-group location-str)) (assert-equal line-str (match-string pydb-marker-regexp-line-group location-str)) ) (deftest "pydb-position-re-test" (position-regexp-test "(e:\\sources\\capfilterscanner\\capanalyzer.py:3): \n" "e:\\sources\\capfilterscanner\\capanalyzer.py" "3" ) (position-regexp-test "(e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py:3): \n" "e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py" "3" ) (position-regexp-test "(/tmp/gcd.py:29): gcd\n" "/tmp/gcd.py" "29" ) (position-regexp-test "(/tmp/gcd.py:29)\n" "/tmp/gcd.py" "29" ) ) (deftest "pydb-get-script-name-test" (assert-equal '("foo" nil) (pydb-get-script-name '("foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("-o" "myfile" "foo"))) (assert-equal '("foo" t) (pydb-get-script-name '("--annotate=1" "foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("pydb" "--target" "tcp:127.0.0.1" "--nx" "foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("pydb" "--threading" "--sigcheck" "--error" "errfile.out" "foo" "-1"))) ) (build-suite "pydb-suite" "pydb-marker-regexp-test" "pydb-position-re-test" "pydb-marker-filter-test") (run-elk-test "pydb-suite" "test regular expression used in tracking lines") pydb-1.26/emacs/test-gud.el0000644000175000017500000000177310752361376012511 00000000000000;; -*- emacs-lisp -*- ;; This program has to be run from the directory it is currently in and ;; the pydb code has to be in the parent directory (load-file "./elk-test.el") (setq load-path (cons "." load-path)) (require 'pydb) (setq load-path (cdr load-path)) (defun y-or-n-p (prompt) "Replacement of y-or-n-p() for pydb testing" (assert-nil "y-or-n-p should not have been called")) (defun error (msg) "Replacement error() for pydb testing" (assert-nil "error should not have been called")) ;; ------------------------------------------------------------------- (deftest "test-pydb-find-file" ;; Set to cause a warning in find-file-no-select and ;; check that it is ignored. (let ((large-file-warning-threshold 1)) (gud-pydb-find-file "elk-test.el"))) ;; ------------------------------------------------------------------- ;; Build and run the test suite. ;; (build-suite "pydb-gud-suite" "test-pydb-find-file") (run-elk-test "pydb-gud-suite" "test some pydb-gud code") pydb-1.26/emacs/Makefile.am0000644000175000017500000000236211117742255012455 00000000000000# Copyright (C) 2006, 2008 Rocky Bernstein rockyb@users.sourceforge.net # # Bash is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2, or (at your option) any later # version. # # Bash is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with Bash; see the file COPYING. If not, write to the Free Software # Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. #$Id: Makefile.am,v 1.14 2008/12/10 13:31:25 rockyb Exp $ check_DATA = pydb-test.el test-gud.el elk-test.el EXTRA_DIST = pydb.el $(check_DATA) ELCFILES = pydb.elc if INSTALL_EMACS_LISP lisp_LISP = pydb.el check: check-pydb check-gud check-pydb: ( cd $(top_srcdir)/emacs && \ $(EMACS) -batch -q -l $(top_builddir)/emacs/pydb-test.el $(top_srcdir)/emacs/elk-test.el ) check-gud: ( cd $(top_srcdir)/emacs && \ $(EMACS) -batch -q -l $(top_srcdir)/emacs/test-gud.el ) test: check endif pydb-1.26/emacs/pydb-test.el0000644000175000017500000000735211167754544012673 00000000000000; -*- emacs-lisp -*- (load-file "./elk-test.el") (load-file "./pydb.el") (make-variable-buffer-local 'gud-pydb-marker-acc) (deftest "pydb-marker-filter-test" (assert-equal "Testing 1 2 3" (gud-pydb-marker-filter "Testing 1 2 3")) (assert-equal "ABC" (gud-pydb-marker-filter "breakpoints No breakpoints  ABC"))) (defun regexp-stack-test (location-str) "Test to see that location-str matches pydb--stack-frame-regexp" (assert-equal 0 (string-match pydb--stack-frame-regexp location-str)) ) (defun regexp-breakpoint-test (location-str) "Test to see that location-str matches pydb--breakpoint-regexp" (assert-equal 0 (string-match pydb--breakpoint-regexp location-str)) ) (defun regexp-file-test (location-str file-str) "Test to see that location-str matches gud-pydb-marker-regexp" (assert-equal 0 (string-match gud-pydb-marker-regexp location-str)) (assert-equal file-str (substring location-str (match-beginning gud-pydb-marker-regexp-file-group) (match-end gud-pydb-marker-regexp-file-group))) ) (deftest "pydb-marker-regexp-test" (regexp-breakpoint-test "1 breakpoint keep y at /src/external-cvs/pydb/test/gcd.py:24") (regexp-stack-test "-> 0 () called from file '/src/external-cvs/pydb/test/gcd.py' at line 10") (regexp-stack-test " 1 () called from file '' at line 1") (regexp-stack-test " 2 run(self=<__main__.Pdb instance at 0xb7d2cc6c>, cmd='execfile( \"../test/gcd.py\")\n', globals={'__builti...) called from file '/usr/local/lib/python2.5/site-packages/pydb/pydbbdb.py' at line 313") (regexp-file-test "(e:\\sources\\capfilterscanner\\capanalyzer.py:3): " "e:\\sources\\capfilterscanner\\capanalyzer.py" ) (regexp-file-test "(e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py:3): " "e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py" ) (regexp-file-test "(/tmp/gcd.py:29): gcd" "/tmp/gcd.py" ) (regexp-file-test "(/tmp/gcd.py:29)" "/tmp/gcd.py" ) ) (defun position-regexp-test (location-str file-str line-str) "Test to see that location-str matches position-regexp-test with the correct file and line submatches." (assert-equal 0 (string-match pydb-position-re location-str)) (assert-equal file-str (match-string pydb-marker-regexp-file-group location-str)) (assert-equal line-str (match-string pydb-marker-regexp-line-group location-str)) ) (deftest "pydb-position-re-test" (position-regexp-test "(e:\\sources\\capfilterscanner\\capanalyzer.py:3): \n" "e:\\sources\\capfilterscanner\\capanalyzer.py" "3" ) (position-regexp-test "(e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py:3): \n" "e:\\Documents and Settings\\jsmith\\My Documents\\cpanalyzer test.py" "3" ) (position-regexp-test "(/tmp/gcd.py:29): gcd\n" "/tmp/gcd.py" "29" ) (position-regexp-test "(/tmp/gcd.py:29)\n" "/tmp/gcd.py" "29" ) ) (deftest "pydb-get-script-name-test" (assert-equal '("foo" nil) (pydb-get-script-name '("foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("-o" "myfile" "foo"))) (assert-equal '("foo" t) (pydb-get-script-name '("--annotate=1" "foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("pydb" "--target" "tcp:127.0.0.1" "--nx" "foo"))) (assert-equal '("foo" nil) (pydb-get-script-name '("pydb" "--threading" "--sigcheck" "--error" "errfile.out" "foo" "-1"))) ) (build-suite "pydb-suite" "pydb-marker-regexp-test" "pydb-position-re-test" "pydb-marker-filter-test") (run-elk-test "pydb-suite" "test regular expression used in tracking lines") pydb-1.26/emacs/pydb.el0000644000175000017500000010601711131733275011701 00000000000000;; Copyright (C) 2006, 2007 Free Software Foundation, Inc. ;; Copyright (C) 2007, 2009 Rocky Bernstein (rocky@gnu.org) ;; This file is (not yet) part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ====================================================================== ;; pydb (Python extended debugger) functions (if (< emacs-major-version 22) (error "This version of pydb.el needs at least Emacs 22 or greater - you have version %d." emacs-major-version)) (require 'gud) ;; User-definable variables ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv (defcustom gud-pydb-command-name "pydb --annotate=3" "File name for executing the Python debugger. This should be an executable on your path, or an absolute file name." :type 'string :group 'gud) (defcustom pydb-temp-directory (let ((ok '(lambda (x) (and x (setq x (expand-file-name x)) ; always true (file-directory-p x) (file-writable-p x) x)))) (or (funcall ok (getenv "TMPDIR")) (funcall ok "/usr/tmp") (funcall ok "/tmp") (funcall ok "/var/tmp") (funcall ok ".") (error "Couldn't find a usable temp directory -- set `pydb-temp-directory'"))) "*Directory used for temporary files created by a *Python* process. By default, the first directory from this list that exists and that you can write into: the value (if any) of the environment variable TMPDIR, /usr/tmp, /tmp, /var/tmp, or the current directory." :type 'string :group 'pydb) (defgroup pydbtrack nil "Pydb file tracking by watching the prompt." :prefix "pydb-pydbtrack-" :group 'shell) (defcustom pydb-pydbtrack-do-tracking-p nil "*Controls whether the pydbtrack feature is enabled or not. When non-nil, pydbtrack is enabled in all comint-based buffers, e.g. shell buffers and the *Python* buffer. When using pydb to debug a Python program, pydbtrack notices the pydb prompt and displays the source file and line that the program is stopped at, much the same way as gud-mode does for debugging C programs with gdb." :type 'boolean :group 'pydb) (make-variable-buffer-local 'pydb-pydbtrack-do-tracking-p) (defcustom pydb-many-windows nil "*If non-nil, display secondary pydb windows, in a layout similar to `gdba'. However only set to the multi-window display if the pydb command invocation has an annotate options (\"--annotate 1\"." :type 'boolean :group 'pydb) (defcustom pydb-pydbtrack-minor-mode-string " PYDB" "*String to use in the minor mode list when pydbtrack is enabled." :type 'string :group 'pydb) ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT (defvar gud-pydb-history nil "History of argument lists passed to pydb.") (defconst gud-pydb-marker-regexp "^(\\(\\(?:[a-zA-Z]:\\)?[-a-zA-Z0-9_/.\\\\ ]+\\):\\([0-9]+\\))" "Regular expression used to find a file location given by pydb. Program-location lines look like this: (/usr/bin/zonetab2pot.py:15): or MS Windows: (c:\\mydirectory\\gcd.py:10): and in tracebacks like this: (/usr/bin/zonetab2pot.py:15) ") (defconst gud-pydb-marker-regexp-file-group 1 "Group position in gud-pydb-marker-regexp that matches the file name.") (defconst gud-pydb-marker-regexp-line-group 2 "Group position in gud-pydb-marker-regexp that matches the line number.") ;;----------------------------------------------------------------------------- ;; ALB - annotations support ;;----------------------------------------------------------------------------- (defconst pydb-annotation-start-regexp "\\([a-z]+\\)\n") (defconst pydb-annotation-end-regexp "^\n") (defun gud-pydb-massage-args (file args) args) ;; There's no guarantee that Emacs will hand the filter the entire ;; marker at once; it could be broken up across several strings. We ;; might even receive a big chunk with several markers in it. If we ;; receive a chunk of text which looks like it might contain the ;; beginning of a marker, we save it here between calls to the ;; filter. (defun gud-pydb-marker-filter (string) ;;(message "GOT: %s" string) (setq gud-marker-acc (concat gud-marker-acc string)) ;;(message "ACC: %s" gud-marker-acc) (let ((output "") s s2 (tmp "")) ;; ALB first we process the annotations (if any) (while (setq s (string-match pydb-annotation-start-regexp gud-marker-acc)) (let ((name (substring gud-marker-acc (match-beginning 1) (match-end 1))) (end (match-end 0))) (if (setq s2 (string-match pydb-annotation-end-regexp gud-marker-acc end)) ;; ok, annotation complete, process it and remove it (let ((contents (substring gud-marker-acc end s2)) (end2 (match-end 0))) (pydb-process-annotation name contents) (setq gud-marker-acc (concat (substring gud-marker-acc 0 s) (substring gud-marker-acc end2)))) ;; otherwise, save the partial annotation to a temporary, and re-add ;; it to gud-marker-acc after normal output has been processed (setq tmp (substring gud-marker-acc s)) (setq gud-marker-acc (substring gud-marker-acc 0 s))))) (when (setq s (string-match pydb-annotation-end-regexp gud-marker-acc)) ;; save the beginning of gud-marker-acc to tmp, remove it and restore it ;; after normal output has been processed (setq tmp (substring gud-marker-acc 0 s)) (setq gud-marker-acc (substring gud-marker-acc s))) ;; Process all the complete markers in this chunk. ;; Format of line looks like this: ;; (/etc/init.d/ntp.init:16): ;; but we also allow DOS drive letters ;; (d:/etc/init.d/ntp.init:16): (while (string-match gud-pydb-marker-regexp gud-marker-acc) (setq ;; Extract the frame position from the marker. gud-last-frame (cons (substring gud-marker-acc (match-beginning gud-pydb-marker-regexp-file-group) (match-end gud-pydb-marker-regexp-file-group)) (string-to-number (substring gud-marker-acc (match-beginning gud-pydb-marker-regexp-line-group) (match-end gud-pydb-marker-regexp-line-group)))) ;; Append any text before the marker to the output we're going ;; to return - include the marker in this text. output (concat output (substring gud-marker-acc 0 (match-end 0))) ;; Set the accumulator to the remaining text. gud-marker-acc (substring gud-marker-acc (match-end 0)))) ;; Does the remaining text look like it might end with the ;; beginning of another marker? If it does, then keep it in ;; gud-marker-acc until we receive the rest of it. Since we ;; know the full marker regexp above failed, it's pretty simple to ;; test for marker starts. (if (string-match "\032.*\\'" gud-marker-acc) (progn ;; Everything before the potential marker start can be output. (setq output (concat output (substring gud-marker-acc 0 (match-beginning 0)))) ;; Everything after, we save, to combine with later input. (setq gud-marker-acc (concat tmp (substring gud-marker-acc (match-beginning 0))))) (setq output (concat output gud-marker-acc) gud-marker-acc tmp)) output)) (defun gud-pydb-find-file (f) (find-file-noselect f 'nowarn)) ; From Emacs 23 (unless (fboundp 'split-string-and-unquote) (defun split-string-and-unquote (string &optional separator) "Split the STRING into a list of strings. It understands Emacs Lisp quoting within STRING, such that (split-string-and-unquote (combine-and-quote-strings strs)) == strs The SEPARATOR regexp defaults to \"\\s-+\"." (let ((sep (or separator "\\s-+")) (i (string-match "[\"]" string))) (if (null i) (split-string string sep t) ; no quoting: easy (append (unless (eq i 0) (split-string (substring string 0 i) sep t)) (let ((rfs (read-from-string string i))) (cons (car rfs) (split-string-and-unquote (substring string (cdr rfs)) sep))))))) ) (defun pydb-get-script-name (args &optional annotate-p) "Pick out the script name from the command line and return a list of that and whether the annotate option was set. Initially annotate should be set to nil." (let ((arg (pop args))) (cond ((not arg) (list nil annotate-p)) ((string-match "^--annotate=[1-9]" arg) (pydb-get-script-name args t)) ((member arg '("-t" "--target" "-o" "--output" "--execute" "-e" "--error" "--cd" "-x" "--command")) (if args (pydb-get-script-name (cdr args) annotate-p) ;else (list nil annotate-p))) ((string-match "^-[a-zA-z]" arg) (pydb-get-script-name args annotate-p)) ((string-match "^--[a-zA-z]+" arg) (pydb-get-script-name args annotate-p)) ((string-match "^pydb" arg) (pydb-get-script-name args annotate-p)) ; found script name (or nil (t (list arg annotate-p))))) ;;;###autoload (defun pydb (command-line) "Run pydb on program FILE in buffer *gud-cmd-FILE*. The directory containing FILE becomes the initial working directory and source-file directory for your debugger. The custom variable `gud-pydb-command-name' sets the pattern used to invoke pydb. If `pydb-many-windows' is nil (the default value) then pydb just starts with two windows: one displaying the GUD buffer and the other with the source file with the main routine of the inferior. If `pydb-many-windows' is t, regardless of the value of the layout below will appear. +----------------------------------------------------------------------+ | GDB Toolbar | +-----------------------------------+----------------------------------+ | GUD buffer (I/O of pydb) | Locals buffer | | | | | | | | | | +-----------------------------------+----------------------------------+ | Source buffer | | | +-----------------------------------+----------------------------------+ | Stack buffer | Breakpoints buffer | | RET pydb-goto-stack-frame | SPC pydb-toggle-breakpoint | | | RET pydb-goto-breakpoint | | | D pydb-delete-breakpoint | +-----------------------------------+----------------------------------+ " (interactive (list (gud-query-cmdline 'pydb))) ; Parse the command line and pick out the script name and whether --annotate ; has been set. (let* ((words (split-string-and-unquote command-line)) (script-name-annotate-p (pydb-get-script-name (gud-pydb-massage-args "1" words) nil)) (target-name (file-name-nondirectory (car script-name-annotate-p))) (annotate-p (cadr script-name-annotate-p)) (pydb-buffer-name (format "*pydb-cmd-%s*" target-name)) (pydb-buffer (get-buffer pydb-buffer-name)) ) ;; `gud-pydb-massage-args' needs whole `command-line'. ;; command-line is refered through dyanmic scope. (gud-common-init command-line 'gud-pydb-massage-args 'gud-pydb-marker-filter 'gud-pydb-find-file) ; gud-common-init sets the pydb process buffer name incorrectly, because ; it can't parse the command line properly to pick out the script name. ; So we'll do it here and rename that buffer. The buffer we want to rename ; happens to be the current buffer. (setq gud-target-name target-name) (when pydb-buffer (kill-buffer pydb-buffer)) (rename-buffer pydb-buffer-name) (set (make-local-variable 'gud-minor-mode) 'pydb) (gud-def gud-args "info args" "a" "Show arguments of current stack.") (gud-def gud-break "break %d%f:%l""\C-b" "Set breakpoint at current line.") (gud-def gud-cont "continue" "\C-r" "Continue with display.") (gud-def gud-down "down %p" ">" "Down N stack frames (numeric arg).") (gud-def gud-finish "finish" "f\C-f" "Finish executing current function.") (gud-def gud-next "next %p" "\C-n" "Step one line (skip functions).") (gud-def gud-print "p %e" "\C-p" "Evaluate python expression at point.") (gud-def gud-remove "clear %d%f:%l" "\C-d" "Remove breakpoint at current line") (gud-def gud-run "run" "R" "Restart the Python script.") (gud-def gud-statement "eval %e" "\C-e" "Execute Python statement at point.") (gud-def gud-step "step %p" "\C-s" "Step one source line with display.") (gud-def gud-tbreak "tbreak %d%f:%l" "\C-t" "Set temporary breakpoint at current line.") (gud-def gud-up "up %p" "<" "Up N stack frames (numeric arg).") (gud-def gud-where "where" "T" "Show stack trace.") (local-set-key "\C-i" 'gud-gdb-complete-command) (setq comint-prompt-regexp "^(+Pydb)+ *") (setq paragraph-start comint-prompt-regexp) ;; Update GUD menu bar (define-key gud-menu-map [args] '("Show arguments of current stack" . gud-args)) (define-key gud-menu-map [down] '("Down Stack" . gud-down)) (define-key gud-menu-map [eval] '("Execute Python statement at point" . gud-statement)) (define-key gud-menu-map [finish] '("Finish Function" . gud-finish)) (define-key gud-menu-map [run] '("Restart the Python Script" . gud-run)) (define-key gud-menu-map [stepi] 'undefined) (define-key gud-menu-map [tbreak] '("Temporary break" . gud-tbreak)) (define-key gud-menu-map [up] '("Up Stack" . gud-up)) (define-key gud-menu-map [where] '("Show stack trace" . gud-where)) (local-set-key [menu-bar debug finish] '("Finish Function" . gud-finish)) (local-set-key [menu-bar debug up] '("Up Stack" . gud-up)) (local-set-key [menu-bar debug down] '("Down Stack" . gud-down)) (setq comint-prompt-regexp "^(+Pydb)+ *") (setq paragraph-start comint-prompt-regexp) ; remove other py-pdbtrack if which gets in the way (remove-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file) (setq paragraph-start comint-prompt-regexp) (when (and annotate-p pydb-many-windows) (pydb-setup-windows)) (run-hooks 'pydb-mode-hook))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; pydbtrack --- tracking pydb debugger in an Emacs shell window ;;; Modified from python-mode in particular the part: ;; pdbtrack support contributed by Ken Manheimer, April 2001. ;;; Code: (require 'comint) (require 'custom) (require 'cl) (require 'compile) (require 'shell) ;; have to bind pydb-file-queue before installing the kill-emacs-hook (defvar pydb-file-queue nil "Queue of Makefile temp files awaiting execution. Currently-active file is at the head of the list.") (defvar pydb-pydbtrack-is-tracking-p t) ;; Constants (defconst pydb-position-re "\\(^\\|\n\\)(\\(\\(?:[A-Za-z]:\\)?[^:]+\\):\\([0-9]*\\)).*\n" "Regular expression for a pydb position") (defconst pydb-marker-regexp-file-group 2 "Group position in pydb-postiion-re that matches the file name.") (defconst pydb-marker-regexp-line-group 3 "Group position in pydb-position-re that matches the line number.") (defconst pydb-traceback-line-re "^[ \t]+File \"\\([^\"]+\\)\", line \\([0-9]*\\)," "Regular expression that describes Python tracebacks.") (defconst pydb-pydbtrack-input-prompt "\n(+Pydb)+ *" "Regular expression pydbtrack uses to recognize a pydb prompt.") (defconst pydb-pydbtrack-track-range 10000 "Max number of characters from end of buffer to search for stack entry.") (defun pydb-pydbtrack-overlay-arrow (activation) "Activate or de arrow at beginning-of-line in current buffer." ;; This was derived/simplified from edebug-overlay-arrow (cond (activation (setq overlay-arrow-position (make-marker)) (setq overlay-arrow-string "=>") (set-marker overlay-arrow-position (point) (current-buffer)) (setq pydb-pydbtrack-is-tracking-p t)) (pydb-pydbtrack-is-tracking-p (setq overlay-arrow-position nil) (setq pydb-pydbtrack-is-tracking-p nil)) )) (defun pydb-pydbtrack-track-stack-file (text) "Show the file indicated by the pydb stack entry line, in a separate window. Activity is disabled if the buffer-local variable `pydb-pydbtrack-do-tracking-p' is nil. We depend on the pydb input prompt matching `pydb-pydbtrack-input-prompt' at the beginning of the line. " ;; Instead of trying to piece things together from partial text ;; (which can be almost useless depending on Emacs version), we ;; monitor to the point where we have the next pydb prompt, and then ;; check all text from comint-last-input-end to process-mark. ;; ;; Also, we're very conservative about clearing the overlay arrow, ;; to minimize residue. This means, for instance, that executing ;; other pydb commands wipe out the highlight. You can always do a ;; 'where' (aka 'w') command to reveal the overlay arrow. (let* ((origbuf (current-buffer)) (currproc (get-buffer-process origbuf))) (if (not (and currproc pydb-pydbtrack-do-tracking-p)) (pydb-pydbtrack-overlay-arrow nil) ;else (let* ((procmark (process-mark currproc)) (block-start (max comint-last-input-end (- procmark pydb-pydbtrack-track-range))) (block-str (buffer-substring block-start procmark)) target target_fname target_lineno target_buffer) (if (not (string-match (concat pydb-pydbtrack-input-prompt "$") block-str)) (pydb-pydbtrack-overlay-arrow nil) (setq target (pydb-pydbtrack-get-source-buffer block-str)) (if (stringp target) (message "pydbtrack: %s" target) ;else (gud-pydb-marker-filter block-str) (setq target_lineno (car target)) (setq target_buffer (cadr target)) (setq target_fname (buffer-file-name target_buffer)) (switch-to-buffer-other-window target_buffer) (goto-line target_lineno) (message "pydbtrack: line %s, file %s" target_lineno target_fname) (pydb-pydbtrack-overlay-arrow t) (pop-to-buffer origbuf t) ) ; Delete processed annotations from buffer. (save-excursion (let ((annotate-start) (annotate-end (point-max))) (goto-char block-start) (while (re-search-forward pydb-annotation-start-regexp annotate-end t) (setq annotate-start (match-beginning 0)) (if (re-search-forward pydb-annotation-end-regexp annotate-end t) (delete-region annotate-start (point)) ;else (forward-line))) ))) ))) ) (defun pydb-pydbtrack-get-source-buffer (block-str) "Return line number and buffer of code indicated by block-str's traceback text. We look first to visit the file indicated in the trace. Failing that, we look for the most recently visited python-mode buffer with the same name or having having the named function. If we're unable find the source code we return a string describing the problem as best as we can determine." (if (not (string-match pydb-position-re block-str)) "line number cue not found" (let* ((filename (match-string pydb-marker-regexp-file-group block-str)) (lineno (string-to-number (match-string pydb-marker-regexp-line-group block-str))) funcbuffer) (cond ((file-exists-p filename) (list lineno (find-file-noselect filename))) ((= (elt filename 0) ?\<) (format "(Non-file source: '%s')" filename)) (t (format "Not found: %s" filename))) ) ) ) ;;; Subprocess commands ;; pydbtrack functions (defun pydb-pydbtrack-toggle-stack-tracking (arg) (interactive "P") (if (not (get-buffer-process (current-buffer))) (error "No process associated with buffer '%s'" (current-buffer))) ;; missing or 0 is toggle, >0 turn on, <0 turn off (if (or (not arg) (zerop (setq arg (prefix-numeric-value arg)))) (setq pydb-pydbtrack-do-tracking-p (not pydb-pydbtrack-do-tracking-p)) (setq pydb-pydbtrack-do-tracking-p (> arg 0))) (message "%sabled pydb's pydbtrack" (if pydb-pydbtrack-do-tracking-p "En" "Dis"))) (defun turn-on-pydbtrack () (interactive) (pydb-pydbtrack-toggle-stack-tracking 1) (setq pydb-pydbtrack-is-tracking-p t) (local-set-key "\C-cg" 'pydb-goto-traceback-line) (add-hook 'comint-output-filter-functions 'pydb-pydbtrack-track-stack-file) ; remove other py-pdbtrack if which gets in the way (remove-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file)) (remove-hook 'comint-output-filter-functions 'py-rdebugtrack-track-stack-file) (defun turn-off-pydbtrack () (interactive) (pydb-pydbtrack-toggle-stack-tracking 0) (setq pydb-pydbtrack-is-tracking-p nil) (remove-hook 'comint-output-filter-functions 'pydb-pydbtrack-track-stack-file) ) ;; Add a designator to the minor mode strings if we are tracking (or (assq 'pydb-pydbtrack-minor-mode-string minor-mode-alist) (push '(pydb-pydbtrack-is-tracking-p pydb-pydbtrack-minor-mode-string) minor-mode-alist)) ;; pydbtrack ;;----------------------------------------------------------------------------- ;; ALB - annotations support ;;----------------------------------------------------------------------------- (defvar pydb--annotation-setup-map (progn (define-hash-table-test 'str-hash 'string= 'sxhash) (let ((map (make-hash-table :test 'str-hash))) (puthash "breakpoints" 'pydb--setup-breakpoints-buffer map) (puthash "stack" 'pydb--setup-stack-buffer map) (puthash "locals" 'pydb--setup-locals-buffer map) map))) (defun pydb-process-annotation (name contents) (let ((buf (get-buffer-create (format "*pydb-%s-%s*" name gud-target-name)))) (with-current-buffer buf (setq buffer-read-only t) (let ((inhibit-read-only t) (setup-func (gethash name pydb--annotation-setup-map))) (erase-buffer) (insert contents) (when setup-func (funcall setup-func buf)))))) (defun pydb-setup-windows () "Layout the window pattern for `pydb-many-windows'. This was mostly copied from `gdb-setup-windows', but simplified." (pop-to-buffer gud-comint-buffer) (let ((script-name gud-target-name)) (delete-other-windows) (split-window nil ( / ( * (window-height) 3) 4)) (split-window nil ( / (window-height) 3)) (split-window-horizontally) (other-window 1) (set-window-buffer (selected-window) (get-buffer-create (format "*pydb-locals-%s*" script-name))) (other-window 1) (switch-to-buffer (if gud-last-last-frame (gud-find-file (car gud-last-last-frame)) ;; Put buffer list in window if we ;; can't find a source file. (list-buffers-noselect))) (other-window 1) (set-window-buffer (selected-window) (get-buffer-create (format "*pydb-stack-%s*" script-name))) (split-window-horizontally) (other-window 1) (set-window-buffer (selected-window) (get-buffer-create (format "*pydb-breakpoints-%s*" script-name))) (other-window 1) (goto-char (point-max)))) (defun pydb-restore-windows () "Equivalent of `gdb-restore-windows' for pydb." (interactive) (when pydb-many-windows (pydb-setup-windows))) (defun pydb-set-windows (&optional name) "Sets window used in multi-window frame and issues pydb-restore-windows if pydb-many-windows is set" (interactive "sProgram name: ") (when name (setq gud-target-name name) (setq gud-comint-buffer (current-buffer))) (when gud-last-frame (setq gud-last-last-frame gud-last-frame)) (when pydb-many-windows (pydb-setup-windows))) ;; ALB fontification and keymaps for secondary buffers (breakpoints, stack) ;; -- breakpoints (defvar pydb-breakpoints-mode-map (let ((map (make-sparse-keymap)) (menu (make-sparse-keymap "Breakpoints"))) (define-key menu [quit] '("Quit" . pydb-delete-frame-or-window)) (define-key menu [goto] '("Goto" . pydb-goto-breakpoint)) (define-key menu [delete] '("Delete" . pydb-delete-breakpoint)) (define-key map [mouse-2] 'pydb-goto-breakpoint-mouse) (define-key map [? ] 'pydb-toggle-breakpoint) (define-key map [(control m)] 'pydb-goto-breakpoint) (define-key map [?d] 'pydb-delete-breakpoint) map) "Keymap to navigate/set/enable pydb breakpoints.") (defun pydb-delete-frame-or-window () "Delete frame if there is only one window. Otherwise delete the window." (interactive) (if (one-window-p) (delete-frame) (delete-window))) (defun pydb-breakpoints-mode () "Major mode for rdebug breakpoints. \\{pydb-breakpoints-mode-map}" (kill-all-local-variables) (setq major-mode 'pydb-breakpoints-mode) (setq mode-name "PYDB Breakpoints") (use-local-map pydb-breakpoints-mode-map) (setq buffer-read-only t) (run-mode-hooks 'pydb-breakpoints-mode-hook) ;(if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba) ; 'gdb-invalidate-breakpoints ; 'gdbmi-invalidate-breakpoints) ) (defconst pydb--breakpoint-regexp "^\\([0-9]+\\) +breakpoint +\\([a-z]+\\) +\\([a-z]+\\) +at +\\(.+\\):\\([0-9]+\\)$" "Regexp to recognize breakpoint lines in pydb breakpoints buffers.") (defun pydb--setup-breakpoints-buffer (buf) "Detects breakpoint lines and sets up keymap and mouse navigation." (with-current-buffer buf (let ((inhibit-read-only t)) (pydb-breakpoints-mode) (goto-char (point-min)) (while (not (eobp)) (let ((b (point-at-bol)) (e (point-at-eol))) (when (string-match pydb--breakpoint-regexp (buffer-substring b e)) (add-text-properties b e (list 'mouse-face 'highlight 'keymap pydb-breakpoints-mode-map)) (add-text-properties (+ b (match-beginning 1)) (+ b (match-end 1)) (list 'face font-lock-constant-face 'font-lock-face font-lock-constant-face)) ;; fontify "keep/del" (let ((face (if (string= "keep" (buffer-substring (+ b (match-beginning 2)) (+ b (match-end 2)))) compilation-info-face compilation-warning-face))) (add-text-properties (+ b (match-beginning 2)) (+ b (match-end 2)) (list 'face face 'font-lock-face face))) ;; fontify "enabled" (when (string= "y" (buffer-substring (+ b (match-beginning 3)) (+ b (match-end 3)))) (add-text-properties (+ b (match-beginning 3)) (+ b (match-end 3)) (list 'face compilation-error-face 'font-lock-face compilation-error-face))) (add-text-properties (+ b (match-beginning 4)) (+ b (match-end 4)) (list 'face font-lock-comment-face 'font-lock-face font-lock-comment-face)) (add-text-properties (+ b (match-beginning 5)) (+ b (match-end 5)) (list 'face font-lock-constant-face 'font-lock-face font-lock-constant-face))) (forward-line) (beginning-of-line)))))) (defun pydb-goto-breakpoint-mouse (event) "Displays the location in a source file of the selected breakpoint." (interactive "e") (with-current-buffer (window-buffer (posn-window (event-end event))) (pydb-goto-breakpoint (posn-point (event-end event))))) (defun pydb-goto-breakpoint (pt) "Displays the location in a source file of the selected breakpoint." (interactive "d") (save-excursion (goto-char pt) (let ((s (buffer-substring (point-at-bol) (point-at-eol)))) (when (string-match pydb--breakpoint-regexp s) (pydb-display-line (substring s (match-beginning 4) (match-end 4)) (string-to-number (substring s (match-beginning 5) (match-end 5)))) )))) (defun pydb-goto-traceback-line (pt) "Displays the location in a source file of the Python traceback line." (interactive "d") (save-excursion (goto-char pt) (let ((s (buffer-substring (point-at-bol) (point-at-eol))) (gud-comint-buffer (current-buffer))) (when (string-match pydb-traceback-line-re s) (pydb-display-line (substring s (match-beginning 1) (match-end 1)) (string-to-number (substring s (match-beginning 2) (match-end 2)))) )))) (defun pydb-toggle-breakpoint (pt) "Toggles the breakpoint at PT in the breakpoints buffer." (interactive "d") (save-excursion (goto-char pt) (let ((s (buffer-substring (point-at-bol) (point-at-eol)))) (when (string-match pydb--breakpoint-regexp s) (let* ((enabled (string= (substring s (match-beginning 3) (match-end 3)) "y")) (cmd (if enabled "disable" "enable")) (bpnum (substring s (match-beginning 1) (match-end 1)))) (gud-call (format "%s %s" cmd bpnum))))))) (defun pydb-delete-breakpoint (pt) "Deletes the breakpoint at PT in the breakpoints buffer." (interactive "d") (save-excursion (goto-char pt) (let ((s (buffer-substring (point-at-bol) (point-at-eol)))) (when (string-match pydb--breakpoint-regexp s) (let ((bpnum (substring s (match-beginning 1) (match-end 1)))) (gud-call (format "delete %s" bpnum))))))) (defun pydb-display-line (file line &optional move-arrow) (let ((oldpos (and gud-overlay-arrow-position (marker-position gud-overlay-arrow-position))) (oldbuf (and gud-overlay-arrow-position (marker-buffer gud-overlay-arrow-position)))) (gud-display-line file line) (unless move-arrow (when gud-overlay-arrow-position (set-marker gud-overlay-arrow-position oldpos oldbuf))))) ;; -- stack (defvar pydb-frames-mode-map (let ((map (make-sparse-keymap))) (define-key map [mouse-1] 'pydb-goto-stack-frame-mouse) (define-key map [mouse-2] 'pydb-goto-stack-frame-mouse) (define-key map [(control m)] 'pydb-goto-stack-frame) map) "Keymap to navigate pydb stack frames.") (defun pydb-frames-mode () "Major mode for pydb frames. \\{pydb-frames-mode-map}" ; (kill-all-local-variables) (interactive "") (setq major-mode 'pydb-frames-mode) (setq mode-name "PYDB Stack Frames") (use-local-map pydb-frames-mode-map) ; (set (make-local-variable 'font-lock-defaults) ; '(gdb-locals-font-lock-keywords)) (run-mode-hooks 'pydb-frames-mode-hook)) (defconst pydb--stack-frame-regexp "^\\(->\\|##\\| \\) +\\([0-9]+\\) +\\([^ (]+\\).+$" "Regexp to recognize stack frame lines in pydb stack buffers.") (defun pydb--setup-stack-buffer (buf) "Detects stack frame lines and sets up mouse navigation." (with-current-buffer buf (let ((inhibit-read-only t) (current-frame-point nil) ; position in stack buffer of selected frame ) (pydb-frames-mode) (goto-char (point-min)) (while (not (eobp)) (let* ((b (point-at-bol)) (e (point-at-eol)) (s (buffer-substring b e))) (when (string-match pydb--stack-frame-regexp s) (add-text-properties (+ b (match-beginning 3)) (+ b (match-end 3)) (list 'face font-lock-function-name-face 'font-lock-face font-lock-function-name-face)) (when (string= (substring s (match-beginning 1) (match-end 1)) "->") ;; highlight the currently selected frame (add-text-properties b e (list 'face 'bold 'font-lock-face 'bold)) (setq overlay-arrow-position (make-marker)) (set-marker overlay-arrow-position (point)) (setq current-frame-point (point))) (add-text-properties b e (list 'mouse-face 'highlight 'keymap pydb-frames-mode-map)))) ;; remove initial ## or -> (beginning-of-line) (delete-char 2) (forward-line) (beginning-of-line)) ; Go back to the selected frame if any (when current-frame-point (goto-char current-frame-point)) ))) (defun pydb-goto-stack-frame (pt) "Show the pydb stack frame correspoding at PT in the pydb stack buffer." (interactive "d") (save-excursion (goto-char pt) (let ((s (concat "##" (buffer-substring (point-at-bol) (point-at-eol))))) (when (string-match pydb--stack-frame-regexp s) (let ((frame (substring s (match-beginning 2) (match-end 2)))) (gud-call (concat "frame " frame))))))) (defun pydb-goto-stack-frame-mouse (event) "Show the pydb stack frame under the mouse in the pydb stack buffer." (interactive "e") (with-current-buffer (window-buffer (posn-window (event-end event))) (pydb-goto-stack-frame (posn-point (event-end event))))) ;; -- locals (defvar pydb-locals-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (define-key map "\r" 'pydb-edit-locals-value) (define-key map "e" 'pydb-edit-locals-value) (define-key map [mouse-1] 'pydb-edit-locals-value) (define-key map [mouse-2] 'pydb-edit-locals-value) (define-key map "q" 'kill-this-buffer) map)) (defun pydb-locals-mode () "Major mode for pydb locals. \\{pydb-locals-mode-map}" ; (kill-all-local-variables) (setq major-mode 'pydb-locals-mode) (setq mode-name "PYDB Locals") (setq buffer-read-only t) (use-local-map pydb-locals-mode-map) ; (set (make-local-variable 'font-lock-defaults) ; '(gdb-locals-font-lock-keywords)) (run-mode-hooks 'pydb-locals-mode-hook)) (defun pydb--setup-locals-buffer (buf) (with-current-buffer buf (pydb-locals-mode))) (defun pydb-edit-locals-value (&optional event) "Assign a value to a variable displayed in the locals buffer." (interactive (list last-input-event)) (save-excursion (if event (posn-set-point (event-end event))) (beginning-of-line) (let* ((var (current-word)) (value (read-string (format "New value (%s): " var)))) (gud-call (format "! %s=%s" var value))))) (defadvice gud-reset (before pydb-reset) "pydb cleanup - remove debugger's internal buffers (frame, breakpoints, etc.)." (dolist (buffer (buffer-list)) (when (string-match "\\*pydb-[a-z]+\\*" (buffer-name buffer)) (let ((w (get-buffer-window buffer))) (when w (delete-window w))) (kill-buffer buffer)))) (ad-activate 'gud-reset) (provide 'pydb) pydb-1.26/emacs/Makefile.in0000644000175000017500000002772311167754542012505 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006, 2008 Rocky Bernstein rockyb@users.sourceforge.net # # Bash is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2, or (at your option) any later # version. # # Bash is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with Bash; see the file COPYING. If not, write to the Free Software # Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. #$Id: Makefile.am,v 1.14 2008/12/10 13:31:25 rockyb Exp $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = emacs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/pydb-test.el.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = pydb-test.el SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(lispdir)" lispLISP_INSTALL = $(INSTALL_DATA) LISP = $(lisp_LISP) am__ELFILES = pydb.el am__ELCFILES = $(am__ELFILES:.el=.elc) elisp_comp = $(top_srcdir)/elisp-comp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CVS2CL = @CVS2CL@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIN_VERSION = @MIN_VERSION@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ READLINE = @READLINE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ check_DATA = pydb-test.el test-gud.el elk-test.el EXTRA_DIST = pydb.el $(check_DATA) ELCFILES = pydb.elc @INSTALL_EMACS_LISP_TRUE@lisp_LISP = pydb.el all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu emacs/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu emacs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh pydb-test.el: $(top_builddir)/config.status $(srcdir)/pydb-test.el.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ elc-stamp: $(LISP) @echo 'WARNING: Warnings can be ignored. :-)' @rm -f elc-temp && touch elc-temp if test "$(EMACS)" != no; then \ set x; \ list='$(LISP)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ set x "$$@" "$$d$$p"; shift; \ done; \ shift; \ EMACS="$(EMACS)" $(SHELL) $(elisp_comp) "$$@" || exit 1; \ else : ; fi @mv -f elc-temp $@ $(am__ELCFILES): elc-stamp @if test "$(EMACS)" != no && test ! -f $@; then \ trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \ if mkdir elc-lock 2>/dev/null; then \ rm -f elc-stamp; \ $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \ rmdir elc-lock; \ else \ while test -d elc-lock; do sleep 1; done; \ test -f elc-stamp; exit $$?; \ fi; \ else : ; fi install-lispLISP: $(lisp_LISP) $(ELCFILES) @$(NORMAL_INSTALL) @if test "$(EMACS)" != no; then \ test -z "$(lispdir)" || $(MKDIR_P) "$(DESTDIR)$(lispdir)"; \ list='$(lisp_LISP)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(lispLISP_INSTALL) '$$d$$p' '$(DESTDIR)$(lispdir)/$$f'"; \ $(lispLISP_INSTALL) "$$d$$p" "$(DESTDIR)$(lispdir)/$$f"; \ if test -f $${p}c; then \ echo " $(lispLISP_INSTALL) '$${p}c' '$(DESTDIR)$(lispdir)/$${f}c'"; \ $(lispLISP_INSTALL) "$${p}c" "$(DESTDIR)$(lispdir)/$${f}c"; \ else : ; fi; \ done; \ else : ; fi uninstall-lispLISP: @$(NORMAL_UNINSTALL) @if test "$(EMACS)" != no; then \ list='$(lisp_LISP)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(lispdir)/$$f' '$(DESTDIR)$(lispdir)/$${f}c'"; \ rm -f "$(DESTDIR)$(lispdir)/$$f" "$(DESTDIR)$(lispdir)/$${f}c"; \ done; \ else : ; fi clean-lisp: -rm -f elc-stamp $(ELCFILES) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_DATA) check: check-am all-am: Makefile $(LISP) $(ELCFILES) installdirs: for dir in "$(DESTDIR)$(lispdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-lisp mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-lispLISP install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-lispLISP .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-lisp \ distclean distclean-generic distdir dvi dvi-am html html-am \ info info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-lispLISP install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-lispLISP @INSTALL_EMACS_LISP_TRUE@check: check-pydb check-gud @INSTALL_EMACS_LISP_TRUE@check-pydb: @INSTALL_EMACS_LISP_TRUE@ ( cd $(top_srcdir)/emacs && \ @INSTALL_EMACS_LISP_TRUE@ $(EMACS) -batch -q -l $(top_builddir)/emacs/pydb-test.el $(top_srcdir)/emacs/elk-test.el ) @INSTALL_EMACS_LISP_TRUE@check-gud: @INSTALL_EMACS_LISP_TRUE@ ( cd $(top_srcdir)/emacs && \ @INSTALL_EMACS_LISP_TRUE@ $(EMACS) -batch -q -l $(top_srcdir)/emacs/test-gud.el ) @INSTALL_EMACS_LISP_TRUE@test: check # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pydb-1.26/NEWS0000644000175000017500000003343011167755753010044 000000000000001.26 04-10-2009 * Add -d (debug debugger) option to ipython * Add pdef command * Allow a signal number in "info signals" * Disassemble command improvements, such as disassembly of frames * Add "p" format specifier in "print" command * Add a skip (statement) command The above are all backports from pydbgr. * Doc fixes 1.25 12-25-2008 * Clean up debugger(). Add "status=continue". * list now works in the presense of zipped eggs * Some small bug fixes and configuration bug fixes 1.24 12-10-2008 * "frame" (no arg) is "frame 0" like gdb * Fix a bug starting ipython and running pydb. * Catch exceptions raised in runcall() * Revise tests for 2.6 and systems without readline * Small doc and test changes. This may be the last release before a major rewrite. 1.23 5-30-2008 * Show parameters on call * Some doc fixes. * add ipython and python commands to go into an ipython or a python shell * add "save" command to save the current breakpoints and/or most settings to a file. (Suggested at a NYC Python group meeting.) * add set/show "deftrace" to allow stopping at a def (method creation) statement. * pseudo gdb-like "annotate" set/show commands and option. * Better emacs interaction via above annotate * bug when "info local" is run inside a "with" statement Fixes for last three items based patches by Alberto Griggio 1.22 2007-04-15 * Add function tracing and option -F. * Call and return trace lines show nesting level. Return will show the value if it is a scalar or string type or return type otherwise. * Make pydb.el work on Emacs 22 and 23. (was previously just 21). Better emacs tolerance on MS Windows. * fix bug in "info thread" when threadframe is not installed (and python < 2.5). * Better ipython interaction. * pm distinquishes now where an exception rolled back to versus where the exception occurred. * BSD Make tolerance 1.21 2007-02-13 * pydb script will do a path search to find a script, same as gdb. If compiled Python script is given, we try to find the non-compiled equivalent. * 'help' command now allows an expression and runs Python's builtin help command (pydoc). Add pydoc command to call pydoc externally. * Make prompt string detection in Emacs pydb-track more MS-friendly. Add a unit test for the Emacs interface. * Allow lowercase signal names, e.g. "int" or "sigint" for "SIGINT". * disassemble command allows for a start line and end line to limit disassembly, same as gdb. Due to these changes, we now require at least Python 2.4.0. * Allow limited expressions many places an int parameter is used in a debugger command * Allow "info thread" always. That is we don't need --threading for this * signal command's output more like gdb's. * Add pydoc's help (i.e. python's built-in help) to debugger "help" command * Add "set"/"show" option to force debugger output to be flushed on write. * set/show "cmdtrace" is now "trace-commands" to match gdb 6.6. * work-around a possible Python 2.5 bug manifested in pm/post_mortem where t.tb_frame.f_lineno != t.tb_lineno * Experimental command completion. "complete" command now adds in local and global names on the first word * Handle a quit when called via pydb.debugger(). Also experimental. * We now print the line text and (and again the line number) when we stop. This is more helpful and more consistent with gdb and other debuggers. Note linetrace adds also (redundant) line number. 1.20 2006-12-10 * Turning on signal checking may slow things down too much. So off by default. Fix bug in "set sigcheck". Add --sigcheck option. * Allow a thread number in "info thread" and "frame" commands if Python 2.5 or threadframe. * Show all threads even if we don't know their names. * Allow Pdb object to get passed in runv(). Allows for better ipython invocation (%pydb) and may be useful in other shells as well * Provide a clue when debugger "run" command given but no "file" has been set. * Better shell-like argument parsing in the "run" command via shlex. * Recover more gracefully if a post-mortem is called and there is none. * "set_trace" is now an alias for "debugger" which is probably a more natural name. * We now tolerate back to Python version 2.3.3 * A number of small bugs fixed and document updates. 1.19 2006-10-27 * info threads: merge in terse display (Python 2.5, threadframe) and sort by thread name (Python 2.5) * Add optional position argument on "continue" command. * Add pydb.runl() and pydb.runv() forms to facilitate debugging a program from inside a Python shell. * fix thread bugs: on startup with threading we stopped one statement too soon. more careful about storing into variables used in threading which are not locked (and so could be changed during a thread switch) * Allow quit in thread debugging when MainThread is the only thread that we are in * fix bugs in signal handling. * Add "stack" and "nostack" to list of things that can be done when a signal is received. * things to make more ipython friendly. * Improve pydb manual 1.18 2006-09-25 * Start thread debugging: info thread [thread-name] [terse|verbose] - show thread info qt - quit current thread can set a breakpoint on a specific thread name. expand definitions of "frame" and "break" for threading * GDB-like signal handling. Some code based on Matt Fleming's 2006 Summer-of-Code project. Gdb's "handle" and "signal" commands. * Add hard kill. May be needed for thread debugging. * Fix bug in handling temporary breakpoints (tbreak) caused by the difference in semantics between pdb's 'clear' command and pdb's (which calls this 'delete' and has a different meaning for 'clear'). * 'examine' command now shows object's instance variables. * add gdb 'FILE' command: allow loading/running a file from within pydb. (The old pydb from ddd had it too.) 1.17 2006-07-29 * Allow entry to the debugger without a script name. * "examine" command output shows object attributes. There is a routine common to both examine and display. * "whatis" shows doc strings if there is one. * Fix a bug where we would get the wrong path in tracing through an "import x as y". This happened only if we invoked from a directory other than where the debugged program lives and we stepped into such an imported method. The fix is to save the the dirname of the script in the debugger instance variable. * Fix bug when using set trace introduced in 1.16 in adding "command". * Add gdb "directory" and "show directories" commands. * All "show" and "info" commands allow unique abbreviations in the subcommand name and in help. E.g. "show dir" for "show directories"; "help dir" for "help directories". * The "turn-on-pydbtrack" command turns removes py-pdbtrack from comint-output-filter-functions which was removing the cursor in the source window. Some small bugs removed from turn-on-pydbtrack. * Tested on Python versions 2.3.4, 2.3.5, 2.4, 2.4.3, and 2.5.b1 on cygwin FreeBSD, GNU/Linux, NetBSD, OSX and Solaris. * Add a subcommand class. Used in "set", "show", "info" (and possibly more down the line). As a result help output now more closely resembles gdb's. Thanks to Matt Fleming for finishing what I started. * More fexible and more general output by no longer assuming we write to sys.stdout. Rather the output object is saved in the instance variable, which could be and often is the same as sys.stdout, but doesn't need to be. This change may make communication used in remote debugging and thread debugging simpler. Many thanks to Matt Fleming for the patch. * Debugger options --output and --error no longer modify program's stdout/stderr. * --exec (-e) added allow debugger commands to be run on startup. Thanks to Matt Fleming * post-mortem(), pm() and set-trace() interfaces changed. The dictionary of assignements removed and instead a list of debugger commands has been added. * Document least-intrusion principle and changes listed above, list of files making up the debugger and changes above. Be more precise on the subtle differences in how the debugger is invoked. * Remove pycheck errors; reduce pycheck warnings * Changes have been made to facilitate addition of future features 1.16 2006-04-27 * Add gdb "command" - run commands on a breakpoint. Code from current pdb sources, but we follow gdb more closely. * Allow one specify in the Pdb class Cmd's "completekey" binding. (Also in current pdb sources.) * Line tracing now shows source text. * Document how to turn on and off from program control. * "list" command is more like gdb's and can accept filename:lineo if that's all that's given (Suggestion from Matt Fleming). Was also off by one in line number listings. * Made pydb document corrections for the "source" command * Reword documentation on how set_trace() works based on confusion observed in comp.lang.python. Note speed implications of using this over setting a breakpoint. * Note in Documentation that "jump" can be used to leave a loop. (Also based on a query in comp.lang.python) * Remove pdb backwards-compatibile runctx. This is a new debugger. 1.15 2006-03-25 * Add gdb history commands: set history ..., show history ..., show commands * Add command completion (gdb: complete) * Add log redirection (gdb: set logging, show logging) * Add gdb directory commands: cd, pwd * Add --cd invocation option * Add installation section in documentation * reorder documentation so important stuff is towards the front. Small text corrections too. * Add pyreadline as a configuration option. * Position location in file in GNU Emacs tracking in when in comint shell: pydbtrack is a modified pdbtrack for Pydb. * Some single-letter command names for these reasons 1. We now have command completion (often) 2. If the letter isn't a command it can be used as a variable name in an assignment 3. There is an alias mechanism that can be used 4. Some of the commands like "j" for "jump" aren't used that much; or in the case of "cont" for "continue", there already was an abbreviation "c". 5. Multiple names makes help and completion more awkward. 1.14 2006-02-28 * Fix bugs in configuration management. Make distcheck works again (sometimes) 1.13 2006-02-27 * Add MAN page (from Debian) * Bump revision to 0.12 to 1.13 to be compatible with Debian pydb package. * Improve set_trace(), post_mortem(), and pm() * Document alternative invocation methods and how to call from a program. * Break out cmds and bdb overrides into a separate module * add optional count on "where" * install in our own directory (e.g. site-packages/pydb) NOTE: REMOVE OLD PYDB INSTALLATIONS BEFORE INSTALLING THIS PYDB. * As a result of the above add __init__.py to give package info. * Don't rely on tabs settings. Remove all tabs in programs and use -t to check that. * Various bug fixes and documentation corrections 0.12 2006-02-21 * Add gdb commands: - "cd" command - "display", "undisplay" - help subcommands for "show", "info", and "set" - info: "display", "line" "source" and "program" - "pwd" command - "return" (early exit from a function) - "shell" command - Extend "info line" to allow a function name. * Use inspect module. Argument parameters and values are now shown. * Break out debugger into more files * File location reporting changed. Is now like mdb, bashdb, or (or perldb) * Changes to make more compatible with ddd. * Doc fixes, add more GNU Emacs debugger commands * "clear" command now accepts a function name * Bugfixes: - allow debugged program to mangle sys.argv (we save our own copy) 0.11 2006-01-29 * Add regression tests! As a result more of the debugger has been tested and a number of bugs in pdb.py have been found and fixed. * Add line tracing. Allow a delay in linetracing: "set linetrace delay *float*" (delay is useful in front-end GUIs) * Add debugger command options: --batch - don't run interactive commands on shell stops --trace (-x) - non-interactive line tracing a la POSIX shells --output (-o) - redirect stdout to a file --error - redirect stderr to a file --command - run a debugger command script * New debugger commands: disassemble - disassemble python instructions source - run a debugger script set basename - show long/short filenames set linetrace - line tracing set linetrace delay - see above set cmdtrace - show debugger script commands before running * step/next can now take a count. E.g. step 2 or next 3. * Show more accurate and useful location when we are stopped on an exec. * Stack trace now reports exec positions a little bit better - it doesn't call it a file. * Emacs interface (pydb.el) updated for expanded commands * set prompt allows embedded blanks and punctiation. Still have problems with trailing blanks. * show with no parameters is like gdb: shows all subcommands. * Class name back to Pdb to make interaction with other programs like ipython more transparent. The *module* name is Pydb, so one must either "import pydb" or import "pdb" (stock debugger). * Error message output made more uniform * output routines can be subclassed * Bugfixes: - __file__ is set before debugging script. (Bug in 2.4.2 pdb.py) 0.10 2006-01-12 First release of extended python debugger. * Add gdb frame command * Add gdb run (restart) command * Add some "set"/"show" commands: args, listsize, version (no set here), dialect * up/down can take a number of frames to move. * Stepping skips over "def" statements. * Document retval * Add info commands ("args", "break", "line', "locals" and "source") * Add examine command analogous to Perl's. * up/down work like gdb's (when gdb dialect is in effect). Can supply an optional number of frames to go up/down. * step/next skip over "def" commands. pydb-1.26/ChangeLog0000644000175000017500000044637511167772525011133 00000000000000## ## autogenerated ChangeLog -- don't edit ## 2009-04-11 Saturday 01:41 Rocky Bernstein * AUTHORS: Typo. 2009-04-10 Friday 23:53 Rocky Bernstein * NEWS: What's up 2009-04-10 Friday 23:41 Rocky Bernstein * configure.ac, Doc/lib/libpydb.tex, test/Makefile.am, test/data/Makefile.am: Get ready for 1.26 release 2009-04-03 Friday 16:28 Rocky Bernstein * test/unit/pydbcmd.py.in: Start a unit test for pydbcmd.py 2009-03-31 Tuesday 19:52 Rocky Bernstein * pydb/gdb.py.in, test/test-disassem.py.in, test/data/noscript.right: Go over disassemble 2009-03-25 Wednesday 20:48 Rocky Bernstein * pydb/: disassemble.py, gdb.py.in: Add ability to disassemble pyc although no debugger commands use right now. 2009-03-20 Friday 01:30 Rocky Bernstein * pydb/fns.py: Include function signature for callables in the "examine" command. 2009-03-18 Wednesday 10:15 Rocky Bernstein * test/: cmdparse.cmd, data/cmdparse.right: Add test of "list ." 2009-03-18 Wednesday 10:12 Rocky Bernstein * configure.ac, pydb/fns.py, pydb/gdb.py.in, pydb/pydbcmd.py, test/unit/bytecode.py.in, test/unit/sighandler.py.in: Add ipython magic. Add "list ." 2009-03-17 Tuesday 22:06 Rocky Bernstein * pydb/gdb.py.in: Add -d option to ipython. Partial backport from pydbgr 2009-03-17 Tuesday 21:36 Rocky Bernstein * configure.ac, pydb/fns.py, pydb/gdb.py.in, test/unit/.cvsignore, test/unit/bytecode.py.in, test/unit/fns.py.in: Add pdef (backported from pydbgr) 2009-03-14 Saturday 09:42 Rocky Bernstein * htdocs/features.html: Small tweaks to css. 2009-03-14 Saturday 09:36 Rocky Bernstein * htdocs/features.html: Revice css, node ddd 3.3.12 now. 2009-03-12 Thursday 03:10 Rocky Bernstein * pydb/fns.py: Guard against None curframe in checkline 2009-03-07 Saturday 04:20 Rocky Bernstein * pydb/sighandler.py, test/data/sighandler.right: Wrongly changed how sighandler work, previously 2009-03-06 Friday 09:41 Rocky Bernstein * pydb/: display.py, gdb.py.in, info.py, pydbbdb.py: Start backporting display code from pydbgr. More modularity fixes are needed, but it's too do in one shot. 2009-03-06 Friday 08:55 Rocky Bernstein * test/: .cvsignore, unit/.cvsignore: Administrivia 2009-03-06 Friday 08:51 Rocky Bernstein * configure.ac, pydb/sighandler.py, test/test-sighandle.py.in, test/data/sighandler.right, test/unit/.cvsignore, test/unit/bytecode.py.in, test/unit/sighandler.py.in: Backport signal handling bug fixes from pydbgr 2009-03-05 Thursday 02:55 Rocky Bernstein * pydb/sighandler.py: One more wafer-thin change... 2009-03-05 Thursday 02:43 Rocky Bernstein * pydb/sighandler.py: Allow a signal number in "info signals" 2009-03-02 Monday 03:03 Rocky Bernstein * pydb/sighandler.py: Cosmetics and doc grammar typo. 2009-02-28 Saturday 11:26 Rocky Bernstein * pydb/threaddbg.py: More msg->errmsg tagging. "Don't"->"I don't" 2009-02-28 Saturday 11:14 Rocky Bernstein * pydb/threaddbg.py: Tag some error messages as such 2009-02-22 Sunday 07:46 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in: Bug in python command. Python in contrast to Ruby and POSIX shell needs parens on function calls. Remove retval/rv which do not work. 2009-02-17 Tuesday 10:52 Rocky Bernstein * pydb/pydbbdb.py: Need to use relpath to weed out paths with symlinks in them 2009-02-09 Monday 09:28 Rocky Bernstein * configure.ac, Doc/lib/libpydb.tex, test/skip.cmd, test/test-complete.py.in, test/test-skip.py.in, test/data/skip.right, test/unit/Makefile.am, test/unit/bytecode.py.in: Add unit and integration test for the "skip" command. Add it to the command reference too 2009-02-09 Monday 03:13 Rocky Bernstein * Makefile.am, pydb/bytecode.py, pydb/fns.py, pydb/gdb.py.in, pydb/pydbbdb.py: Backport skip command from pydbg 2009-01-28 Wednesday 02:46 Rocky Bernstein * pydb/pydbcmd.py: Small doc grammar fix. 2009-01-28 Wednesday 00:08 Rocky Bernstein * pydb/gdb.py.in: Backport "p" format specifier from pydbg 2009-01-26 Monday 04:03 Rocky Bernstein * htdocs/index.html: Use relative units. 2009-01-26 Monday 03:55 Rocky Bernstein * htdocs/jc.css: Use relative units more 2009-01-23 Friday 05:13 Rocky Bernstein * pydb/: disassemble.py, gdb.py.in: Better arg interface 2009-01-22 Thursday 03:50 Rocky Bernstein * pydb/disassemble.py, pydb/gdb.py.in, test/test-sig.py.in, test/data/noscript.right: Bugs. Align better with pydbg. 2009-01-22 Thursday 03:32 Rocky Bernstein * pydb/: disassemble.py, gdb.py.in: dissassemble: Allow '.' to mean the current line and negative number to mean the number of statments to disassemble. 2009-01-19 Monday 18:12 Rocky Bernstein * pydb/: disassemble.py, pydb.py.in: Allow dissasembly of frames. Print object before disassembling it so we know what we have got. 2009-01-17 Saturday 07:55 Rocky Bernstein * pydb/fns.py, pydb/pydbbdb.py, test/data/brkpt2.right, test/data/file-2.5.right: Disassemble enough to show function calls when that is not shown in the stack 2009-01-17 Saturday 06:42 Rocky Bernstein * pydb/pydbcmd.py: This time, for sure! 2009-01-17 Saturday 06:37 Rocky Bernstein * pydb/pydbcmd.py, test/data/brkpt2.right, test/data/trace-2.5.right: A better way to make the previous change 2009-01-17 Saturday 06:31 Rocky Bernstein * pydb/pydbcmd.py, test/data/brkpt2.right, test/data/trace-2.5.right: Use positions behind eval positions or none at all 2009-01-16 Friday 04:12 Rocky Bernstein * pydb/gdb.py.in: Fix bugs in "return" command. Am I the only one who uses this piece of...? 2009-01-14 Wednesday 02:50 Rocky Bernstein * pydb/: info.py, show.py: Small typos 2009-01-09 Friday 20:44 Rocky Bernstein * test/test-sig.py.in: Module location status changed (for the better) 2009-01-06 Tuesday 17:19 Rocky Bernstein * pydb/pydb.py.in: Make sure shadow copy of program args is initialized 2009-01-04 Sunday 15:18 Rocky Bernstein * pydb/: fns.py, gdb.py.in: get_confirmation was not lowercasing and blank-stripping the reply. Simplify interface and show default value. (Done in conjunction with work on pydbg). 2009-01-04 Sunday 03:38 Rocky Bernstein * emacs/pydb.el: Show location output in command buffer. It was a mistake not to have removed it. 2009-01-03 Saturday 14:13 Rocky Bernstein * pydb/pydbbdb.py, test/data/brkpt2.right, test/data/file-2.5.right, test/data/tracetest-2.5.right: More tweaking of stack display of modules (rather than fn/method) 2009-01-03 Saturday 13:57 Rocky Bernstein * pydb/pydbbdb.py: Tidy code a little bit. (This and last change from pydbg rewrite) 2009-01-03 Saturday 13:48 Rocky Bernstein * pydb/pydbbdb.py, test/data/brkpt2.right, test/data/file-2.5.right, test/data/tracetest-2.5.right: Remove extraneous () from () in format_stack_entry. 2009-01-03 Saturday 03:50 Rocky Bernstein * pydb/fns.py: Typo 2008-12-31 Wednesday 11:36 Rocky Bernstein * htdocs/: index.html: Presumably a little more compliant 2008-12-31 Wednesday 10:36 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex: Correct documentation of debugger() to remove new_instance and add status. Put precmd hook and using status='continue' in a new section 2008-12-31 Wednesday 02:48 Rocky Bernstein * pydb/gdb.py.in: Doc elaboration on kill command. 2008-12-28 Sunday 16:20 Rocky Bernstein * pydb/pydbcmd.py: Docstring typo 2008-12-26 Friday 04:32 Rocky Bernstein * pydb/gdb.py.in: More guarding against a lack of readline 2008-12-26 Friday 03:03 Rocky Bernstein * Makefile.am, configure.ac: Fix Emacs 22 testing/building 2008-12-26 Friday 02:40 Rocky Bernstein * Makefile.am, configure.ac, test/dbgcall.py, test/test-dbgcall.py.in, test/test.py.in, test/data/Makefile.am, test/data/dbgcall-2.5.right, test/data/dbgcall.right: Add configure --with-emacs option. Better test support for emacs < 22 and python < 2.5 2008-12-26 Friday 01:56 Rocky Bernstein * pydb/: fns.py, pydbcmd.py: Tolerate 2 (< Python 2.5) and 3 parameter version of getline 2008-12-26 Friday 01:47 Rocky Bernstein * NEWS, configure.ac, cvs2cl_usermap: Get ready for 1.25 release 2008-12-26 Friday 01:40 Rocky Bernstein * Doc/lib/libpydb.tex: Note status='continue' 2008-12-25 Thursday 22:53 Rocky Bernstein * Doc/lib/libpydb.tex: More low-level on creating a precmd hook and for removing/restoring the debugger call hook 2008-12-22 Monday 23:28 Rocky Bernstein * Makefile.am: Make madness: accidentally put test target inside MAINTAINER_MODE. 2008-12-22 Monday 21:02 Rocky Bernstein * pydb/fns.py, pydb/pydbcmd.py, test/data/cmdparse.right: Fix Variable name corruption when tracking pdb sources. 2008-12-22 Monday 15:17 Rocky Bernstein * pydb/: connection.py, pydb.py.in: os.path.exists -> os.path.file where appropriate which is always the case. Better would be to create a file_readable via stat() 2008-12-22 Monday 13:19 Rocky Bernstein * pydb/gdb.py.in: Don't abort if pp fails. 2008-12-21 Sunday 10:54 Rocky Bernstein * pydb/fns.py, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/data/cmdparse.right, test/unit/checkline.py.in: Allow 2.5 linecache interface which will read from zipped/egg'd files. save restore stdout before exec'ing tracking pdb/bdb changes. 2008-12-21 Sunday 02:17 Rocky Bernstein * pydb/gdb.py.in: Check names in "file" to see that they exist. Should also check to see if its readable 2008-12-15 Monday 15:26 Rocky Bernstein * pydb/gdb.py.in: Docstring grammar 2008-12-13 Saturday 14:13 Rocky Bernstein * pydb/: fns.py, pydb.py.in: Add places for pre/post loop/cmd hooks. 2008-12-13 Saturday 03:56 Rocky Bernstein * pydb/: fns.py, pydb.py.in: Misread how sys.exc_info() works. Gotta do better in testing! Maybe next lifetime... 2008-12-12 Friday 14:55 Rocky Bernstein * NEWS, test/Makefile.am, test/test-dbgcall.py.in: Administrivia 2008-12-12 Friday 13:11 Rocky Bernstein * test/data/Makefile.am: One more file. 2008-12-12 Friday 13:10 Rocky Bernstein * configure.ac, pydb/pydb.py.in, test/.cvsignore, test/Makefile.am, test/dbgcall.py, test/test-dbgcall.py.in, test/data/dbgcall.right: Allow stopping tracer via sys.settrace(None) and continuing iwth pydb.debugger(status='continue'). Remove a lot of the hoaky step_ignore crap in debugger. 2008-12-10 Wednesday 13:33 Rocky Bernstein * NEWS: Doc changes. Last commit before release 2008-12-10 Wednesday 13:31 Rocky Bernstein * emacs/Makefile.am, test/test-file.py.in, test/test-import.py.in, test/test-run.py.in, test/test-save.py.in, test/test-setshow.py.in, test/test-step.py.in, test/test-with.py.in, test/test.py.in: Stuff to make distcheck work better. (Doc is still broken though.) 2008-12-09 Tuesday 20:06 Rocky Bernstein * pydb/set.py, test/data/cmdparse.right: More complete help on various on some set commands. Also make ddd friendly. 2008-12-09 Tuesday 04:12 Rocky Bernstein * NEWS, configure.ac: More ready for release. 2008-12-08 Monday 11:26 Rocky Bernstein * pydb/fns.py, pydb/pydb.py.in, pydb/set.py, test/pm.cmd, test/test-complete.py.in, test/test-setshow.py.in, test/data/Makefile.am, test/data/pm.right, test/data/setshow-no-rl.right: Tolerate systems that don't have readline installed. 2008-12-08 Monday 05:09 Rocky Bernstein * test/: test-with.py.in, data/Makefile.am, data/withbug-2.6.right: More 2.6 compatibility. 2008-12-08 Monday 02:04 Rocky Bernstein * test/: Makefile.am, test-run.py.in, test.py.in, data/Makefile.am, data/brkpt2-2.3.right: Python 2.6 compatibility 2008-12-08 Monday 00:40 Rocky Bernstein * test/: test-contbug.py.in, test-file.py.in, test-help.py.in, test-linetrace.py.in, test-run.py.in, test-sig.py.in, test-trace.py.in, test-with.py.in, test.py.in: Go over tests for 2.6 compatibility. More work needed, but this is a start. 2008-12-07 Sunday 23:48 Rocky Bernstein * Makefile.am: Make test, make check -- same thing. 2008-12-07 Sunday 23:42 Rocky Bernstein * NEWS, configure.ac, pydb/pydbbdb.py: What's cooking. Get ready for release on the 10th 2008-11-24 Monday 21:24 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, test/brkpt2.cmd, test/data/brkpt2.right: If a frame number is not given in the frame command, use 0, the current frame. This makes it more like the way gdb works. 2008-11-17 Monday 19:06 Rocky Bernstein * test/: Makefile.am, brkpt1.right, brkpt1t.right, brkpt2-2.3.right, brkpt2.right, brkpt3-2.5t.right, cmdparse.right, contbug-2.5.right, contbug.right, filebug.right, fntrace.right, help.right, history.right, logging.right, noscript.right, pm.right, pydbrc.right, run.right, run2.right, save.right, setshow.right, sighandler.right, step.right, test-contbug.py.in, test-file.py.in, test-help.py.in, test-linetrace.py.in, test-pm.py.in, test-run.py.in, test-save.py.in, test-setshow.py.in, test-step.py.in, test-trace.py.in, test-with.py.in, test.py.in, trace-2.4-final.right, trace-2.5.right, trace.right, tracetest-2.4-final.right, tracetest-2.5.right, tracetest.right, withbug.right, data/Makefile.am, data/brkpt1.right, data/brkpt1t.right, data/brkpt2-2.3.right, data/brkpt2.right, data/brkpt3-2.5t.right, data/brkpt3.right, data/brkpt3t.right, data/cmdparse.right, data/contbug-2.5.right, data/contbug.right, data/file-2.5.right, data/file.right, data/filebug.right, data/fntrace.right, data/help.right, data/history.right, data/logging.right, data/noscript.right, data/pm.right, data/pydbrc.right, data/run.right, data/run2.right, data/save.right, data/savefile.right, data/setshow.right, data/sighandler.right, data/step.right, data/trace-2.4-final.right, data/trace-2.5.right, data/trace.right, data/tracetest-2.4-final.right, data/tracetest-2.5.right, data/tracetest.right, data/withbug.right: Move data files into test/data. More work may follow later. 2008-11-17 Monday 18:41 Rocky Bernstein * .cvsignore, emacs/.cvsignore: Administrivia 2008-11-16 Sunday 17:23 Rocky Bernstein * configure.ac, test/unit/.cvsignore, test/unit/Makefile.am, test/unit/checkline.py.in, test/unit/listsize.py.in, test/unit/test-checkline.py.in: Unit test reorganization. More work is really needed. 2008-11-16 Sunday 17:10 Rocky Bernstein * autogen.sh, configure.ac, pydb/fns.py, test/Makefile.am, test/brkpt1.right, test/brkpt1t.right, test/data/.cvsignore, test/data/Makefile.am, test/data/checkline.py, test/unit/.cvsignore, test/unit/Makefile.am, test/unit/test-checkline.py.in: A more accurate message regarding a line which can't have a breakpoint. Add a unit test for this. 2008-11-16 Sunday 07:52 Rocky Bernstein * pydb/pydbbdb.py: More explicit about initialization that goes on. 2008-11-16 Sunday 06:38 Rocky Bernstein * pydb/pydbbdb.py: Add "return" to help me and Emacs keep indentation straight. 2008-10-26 Sunday 22:30 Rocky Bernstein * htdocs/jc.css: Add css used 2008-10-26 Sunday 22:30 Rocky Bernstein * htdocs/features.html: - -> – 2008-07-28 Monday 14:05 Rocky Bernstein * pydb/pydb.py.in: Catch exception on a runcall 2008-07-08 Tuesday 23:44 Rocky Bernstein * pydb/gdb.py.in, test/save.right: Passing wrong arg in source -v. 2008-07-07 Monday 16:40 Rocky Bernstein * Doc/lib/libpydb.tex: LaTeX # escape problem. 2008-07-03 Thursday 09:23 Rocky Bernstein * Doc/lib/libpydb.tex, htdocs/pydb.html, pydb/gdb.py.in, pydb/pydbcmd.py, test/save.cmd, test/save.right: Add -v option to source command like gdb has. 2008-06-12 Thursday 20:09 Rocky Bernstein * setup.py.in: Spelling typo. Add a couple more "features". 2008-06-10 Tuesday 18:37 Rocky Bernstein * htdocs/index.html: Fiddle with styling color a little. 2008-06-10 Tuesday 01:05 Rocky Bernstein * Doc/pydb.1.in, htdocs/pydb.html: Go over man page yet again. Options more complete. Bullet fixes and some comment separator lines added. 2008-06-09 Monday 01:30 Rocky Bernstein * Doc/pydb.1.in, htdocs/index.html, htdocs/pydb.html: Clean up documentation. 2008-06-08 Sunday 21:04 Rocky Bernstein * Doc/pydb.1.in, htdocs/pydb.html: Work on manual page and HTML for it. 2008-06-08 Sunday 20:21 Rocky Bernstein * htdocs/: index.html, pydb.html: Move doc towards web 2.0. 2008-06-07 Saturday 16:43 Rocky Bernstein * pydb/pydbbdb.py: Error in grammar of a comment. 2008-05-31 Saturday 11:49 Rocky Bernstein * pydb/pydbbdb.py: Bug in starting in ipython and running pydb. format_stack_entry in pydb allows and additional optional parameter which ipython doesn't have. Do some introspection on the call to figure out if the parameter is there. 2008-05-30 Friday 13:41 Rocky Bernstein * NEWS: Typo. 2008-05-30 Friday 04:25 Rocky Bernstein * NEWS: Update for release. 2008-05-29 Thursday 04:07 Rocky Bernstein * configure.ac, emacs/Makefile.am, pydb/remote.py, test/Makefile.am, test/test.py.in: Get ready for 1.23 release. remote.py: spelling typo Makefile.am: add missing files. test.py.in: ignore srcdir vs buildir difference 2008-05-29 Thursday 02:53 Rocky Bernstein * pydb/server.py: Correct CVS $Id$ line. 2008-05-29 Thursday 02:50 Rocky Bernstein * pydb/: remote.py, server.py: Add remote debugging files. Dont' know how good these though. They just had been laying around on my disk. 2008-05-24 Saturday 00:46 Rocky Bernstein * Doc/pydb.1.in: Update info on Annotate. 2008-05-21 Wednesday 20:20 Rocky Bernstein * test/: .cvsignore, test-linetrace.py.in: Remove some filenames bleeding into test comparisons 2008-05-21 Wednesday 15:30 Rocky Bernstein * test/test-linetrace.py.in: Portiability thing for 2.4.0 final. 2008-05-21 Wednesday 15:20 Rocky Bernstein * configure.ac, test/Makefile.am, test/test-save.py, test/test-save.py.in, test/test-trace.py.in, test/trace-2.4-final.right, test/tracetest-2.4-final.right: Portability fixes for 2.4 final 2008-05-21 Wednesday 14:48 Rocky Bernstein * test/: Makefile.am, test-with.py.in: Add new test files to distribution. Skipp test-with if not Python 2.5. 2008-05-21 Wednesday 11:02 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in: Let python command get used if program is in post-mortem or no program. ipython however can't be used without more work. 2008-05-21 Wednesday 10:50 Rocky Bernstein * pydb/gdb.py.in: Allow the "python" command even when a program isn't run or is in post-mortem. 2008-05-21 Wednesday 10:43 Rocky Bernstein * Doc/lib/libpydb.tex: Go over "save" command and put in the right place. A number of small spelling mistakes have been corrected. 2008-05-21 Wednesday 00:27 Rocky Bernstein * pydb/gdb.py.in, test/save.cmd, test/save.right: Error checking on save command. Some "save" status messages revised. 2008-05-20 Tuesday 18:24 Rocky Bernstein * pydb/gdb.py.in, test/save.cmd, test/save.right, test/test-save.py: Add save test program. 2008-05-20 Tuesday 13:17 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/show.py, test/setshow.right: Save command now saves settings. show.py split up into access routines and versus the command part. 2008-05-17 Saturday 10:08 Rocky Bernstein * NEWS, configure.ac, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/set.py, pydb/show.py, test/Makefile.am, test/cmdparse.right, test/setshow.cmd, test/setshow.right, test/step.cmd, test/step.right, test/test-step.py.in: Add set/show deftrace. 2008-05-16 Friday 10:31 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in: Document limitation to setting local variables and scope limitations on assignments of new local variables. Update ipython and python doc. 2008-05-15 Thursday 11:31 Rocky Bernstein * pydb/gdb.py.in: Add a python command. Probably needs work to deal with globals better though. 2008-05-15 Thursday 03:03 Rocky Bernstein * NEWS, pydb/gdb.py.in: gdb.py.in: Recover history re-reading when leaving ipython. 2008-05-14 Wednesday 18:02 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, test/pm.right, test/test-complete.py.in: Cursory attempt to add a "save" command. 2008-04-16 Wednesday 01:20 Rocky Bernstein * pydb/gdb.py.in, pydb/pydbcmd.py, pydb/set.py, pydb/show.py, pydb/sighandler.py, test/cmdparse.right: Add set autoeval to be more consistent with ruby-debug and bashdb. 2008-02-06 Wednesday 16:40 Rocky Bernstein * emacs/Makefile.am, emacs/pydb.el, emacs/test-gud.el, test/tracetest-2.5.right: Disable warnings with pydb loads a program file. Bug #1842447. tracetest-2.5.right - looks like old 2.4.3. Could be a 2.5.1. change? 2008-02-02 Saturday 23:38 Rocky Bernstein * AUTHORS: Elaborate on pydb and pdb a little more. 2008-01-11 Friday 13:58 Rocky Bernstein * emacs/Makefile.am: Don't give an error with make check if Emacs is not around. 2007-12-01 Saturday 21:24 Rocky Bernstein * emacs/pydb-test.el.in: Add a marker-filter test. 2007-11-30 Friday 01:55 Rocky Bernstein * emacs/pydb.el: Was creating duplicate buffers. 2007-11-29 Thursday 13:09 Rocky Bernstein * pydb/info.py: Remove debug statements 2007-11-26 Monday 00:48 Rocky Bernstein * emacs/pydb.el: Typo. 2007-11-26 Monday 00:47 Rocky Bernstein * emacs/pydb.el: Make sure we have Emacs 22 or greater. 2007-11-25 Sunday 17:09 Rocky Bernstein * emacs/pydb.el: Make a major mode for backtrace 2007-11-17 Saturday 11:55 Rocky Bernstein * emacs/pydb.el: Set --annotate=3 which is what it is in gdba 2007-11-17 Saturday 11:43 Rocky Bernstein * emacs/pydb.el: Use an advise function to hook into gud-reset. 2007-11-17 Saturday 00:52 Rocky Bernstein * emacs/pydb.el: Make a real mode for stack frames. Use a more gud-like name for the map. 2007-11-15 Thursday 00:39 Rocky Bernstein * emacs/pydb.el: Make like the others 2007-11-13 Tuesday 15:55 Rocky Bernstein * test/: setshow.right, test-setshow.py.in: Put back test of set history size. 2007-11-13 Tuesday 15:52 Rocky Bernstein * test/setshow.cmd: Set history size before showing it. 2007-11-13 Tuesday 13:51 Rocky Bernstein * Doc/lib/libpydb.tex: Document HISTSIZE. 2007-11-13 Tuesday 13:49 Rocky Bernstein * pydb/: gdb.py.in, show.py: gdb.py.in: use HISTSIZE - follow gdb more closely in history size. show.py: remove unused code 2007-11-12 Monday 04:07 Rocky Bernstein * pydb/gdb.py.in, pydb/show.py, test/history.right, test/setshow.cmd, test/setshow.right: Make "show history" a tad more like gdb. 2007-11-07 Wednesday 01:02 Rocky Bernstein * emacs/pydb.el: Add a small comment. 2007-11-06 Tuesday 15:05 Rocky Bernstein * emacs/pydb.el: Remove annotation lines from buffer in pydbtracking. 2007-11-06 Tuesday 03:59 Rocky Bernstein * emacs/pydb.el: Add pydbtrack to go to the place mentioned in a traceback. 2007-11-05 Monday 19:24 Rocky Bernstein * emacs/pydb.el: Add ability to set variables in the local buffer. 2007-11-05 Monday 15:19 Rocky Bernstein * emacs/pydb.el: Not all Emacs's have split-string-and-unquote. 2007-11-04 Sunday 22:02 Rocky Bernstein * emacs/pydb.el: Use overlay arrow in fringe to make selected line. 2007-11-04 Sunday 15:03 Rocky Bernstein * emacs/: pydb-test.el.in, pydb.el: Update Emacs pydb documentation. Fix unit test mismatched test name. 2007-11-04 Sunday 14:07 Rocky Bernstein * configure.ac, emacs/pydb.el, pydb/set.py, test/.cvsignore, test/Makefile.am, test/setshow.cmd, test/setshow.right, test/test-setshow.py.in, test/test-with.py.in: Add annotation tracking to pydbtrack'ing. Bugs in set (annotate and width). Start a proper regression test for these. 2007-11-04 Sunday 05:48 Rocky Bernstein * emacs/: pydb-test.el.in, pydb.el: buffer for commands renamed to be more regular with other buffers. Is always *pydb-fn-script* now. Add more text attributes to breakpoint and stack buffers. 2007-11-03 Saturday 16:57 Rocky Bernstein * emacs/pydb.el: Dyslexic use of string-match 2007-11-03 Saturday 13:22 Rocky Bernstein * emacs/pydb.el: Update doc. 2007-11-03 Saturday 13:21 Rocky Bernstein * emacs/: pydb-test.el.in, pydb.el: pydb.el: make pydb-script-name more Lisp idiomatic. We also now parse the whether the --annotate option was given and only set multiple windows if that is set. Use gud-target-name in annotation buffers and set gud-target-name in those buffers too. pydb-test.el.in: modify test of pydb-script-name for new interface and to check whether --annotate was given. 2007-11-02 Friday 11:36 Rocky Bernstein * emacs/: pydb-test.el.in, pydb.el: Reorganize code to put user-settable things at the beginning. Do real parsing of pydb command arguments. Add test of new stuff. 2007-11-01 Thursday 10:42 Rocky Bernstein * emacs/pydb.el: Typo. 2007-11-01 Thursday 09:20 Rocky Bernstein * Makefile.am, configure.ac, test/.cvsignore, test/Makefile.am, test/complete.py.in, test/connect.py.in, test/contbug.py.in, test/disassem.py.in, test/fifo_connect.py.in, test/file.py.in, test/fns.py.in, test/help.py.in, test/import.py.in, test/pm.py.in, test/pm.right, test/runtest.py.in, test/sighandle.py.in, test/sigtest.py.in, test/tcp_connect.py.in, test/test-complete.py.in, test/test-connect.py.in, test/test-contbug.py.in, test/test-disassem.py.in, test/test-fifo-connect.py.in, test/test-file.py.in, test/test-fns.py.in, test/test-help.py.in, test/test-import.py.in, test/test-linetrace.py.in, test/test-pm.py.in, test/test-run.py.in, test/test-sig.py.in, test/test-sighandle.py.in, test/test-tcp-connect.py.in, test/test-trace.py.in, test/test-with.py.in, test/testwith.py, test/trace.py.in, test/tracetest-2.5.right, test/tracetest.py.in: Attempt a cleanup at the testing system. All tests in test now match test/test-*.py other files in test/ are in support of the tests. DRY Makefile.am more. 2007-11-01 Thursday 02:34 Rocky Bernstein * NEWS: What's up. 2007-11-01 Thursday 02:31 Rocky Bernstein * test/: withbug.cmd, withbug.py, withbug.right: Files needed to test "with" bug 2007-11-01 Thursday 02:29 Rocky Bernstein * pydb/info.py, test/Makefile.am, test/testwith.py: Bug in "info locals" inside a Python "with" statement. Patch modified from one given by Alberto Griggio. 2007-10-30 Tuesday 11:37 Rocky Bernstein * THANKS: Thank Albert Griggio for adding annotate. 2007-10-30 Tuesday 03:02 Rocky Bernstein * emacs/pydb-test.el.in: Add some test of the regexps for the stack and breakpoint entries. 2007-10-29 Monday 14:28 Rocky Bernstein * test/help.right: help output changed. 2007-10-29 Monday 14:26 Rocky Bernstein * pydb/show.py: Remove reference to GDB. 2007-10-29 Monday 04:22 Rocky Bernstein * emacs/pydb.el, pydb/pydb.py.in: pydb.py.in: make sure "up" and "down" change stack window. pydb.el: set paragraph to prompt which I think has overall goodness. 2007-10-29 Monday 02:52 Rocky Bernstein * Doc/: pydb.1.in, lib/libpydb.tex: Annotation level is an integer as it is in gdb. 2007-10-29 Monday 02:35 Rocky Bernstein * emacs/pydb.el, pydb/gdb.py.in, pydb/pydb.py.in, pydb/set.py, pydb/show.py, test/cmdparse.right, test/help.right: Annotation level is an integer same as it is in gdb. 2007-10-28 Sunday 04:20 Rocky Bernstein * emacs/pydb.el: Remove unused pydb-safe. 2007-10-28 Sunday 04:13 Rocky Bernstein * emacs/pydb.el: Reorder some declarations so they appear before uses. 2007-10-27 Saturday 15:05 Rocky Bernstein * emacs/pydb.el, pydb/pydb.py.in: many-windows mode courtesy of Alberto Griggio patch 1781965. 2007-10-27 Saturday 14:55 Rocky Bernstein * pydb/pydbcmd.py: Small typo. 2007-08-06 Monday 12:15 Rocky Bernstein * htdocs/index.html: Correct link. 2007-08-06 Monday 12:13 Rocky Bernstein * htdocs/features.html: Add features page. 2007-08-06 Monday 12:13 Rocky Bernstein * htdocs/index.html: Make more css-ish. Add note regarding ruby-debug. 2007-05-23 Wednesday 09:25 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/fns.py, pydb/gdb.py.in, pydb/pydbcmd.py, pydb/set.py, pydb/show.py, test/cmdparse.right, test/fns.py.in: Add set width and show width columnize -> columnize_array 2007-05-23 Wednesday 01:39 Rocky Bernstein * pydb/fns.py, pydb/gdb.py.in, test/fns.py.in: Add routine to pretty print arrays in columns. Not sure it's worth all the effort though. Sort of an expriment. 2007-05-22 Tuesday 14:02 Rocky Bernstein * pydb/fns.py, test/fns.py.in: Columnize may be useful in formatting arrays and dictionaries. 2007-05-19 Saturday 01:19 Rocky Bernstein * pydb/pydbcmd.py, test/brkpt2-2.3.right, test/brkpt2.cmd, test/brkpt2.right: Remove unitialized return value bug in get_an_int. 2007-05-14 Monday 00:29 Rocky Bernstein * Doc/lib/libpydb.tex: Small note about post-mortem debugging. 2007-04-24 Tuesday 06:32 Rocky Bernstein * Doc/lib/libpydb.tex: Another typo. 2007-04-24 Tuesday 06:31 Rocky Bernstein * Doc/lib/libpydb.tex: More small changes. 2007-04-24 Tuesday 06:24 Rocky Bernstein * Doc/lib/libpydb.tex: Note normal pydb invocation behavior. 2007-04-24 Tuesday 06:05 Rocky Bernstein * Doc/lib/libpydb.tex: Document commands better. 2007-04-24 Tuesday 05:50 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, test/cmdparse.right, test/noscript.right: Small Documentation changes. Move a run one message from info into an error message class. 2007-04-24 Tuesday 05:37 Rocky Bernstein * Doc/lib/libpydb.tex: Grammar fix. 2007-04-22 Sunday 13:39 Rocky Bernstein * test/brkpt3t.right.in: Looks like we now have a trailing blank. 2007-04-22 Sunday 01:28 Rocky Bernstein * pydb/gdb.py.in: Disallow running %pydb inside ipython invoked by pydb - it causes an infinite loop running the program over and over. 2007-04-21 Saturday 10:40 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, pydb/set.py, test/noscript.right, test/pm.right: Add ability to call ipython as a subshell. change message type for running a command that needs to be run in a running program from normal to error. Document "help set history" better. Update doc for ipython and set history commands. 2007-04-19 Thursday 20:09 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in: Make it more explicit that the "source" command refers to debugger commands (not Python commands.) 2007-04-16 Monday 03:35 Rocky Bernstein * htdocs/index.html: A spelling typo and some minor updates. 2007-04-15 Sunday 22:34 Rocky Bernstein * Doc/lib/libpydb.tex: Update for current line and function trace output. 2007-04-15 Sunday 22:27 Rocky Bernstein * NEWS, configure.ac, pydb/pydbbdb.py, test/Makefile.am, test/brkpt1t.right, test/brkpt3-2.5t.right, test/fntrace.right, test/test.py.in, test/trace-2.5.right, test/trace.right: --Call now show function parameters. I should have thought of this before the release. It's so simple and cool. :-( 2007-04-15 Sunday 17:15 Rocky Bernstein * Doc/tools/patchlevel.h: Let's pretend everyone runs 2.5 now. 2007-04-15 Sunday 17:14 Rocky Bernstein * Doc/lib/libpydb.tex: Update with more accurate trace information. 2007-04-15 Sunday 15:20 Rocky Bernstein * NEWS: Hopefully last change before releasing 1.22 2007-04-15 Sunday 15:17 Rocky Bernstein * Makefile.am: BSD Make compatibility. 2007-04-15 Sunday 04:32 Rocky Bernstein * test/: help.py.in, help.right: Accomodate change in getopts "Usage" and "Options" casing 2007-04-15 Sunday 04:17 Rocky Bernstein * test/help.py.in: Do not hardcode where python comes from 2007-04-13 Friday 10:00 Rocky Bernstein * configure.ac, pydb/pydb.py.in, test/.cvsignore, test/Makefile.am, test/contbug.py.in, test/contbug.right, test/help.py.in, test/help.right, test/trace.py.in: test/help*: add test to check --help and -h test/contbug.py*: different output for 2.5 versus before configure.ac: get ready for release rest: support of above. 2007-04-13 Friday 01:38 Rocky Bernstein * NEWS: spelling. 2007-04-13 Friday 01:00 Rocky Bernstein * Doc/Makefile.in: := -> = for BSD make compatibility 2007-04-13 Friday 00:59 Rocky Bernstein * emacs/Makefile.am: := -> = for BSD Make compatibility. 2007-04-11 Wednesday 09:51 Rocky Bernstein * Makefile.am: BSD make doesn't grok := 2007-04-11 Wednesday 09:48 Rocky Bernstein * test/brkpt3t.right.in: Output changed for call levels. 2007-04-11 Wednesday 09:45 Rocky Bernstein * test/contbug-2.5.right: DIfferent output for Python 2.5 2007-04-11 Wednesday 09:37 Rocky Bernstein * test/trace.right: Python <2.5 output. 2007-04-11 Wednesday 09:28 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/fns.py, pydb/pydbbdb.py, test/Makefile.am, test/brkpt1t.right, test/fntrace.right, test/trace-2.5.right, test/trace.py.in, test/tracetest.py.in: pydbbdb.py/fns.py: Make call levels start at 0. Nicer call/return output too. test/* change to support above. Add fntrace regression test. Test both forms of the options. libpydb.tex: document set fntrace 2007-04-07 Saturday 13:53 Rocky Bernstein * pydb/pydbbdb.py, test/brkpt1t.right, test/trace-2.5.right: Reduce call level count a little. 2007-04-07 Saturday 10:53 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/set.py, pydb/show.py, test/brkpt1t.right, test/cmdparse.right, test/trace-2.5.right: Add function tracing and option -F. More work would be nice. Call and return trace lines show nesting level. Return will show the value if it is a scalar or string type or return type otherwise. 2007-03-31 Saturday 11:38 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in: gdb.py.in: fix bug in "info thread" when threadframe is not installed (and python < 2.5). pydb.py.in: spelling typo. 2007-03-15 Thursday 09:33 Rocky Bernstein * htdocs/index.html: css error. 2007-03-15 Thursday 03:05 Rocky Bernstein * htdocs/index.html: Make links larger. 2007-03-15 Thursday 02:59 Rocky Bernstein * htdocs/index.html: Start to use css. 2007-03-15 Thursday 02:21 Rocky Bernstein * pydb/fns.py: Track pythonpdb bug #1526834 Fix crash in pdb when you do 'b f('; 2007-03-10 Saturday 16:57 Rocky Bernstein * htdocs/index.html: Make w3c compliant. Note recent changes. Links to gdb and ipython. 2007-03-05 Monday 04:02 Rocky Bernstein * Doc/info/Makefile, emacs/Makefile.am, pydb/threaddbg.py: Doc/Info/Makefile: allow Emacs versions 21-23 not just 21 emacs/Makefile.am: wrong test file pydb-test.el not mdb-test.el pydb/threaddbg.py: inspect sometimes bombs, protect against that. 2007-03-01 Thursday 03:00 Rocky Bernstein * emacs/pydb-test.el.in: Make more Emacs friendly by setting emacs-lisp mode. 2007-03-01 Thursday 02:47 Rocky Bernstein * emacs/: pydb-test.el.in, pydb.el: Allow embedded blanks in filenames which occors in Microsoft Windows. Many thanks to DaveS! 2007-02-21 Wednesday 09:00 Rocky Bernstein * test/runtest.py.in: Add a test which actually covers the bug that was reported. 2007-02-20 Tuesday 18:28 Rocky Bernstein * test/contbug.py.in: Test of a continuation bug. 2007-02-20 Tuesday 18:24 Rocky Bernstein * test/.cvsignore: Yet another. 2007-02-20 Tuesday 18:23 Rocky Bernstein * test/pydbrc.cmd: Debugger command file for ./.pydbrc test 2007-02-20 Tuesday 18:21 Rocky Bernstein * configure.ac, emacs/pydb.el, pydb/pydb.py.in, pydb/pydbcmd.py, test/.cvsignore, test/.pydbrc.in, test/Makefile.am, test/pydbrc.right, test/runtest.py.in: Fix bug where we required $HOME to end in os.pathsep. (Need to add a test here) Add a test to make sure we are reading ./.pydbrc 2007-02-19 Monday 02:46 Rocky Bernstein * pydb/pydb.py.in: traceback.print_exc() prints to stderr. We want it to go to whereever we've redirected output. Observation from DaveS. 2007-02-19 Monday 02:30 Rocky Bernstein * pydb/: fns.py, gdb.py.in: DaveS reports: raw_input() needs a strip() because when running pydb with ipython and emacs, I keep getting a trailing CR, which breaks things. 2007-02-18 Sunday 23:00 Rocky Bernstein * pydb/: pydb.py.in, pydbcmd.py: pydb.py.in: fix parameter setting bug in pm calling post_mortem pydbcmd.py: expose format_source_line so things like ipython can extend 2007-02-17 Saturday 10:53 Rocky Bernstein * configure.ac, pydb/gdb.py.in, test/Makefile.am, test/contbug.cmd, test/contbug.right: Bug in "continue *line*" when issued before a step, or outside of line tracing. In this situtation, self.stopframe was set incorrectly. 2007-02-14 Wednesday 12:10 Rocky Bernstein * pydb/: fns.py, gdb.py.in, info.py, pydbbdb.py, show.py: Better handling of self.search_path 2007-02-14 Wednesday 02:45 Rocky Bernstein * pydb/: fns.py, pydbbdb.py: Use sys.path for Python file name resolution. 2007-02-13 Tuesday 21:20 Rocky Bernstein * pydb/pydb.py.in: Allow one to pass post-mortem and pm a pydb.Pdb object. 2007-02-13 Tuesday 13:50 Rocky Bernstein * emacs/pydb.el: Make setting breakpoints add absolute file name. Previously worked only for files that are either in the current working directory of the debugger or found on sys.path. Patch from Jouni K Seppänen 2007-02-13 Tuesday 11:59 Rocky Bernstein * NEWS, configure.ac: Adjust back to allow Python 2.4.0 2007-02-13 Tuesday 11:53 Rocky Bernstein * test/test.py.in: Remove history file after test. 2007-02-13 Tuesday 11:46 Rocky Bernstein * test/.cvsignore: More derived files. 2007-02-13 Tuesday 11:42 Rocky Bernstein * configure.ac, emacs/pydb-test.el.in, emacs/pydb.el, test/Makefile.am, test/brkpt3.cmd, test/brkpt3.cmd.in, test/brkpt3.right, test/brkpt3.right.in, test/brkpt3t.right, test/brkpt3t.right.in, test/file-2.5.right, test/file-2.5.right.in, test/file.cmd, test/file.cmd.in, test/file.py.in, test/file.right, test/file.right.in, test/fns.py.in, test/runtest.py.in, test/sigtest.py.in, test/test.py.in, test/trace.py.in: emacs/pydb*: add stack trace format in pydb tracking rest: changes to make "make distcheck" work. 2007-02-11 Sunday 02:32 Rocky Bernstein * Doc/lib/libpydb.tex: Correct documentation for break command. 2007-02-11 Sunday 02:28 Rocky Bernstein * pydb/: gdb.py.in, threaddbg.py: Correct documentation for "break" command. 2007-02-11 Sunday 02:16 Rocky Bernstein * configure.ac: We now require Python 2.4.3 or greater as a result of the dissassemble changes. 2007-02-11 Sunday 01:32 Rocky Bernstein * NEWS: Note we upped min version to 2.4.3 as a result of the dissassemble changes. 2007-02-11 Sunday 00:54 Rocky Bernstein * NEWS, configure.ac, pydb/gdb.py.in: gdb.py.in: If only one thread allow a simpler quit from post-mortem. configure.ac, NEWS: get ready for release 2007-02-10 Saturday 15:24 Rocky Bernstein * test/: brkpt2-2.3.right, trace.right: Output changes for Python < 2.5 2007-02-10 Saturday 15:19 Rocky Bernstein * pydb/pydbcmd.py, test/brkpt2.right, test/pm.right, test/trace-2.5.right: We now print the line text and (and again the line number) when we stop. This is more helpful and more consistent with GDB linetrace adds (redundant) linenumber 2007-02-10 Saturday 01:56 Rocky Bernstein * NEWS, pydb/threadinfo.py, test/cmdparse.right: Mystery solved with diffeing cmdparse.right. Sync up Pre 2.5 non-threadframe help with the others. 2007-02-10 Saturday 01:52 Rocky Bernstein * test/: brkpt2-2.3.right, cmdparse.right: 2.3.right is also 2.4. Not sure why cmdparse.right didn't work though. 2007-02-09 Friday 02:23 Rocky Bernstein * pydb/complete.py, pydb/pydbbdb.py, test/pm.right: compete help prefix... fixed. 2007-02-08 Thursday 17:54 Rocky Bernstein * pydb/complete.py, pydb/gdb.py.in, pydb/pydbbdb.py, test/complete.py.in, test/pm.cmd, test/pm.right: More work on command completion. 2007-02-04 Sunday 18:35 Rocky Bernstein * pydb/pydbbdb.py: Multi-parameter completion not working the way it's supposed to be and was single-word completion. So remove and simplify for now. 2007-02-04 Sunday 14:54 Rocky Bernstein * pydb/: complete.py, gdb.py.in, pydbbdb.py: Refactoring had broken readline complete. 2007-02-04 Sunday 14:17 Rocky Bernstein * pydb/gdb.py.in: ipython needs .all_completions in Gdb object so it can decorate it. 2007-02-04 Sunday 13:00 Rocky Bernstein * pydb/: info.py, subcmd.py: More lint-like chagnes. 2007-02-04 Sunday 12:50 Rocky Bernstein * pydb/: connection.py, disassemble.py, info.py, set.py, threadinfo.py: Some small lint-like changes. 2007-02-04 Sunday 12:16 Rocky Bernstein * pydb/gdb.py.in: Add GPL copyright. 2007-02-04 Sunday 12:09 Rocky Bernstein * pydb/: complete.py, gdb.py.in: Complete on object name for those commands which take an object first argument. 2007-02-04 Sunday 11:38 Rocky Bernstein * Makefile.am, configure.ac, pydb/complete.py, pydb/fns.py, pydb/gdb.py.in, pydb/info.py, pydb/pydbbdb.py, pydb/set.py, pydb/subcmd.py, pydb/threadinfo.py, test/.cvsignore, test/Makefile.am, test/complete.py.in: */complete.py*, *Makefile*, gdb.py.in, pydbdb.py: refactor completion command. Is now it's own file. rest: for those things I wrote from scratch, add GPL. 2007-02-04 Sunday 05:48 Rocky Bernstein * pydb/__init__.py.in: Make pydoc look a little bit better. 2007-02-03 Saturday 21:04 Rocky Bernstein * THANKS: Give credit where it is due. 2007-02-03 Saturday 19:10 Rocky Bernstein * pydb/gdb.py.in, test/pm.cmd, test/pm.right: Add regression test for recent change. Fix bug found by regression test. ;-) 2007-02-03 Saturday 18:56 Rocky Bernstein * NEWS, pydb/gdb.py.in, test/exceptbug.py.in: Command completion of local can global names in "complete" command when we are completing the first word. 2007-01-30 Tuesday 11:05 Rocky Bernstein * Doc/: lib/libpydb.tex, tools/patchlevel.h: First attempt to document Bdb. 2007-01-29 Monday 02:58 Rocky Bernstein * test/: brkpt2.cmd, brkpt2.right: Slightly more stringent frame test. "frame -1" would probably be the best though. 2007-01-28 Sunday 23:31 Rocky Bernstein * pydb/gdb.py.in, pydb/pydbbdb.py, test/brkpt2.cmd, test/brkpt2.right: Fix bug with negative frame numbers. 2007-01-28 Sunday 10:35 Rocky Bernstein * pydb/: gdb.py.in, pydbbdb.py: Do symbol completion only if line_buffer hasn't been started. 2007-01-28 Sunday 09:46 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/pydb.py.in: Need to field BdbQuit in dispatcher only if we are in debugger(). But keep open the possibility of other places to - add self.field_BdbQuit boolean. 2007-01-28 Sunday 02:36 Rocky Bernstein * NEWS, test/exceptbug.py: Administrivia 2007-01-28 Sunday 02:35 Rocky Bernstein * pydb/: gdb.py.in, pydbbdb.py: Experimental command completion. Handle a quit when called via pydb.debugger(). Also experimental. 2007-01-26 Friday 13:17 Rocky Bernstein * Doc/lib/libpydb.tex: cmdtrace trace-commands 2007-01-26 Friday 13:14 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbcmd.py, test/brkpt1.cmd, test/brkpt1.right, test/brkpt1t.right, test/brkpt2.cmd, test/brkpt2.right, test/cmdparse.right, test/exceptbug.py: More error checking of parameters on ignore. Error messages regularized a little. 2007-01-25 Thursday 19:04 Rocky Bernstein * configure.ac, pydb/pydb.py.in, pydb/pydbbdb.py, test/except.py.in, test/exceptbug.py.in: pydb.py.in: Work around what may be a bug in Python 2.5 where t.tb_frame.f_lineno != t.tb_lineno pydbbdb.py: set repr() limits to more reasonable values except.py.in: add #!/usr/bin/python line 2007-01-25 Thursday 12:46 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in, pydb/pydb.py.in, test/exceptbug.py: Fix bug in using wrong call stack in pm/post_mortem. 2007-01-25 Thursday 10:19 Rocky Bernstein * pydb/gdb.py.in, pydb/pydbcmd.py, test/brkpt1.cmd, test/brkpt1.right, test/brkpt1t.right, test/brkpt2-2.3.right, test/brkpt2.cmd, test/brkpt2.right, test/brkpt3.cmd, test/brkpt3.right, test/brkpt3t.right, test/cmdparse.cmd, test/cmdparse.right, test/file-2.5.right, test/file.cmd, test/file.right, test/filebug.cmd, test/filebug.right, test/history.cmd, test/history.right, test/pm.cmd, test/pm.right, test/run.cmd, test/run.right, test/run2.cmd, test/run2.right, test/trace-2.5.right, test/tracetest-2.5.right, test/tracetest.right: set/show cmdtrace is now set/show trace-commands to match gdb 6.6. 2007-01-22 Monday 17:53 Rocky Bernstein * pydb/pydb.py.in: __version__ and __title__ seem to be more standard. 2007-01-22 Monday 10:56 Rocky Bernstein * configure.ac: Make pydb-test.el from emacs/pydb/pydb-test.el.in 2007-01-22 Monday 10:55 Rocky Bernstein * emacs/: .cvsignore, Makefile.am, pydb-test.el, pydb-test.el.in: More accurate automake configuration which allows for building outside of the source tree. 2007-01-17 Wednesday 09:42 Rocky Bernstein * configure.ac: In 1.21cvs now 2007-01-17 Wednesday 09:38 Rocky Bernstein * Makefile.am, pydb/gdb.py.in, pydb/pydb.py.in, pydb/threaddbg.py, pydb/threadinfo.py, test/cmdparse.right: frames in "info thread" when not --threading no longer shows debugger frames. 2007-01-16 Tuesday 13:13 Rocky Bernstein * pydb/: gdb.py.in, info.py, threaddbg.py, threadinfo.py: Allow "info thread" always. That is we don't need --threading for this 2007-01-15 Monday 18:04 Rocky Bernstein * pydb/gdb.py.in, pydb/info.py, pydb/threaddbg.py, test/cmdparse.right: Allow "info threads" (plural) as gdb does. No longer claim that "info threads" is an unknown command if --threading option is not there. (The next commit however should make this work always.) 2007-01-15 Monday 13:01 Rocky Bernstein * NEWS: What's new. 2007-01-15 Monday 12:53 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbcmd.py, test/brkpt1.right, test/brkpt1t.right, test/cmdparse.right: Add get_an_int() routine: Reduce redundancy, increase reliablity and regularity by refactoring out this get_an_int() routine. 2007-01-14 Sunday 21:08 Rocky Bernstein * pydb/disassemble.py, pydb/gdb.py.in, pydb/pydbcmd.py, test/cmdparse.cmd, test/cmdparse.right, test/file-2.5.right, test/file.cmd, test/file.py.in, test/file.right: Allow expression where an it is allowed in get_int and get_pos_int -- and other places too. Change raising an exception in dis() into an error message. 2007-01-14 Sunday 07:38 Rocky Bernstein * pydb/sighandler.py, test/sighandle.py.in, test/sighandler.right: Make handle output even more like GDB's: True/False -> Yes/No add SIG descriptions 2007-01-13 Saturday 12:05 Rocky Bernstein * configure.ac, Doc/lib/libpydb.tex, pydb/disassemble.py, test/Makefile.am, test/disassem.py.in, test/test.py.in: Add disassembly test. disassemble_string() converted. 2007-01-13 Saturday 04:38 Rocky Bernstein * NEWS: Note dissassebly change. 2007-01-13 Saturday 04:37 Rocky Bernstein * Makefile.am, TODO, Doc/lib/libpydb.tex, pydb/disassemble.py, pydb/fns.py, pydb/gdb.py.in, pydb/pydbcmd.py, pydb/set.py, pydb/show.py, test/cmdparse.right: Add set/show flush on/off command for flushing output Add disassemble command that allows redirected output and line number ranges in disassembly. (disassemble_string not done though.) 2007-01-09 Tuesday 14:26 Rocky Bernstein * pydb/gdb.py.in: finally: doesn't seem to work on cygwin? 2007-01-08 Monday 12:10 Rocky Bernstein * TODO: TODO 2007-01-08 Monday 12:09 Rocky Bernstein * Makefile.am, TODO, Doc/lib/libpydb.tex, pydb/connection.py, pydb/display.py, pydb/fns.py, pydb/gdb.py.in, pydb/info.py, pydb/pydb.py.in, pydb/subcmd.py, pydb/threaddbg.py: $Id lines at the end of module docstrings Go over the disassemble command so it takes two parameters (like gdb does). 2007-01-08 Monday 07:29 Rocky Bernstein * NEWS, pydb/sighandler.py, test/sighandler.cmd: Allow lowercase signal names, e.g. "int" or "sigint" for "SIGINT". Need to remove a couple of "returns" to make pydb.debugger work right. 2007-01-08 Monday 07:20 Rocky Bernstein * NEWS: What's new. 2007-01-06 Saturday 12:50 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/fns.py, pydb/pydb.py.in, pydb/pydbcmd.py, test/cmdparse.right: help now will allow an expression of object name and run Python's buit-in help (pydoc) on that. Go over help documentation section. Add doc on 'whatis' and 'examine'. 2007-01-05 Friday 22:10 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: We now allow pathname lookup on Python script name to debug. 2007-01-05 Friday 21:54 Rocky Bernstein * pydb/fns.py, pydb/pydb.py.in, test/fns.py.in: Do PATH-like lookup when giving a main python routine. 2007-01-05 Friday 11:46 Rocky Bernstein * pydb/pydb.py.in: non-optimized->non-compiled. 2007-01-05 Friday 11:45 Rocky Bernstein * emacs/Makefile.am, pydb/fns.py, pydb/pydb.py.in, test/fns.py.in, test/trace.py.in: If we give an compiled script name to debug, substitute the non-compiled name and use that. 2007-01-05 Friday 03:09 Rocky Bernstein * Doc/lib/libpydb.tex: Minor link additions and formatting changes. 2007-01-04 Thursday 03:51 Rocky Bernstein * emacs/Makefile.am, emacs/elk-test.el, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py: elk-test.el emacs: Add miminal emacs unit test. 2006-12-30 Saturday 12:55 Rocky Bernstein * NEWS, configure.ac, emacs/Makefile.am, emacs/pydb-test.el, emacs/pydb.el: NEWS, configure.ac: We tolerate Python 2.3.3 now emacs/pydb.el: require 'comint emacs/pydb-test.el Makefile.am: add first regression test 2006-12-28 Thursday 17:36 Rocky Bernstein * emacs/pydb.el: Possibly a more MS-friendly regular expression. 2006-12-28 Thursday 16:58 Rocky Bernstein * test/tracetest.py.in: Test of pydb.runv and pydb.runl 2006-12-24 Sunday 11:28 Rocky Bernstein * pydb/__init__.py.in: Control from configure. 2006-12-13 Wednesday 13:41 Rocky Bernstein * pydb/gdb.py.in: Tsk. Tsk. Grammar. 2006-12-10 Sunday 22:54 Rocky Bernstein * Doc/lib/libpydb.tex: Small formatting changes. 2006-12-10 Sunday 13:32 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex: Updates. 2006-12-10 Sunday 13:26 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.py.in, test/Makefile.am: Have to back off on set-trace regression test as the output (which means behavior) varies too much in ways I don't understand. Fix bug in debugger if this got called more than once. Document some recent changes and the Pdb/Gdb class. 2006-12-10 Sunday 11:59 Rocky Bernstein * test/import.py.in: python path crept in. 2006-12-10 Sunday 11:44 Rocky Bernstein * pydb/: gdb.py.in, sighandler.py: signandler.py: SIGCLD is the same thing as SIGCHLD. Make it ignored. gdb.py.in: wasn't making use of ability to set parameter sig_list. 2006-12-10 Sunday 11:12 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in: Add ability to specify signal ignore list. 2006-12-10 Sunday 11:07 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/Makefile.am, test/tracetest-2.5.right, test/tracetest.right: tracetest*.right, Makefile.am: Python 2.5 output is different from rest sighandler.py, gdb.py.in: Allow list of ignored signals to be passed. add more "returns" to statements and make more explicit that no return statement is really interpreted as a "return False" adding return statments also helps Emacs auto-indentation. 2006-12-10 Sunday 04:52 Rocky Bernstein * configure.ac, test/Makefile.am, test/settrace.py.in, test/tracetest.right: Add a regression test and use the other that had been there for the recently discovered bugs. 2006-12-10 Sunday 04:13 Rocky Bernstein * TODO, configure.ac, pydb/pydb.py.in, test/Makefile.am, test/import.py.in: Add regression test for recent "import" bug. 2006-12-10 Sunday 01:39 Rocky Bernstein * pydb/pydb.py.in: And extraneous pydb got added to __all__. Make "import pydb" fail. 2006-12-10 Sunday 00:06 Rocky Bernstein * pydb/threaddbg.py: Fix bug in getting thread_id in info_thread *thread-name* 2006-12-09 Saturday 23:43 Rocky Bernstein * configure.ac, pydb/gdb.py.in, test/cmdparse.right: configure.ac: Get ready for 1.20 release gdb.py.in cmdparse.right: variable-name typo 2006-12-07 Thursday 09:29 Rocky Bernstein * Doc/lib/libpydb.tex, emacs/Makefile.am, emacs/python-mode.el.diff, pydb/pydb.py.in, test/except.py.in, test/settrace.py.in: python-mode.el.diff: - not used any more. That code has been subsumed in pydb.el. (Update Makefile.am to reflect this too) Doc/lib/libpydb.tex: Go over for release changes pydb.py.in, except.py, settrace.py.in: add debugger and make set_trace be an alias 2006-12-06 Wednesday 02:28 Rocky Bernstein * NEWS, test/pm.py.in: Regression test (sort of) for recent change where we call post_mortem and the cupboard is bare. 2006-12-06 Wednesday 01:39 Rocky Bernstein * emacs/pydb.el, pydb/pydb.py.in: emacs/pydb.el: Add a "provide 'pydb" pydb.py.in: check for running post_mortem when there is none. 2006-11-23 Thursday 10:02 Rocky Bernstein * NEWS, TODO, pydb/fns.py, pydb/gdb.py.in, pydb/pydb.py.in, test/noscript.right: gdb.py.in: Provide a clue when debugger "run" command given but no "file" has been set. Better shell-like argument parsing in the "run" command via shlex. fns.py: add arg_split routine from ipython pydb.py.in: reduce redundancy in runl routine 2006-11-23 Thursday 03:45 Rocky Bernstein * pydb/pydb.py.in: Allow one to pass in a Pdb class. Useful for shells such as ipython that might want to extend before running the debugger. 2006-11-18 Saturday 12:40 Rocky Bernstein * pydb/threaddbg.py: Python 2.5 fixes for unknown threads. 2006-11-18 Saturday 12:31 Rocky Bernstein * NEWS, configure.ac, pydb/threaddbg.py: threaddbg.py: Show all threads even if we don't know their names. Extend 2.5 improvements to threadframe. Simplify and clean up code a little by adding sys._current_frames when < 2.5 configure.ac: in 1.20cvs now. 2006-11-18 Saturday 10:10 Rocky Bernstein * NEWS, pydb/threaddbg.py: Allow a thread number in "info thread" and "frame" command if Python 2.5 or greater. 2006-11-17 Friday 17:16 Rocky Bernstein * NEWS, pydb/pydb.py.in, test/sigtest.py.in: Add option for sigcheck. Don't turn on by default. Use %prog and remove init routine. 2006-11-09 Thursday 12:00 Rocky Bernstein * Doc/lib/libpydb.tex: Post-mortem example addition: add pydb to list of imports 2006-11-05 Sunday 12:52 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/set.py: set.py: Bug in "set sigcheck" gdb.py.in: spelling typo NEWS: see above. 2006-11-01 Wednesday 12:31 Rocky Bernstein * pydb/sighandler.py: On some OS's (Redhat 8), SIGNUM's are listed (like SIGRTMAX) that getsignal can't handle. 2006-11-01 Wednesday 02:39 Rocky Bernstein * pydb/fns.py: Tracker bug #1586213 http://sourceforge.net/tracker/index.php?func=detail&aid=1586213&group_id=61395&atid=497159 op_at_frame: Apparently frame.f_lasti can lie outside of frame.co_code. Return a bogus opcode in this case. 2006-10-30 Monday 15:28 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/set.py, pydb/show.py, test/cmdparse.right: Add ability to set/show Python warning options (e.g. -Werror) pydbdb.py: canonic() don't return None. Not sure if this is the best though. 2006-10-28 Saturday 23:43 Rocky Bernstein * Doc/lib/libpydb.tex: Typo since we are not not run through a preprocessor. 2006-10-28 Saturday 19:38 Rocky Bernstein * pydb/pydb.py.in: Simplify. Suggestion comes from Ville M. Vainio (even if he doesn't know it.) 2006-10-28 Saturday 19:36 Rocky Bernstein * htdocs/index.html: Add showmedo demo. 2006-10-27 Friday 02:15 Rocky Bernstein * test/: runtest.py.in, test.py.in: <2.5 yet again. This time, for sure! 2006-10-27 Friday 02:05 Rocky Bernstein * Doc/lib/libpydb.tex: Correct spelling mistake. 2006-10-27 Friday 01:20 Rocky Bernstein * Doc/lib/libpydb.tex: Add link to pprint. examine *does* have an alias, 'x'. 2006-10-27 Friday 01:18 Rocky Bernstein * pydb/threaddbg.py: Python <2.5 compatibility. 2006-10-27 Friday 01:15 Rocky Bernstein * test/: brkpt1t.right, brkpt3t.right: Add a couple more tests, thread compatability tests, into the fold 2006-10-27 Friday 01:02 Rocky Bernstein * configure.ac: Older /bin/sh tolerance (for Solaris 8) 2006-10-25 Wednesday 10:58 Rocky Bernstein * test/: brkpt3.cmd, brkpt3.right: Reinstate use of "quit" in at least one command file. 2006-10-25 Wednesday 10:50 Rocky Bernstein * NEWS, pydb/threaddbg.py, test/Makefile.am, test/brkpt1.cmd, test/brkpt1.right, test/brkpt3.cmd, test/brkpt3.right, test/test.py.in: Add a couple of thread regression tests for programs that don't use threading. Allow "quit" in threading when we have only one thread that is the MainThread 2006-10-24 Tuesday 17:58 Rocky Bernstein * pydb/threaddbg.py: Bug discovered by Len Gamburg - Thanks! 2006-10-24 Tuesday 02:49 Rocky Bernstein * .cvsignore, Makefile.am, NEWS, TODO, configure.ac, setup.py, setup.py.in, Doc/lib/libpydb.tex: libpydb.tex: Add more verbiage regarding conditions courtesy of gdb. setup.py{,.in}, .cvsignore: update current version number properly NEWS, TODO: make current configure.ac: get ready for a release 2006-10-14 Saturday 03:11 Rocky Bernstein * Doc/lib/libpydb.tex: Make note of the case one *might* want to use "python pydb.py" over a simple "pydb". -- when -Werror is desired. 2006-10-13 Friday 22:45 Rocky Bernstein * emacs/pydb.el, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/trace-2.5.right, test/trace.right: pydb.el: more aggressive about removing pdbtrack. gdb.py.in: initialize self.cur_frame - sure, why not. pydb.pydb.py.in: ipython flips out if sys.stdout is closed, and perhaps other things that call pydb will too pydbbdb.py/pydbcmd.py: bdb.run() is copied. But add a tracer so we can the initial 'exec' in a call stack listing. test/trace*.right: see above. less crap in listing. 2006-10-10 Tuesday 23:59 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, test/gcd.py: libpydb.tex: Note that '.' can be used for the self thread. gdb.py.in: whatis was a little screwy pydbdb.py: show display expressions in linetracing test/gcd.py: can it be that this had a bug in it for this long? 2006-10-10 Tuesday 08:50 Rocky Bernstein * test/.cvsignore: More tests. 2006-10-10 Tuesday 08:42 Rocky Bernstein * test/: Makefile.am, brkpt2-2.3.right, runtest.py.in, test.py.in: Changes to make Python 2.3 work. 2006-10-09 Monday 20:11 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, test/sigtest.py.in: libpydb.tex: Document stack/nostack sigtest.py.in: remove fixed FIXME comment NEWS: update as appropriate. 2006-10-09 Monday 19:59 Rocky Bernstein * htdocs/index.html: Revise list of features yet again. 2006-10-09 Monday 15:37 Rocky Bernstein * Doc/commontex/boilerplate.tex, Doc/html/stdabout.dat, Doc/lib/libpydb.tex, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/sighandler.py: Doc/* correct email address pydb.py.in, pydbbdb.py: move OS idiocycracies of set_trace to bdb so as to make things uniform from the outside. sighandler.py: SighanderManager No longer requires pydb object to be passed it Fix a bug in checking if the right install signal handler is installed. Install the right one when calling action. Deal with stopping in the debugger even if we hadn't called the debugger previously. Some of this last stuff seems a little hacky and could stand improvement. Whew. 2006-10-09 Monday 03:25 Rocky Bernstein * pydb/threaddbg.py, test/thread/thread-switch.cmd: Allow '.' as a synonym for 'self'. 2006-10-09 Monday 01:19 Rocky Bernstein * configure.ac, pydb/pydb.py.in, test/Makefile.am, test/runtest.py.in: pydb.py.in: runv() typo in variable name rest: add runv and runl regression tests 2006-10-09 Monday 00:54 Rocky Bernstein * pydb/pydb.py.in: Close p.stdout before leaving main(). Regression tests expect the file to be closed/flushed. Remove debugging code. 2006-10-09 Monday 00:12 Rocky Bernstein * pydb/fns.py: Bug: error if command is "list(foo)" - "(foo)" is used in a regexp. 2006-10-08 Sunday 19:56 Rocky Bernstein * pydb/sighandler.py, test/sigtest.py.in, test/sigtestexample.py: Okay now that the stack/nostack has been added - remove bugs. Add CR before "Program received ..." message in case previous line hadn't been terminated. 2006-10-08 Sunday 19:20 Rocky Bernstein * pydb/gdb.py.in, pydb/pydb.py.in, pydb/sighandler.py, test/sighandle.py.in, test/sighandler.right: Add "print stack" attribute on signal handling 2006-10-08 Sunday 11:57 Rocky Bernstein * Doc/lib/libpydb.tex: Minor edits and grammar fixes. 2006-10-08 Sunday 01:26 Rocky Bernstein * Doc/lib/libpydb.tex: Document runl and runv. 2006-10-07 Saturday 23:15 Rocky Bernstein * pydb/connection.py: Looks like static methods are necessary and not just a good idea. Add them in a way that's compatible with Python 2.3. 2006-10-07 Saturday 15:20 Rocky Bernstein * NEWS, pydb/pydb.py.in: Do better about not living sys.argv trashed. 2006-10-07 Saturday 11:56 Rocky Bernstein * pydb/: pydb.py.in, threaddbg.py: pydb.py.in: add runl and runv forms so we can debug a program from inside a python shell. threaddbg.py: small typo. 2006-10-06 Friday 17:55 Rocky Bernstein * pydb/: fns.py, gdb.py.in, threaddbg.py: threaddbg.py: be more sensitive about reading variable which are not protected from thread locks. gdb.py.in: break out list command into a parsing part and a listing part so that applications which embed the debugger can use the parsing part but redo the listing part. fns.py: add this cool function that takes a function body from one place and a docstring from another. Useful in decorating functions which want to keep the docstring from the thing they are decorating. The help mechanism uses docstrings for example. Not used currently (but may be in ipython). 2006-10-06 Friday 09:17 Rocky Bernstein * htdocs/download.html: New Debian package. 2006-10-05 Thursday 07:20 Rocky Bernstein * pydb/gdb.py.in: Fix bug in issuing "frame" command when no frame has been set. 2006-10-05 Thursday 06:19 Rocky Bernstein * Doc/lib/libpydb.tex: Note differences between pdb and pydb. 2006-09-29 Friday 04:39 Rocky Bernstein * pydb/threaddbg.py: Improve "info thread" for threadframe along the lines of Python 2.5 2006-09-29 Friday 04:05 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/gdb.py.in, test/brkpt2.cmd, test/brkpt2.right: Add optional position argument on "continue" command. 2006-09-28 Thursday 13:31 Rocky Bernstein * TODO: Revise based on suggestions 2006-09-27 Wednesday 12:01 Rocky Bernstein * TODO, configure.ac: In 1.19cvs now. Note a couple of possible thread changes. 2006-09-27 Wednesday 11:52 Rocky Bernstein * Doc/lib/libpydb.tex: Another spelling mistake. 2006-09-27 Wednesday 11:40 Rocky Bernstein * Doc/lib/libpydb.tex: Another typo. 2006-09-27 Wednesday 11:38 Rocky Bernstein * Doc/lib/libpydb.tex: Note next bug and that step and next change across threads. Some grammar fixes. 2006-09-26 Tuesday 19:16 Rocky Bernstein * test/: run.cmd, run.right: Remove extraneous 'where' command. 2006-09-26 Tuesday 05:43 Rocky Bernstein * pydb/: pydb.py.in, threaddbg.py: When using --threading, we now stop in the program rather than the first in debugger. info thread for python 2.5 made nicer. 2006-09-26 Tuesday 02:01 Rocky Bernstein * pydb/gdb.py.in, pydb/set.py, pydb/show.py, test/cmdparse.cmd, test/cmdparse.right: Add setting to control parameters size showing stack entries. Was missing show_listsize. 2006-09-25 Monday 23:46 Rocky Bernstein * Doc/lib/libpydb.tex: The usual documentation cleanup that's noticed right after a release but should have been done before the release. Here we go over the section on threading and correct information on the kill command. Finally note how to write a wrapper script for those die-hard pdb people that insist on doing so. 2006-09-25 Monday 22:56 Rocky Bernstein * htdocs/index.html: Revise to add threading and signal handling. 2006-09-25 Monday 07:50 Rocky Bernstein * pydb/gdb.py.in, test/thread/thread-switch.cmd: next should be like step for thread debugging. Either way could lead to do something wrong, but a false positive is better than missing a stop. thread-switch: "thread" command doesn't exist right now. 2006-09-25 Monday 00:23 Rocky Bernstein * NEWS, test/file-2.5.right, test/file.cmd, test/file.right: Accomodate Python 2.3. 2006-09-25 Monday 00:08 Rocky Bernstein * configure.ac, test/Makefile.am, test/file-2.5.right, test/file.cmd, test/file.py.in, test/file.right: Add some missing files from distribution. file test needs special 2.5 output. Get ready for 1.18 release. 2006-09-24 Sunday 23:48 Rocky Bernstein * NEWS, TODO, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/threaddbg.py: Handle stepping in the presence of threads. Remove "thread" command - it's too flaky field "run" command in thread debugging TODO: Note deferred items 2006-09-23 Saturday 06:18 Rocky Bernstein * pydb/threaddbg.py: Accidentally checked some test debugging code. 2006-09-23 Saturday 06:15 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, pydb/threaddbg.py, test/thread/tlock.py: Deal with more threading and signal interferences. Deal with recursive debugging and threading interference Note that restart for threading doesn't work. 2006-09-22 Friday 03:07 Rocky Bernstein * pydb/threaddbg.py: Remove duplicate set debug-pydb 2006-09-22 Friday 00:35 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in: Document 'file' command better 2006-09-22 Friday 00:24 Rocky Bernstein * test/: file.py.in, file.right: A slightly less bogus 'file' command test. 2006-09-22 Friday 00:20 Rocky Bernstein * configure.ac, test/Makefile.am, test/trace.py.in: trace.py.in: minor change. *: Add file test. A bit bogus for now but it does check that the command exists. 2006-09-21 Thursday 21:21 Rocky Bernstein * pydb/pydbbdb.py: Spelling in comment. 2006-09-21 Thursday 12:50 Rocky Bernstein * pydb/pydb.py.in: Make run (R) work when started via the FILE command. 2006-09-21 Thursday 12:43 Rocky Bernstein * pydb/gdb.py.in: Better about honoring quit when run via "file". Set more variables to be closer to what it would be done if the program were run directly. 2006-09-21 Thursday 10:16 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in: Add gdb's FILE command. 2006-09-21 Thursday 09:45 Rocky Bernstein * configure.ac, pydb/fns.py, test/.cvsignore, test/Makefile.am, test/fns.py.in: Add some simple regression tests for some of the routines in fns.py 2006-09-21 Thursday 08:56 Rocky Bernstein * pydb/connection.py, test/connect.py.in, test/fifo_connect.py.in: connection.py: FIFO server now waits for an incomming connection. fix improper handling of removing FIFO output file test/connect.py.in: Add proper $Id$ line test/fifo_connect.py: make work when FIFO communicatio files don't exist which *should* have been always the case.a 2006-09-21 Thursday 01:13 Rocky Bernstein * test/: fifo_connect.py.in, tcp_connect.py.in: Don't hard-code in Python interpreter. 2006-09-19 Tuesday 09:22 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: set_trace now supports thread debug support via the "add_threadbg" parameter. 2006-09-19 Tuesday 08:43 Rocky Bernstein * pydb/gdb.py.in: Don't show signals in a plain "info" display. 2006-09-19 Tuesday 08:22 Rocky Bernstein * test/: brkpt2.cmd, brkpt2.right: Add tbreak test. 2006-09-18 Monday 01:29 Rocky Bernstein * pydb/threaddbg.py, test/test.py.in: Return regression test commented out. Needs to be gone over. threaddbg.py: uncomment code so frame doesn't put us in debugger frames Add separator lines between frame stack traces. 2006-09-18 Monday 01:09 Rocky Bernstein * pydb/threaddbg.py, test/test.py.in: threaddbg.py: add in threadframe support. Modularize "info thread terse" More cleanup of everything would be nice. test.py.in: remove run test for Python 2.4. 2006-09-17 Sunday 13:47 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/sighandler.py, pydb/threaddbg.py, test/sighandler.cmd, test/sighandler.right: Fill out documentation on thread debugging, extensions to break, tbreak and frame. Fix bug in "handle sig-name". threaddbg.py: add tbreak with thread name. 2006-09-17 Sunday 09:42 Rocky Bernstein * Doc/lib/libpydb.tex: Start adding thread debugging information. More later. 2006-09-17 Sunday 08:56 Rocky Bernstein * Doc/lib/libpydb.tex: Comment out target docs. 2006-09-17 Sunday 08:50 Rocky Bernstein * Doc/lib/libpydb.tex: Add section on signal handling. 2006-09-17 Sunday 07:48 Rocky Bernstein * test/: sighandler.cmd, sighandler.right: Add test for recent bug fix 2006-09-17 Sunday 07:44 Rocky Bernstein * pydb/sighandler.py: info signal: looking in wrong list for signal. 2006-09-17 Sunday 01:21 Rocky Bernstein * pydb/threaddbg.py: Comment untangling. 2006-09-17 Sunday 01:11 Rocky Bernstein * pydb/gdb.py.in, pydb/pydb.py.in, pydb/show.py, pydb/sighandler.py, pydb/threaddbg.py, test/connect.py.in, test/test.py.in, test/trace.py.in: Reduce pyflakes errors. 2006-09-17 Sunday 00:49 Rocky Bernstein * Doc/lib/libpydb.tex: Some typos. 2006-09-17 Sunday 00:37 Rocky Bernstein * test/sigtest.py.in: Tolerance for Python 2.4. This time for sure! 2006-09-17 Sunday 00:31 Rocky Bernstein * test/sigtest.py.in: Tolerance for python 2.3 2006-09-17 Sunday 00:18 Rocky Bernstein * NEWS: possible order of interest. 2006-09-17 Sunday 00:17 Rocky Bernstein * pydb/connection.py, test/fifo_connect.py.in: pydb/connection.py: @static is not available on any Pythons test/fifo_connect.py.in: deal with a race condition between client and server 2006-09-16 Saturday 23:49 Rocky Bernstein * pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/threaddbg.py, test/thread/thread-switch.cmd: Add breakpoints on specific threads 2006-09-16 Saturday 19:07 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.py.in: Doc/lib/lib/pydb.py: Update files section. Add info on exception_hook gdb.py.in: remove frame setup in trace_dispatch_gdb was an erroneous fix. pydb.py.in: comment out pdbserver. 2006-09-16 Saturday 16:15 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/pydbbdb.py, test/tcp_connect.py.in: Fix bug in handling tbreak. 2006-09-16 Saturday 14:55 Rocky Bernstein * pydb/gdb.py.in: Fix parameters from conversion. 2006-09-16 Saturday 14:54 Rocky Bernstein * htdocs/debian.png, htdocs/netbsd.png, pydb/gdb.py.in, pydb/threaddbg.py, test/.cvsignore, test/Makefile.am, test/fifo_connect.py.in, test/sighandler.cmd, test/sighandler.right, test/test.py.in, test/thread/test.py, test/thread/thread-switch.cmd: gdb.py.in: make it play nice with other dispatchers (namely the thread dispatcher) test/sighandler* test/test.py.in: yet another set of little handle tests test/thread/thread-switch.cmd test/thread/test.py: towards better regression tests htdocs: png's that appear on the site. 2006-09-16 Saturday 08:24 Rocky Bernstein * pydb/connection.py, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbcmd.py, pydb/threaddbg.py, test/cmdparse.right: Remove remote stuff. For now it's just too much of a hassle to get working. 2006-09-16 Saturday 01:04 Rocky Bernstein * Makefile.am, configure.ac, test/Makefile.am, test/sigtest.py.in, test/tcp_connect.py.in: Add tcp_connect.py and fifo_connect.py regression tests. Remove some pychecker warnings in test/*.py 2006-09-15 Friday 08:45 Rocky Bernstein * test/: .cvsignore, tcp_connect.py.in: New TCP connection tests. 2006-09-15 Friday 08:44 Rocky Bernstein * Makefile.am, configure.ac, pydb/connection.py, test/connect.py.in: pydb/connection.py: reinstate raising ConnectionFailed in connect() remove output file if it exists in disconnect() connect.py.in: some TCP tests haven moved to tcp_connect.py.in Makefile.am, configure.ac: add tcp_connect.py.in 2006-09-14 Thursday 10:47 Rocky Bernstein * pydb/connection.py: Revise FIFO connection code. 2006-09-13 Wednesday 01:49 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/set.py: Doc/lib/libpydb.tex: start to document some of the set/show commans. set.py: docstring updates and flesh out set debug-signal a little more. 2006-09-12 Tuesday 23:58 Rocky Bernstein * pydb/sighandler.py, test/sigtest.py.in: Fix bug in handling "stop" attribute of "handle" command. 2006-09-12 Tuesday 07:11 Rocky Bernstein * test/sigtest.py.in: At least some of the *other* workarounds can now be removed. 2006-09-12 Tuesday 07:02 Rocky Bernstein * pydb/gdb.py.in, pydb/set.py, pydb/show.py, pydb/sighandler.py, test/cmdparse.right, test/sigtest.py.in: Start set/show sigcheck. One regression test in sigtest.py still fails (and commented out for now.) 2006-09-12 Tuesday 02:23 Rocky Bernstein * pydb/gdb.py.in, pydb/set.py, pydb/show.py, pydb/threaddbg.py, test/cmdparse.right: rename "set/show systrace" to "set/show debug-pydb". Start the process of doing being able to turn on/off the signal watching dispatcher. (A Later change will be done to force it to be used thoroughly when it is wanted.) 2006-09-09 Saturday 11:50 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/connect.py.in, test/sigtest.py.in: Change needed for Python 2.3.4. Sigh. 2006-09-09 Saturday 01:24 Rocky Bernstein * NEWS, pydb/sighandler.py, test/sigtest.py.in: Add a signal handler "print" + "stop" test. 2006-09-08 Friday 15:54 Rocky Bernstein * pydb/connection.py: Import mconnection.py from Matt Fleming's '06 Summer of Code project 2006-09-08 Friday 15:47 Rocky Bernstein * Doc/paper-letter/.cvsignore: More derived files. 2006-09-08 Friday 10:13 Rocky Bernstein * Makefile.am: Recreate gdb.py.in BEFORE running make check. 2006-09-08 Friday 10:04 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/sighandle.py.in, test/sigtest.py.in, test/sigtestexample.py: Handle stop. Can't figure out though how to do stop and pass together. Revise docstrings to reflect this. More regression tests of the various nopass combinations. SigHandler is now an internal class. 2006-09-08 Friday 00:44 Rocky Bernstein * pydb/: fns.py, gdb.py.in: fns.py: make examine more useful by showing instance variables gdb.py.in: typo 2006-09-08 Friday 00:01 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/sighandle.py.in: The SigHandler class now has just the things it needs for signal handling and doesn't pull in the debugger or contain a hash table of other signals. Make signalmanager class which wraps SigHandle objects for the debugger. Code is also, by the way, a bit cleaner and simpler. 2006-09-07 Thursday 01:23 Rocky Bernstein * pydb/gdb.py.in, pydb/set.py, pydb/show.py, pydb/threaddbg.py, test/cmdparse.right, test/sigtest.py.in, test/sigtestexample.py: Add the ability even if crude, to get access to the debugger object inside the debugger: set/show systrace. (Idea came from thread debugger, so code was removed from that). test/sig*: more honest regression test, even if still has some flakiness. Removed some sleeps, too. 2006-09-05 Tuesday 01:38 Rocky Bernstein * Makefile.am: Typo: trace/pm.py -> test/pm.py 2006-09-05 Tuesday 01:37 Rocky Bernstein * Makefile.am, configure.ac, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/show.py, test/Makefile.am, test/cmdparse.right, test/connect.py.in: Add mmore of the connect tests. Start adding bits to the documentation and revising it, usually by elaborating. 2006-09-05 Tuesday 01:35 Rocky Bernstein * htdocs/index.html: It's "python pdb.py script" not "python pdb" 2006-09-05 Tuesday 01:00 Rocky Bernstein * htdocs/index.html: pydb *is* still used in ddd. 2006-09-04 Monday 07:30 Rocky Bernstein * Doc/pydb.1.in, htdocs/download.html, pydb/gdb.py.in, pydb/subcmd.py, test/test.py.in: pydb/* test/*: Had broken subcommand completion in revising subcommand interface. Add regression test so this doesn't happen again. htdocs: Add links2linux. Thanks Manfred! pydb.1.in: add mention of frame, up, down, and disassemble. 2006-09-04 Monday 03:45 Rocky Bernstein * TODO: Knock two things off the list. 2006-09-03 Sunday 11:41 Rocky Bernstein * Makefile.am, pydb/gdb.py.in, pydb/info.py, pydb/pydb.py.in, pydb/pydbcmd.py, pydb/pydbdisp.py, pydb/set.py, pydb/show.py, test/cmdparse.right: First very rough cut at trying to merge in Matt's Summer of Code remote communication project. 2006-09-03 Sunday 01:00 Rocky Bernstein * pydb/pydbdisp.py, test/.cvsignore: Dunno how I missed pydbdisp.py. CVS lint. 2006-09-03 Sunday 00:57 Rocky Bernstein * test/: Makefile.am, sigtest.py.in: Add two of Matt's regression tests. The others don't work for me. 2006-09-03 Sunday 00:33 Rocky Bernstein * Makefile.am, configure.ac, pydb/sighandler.py, pydb/threaddbg.py, test/Makefile.am, test/sighandle.py.in, test/sigtest.py.in: pydb/sighandler.py: simplify logic and make code more precise. Allow signal names without the SIG prefix. Add main to do some simple tests over signal name/num lookup. test/*: First set of regression tests that works for me. 2006-09-02 Saturday 10:41 Rocky Bernstein * pydb/: gdb.py.in, sighandler.py, threaddbg.py: gdb.py.in: Add unconditionally option to kill. Add gdb's signal command. signandler.py lookup_signame(): fastpath signal name check lookup_signum(): more correct signal name lookup tolerate signal names without SIG. threaddbg.py: grammar 2006-09-02 Saturday 03:31 Rocky Bernstein * htdocs/index.html: Go to a separate download page. 2006-09-02 Saturday 03:28 Rocky Bernstein * htdocs/download.html: A real download page. 2006-09-02 Saturday 02:43 Rocky Bernstein * pydb/: sighandler.py, subcmd.py: sighandler: someone doesn't remember how startswith works, and doesn't write thorough tests to find bugs. subcmd.py: remove a pychecker warning. 2006-09-02 Saturday 01:46 Rocky Bernstein * pydb/threaddbg.py: Show current thread and frame thread showing location. Short thread list display is a little nicer. 2006-09-01 Friday 11:03 Rocky Bernstein * Doc/pydb.1.in: Put references one on a line to lessen the chance of a long line. Thanks to feedback from Alex Moskalenko. 2006-09-01 Friday 10:55 Rocky Bernstein * Makefile.am: Install/copy pydb.py as pydb rather than symlink. Thanks to Alex Moskalenko for the suggestion. 2006-09-01 Friday 01:31 Rocky Bernstein * pydb/: gdb.py.in, threaddbg.py: threaddbg.py: Add frame command that allows one to specify a thread name gdb.py.in: more detailed doc string for setup() method. 2006-08-31 Thursday 11:16 Rocky Bernstein * NEWS, pydb/threaddbg.py: Add ability to specify a set of thread to switch to. Add "info thread terse" for just-the-facts thread info Start safe-quit routine. Currently buggy and routine needs to be split into a part for >=2.5b1 and another part for <2.5b1. 2006-08-31 Thursday 02:52 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in, pydb/threaddbg.py: threaddbg.py: remove some of the flakiness about checking to see if a frame is nested from threaddbg.py gdb.py.in: split quit from kill. Kill is a "kill -KILL", i.e. hard and nonmaskable. Note performance implication of checking of a signal handler on every dispatch call. fns.py get_confirmation(): add a default confirmation value for when we are noninteractive. NEWS: note threading started and kill 2006-08-30 Wednesday 07:59 Rocky Bernstein * pydb/threaddbg.py: We now only allow switching between threads that are blocked inside the debugger. Neat idea, huh? 2006-08-30 Wednesday 07:29 Rocky Bernstein * test/thread/test.py: Something basic to run all of the thread programs under tracing to make sure we haven't botched something badly in the dispather. 2006-08-30 Wednesday 07:16 Rocky Bernstein * test/thread/: prof2.py, q.py, t2.py, thread1.py, tlock.py: Add some sample thread programs to be used to test debugging. 2006-08-29 Tuesday 02:48 Rocky Bernstein * Makefile.am, pydb/gdb.py.in, pydb/pydb.py.in, pydb/threaddbg.py: First checked-in attempt at a thread debugging. * info thread:- like gdb (if Python 2.5b and later threadframe) we also add a "verbose" to list the entire stack for a thread * thread: like gdb's switches between threads * set/show systrace: do we include debugger/threading routines in the most-recent list of frames? Warning things are a little flaky and it's very possible that things like detecting deadlock when a "quit" is done can't be done reliably. pydb/pydb.py.in: add --threading option. You don't get thread debugging unless you ask for it, because it adds complexity and flakiness. 2006-08-26 Saturday 01:22 Rocky Bernstein * Doc/pydb.1.in: pdb.doc -> pydb.doc. Many thanks to Aleks Moskalenko for catching this (and making a Debian package). 2006-08-25 Friday 12:33 Rocky Bernstein * pydb/pydbcmd.py: Erroneous indent creaped in. 2006-08-25 Friday 12:29 Rocky Bernstein * pydb/pydbcmd.py: Truncating help messages is *not* like the way gdb works. The prior change to make it so was probably incorrect. 2006-08-23 Wednesday 02:55 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/sigtest.py.in: Patch from Matt Fleming: Had checked to see whether we were set to 'stop' on a signal inside trace_dispatch and only then, if the signal handler was not our custom one, reset the signal handler to our custom handler and saved the old handler (which could be a handler from a user's program) in old_handler. Now, we check to see if the signal handler has been replaced by something that is not: signal.SIG_DFL - the default handler in Python signal.SIG_IGN - sets python to ignore the signal sighandler.handle - pydb's signal handler If this is so, then it must have been set to a signal handler from a user's file. In which case we store it, and use it later if the programmer controlling pydb decides they want to pass the signal to their program. 2006-08-22 Tuesday 23:51 Rocky Bernstein * NEWS: Spelling typo 2006-08-22 Tuesday 20:39 Rocky Bernstein * test/sigtest.py.in: Make nicer for Emacs users 2006-08-22 Tuesday 01:19 Rocky Bernstein * NEWS, configure.ac: Solidly in 1.18cvs by now. 2006-08-22 Tuesday 01:14 Rocky Bernstein * pydb/fns.py, pydb/gdb.py.in, pydb/pydb.py.in, pydb/sighandler.py, test/.cvsignore, test/brkpt1.right, test/sigtestexample.py: pydb/fns.py: Matt Fleming's patch to pull out common code from gdb.py.in and thread debugging breakpoint handling. pydb/sighandler.py: revise "pass" so that the debugger signal handler is not seen in the passed frame tset/sigtestexample.py: Change to make it useful to debug to see that signal handling, like "pass" works properly. pydb/gdb.py.in: remove code in fns.py brkpt1.right: some error messages have changed wording slightly .cvsignore: sigtest.py 2006-08-12 Saturday 04:34 Rocky Bernstein * Makefile.am, configure.ac, pydb/gdb.py.in, pydb/sighandler.py, test/Makefile.am, test/sigtest.py.in, test/sigtestexample.py: Third update from Matt Fleming. passing a signal probably works now. regression test added. Dispatcher checks/installs stopped signals. (Probably not the last word on this though). 2006-08-08 Tuesday 02:04 Rocky Bernstein * pydb/sighandler.py: Note work that yet to be done 2006-08-08 Tuesday 01:34 Rocky Bernstein * pydb/gdb.py.in, pydb/sighandler.py, test/Makefile.am: Matt Fleming's signal handling patches. 2nd round. But there seem to be still gaps... 2006-08-07 Monday 01:45 Rocky Bernstein * pydb/set.py: Need to import re. 2006-08-01 Tuesday 15:10 Rocky Bernstein * pydb/sighandler.py: Follow gdb signals more closely. In particular the signals we really don't want to stop on. 2006-08-01 Tuesday 14:46 Rocky Bernstein * Makefile.am: Install sighandler.py 2006-07-31 Monday 00:14 Rocky Bernstein * pydb/sighandler.py, test/cmdparse.right, test/test.py.in: sighandler.py: had improperly patched this routine. *: changes to make regression tests work. 2006-07-31 Monday 00:06 Rocky Bernstein * pydb/sighandler.py: CVS Id line. 2006-07-31 Monday 00:02 Rocky Bernstein * pydb/: gdb.py.in, sighandler.py: Matt Fleming's signal handling code. Thanks! 2006-07-29 Saturday 16:34 Rocky Bernstein * Doc/pydb.1.in: Doc --exec/-e. 2006-07-29 Saturday 10:43 Rocky Bernstein * Doc/lib/libpydb.tex: Add linetrace example and output. 2006-07-29 Saturday 10:21 Rocky Bernstein * NEWS: Update tested OSs 2006-07-29 Saturday 09:59 Rocky Bernstein * NEWS: Update tested Python versions 2006-07-29 Saturday 09:00 Rocky Bernstein * .cvsignore, pydb/fns.py, pydb/pydb.py.in, test/test.py.in: fns.py pydb.py: reduce imports 2006-07-29 Saturday 08:09 Rocky Bernstein * NEWS, configure.ac, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.py.in, pydb/subcmd.py: pydb.py.in, libpdb.py.tex: Remove cmdfile from pm(). *: reduce pychecker warnings 2006-07-29 Saturday 02:21 Rocky Bernstein * Doc/lib/libpydb.tex: Document new option --exec or -e. 2006-07-29 Saturday 02:13 Rocky Bernstein * Doc/lib/libpydb.tex: Add section on linetracing. Work on section "Calling debugger from inside your program" 2006-07-29 Saturday 01:52 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in, test/pm.py.in: post_mortem and pm: Instead of opt dictionary, you pass a list of debugger command strings. 2006-07-28 Friday 14:46 Rocky Bernstein * test/trace-2.5.right: Update Python 2.5 output. 2006-07-28 Friday 09:37 Rocky Bernstein * NEWS, pydb/display.py, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/.cvsignore, test/brkpt1.right, test/cmdparse.right, test/gcd.py, test/hanoi.py, test/history.right, test/pm.py.in, test/run.right, test/run2.right, test/test.py.in, test/trace.right: reduce pychecker warnings 2006-07-28 Friday 01:36 Rocky Bernstein * pydb/: display.py, fns.py, gdb.py.in, info.py, pydb.py.in, pydbbdb.py, pydbcmd.py, set.py: Reduce number of pycheck errors. 2006-07-28 Friday 00:47 Rocky Bernstein * configure.ac, Doc/lib/libpydb.tex, pydb/fns.py, pydb/pydb.py.in, test/Makefile.am, test/settrace.py.in: pydb/fns.py: Add --exec option for pydb. Change set_trace to take a list of commands rather than the hoaky dictionary. Doc/lib/libpydb.tex: Update documentation to reflect changes Thanks to Matt Fleming for the --exec patch. 2006-07-27 Thursday 23:36 Rocky Bernstein * emacs/pydb.el: (pydb-pydbtrack-overlay-arrow): Don't set value to pos. Fix a typo. (pydb-pydbtrack-track-stack-file): Put target_buffer to let*'s variable list. Changes modified from from Masatake YAMATO' patches to bashdb/bashdb.el 2006-07-25 Tuesday 20:13 Rocky Bernstein * Makefile.am: Was trying to make a directory when one already existed. 2006-07-25 Tuesday 14:15 Rocky Bernstein * pydb/: gdb.py.in, info.py, set.py, show.py: Remove "show commands" from "show" commands that are run. {info,set,show}.py: note importance of docstring. 2006-07-25 Tuesday 14:08 Rocky Bernstein * pydb/: gdb.py.in, subcmd.py: We need to remove commands from "info" not the list of info commands. 2006-07-25 Tuesday 13:48 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in: Remove "info global" and "info local" from things that get shown when "info" is run. So nice to have an easy mechanism for doing this - thanks Matt! 2006-07-25 Tuesday 09:40 Rocky Bernstein * pydb/: info.py, set.py, show.py: Document weird behavior of phony "info", "set" and show subclasses. 2006-07-25 Tuesday 09:33 Rocky Bernstein * Makefile.am, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/info.py, pydb/pydbcmd.py, pydb/set.py, pydb/show.py, test/cmdparse.right: Put info, set and show subcommands into separate files. 2006-07-25 Tuesday 08:25 Rocky Bernstein * Makefile.am, Doc/lib/libpydb.tex, pydb/display.py, pydb/pydbdisp.py: pydbdisp.py -> diplay.py Makefile.am: clean targets were missing some pyc's. 2006-07-25 Tuesday 01:43 Rocky Bernstein * NEWS: Note recent subcommand work and doc changes. 2006-07-25 Tuesday 01:30 Rocky Bernstein * TODO, pydb/gdb.py.in, pydb/pydbcmd.py, pydb/subcmd.py, test/cmdparse.cmd, test/cmdparse.right: Lots of bug fixes to the subcommand handling from Matt Fleming. Thanks Matt! Some help/doc strings are now more than one line and more closely follow gdb conventions (odd as it seems to me). 2006-07-23 Sunday 16:32 Rocky Bernstein * TODO: Recent commit caused a bug or two. And needs to be finished more. 2006-07-23 Sunday 04:09 Rocky Bernstein * Doc/lib/libpydb.tex: Even more about interpreter and script-name searching. This time under the section on set_trace. 2006-07-23 Sunday 00:23 Rocky Bernstein * Doc/lib/libpydb.tex: More information alternate command invocation methods and their pitfalls. 2006-07-22 Saturday 23:31 Rocky Bernstein * Doc/lib/libpydb.tex: Typo. 2006-07-22 Saturday 22:39 Rocky Bernstein * Makefile.am, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbcmd.py, pydb/subcmd.py, test/cmdparse.right: subcmd.py: Add class for handling subcommmands gdb.py.in, pydb.py.in: use subcommand class pydb.py.in: Better error message when script name not found. 2006-07-22 Saturday 22:37 Rocky Bernstein * Doc/lib/libpydb.tex: More it explicit that script name in pydb script-name doesn't undergo path searching. 2006-07-21 Friday 08:17 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: Had broken run, runeval, and runcall with the addition of the "running" variable. Update documentation to clarify the use of these routines and that "run" is NOT the simlar to the debugger command "run". 2006-07-18 Tuesday 21:34 Rocky Bernstein * pydb/gdb.py.in: Typo. 2006-07-16 Sunday 20:15 Rocky Bernstein * Doc/lib/libpydb.tex: Address a couple of LaTeX bugs? 2006-07-16 Sunday 04:57 Rocky Bernstein * pydb/gdb.py.in: 1 -> True. Is more linguistically pure. 2006-07-16 Sunday 00:06 Rocky Bernstein * htdocs/index.html: Simplify page a little. 2006-07-15 Saturday 22:59 Rocky Bernstein * pydb/gdb.py.in: Another typo. 2006-07-15 Saturday 22:58 Rocky Bernstein * pydb/gdb.py.in: Typo. 2006-07-15 Saturday 22:57 Rocky Bernstein * pydb/gdb.py.in: Restore sys.stdout even in the presence of exceptions. 2006-07-15 Saturday 22:42 Rocky Bernstein * pydb/gdb.py.in: Disassemble uses "print". We may have redirected where we want debugger output to do. So we'll save and restore sys.stdout. Observation and fix from by Matt Flemming. 2006-07-13 Thursday 08:29 Rocky Bernstein * pydb/pydb.py.in: Correct doc string for set_trace 2006-07-13 Thursday 07:45 Rocky Bernstein * pydb/fns.py: Correct usage string. 2006-07-13 Thursday 02:30 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: Change cmdfile option in set_trace which is broken, to a dictionary option. 2006-07-13 Thursday 02:14 Rocky Bernstein * Doc/lib/libpydb.tex: Update doc for new set_trace behavior. 2006-07-13 Thursday 01:54 Rocky Bernstein * pydb/pydb.py.in: Typo. 2006-07-12 Wednesday 09:47 Rocky Bernstein * pydb/pydb.py.in: Last change was bogus. Remove unnecessary assignemnt. 2006-07-12 Wednesday 09:37 Rocky Bernstein * pydb/pydb.py.in: Make exception handling when debugger pulled in by set_trace work under Python 2.3.4 2006-07-12 Wednesday 03:07 Rocky Bernstein * pydb/fns.py: Bug in get_confirmation. Patch courtesy of Matt Fleming. 2006-07-11 Tuesday 10:54 Rocky Bernstein * test/.cvsignore: The usual. 2006-07-11 Tuesday 10:53 Rocky Bernstein * test/except.py.in: Minor change. 2006-07-11 Tuesday 10:47 Rocky Bernstein * configure.ac, pydb/pydb.py.in, test/Makefile.am, test/except.py.in: Add exception handler on set_trace entry. There is a weirdness in post_mortem I don't understand. restart doesn't work either.a 2006-07-10 Monday 08:11 Rocky Bernstein * NEWS, pydb/gdb.py.in, pydb/pydb.py.in, test/test.py.in: whatis now shows doc strings if there is one. test.py.in: improve docstrings. 2006-07-10 Monday 07:21 Rocky Bernstein * pydb/fns.py: process_options: allow options to be passed in. Return list of options parsed. 2006-07-10 Monday 07:04 Rocky Bernstein * pydb/fns.py, pydb/gdb.py.in, test/noscript.cmd, test/noscript.right: More checks on commands when we aren't running a program. 2006-07-09 Sunday 23:01 Rocky Bernstein * pydb/: fns.py, gdb.py.in, pydbdisp.py: Long display only for examine, not display. Correct examine documentation again. 2006-07-09 Sunday 22:31 Rocky Bernstein * pydb/: fns.py, gdb.py.in, pydbdisp.py: Address examine issue one more time. Remove printing routines from pydbdisp.py 2006-07-09 Sunday 17:07 Rocky Bernstein * pydb/pydbdisp.py: More detail for class/instance objects. Still don't know how to deal with dictproxy though. 2006-07-09 Sunday 16:31 Rocky Bernstein * test/: Makefile.am, noscript.cmd, noscript.right: New regression test for entering the debugger without a script name. 2006-07-09 Sunday 00:49 Rocky Bernstein * pydb/gdb.py.in, test/test.py.in: Fix a couple of simple bugs caught by the unit tests. Good thing we have them! 2006-07-09 Sunday 00:43 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, pydb/pydbdisp.py, test/test.py.in: Allow entry to the debugger without a script name. info commands now allow for unique abbreviation. Update doc to include list of files making up the debugger and other changes in user behavior. 2006-07-04 Tuesday 13:45 Rocky Bernstein * NEWS: Typo. 2006-07-04 Tuesday 13:40 Rocky Bernstein * test/test.py.in: "Note:" is not applicable when not running the test. (But maybe someday the test will be fixed up for Python 2.5) 2006-07-04 Tuesday 13:31 Rocky Bernstein * test/trace-2.5.right: Correct output now doesn't show program stdout, even in Python 2.5. Thanks again to Matt Fleming for noticing the problem. 2006-07-04 Tuesday 06:09 Rocky Bernstein * NEWS: Note: --output and --error no longer modify programs stdout/stderr. 2006-07-04 Tuesday 06:02 Rocky Bernstein * pydb/fns.py, test/filebug.right, test/run.right, test/trace.right: Change of heard. --output changes only debugger output, not also the program stdout. 2006-07-04 Tuesday 02:13 Rocky Bernstein * pydb/fns.py: Note that --output and --errors change both the debugger's and the programs's stdout/stderr. 2006-07-04 Tuesday 01:58 Rocky Bernstein * NEWS, pydb/fns.py, pydb/pydbcmd.py: More fexible and more general output by no longer assuming we write to sys.stdout. Rather the output object is saved in the instance variable, which could be and often is the same as sys.stdout, but doesn't need to be. This change may make communication used in remote and thread debugging simpler. Many thanks to Matt Flemming for the patch. 2006-07-03 Monday 02:23 Rocky Bernstein * Doc/info/Makefile: For building info file. 2006-07-02 Sunday 01:08 Rocky Bernstein * NEWS, test/Makefile.am, test/trace-2.5.right, test/trace.py.in: Tolerance for Python 2.5. 2006-06-29 Thursday 10:39 Rocky Bernstein * TODO, pydb/gdb.py.in: Check if we have something to exec in restart. 2006-06-28 Wednesday 19:11 Rocky Bernstein * pydb/pydbbdb.py: filename: Bug when filename=None. Try mainpyfile if that exists. 2006-06-26 Monday 12:30 Rocky Bernstein * pydb/fns.py: Small changes. Add a __main__ for testing. Some variable renaming in search_file(). 2006-06-26 Monday 02:41 Rocky Bernstein * pydb/: gdb.py.in, pydbdisp.py: Allow Display mode where we don't print a number. 2006-06-26 Monday 02:04 Rocky Bernstein * pydb/gdb.py.in, test/pm.py.in, test/test.py.in: gdb.py.in: do_debug fixes. 2006-06-26 Monday 00:59 Rocky Bernstein * test/test.py.in: Tolerate for python 2.3.4. It's what I gotta use at work. Sigh. 2006-06-24 Saturday 09:08 Rocky Bernstein * pydb/: fns.py, pydb.py.in: --version option had been broken due to lack of @PACKAGE_VERSION@ substitution. 2006-06-24 Saturday 09:01 Rocky Bernstein * pydb/: fns.py, gdb.py.in: Move some of the non-command fns from gdb.py.in into fns.py 2006-06-24 Saturday 08:47 Rocky Bernstein * pydb/gdb.py.in, pydb/pydb.doc, test/brkpt1.cmd, test/cmdparse.cmd, test/cmdparse.right, test/history.cmd, test/history.right: Allow short subcommands in "set". E.g. "set hi", "set lis" 2006-06-23 Friday 10:30 Rocky Bernstein * pydb/gdb.py.in: More work in the "directory" command. 2006-06-23 Friday 08:53 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in: Add common routine get_confirmation() and remove it from gdb.py.in 2006-06-23 Friday 03:14 Rocky Bernstein * pydb/gdb.py.in: Use "display" output in examine. 2006-06-21 Wednesday 11:03 Rocky Bernstein * pydb/gdb.py.in: __help_set -> set_helper; __help_info -> info_helper. Looks like these routines are not so internal after all. 2006-06-21 Wednesday 10:34 Rocky Bernstein * NEWS: What's new. 2006-06-21 Wednesday 10:33 Rocky Bernstein * NEWS, pydb/gdb.py.in: Allow all "show" commands to allow unique abbreviations of the subcommand name. Allow info, and set help strings to be subclassed properly. 2006-06-20 Tuesday 12:19 Rocky Bernstein * pydb/: gdb.py.in, pydbbdb.py: pydbbdb.py: remove the debugging code in there. gdb.py.in: set directory wasn't working. 2006-06-20 Tuesday 11:08 Rocky Bernstein * test/history.right: Update to allow "show hi" 2006-06-20 Tuesday 11:06 Rocky Bernstein * pydb/gdb.py.in, test/cmdparse.cmd, test/cmdparse.right, test/history.cmd: Add more shortened versions of show commands. 2006-06-20 Tuesday 03:34 Rocky Bernstein * NEWS, configure.ac, pydb/pydb.py.in: Tolerance for version 2.3.4. - It's what I have to use at work. 2006-06-20 Tuesday 03:22 Rocky Bernstein * pydb/__init__.py.in: Tolerance for version 2.3.4. (It's what I have to use at work). 2006-06-19 Monday 04:55 Rocky Bernstein * NEWS, pydb/gdb.py.in: Allow more subcommand prefixes in the show command 2006-06-18 Sunday 22:40 Rocky Bernstein * NEWS, pydb/fns.py, pydb/gdb.py.in, pydb/pydb.doc, pydb/pydbbdb.py, pydb/pydbcmd.py: Initial try at "directories" and "show directories". We also start to use startswith in show commands. Added some FIXME's which I hope get fixed. 2006-06-18 Sunday 19:25 Rocky Bernstein * Doc/lib/libpydb.tex: I've coined a catchy phrase for this debugger principle. Maybe it'll catch on. (Newton didn't have any descendants and I don't think he and his kind trademarked the name. I hope I don't get sued.) 2006-06-17 Saturday 22:13 Rocky Bernstein * Doc/lib/libpydb.tex: Note difference between debugger "p", Python eval print, and Python "print". 2006-06-16 Friday 09:33 Rocky Bernstein * emacs/pydb.el: syntax error 2006-06-16 Friday 08:02 Rocky Bernstein * emacs/pydb.el: The "turn-on-pydbtrack" command turns removes py-pdbtrack from comint-output-filter-functions which was removing the cursor in the source window. 2006-06-16 Friday 03:41 Rocky Bernstein * pydb/pydbbdb.py: Need to handle the other specifier of a relative directory: .. 2006-06-16 Friday 02:53 Rocky Bernstein * configure.ac: We're in 1.17 now. 2006-06-08 Thursday 09:04 Rocky Bernstein * Doc/lib/libpydb.tex: another typo 2006-06-08 Thursday 07:41 Rocky Bernstein * Doc/lib/libpydb.tex: more wordsmithing 2006-06-07 Wednesday 10:51 Rocky Bernstein * Doc/lib/libpydb.tex: Note tai-chi principle for debuggers: minimum force 2006-06-03 Saturday 22:22 Rocky Bernstein * pydb/: fns.py, pydb.py.in: Make pm and post_mortem easier to use by using sys.exec_info() if sys.last_traceback hasn't been set. fns.py: get_last_tb_or_frame_tb(frameno=1): Intended to be used going into post mortem routines. If sys.last_traceback is set, we will return that and assume that this is what post-mortem will want. If sys.last_traceback has not been set, then perhaps we *about* to raise an error and are fielding an exception. So assume that sys.exec_info()[frameno] is where we want to look. 2006-06-03 Saturday 21:15 Rocky Bernstein * pydb/pydbcmd.py: Add __builtins__ to the set globals passed to the debugger initially. 2006-06-01 Thursday 00:49 Rocky Bernstein * pydb/: gdb.py.in, pydbcmd.py: pydbcmd.py: add add stdin, stdout parameters gdb.py.in: set_trace() was failing because of improper intialization of commands. 2006-05-30 Tuesday 00:33 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in, pydbbdb.py, pydbcmd.py: Allow redirection of stdin and stdout in the same manner as {p,b}db.py. 2006-05-27 Saturday 11:56 Rocky Bernstein * Doc/lib/libpydb.tex: link to readline. cmd.py -> cmd. 2006-05-27 Saturday 11:52 Rocky Bernstein * pydb/: gdb.py.in, pydb.py.in, pydbcmd.py: Wasn't passing completekey paramenter properly. 2006-05-27 Saturday 11:50 Rocky Bernstein * Doc/lib/libpydb.tex: More about Pdb class and what's in Gdb, Cmd, and Bdb. 2006-05-27 Saturday 04:41 Rocky Bernstein * NEWS: NEWS 2006-05-27 Saturday 04:36 Rocky Bernstein * Doc/lib/libpydb.tex: Small corrections. 2006-05-27 Saturday 04:00 Rocky Bernstein * configure.ac: Get ready for the 1.16 release. 2006-05-27 Saturday 02:58 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex: Note restart behavior. Use python's -m option were appropriate. That is: python /pydb.py myscript becomes python -m myscript (Change mirrors change in pdb documentaton). 2006-05-27 Saturday 02:58 Rocky Bernstein * pydb/: gdb.py.in, pydbcmd.py: Allow one specify in the Pdb class Cmd's "completekey" binding. (Also in current pdb sources.) 2006-05-27 Saturday 02:12 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/Makefile.am, test/brkpt3.cmd, test/brkpt3.right, test/comm1.cmd, test/comm2.cmd, test/test.py.in, pydb/pydb.doc: Add gdb "commands". Really a marriage from the current pdb.py but follows gdb more closely. 2006-05-24 Wednesday 04:18 Rocky Bernstein * Doc/lib/libpydb.tex: Note that jump can be used to get out of a loop 2006-05-24 Wednesday 03:51 Rocky Bernstein * Doc/lib/libpydb.tex: more minor corrections 2006-05-24 Wednesday 03:36 Rocky Bernstein * Doc/lib/libpydb.tex: Improve description of the set_trace() function. 2006-05-22 Monday 16:56 Rocky Bernstein * htdocs/index.html: change url of CVS browser 2006-05-21 Sunday 04:27 Rocky Bernstein * pydb/gdb.py.in, pydb/pydbbdb.py, test/cmdparse.cmd, test/cmdparse.right: Wasn't fielding error when invalid filespec given. pydbbdb.py: towards adding a file path in canonic. 2006-05-13 Saturday 12:25 Rocky Bernstein * TODO: Note watchpoints and bdb canonic() bug. 2006-05-13 Saturday 00:16 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.doc, test/cmdparse.cmd, test/cmdparse.right, test/history.right, test/pm.right, test/test.py.in, test/trace.py.in: Check file when reporting current position (->) in "list" command. In the past this wasn't an issue because you could only list from file you were currently stopped on. list command is now like gdb's list exactly LISTSIZE lines (not LISTSIZE+1). no more "," between arguments both first and last can be file:pos 2006-05-06 Saturday 13:50 Rocky Bernstein * test/trace.py.in: Trailing lines on trace may be different. 2006-05-06 Saturday 06:05 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/gdb.py.in, pydb/pydb.doc, test/cmdparse.cmd, test/cmdparse.right: Hack just a little bit on the "list" command. In particular we now allow a filename:linenumber or linenumber if a single argument is given. This is a bit hacky, although a step probably in the right direction by unifying position parsing from breakpoints and listing. Much more work is needed though. 2006-05-06 Saturday 02:22 Rocky Bernstein * pydb/gdb.py.in, pydb/pydbbdb.py, test/pm.right: gdb.py.in: --trace wasn't tracing properly. pydbbdb.py: minor indentation change pm.right: some question about whether line + Raise FloatingPointError is shown or not 2006-05-04 Thursday 09:50 Rocky Bernstein * pydb/pydb.doc: "source" command additions/corrections. 2006-05-04 Thursday 09:39 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/gdb.py.in: Document "source" command. 2006-04-08 Saturday 17:55 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/pm.right, test/trace.right: Line tracing now shows source line in addition to position. libpydb.tex: show out to turn on tracing inside a program. pydbbdb.py: add parameter in print_location to indicate whether or not we are to show line. 2006-04-08 Saturday 09:04 Rocky Bernstein * NEWS, configure.ac, htdocs/index.html, pydb/pydb.py.in: configure.ac: we are in 1.16cvs now pydb.py.py.in: we don't need no stinking backward compatibility index.html: make sure we conform to W3C standards NEWS: typo 2006-03-26 Sunday 01:58 Rocky Bernstein * Doc/lib/libpydb.tex: More on restart vs run. 2006-03-25 Saturday 18:15 Rocky Bernstein * Doc/lib/libpydb.tex: Note --basename option. 2006-03-25 Saturday 06:05 Rocky Bernstein * NEWS: NEWS 2006-03-25 Saturday 05:57 Rocky Bernstein * pydb/fns.py, test/trace.py.in, test/trace.right: Add --basename option so we can do testing on post-mortem dump. 2006-03-25 Saturday 05:37 Rocky Bernstein * test/logging.right: typo 2006-03-25 Saturday 05:28 Rocky Bernstein * configure.ac, Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydbcmd.py: configure.ac: get ready for 1.15 release libpydb.tex: note different ways to invoke under invocation, give readline urls and note pyreadline is okay too. pydbcmd.py: some small typos. 2006-03-18 Saturday 16:03 Rocky Bernstein * NEWS, emacs/pydb.el: pydbtrack fixes. 2006-03-16 Thursday 04:19 Rocky Bernstein * emacs/pydb.el, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbcmd.py: Add subcommand completion, in particular for "set" "show" and "info" 2006-03-15 Wednesday 20:29 Rocky Bernstein * Makefile.am, configure.ac, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbcmd.py, test/.cvsignore, test/Makefile.am, test/pm.py.in, test/pm.right, test/test2.py.in, test/test2.right, test/trace.py.in, test/trace.right: Add trace regression test. test2 renamed to pm (post-mortem). More functions moved out of larger files and into newer smaller ones. 2006-03-15 Wednesday 19:22 Rocky Bernstein * Makefile.am, autogen.sh, configure.ac, pydb/.cvsignore, pydb/fns.py, pydb/gdb.py.in, pydb/pydb.py.in, pydb/pydbfns.py: autogen.sh - changes to get Makefile.am dependencies looked at. pydb.py.in, pydbfns.py, gdb.py.in: Move more stuff out of pydb.py.in 2006-03-15 Wednesday 00:40 Rocky Bernstein * pydb/: pydb.py.in, pydbbdb.py: Recent move messed up global _repr and _saferepr. Save in object. 2006-03-14 Tuesday 11:40 Rocky Bernstein * Makefile.am: FSF address change. 2006-03-14 Tuesday 03:48 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in, pydb/pydbcmd.py, test/.cvsignore, test/Makefile.am, test/cmdparse.cmd, test/cmdparse.right, test/history.cmd, test/history.right, test/run2.right, test/test.py.in: Allow negative numers (count from end) in show commands. 2006-03-14 Tuesday 02:02 Rocky Bernstein * NEWS, test/brkpt2.cmd, test/brkpt2.right, test/test.py.in: "cont" removed. 2006-03-14 Tuesday 00:09 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, test/cmdparse.cmd, test/cmdparse.right: Remove some single-letter command names for these reasons 1. We now have command completion (often) 2. If the letter isn't a command it can be used as a variable name in an assignment 3. There is an alias mechanism that can be used 4. Some of the commands like "j" for "jump" aren't used that much; or in the case of "cont" for "continue", there already was an abbreviation "c". 5. Multiple names makes help and completion more awkward. 2006-03-13 Monday 22:23 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/pydb.py.in, pydb/pydbcmd.py, test/Makefile.am, test/cmdparse.right, test/logging.cmd, test/logging.right, test/run2.cmd, test/test.py.in: Add set/show logging regession tests. Move more code out of pydb.py.in and into pydb.cmd. Add more information about the Cmd class and how to run debugger commands as an object. 2006-03-13 Monday 15:34 Rocky Bernstein * NEWS, Doc/pydb.1.in: Reflect current changes. 2006-03-13 Monday 15:09 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, test/test.py.in: Add gdb complete function (and regression test) and document it. libpydb.tex: also add section on configuration options and reorder so important stuff is more toward the front. 2006-03-13 Monday 05:49 Rocky Bernstein * pydb/pydb.py.in: If we have rlcompleter use it. 2006-03-09 Thursday 20:56 Rocky Bernstein * configure.ac, pydb/pydb.py.in: Add pyreadline as a configuration option. 2006-03-05 Sunday 00:52 Rocky Bernstein * AUTHORS, NEWS, Doc/lib/libpydb.tex, pydb/pydbfns.py: Add --cd option. Note Richard Wolff and GDB authorship. 2006-03-05 Sunday 00:14 Rocky Bernstein * test/test2.py.in: test2.py.in: need to close files to make sure the diff works. 2006-03-05 Sunday 00:11 Rocky Bernstein * pydb/pydb.py.in: Regression test thing. 2006-03-04 Saturday 23:58 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, pydb/pydbcmd.py, test/cmdparse.cmd, test/cmdparse.right: Add "set/show history" commands. Now allow "+" for in "show commands". 2006-03-04 Saturday 17:37 Rocky Bernstein * configure.ac, pydb/pydb.doc, pydb/pydb.py.in, test/cmdparse.right: Add adding an positive integer parameter to "show commands". 2006-03-04 Saturday 12:48 Rocky Bernstein * pydb/: pydb.py.in, pydbcmd.py: Add "show commands" - start of history mechanism. 2006-03-03 Friday 02:28 Rocky Bernstein * pydb/pydbbdb.py: Import needed global variable. 2006-02-28 Tuesday 23:14 Rocky Bernstein * NEWS: NEWS 2006-02-28 Tuesday 22:53 Rocky Bernstein * test/.cvsignore: .cvsignore 2006-02-28 Tuesday 22:53 Rocky Bernstein * configure.ac, test/test.py.in, test/test2.py: Get ready for 1.14 release test.py.in: remove duplicate code test2.py is derived 2006-02-28 Tuesday 17:13 Rocky Bernstein * configure.ac, test/test2.py: Work on configuration management. Add --with-python option. Site packages wasn't set properly. 2006-02-27 Monday 16:25 Rocky Bernstein * Doc/lib/libpydb.tex: Yet another small change 2006-02-27 Monday 16:20 Rocky Bernstein * Doc/lib/libpydb.tex: One more grammar correction 2006-02-27 Monday 15:40 Rocky Bernstein * pydb/.cvsignore, test/.cvsignore, test/pm.cmd, test/test2.py, test/test2.right: Put in newly added files 2006-02-27 Monday 15:37 Rocky Bernstein * Doc/lib/: hardtodebug.py, mymodule.py: Get newly added files 2006-02-27 Monday 15:33 Rocky Bernstein * configure.ac, cvs2cl_usermap, setup.py, Doc/pydb.1.in, emacs/Makefile.am, htdocs/index.html: Change contact info. Get ready for 1.13 release. 2006-02-27 Monday 15:14 Rocky Bernstein * NEWS: NEWS 2006-02-27 Monday 10:26 Rocky Bernstein * Doc/lib/libpydb.tex: More small doc grammar changes 2006-02-27 Monday 10:18 Rocky Bernstein * Doc/lib/: libpydb.tex: More small doc grammar changes 2006-02-27 Monday 10:15 Rocky Bernstein * configure.ac, pydb/pydb.py.in: configure.ac: Require 2.4.0 or greater pydb.py.in: do_list(): Adjust centering based on self.listsize 2006-02-27 Monday 10:12 Rocky Bernstein * test/: cmdparse.cmd, cmdparse.right, test2.py.in: Add list commands to regression tests. test2.py.in: remove unused code. 2006-02-27 Monday 03:13 Rocky Bernstein * test/Makefile.am: Add the missing files. 2006-02-27 Monday 02:48 Rocky Bernstein * NEWS, Doc/lib/libpydb.tex, pydb/pydb.py.in: libpydb.tex: Give proper examples for set_trace and pm. Other small mistakes corrected. pydb.py.in: miscellaneous bugs fixed (in listing, in restart, set_trace) 2006-02-27 Monday 01:02 Rocky Bernstein * Makefile.am, TODO, configure.ac, pydb/Makefile, pydb/pydb.py.in, pydb/pydbbdb.py, pydb/pydbfns.py, test/Makefile.am, test/test.py.in, test/test2.py.in: - Add post-mortem call regression test. - Move more code from pydb.py.in into pydbbdb.py - post-mortem: don't allow "step", "next", "finish", return" if not actually running the program - post-mortem: wasn't setting current frame - _program_sys_argv was set incorrectly - --errors option was stdout, not stderr test/Makefile: probably better checking that pydb.py needs to be recreated 2006-02-26 Sunday 16:31 Rocky Bernstein * pydb/__init__.py: Superceded by __init__py.in 2006-02-26 Sunday 16:31 Rocky Bernstein * pydb/pydb.py.in: Things to facilitate post-mortem regresssion tests. 2006-02-26 Sunday 15:54 Rocky Bernstein * pydb/pydb.py.in: Hack more on getting restart and run working from post-mortem. 2006-02-26 Sunday 14:29 Rocky Bernstein * configure.ac, pydb/__init__.py, pydb/__init__.py.in, pydb/pydb.py.in: Add version number from configure. Hence the .in. 2006-02-26 Sunday 13:47 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: libpydb.tex: Go over post-mortem section. pydb.py.in: allow None as a opts argument. Better message if sys.last_traceback is not defined in pm(). 2006-02-26 Sunday 12:47 Rocky Bernstein * NEWS: What's up 2006-02-26 Sunday 12:46 Rocky Bernstein * Makefile.am, Doc/lib/libpydb.tex, pydb/__init__.py, pydb/pydb.doc, pydb/pydb.py.in, pydb/pydbcmd.py, test/cmdparse.right, test/test.py.in: libpydb.tex, pydb.doc, pydb.py.in: note kill is a synonym for quit Makefile.am, __init__.py: Now that we a packages directory we need to have an __init__.py for "import pydb" to work. *.py.*: remove tabs and warn if they come back in pydb.py.in, cmdparse.right: Remove space in docstring reformatting. More recent GNU Emacs python.el understands triple quotes a little better. pydb.py.in: Allow option setting in post-mortem routines. 2006-02-26 Sunday 05:07 Rocky Bernstein * TODO, NEWS: Revise. 2006-02-26 Sunday 05:05 Rocky Bernstein * Makefile.am, pydb/pydb.py.in, pydb/pydbbdb.py: Break out bdb overridden methods into pydbbdb.py Install now site_packages/pydb as there are now 6 py files + corresponding .pyo's and pyc's. 2006-02-25 Saturday 00:49 Rocky Bernstein * pydb/pydb.py.in: Put back kill as a synonym for quit. 2006-02-24 Friday 22:07 Rocky Bernstein * pydb/: pydb.py.in, pydbcmd.py: Simplify whatis. Remove some of the ugly traceback stuff on syntax errors and name errors and try to present something better. 2006-02-24 Friday 19:13 Rocky Bernstein * pydb/: pydb.py.in, pydbcmd.py: move some initializations around a little 2006-02-24 Friday 19:08 Rocky Bernstein * NEWS: NEWS 2006-02-24 Friday 18:58 Rocky Bernstein * Makefile.am, pydb/pydb.py.in, pydb/pydbcmd.py, pydb/pydbdisp.py: Break out cmd-like methods into a separate moudule/class. 2006-02-24 Friday 09:44 Rocky Bernstein * Doc/pydb.1.in, Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, test/run.cmd, test/run.right: Add count field to where 2006-02-24 Friday 09:16 Rocky Bernstein * Doc/.cvsignore: Doc/.cvsignore 2006-02-24 Friday 09:15 Rocky Bernstein * Doc/lib/libpydb.tex: typo 2006-02-24 Friday 09:13 Rocky Bernstein * Doc/pydb.1.in: Make more complete. Add frequent debugger commands 2006-02-24 Friday 07:52 Rocky Bernstein * pydb/pydbsupt.py: File has been redoced and moved into other files 2006-02-24 Friday 00:57 Rocky Bernstein * Makefile.am, NEWS, Doc/lib/libpydb.tex, htdocs/index.html, pydb/pydb.py.in, pydb/pydbfns.py: More work on set_trace. Tried adding --exec and --eval it seems that is not all that useful. 2006-02-23 Thursday 20:59 Rocky Bernstein * configure.ac: Change version number to be more consistent with the Debian release. 2006-02-23 Thursday 12:10 Rocky Bernstein * pydb/pydb.py.in: Add debugger() function. 2006-02-23 Thursday 12:09 Rocky Bernstein * Doc/lib/libpydb.tex: Add sections for alternative methods of invocation and fill this out a bit. Add debugger() function. 2006-02-23 Thursday 10:53 Rocky Bernstein * Doc/pydb.1.in: minor correctins 2006-02-23 Thursday 10:52 Rocky Bernstein * Doc/lib/libpydb.tex: Minor corrections, e.g. linetrace. Document set/show/info section 2006-02-23 Thursday 10:51 Rocky Bernstein * test/: run.cmd, run.right: Comment tidy up a little. 2006-02-23 Thursday 10:50 Rocky Bernstein * emacs/: Makefile.am, pydb.el, python-mode.el.diff: python-mode.el.diff: changes to python-mode.el for pydb. Patch sumbitted to python-mode sourceforge project. pydb.el: docstrings on some variables. 2006-02-23 Thursday 02:06 Rocky Bernstein * pydb/pydb.py.in: Add routine to allow calling the debugger from a the middle of a program. Move an initialization into __init__. 2006-02-23 Thursday 02:05 Rocky Bernstein * pydb/pydbfns.py: Correct option documentation 2006-02-23 Thursday 02:04 Rocky Bernstein * Doc/pydb.1.in: Start of a manual page. 2006-02-23 Thursday 00:56 Rocky Bernstein * htdocs/index.html: Correct ddd link. 2006-02-23 Thursday 00:54 Rocky Bernstein * htdocs/index.html: small typo 2006-02-23 Thursday 00:53 Rocky Bernstein * htdocs/index.html: More tt tagging 2006-02-22 Wednesday 23:44 Rocky Bernstein * htdocs/index.html: Revise 2006-02-21 Tuesday 21:53 Rocky Bernstein * TODO: Revise for 0.12 release 2006-02-21 Tuesday 21:39 Rocky Bernstein * NEWS: Update for release. 2006-02-21 Tuesday 21:31 Rocky Bernstein * Doc/lib/libpydb.tex: Fix some doc typos and last minite corrections/additions. 2006-02-21 Tuesday 21:12 Rocky Bernstein * README: Greatly needed revision for 0.12 release. 2006-02-21 Tuesday 18:14 Rocky Bernstein * emacs/pydb.el, test/gcd.py, test/run2.right: Fix bugs in GCD sample program ;-) and emacs regexps. 2006-02-21 Tuesday 17:44 Rocky Bernstein * configure.ac: Get ready for 0.12 release 2006-02-21 Tuesday 17:43 Rocky Bernstein * emacs/pydb.el: Correct debugger prompt. 2006-02-21 Tuesday 15:30 Rocky Bernstein * Makefile.am, NEWS, Doc/lib/lib-ds.tex, Doc/lib/libpydb.tex, htdocs/download.html, htdocs/links2linux.de.png, htdocs/source-code.gif, pydb/.cvsignore, pydb/pydb.doc, pydb/pydb.py.in, pydb/pydbdisp.py, pydb/pydbfns.py, test/Makefile.am, test/brkpt1.cmd, test/brkpt1.right, test/brkpt2.cmd, test/brkpt2.right, test/cmdparse.cmd, test/cmdparse.right, test/gcd.py, test/hanoi.py, test/run.right, test/run2.cmd, test/run2.right, test/test.py.in: Add help subcommands for "show", "info", and "set" Add info: "display", "line" and "source" Use inspect module. Argument parameters and values are now shown. Break out debugger into more files Now works with the pydb branch of ddd. "clear" command now accepts a function name allow debugged program to mangle sys.argv (we save our own copy) Update documentation and regression tests as appropriate for the above More stringent regression tests. 2006-02-19 Sunday 11:44 Rocky Bernstein * pydb/pydb.py.in: Save sys.argv properly. We need a real copy in case the debugged program modifies sys.argv. 2006-02-19 Sunday 10:51 Rocky Bernstein * NEWS, configure.ac, Doc/lib/libpydb.tex, emacs/pydb.el, pydb/pydb.doc, pydb/pydb.py.in, test/cmdparse.cmd, test/cmdparse.right, test/hanoi.py: Add return command. Doc updates. 2006-02-18 Saturday 02:12 Rocky Bernstein * test/: run.cmd, run.right: Add "info program" into list of tests. 2006-02-18 Saturday 02:03 Rocky Bernstein * emacs/pydb.el, pydb/pydb.py.in: Get info program working. Emacs regexp was causing line feeds to drop out. 2006-02-17 Friday 22:44 Rocky Bernstein * pydb/pydb.py.in, test/brkpt1.right, test/run.right: Make breakpoint status more like gdb to simplify ddd. 2006-02-17 Friday 20:19 Rocky Bernstein * emacs/pydb.el, pydb/pydb.py.in: I can't take it any more. Let's just make python line locations follow the usual file:line location-reporting format. It really make it more of a no-brainer for programs like ddd and gud that have to parse the output. 2006-02-17 Friday 18:07 Rocky Bernstein * pydb/pydb.py.in, test/cmdparse.cmd, test/cmdparse.right: Kill is now a synonym for quit. (Until we know how to do better) Hack on "debug" command: prompt should not have extra space and we inherit some settings like listsize, linetrace etc. Add a test of "info line" 2006-02-17 Friday 04:27 Rocky Bernstein * Makefile.am, Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, pydb/pydbsupt.py: Get display command working. Work on documentation of new display/undisplay commands. More do_ alphabetization. 2006-02-17 Friday 02:31 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.doc, pydb/pydb.py.in, test/brkpt1.right, test/cmdparse.cmd, test/cmdparse.right, test/test.py.in: Add cd and pwd commands and document these new commands. When no breakpoints we give the gdb message "No breakpoints." Alphabetize do_ commands. 2006-02-14 Tuesday 11:42 Rocky Bernstein * NEWS, Doc/Makefile.in, Doc/lib/libpydb.tex, emacs/pydb.el, pydb/pydb.doc, pydb/pydb.py.in: pydb.doc, pydb.py.in, libpydb.tex: Add "shell" command emacs/pydb.el: More commands available from GNU Emacs pydb.doc: alphabetize, "return" doesn't exist (when it comes back it will be like gdb's) Doc/Makefile.in: Add check and test targets to do nothing. 2006-01-30 Monday 12:19 Rocky Bernstein * Doc/: .cvsignore, paper-letter/.cvsignore: More docs - more stuff for .cvsignore 2006-01-30 Monday 12:18 Rocky Bernstein * Doc/: Makefile.in, lib/lib.tex, lib/libpydb.tex: Makefile.in: target 'clean' cleans more; target 'all' includes info lib/lib.tex: include index now libpydb.tex: mostly get better control of documentation system 2006-01-30 Monday 11:54 Rocky Bernstein * Doc/tools/: buildindex.py, checkargs.pm, mkinfo, py2texi.el: Some things to make info files 2006-01-30 Monday 10:48 Rocky Bernstein * htdocs/index.html: Change sf logo. 2006-01-29 Sunday 19:14 Rocky Bernstein * htdocs/index.html: Project home pages. 2006-01-29 Sunday 18:47 Rocky Bernstein * Doc/Makefile.in: For now we don't install anything. Don't give an error though. 2006-01-29 Sunday 18:45 Rocky Bernstein * Makefile.am, NEWS, README, THANKS, configure.ac: Revise for 0.11 release. 2006-01-29 Sunday 18:43 Rocky Bernstein * Doc/lib/libpydb.tex: Massive grammatical changes. Thanks to Stuart Frankel, Ph. Mad. 2006-01-29 Sunday 02:44 Rocky Bernstein * test/test.py.in: Skip "run" test output check if not 2.4.2. 2006-01-29 Sunday 02:18 Rocky Bernstein * pydb/pydb.py.in: Add some Python 2.3.5 tolerance 2006-01-28 Saturday 22:00 Rocky Bernstein * Makefile.am, configure.ac, Doc/Makefile.in: Make makedistdir work in the presence of building documentation. 2006-01-28 Saturday 21:27 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/pydb.py.in: More documentation. 2006-01-28 Saturday 17:02 Rocky Bernstein * Makefile.am: make test is the same thing as make check 2006-01-28 Saturday 17:00 Rocky Bernstein * Doc/lib/libpydb.tex, pydb/.cvsignore, pydb/pydb.py.in: Work on documentation a bit more. 2006-01-28 Saturday 15:05 Rocky Bernstein * Doc/: Makefile.deps, Makefile.in, lib/libpydb.tex, paper-letter/.cvsignore, texinputs/python.ist, tools/.cvsignore, tools/indfix.py, tools/toc2bkm.py: More stuff for making more complete documentation while reducing what we don't need and filling actions when various Makefile targets get fired on. If I have to say it myself (and for now do) my GNU Makefile debugger is invaluable in figuring out this complex mess. 2006-01-28 Saturday 11:26 Rocky Bernstein * Doc/.cvsignore: .cvsignore 2006-01-28 Saturday 11:24 Rocky Bernstein * Doc/: Makefile.in, lib/libpydb.tex: More doc work. Add section on why gdb. 2006-01-28 Saturday 10:50 Rocky Bernstein * Doc/: Makefile.in, commontex/boilerplate.tex, html/index.html, lib/Makefile, lib/lib.tex, lib/libpydb.tex: More work to get this more automated. 2006-01-28 Saturday 09:44 Rocky Bernstein * Doc/: commontex/.cvsignore, commontex/boilerplate.tex, commontex/copyright.tex, commontex/underscore.sty, lib/lib.tex, perl/SynopsisTable.pm, perl/l2hinit.perl, perl/manual.perl, perl/python.perl, texinputs/fncychap.sty, texinputs/manual.cls, texinputs/pypaper.sty, texinputs/python.sty, texinputs/underscore.sty: Files needed to make the documentation. 2006-01-28 Saturday 09:39 Rocky Bernstein * Doc/: .cvsignore, Makefile.deps, Makefile.in, html/.cvsignore, html/stdabout.dat, lib/libpydb.tex, tools/.cvsignore, tools/getversioninfo, tools/mkhowto, tools/node2label.pl, tools/patchlevel.h: The various files needed to make the documentation. 2006-01-28 Saturday 09:34 Rocky Bernstein * Doc/html/: style.css, icons/blank.gif, icons/blank.png, icons/contents.gif, icons/contents.png, icons/index.gif, icons/index.png, icons/modules.gif, icons/modules.png, icons/next.gif, icons/next.png, icons/previous.gif, icons/previous.png, icons/pyfav.gif, icons/pyfav.png, icons/up.gif, icons/up.png: (minimal?) HTML needed to make the doc. 2006-01-28 Saturday 08:25 Rocky Bernstein * Makefile.am, configure.ac, Doc/tools/getversioninfo, test/test.py.in: More "make distcheck" changes. Doc: start to be able to build documentation. 2006-01-28 Saturday 07:41 Rocky Bernstein * pydb/pydb.py.in, test/Makefile.am, test/test.py.in: Things to get "make distcheck" work. 2006-01-28 Saturday 07:16 Rocky Bernstein * test/test.py.in: Add __file__ regression tests. 2006-01-28 Saturday 07:13 Rocky Bernstein * pydb/pydb.py.in: Add --version option. Some help strings reformated; note that disassemble can deal with a string. Note that L is short name for info break and not vice versa. 2006-01-28 Saturday 06:54 Rocky Bernstein * test/filebug.cmd: debugger command file for __file__ test. 2006-01-28 Saturday 05:19 Rocky Bernstein * Makefile.am, test/Makefile.am: Make distdir fixess. Make sure test.py isn't in there. 2006-01-28 Saturday 05:08 Rocky Bernstein * test/Makefile.am: Typo. 2006-01-28 Saturday 04:58 Rocky Bernstein * TODO, pydb/pydb.py.in, test/Makefile.am, test/filebug.py, test/filebug.right: Make sure __file__ is set. 2006-01-28 Saturday 03:42 Rocky Bernstein * pydb/pydb.py.in, test/run.right: Lots of print's changed to self.msg and some self.errmsg 2006-01-28 Saturday 03:11 Rocky Bernstein * Makefile.am, test/run.cmd, test/run.right, test/test.py.in: Add run regression test. 2006-01-28 Saturday 03:10 Rocky Bernstein * pydb/pydb.py.in: Fix bug in printing breakpoint info. Linetracing no longer stops on call unless there's a breakpoint. Output for restart now uses generic routine. 2006-01-28 Saturday 02:04 Rocky Bernstein * Makefile.am, NEWS, configure.ac: Makefile.am, configure.ac: Give up on non-recursive handling of test. configure.ac: create test.py and as an executable. NEWS: go over some of the good stuff that's been added. 2006-01-28 Saturday 02:00 Rocky Bernstein * pydb/: pydb.doc, pydb.py.in: Add delete command and break out code from clear command. Some bugs in these commands were addressed and more gdb compatiblity added. Add "set cmdtrace". 2006-01-28 Saturday 01:58 Rocky Bernstein * test/: brkpt1.cmd, brkpt1.right: Add some clear tests. Uncovered some bugs which need to be addressed though. 2006-01-28 Saturday 01:38 Rocky Bernstein * test/: Makefile.am, brkpt1.cmd, brkpt1.right, cmdparse.cmd, cmdparse.right, test.py.in: Add some basic breakpoint commands. 2006-01-27 Friday 18:35 Rocky Bernstein * test/: .cvsignore, Makefile.am, cmdparse.cmd, cmdparse.right, test.py.in: Add first regression test. Tried non-recursive make solution. Too hard. 2006-01-27 Friday 12:18 Rocky Bernstein * pydb/pydb.py.in: get_int get_pos int will now print what command they came from. Helpful in the presence of short names and aliases x removed as a short name for examine. I use it too much as a simple variable name, and the examine command isn't all that useful (yet). handle getarg exception in do_examine. 2006-01-26 Thursday 23:06 Rocky Bernstein * pydb/pydb.py.in, test/cmdparse.cmd, test/hanoi.py: pydb.py.in Added set basename New debugger options: --command --nx test/cmdparse.cmd: some simple command parsing tests test/hanoi.py: a sample python program to use for debugging tests. 2006-01-26 Thursday 21:52 Rocky Bernstein * pydb/: pydb.doc, pydb.py.in: "source" command now works in the presence of step/next/continue commands. Update doc on this too. 2006-01-26 Thursday 10:29 Rocky Bernstein * Makefile.am, NEWS, configure.ac: Makefile: had botched pydb.doc installation. Doc is document subdirectory, not doc. configure.ac: do better on dealing with chmod. Add --with-site-packages option. 2006-01-26 Thursday 10:26 Rocky Bernstein * pydb/: pydb.doc, pydb.py.in: Add gdb's source command - sort of. Remove some some of the "python_dialect" mode. Document tbreak Remove non-existent help commands. 2006-01-26 Thursday 08:54 Rocky Bernstein * pydb/pydb.py.in: Set up to stop on the first non-option We don't not want to interpret and option for the script, e.g. --help, as one one of our own, e.g. --help. Thanks to Giovanni Bajo (comp.lang.python) for describing/suggesting OptionParser.disable_interspersed_args() 2006-01-26 Thursday 06:40 Rocky Bernstein * pydb/pydb.py.in: Allow stdout and stderr to get redirected. More error message conversion fixes. 2006-01-20 Friday 08:42 Rocky Bernstein * pydb/: pydb.doc, pydb.py.in: Pydb -> Pdb. Was breaking simplified interfaces. Remove "exit" and "w" which are neither gdb or perldb commands. 2006-01-20 Friday 08:21 Rocky Bernstein * pydb/pydb.py.in: --trace now implies --batch. Replace "print" with internal output routines that can be replaced by deriving the Pdb class. This will be necessary for writing regression tests. 2006-01-19 Thursday 21:55 Rocky Bernstein * NEWS, pydb/pydb.doc, pydb/pydb.py.in: pydb.py: Add options processing in particular --batch and --trace pydb.doc: Document set linetrace delay 2006-01-19 Thursday 16:12 Rocky Bernstein * pydb/pydb.py.in: Add a common errmsg routine. Allow a delay in linetracing: set linetrace delay *float* 2006-01-19 Thursday 13:10 Rocky Bernstein * pydb/pydb.py.in: 0 is False, not True. Fix bad bug where we weren't stopping in stepping. 2006-01-19 Thursday 00:52 Rocky Bernstein * pydb/pydb.py.in: Fix bug in not clearing ignore_count across a restart. 2006-01-18 Wednesday 10:15 Rocky Bernstein * Makefile.am, configure.ac, pydb/pydb.doc: Update doc some. Add TeX documentation. 2006-01-18 Wednesday 08:11 Rocky Bernstein * NEWS, pydb/pydb.doc, pydb/pydb.py.in: Add line tracing. "show" without an argument shows all subcommands. 2006-01-18 Wednesday 01:23 Rocky Bernstein * emacs/pydb.el: Add numeric arguments to step/next. 2006-01-18 Wednesday 00:29 Rocky Bernstein * pydb/: pydb.doc, pydb.py.in: Add dissassemble command. Got is_exec_stmpt boolean test backwards - print_location was wacky. 2006-01-17 Tuesday 21:33 Rocky Bernstein * pydb/pydb.py.in: Module documentation correctly inserted. 2006-01-17 Tuesday 21:23 Rocky Bernstein * pydb/pydb.py.in: Fix small bugs error in error handling __get_pos_int, _get_int, do_up and do_down. 2006-01-17 Tuesday 21:07 Rocky Bernstein * pydb/pydb.py.in: Add next/step with counts values (e.g. next 2, step 3). 2006-01-16 Monday 03:20 Rocky Bernstein * pydb/pydb.py.in: Add routine is_exec_stmt() to test if a frame is at an exec statement. Move get_exec_string to get the string assocated with an exec outside of the Pdb class. So less hackery on dependence. 2006-01-16 Monday 02:33 Rocky Bernstein * pydb/pydb.py.in: Class name is now Pdb again so it will work with ipython better. Move test for def'ness out of class and add test for LOAD_CONST - but really that should be a load_const of a code object. 2006-01-15 Sunday 00:40 Rocky Bernstein * pydb/pydb.py.in: Do a little better in handling exec statements in a stack trace. 2006-01-13 Friday 23:45 Rocky Bernstein * emacs/pydb.el: Add missing Emacs Lisp file. Command set has been changed to include extended debugger commands. 2006-01-13 Friday 04:46 Rocky Bernstein * NEWS: Update as appropriate 2006-01-13 Friday 04:23 Rocky Bernstein * configure.ac: We are in version 0.11cvs now. 2006-01-13 Friday 04:23 Rocky Bernstein * pydb/pydb.py.in: version is now a string, and it is immutable by virtue of being a string that's preprocessed via GNU configure :o) - "set prompt" allows punctuation now. Still have problems stripping trailing blanks. Stack trace now reports exec positionsa little bit better - at least it doesn't call it a file. 2006-01-12 Thursday 19:57 Rocky Bernstein * pydb/pydb.py.in: Show a useful location when we are stopped on an exec or execfile. 2006-01-12 Thursday 10:42 Rocky Bernstein * NEWS, README: More small changes. 2006-01-12 Thursday 10:35 Rocky Bernstein * NEWS: Small changes 2006-01-12 Thursday 10:33 Rocky Bernstein * README: Some small typos. 2006-01-12 Thursday 09:47 Rocky Bernstein * pydb/pydb.doc: pdb->pydb 2006-01-12 Thursday 09:34 Rocky Bernstein * Makefile.am, configure.ac, pydb/pydb.py.in: To make import pydb work, go back to no pkgpythondir but just pythondir 2006-01-12 Thursday 07:11 Rocky Bernstein * Makefile.am, README, TODO, configure.ac: More stuff for a release. 2006-01-12 Thursday 07:01 Rocky Bernstein * pydb/pydb.py.in: Handle a restart in when post-mortem is in effect. 2006-01-12 Thursday 04:33 Rocky Bernstein * pydb/pydb.py.in: Wrong numbering in gdb stack. 2006-01-12 Thursday 04:23 Rocky Bernstein * .cvsignore, cvs2cl_header, emacs/.cvsignore, emacs/Makefile.am, pydb/.cvsignore: Misc linkt to get ready for a release. 2006-01-12 Thursday 04:17 Rocky Bernstein * pydb/pydb.py.in: Fix bug in set args. 2006-01-12 Thursday 04:12 Rocky Bernstein * Makefile.am, pydb/pydb.doc, pydb/pydb.py.in: Update doc. Add "set args" 2006-01-12 Thursday 00:56 Rocky Bernstein * Makefile.am, configure.ac, python-version.py, setup.py: setup.py: lame attempt to make more Python-friendly python-version.py/Makefile.am: autoconfs's PYTHON just doesn't cut it. configure.ac: comment what's going on. 2006-01-11 Wednesday 21:56 Rocky Bernstein * Makefile.am, configure.ac, pydb/Makefile, pydb/pydb.py.in: pydb.py.in: Change references to pdb to pydb and Pdb to Pydb. Merge in last changes from before this was a project: Add gdb/python dialects Add Emacs mode line Makefile.am: add comments to variables. Switch to installing as a package directory. Makefile.am pydb/Makefile: Convenience makefile for running make in pydb/pydb. 2006-01-11 Wednesday 17:55 Rocky Bernstein * Makefile.am, autogen.sh, configure.ac, cvs2cl_usermap, pydb/pydb.py, pydb/pydb.py.in: More things to get this going as a package/project: configure.ac: use automake Python macros (partially) configure.ac,pydb/pydb.py{,in}: insert #!@PYTHON@ and make executable Makefile.am: make pydb.py executable on symbolic link. 2006-01-11 Wednesday 04:10 Rocky Bernstein * .cvsignore, AUTHORS, Makefile.am, NEWS, README, autogen.sh, configure.ac, python-version.py, site-packages-path.py: Changes to get this to install/uninstall/make using autoconf. 2006-01-10 Tuesday 23:27 Rocky Bernstein * Makefile.am, configure.ac, pydb/pydb.doc, pydb/pydb.py: Initial revision 2006-01-10 Tuesday 23:27 Rocky Bernstein * Makefile.am, configure.ac, pydb/pydb.doc, pydb/pydb.py: import python debugger pydb-1.26/missing0000755000175000017500000002557711006750040010731 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pydb-1.26/COPYING0000644000175000017500000010451311006750040010351 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pydb-1.26/install-sh0000755000175000017500000003246411006750040011327 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pydb-1.26/Makefile.am0000644000175000017500000000756011167745260011376 00000000000000#$Id: Makefile.am,v 1.56 2009/02/09 03:13:26 rockyb Exp $ # Copyright (C) 2006, 2007, 2008 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. AUTOMAKE_OPTIONS = dist-bzip2 if INSTALL_EMACS_LISP emacs = emacs else emacs = endif SUBDIRS = test $(emacs) # Basename of debugger, used to form help doc, python script and script # installed in an executable directory. DEBUGGER = pydb # The Python debugger script python_debugger_script = $(DEBUGGER).py pkgpython_PYTHON = \ $(DEBUGGER)/__init__.py \ $(DEBUGGER)/$(python_debugger_script) \ $(DEBUGGER)/bytecode.py \ $(DEBUGGER)/complete.py \ $(DEBUGGER)/connection.py \ $(DEBUGGER)/disassemble.py \ $(DEBUGGER)/display.py \ $(DEBUGGER)/fns.py \ $(DEBUGGER)/gdb.py \ $(DEBUGGER)/info.py \ $(DEBUGGER)/pydb.py \ $(DEBUGGER)/pydbbdb.py \ $(DEBUGGER)/pydbcmd.py \ $(DEBUGGER)/set.py \ $(DEBUGGER)/show.py \ $(DEBUGGER)/sighandler.py \ $(DEBUGGER)/subcmd.py \ $(DEBUGGER)/threaddbg.py \ $(DEBUGGER)/threadinfo.py pkgdata_DATA = $(DEBUGGER)/$(DEBUGGER).doc pkgdatadir = $(pkgpythondir) # Section 1 are general commands EXT=1 man1_MANS = Doc/$(DEBUGGER).$(EXT) # We in fact do install python_PYTHON, just not in the executable directory. # Instead it's installed with other python programs. The noinst however # forces a changed pydb.py to get created whenever pydb.py.in changes. noinst_SCRIPTS = $(python_PYTHON) bin_SCRIPTS = $(DEBUGGER) PHONY = $(DEBUGGER) test EXTRA_DIST = ChangeLog TODO THANKS \ Doc/Makefile.deps \ Doc/info/Makefile \ pydb/pydb.doc pydb/Makefile \ setup.py setup.py.in site-packages-path.py MOSTLYCLEANFILES = $(man1_MANS) clean-generic: -rm $(top_builddir)/pydb/*.pyc # # For the executable, we make a symbolic link to the python program, # and make sure it is executable. Configuration should have put the # proper name to the python interpreter into the beginning. # install-binSCRIPTS: $(bin_SCRIPTS) install-data-am if ! test -d "$(DESTDIR)$(bindir)"; then \ test -z "$(DESTDIR)$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"; \ fi rm -f "$(DESTDIR)$(bindir)/$(bin_SCRIPTS)" || true; chmod +x "$(DESTDIR)$(pkgpythondir)/$(python_debugger_script)" $(LN_S) "$(DESTDIR)$(pkgpythondir)/$(python_debugger_script)" "$(DESTDIR)$(bindir)/$(bin_SCRIPTS)" test: check # cvs2cl MAINTAINERCLEANFILES = ChangeLog if MAINTAINER_MODE SUBDIRS += Doc EXTRA_DIST += \ Doc/Makefile.deps \ Doc/Makefile.in \ Doc/lib/Makefile \ Doc/lib/lib.tex \ Doc/lib/libpydb.tex \ Doc/paper-letter/lib.pdf \ Doc/paper-letter/lib.ps \ Doc/perl/SynopsisTable.pm \ Doc/perl/l2hinit.perl \ Doc/perl/manual.perl \ Doc/perl/python.perl \ Doc/texinputs/fncychap.sty \ Doc/texinputs/manual.cls \ Doc/texinputs/pypaper.sty \ Doc/texinputs/python.ist \ Doc/texinputs/underscore.sty \ Doc/tools/getversioninfo \ Doc/tools/indfix.py \ Doc/tools/mkhowto \ Doc/tools/node2label.pl \ Doc/tools/patchlevel.h \ Doc/tools/toc2bkm.py PHONY += ChangeLog ChangeLog: $(CVS2CL) -W 450 --header $(srcdir)/cvs2cl_header --utc -w -I ChangeLog --usermap $(srcdir)/cvs2cl_usermap -P ACLOCAL_AMFLAGS=-I . endif .PHONY: $(PHONY) .OPTIONAL: $(DEBUGGER) pydb-1.26/setup.py0000755000175000017500000001067711167754545011070 00000000000000#!/usr/bin/env python # # Copyright (C) 2006 Rocky Bernstein # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose with or without fee is hereby granted, # provided that the above copyright notice and this permission notice # appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. from optparse import OptionParser import sys, os def do_cmd(cmd): """Run a command and possibly print it out first. If the command fails, we die!""" global opts if opts.verbose: print cmd exit_status = os.system(cmd) if exit_status != 0: sys.exit(exit_status) print """Note: we don't do python-style install yet. But as a service we'll try to transfer your call, but don't expect too much.""" optparser = OptionParser() optparser.add_option("--prefix", "", dest="prefix", action="store", help="--prefix option to pass to configure", metavar='[prefix directory]') optparser.add_option("--install-scripts", "", dest="bindir", action="store", help="--bindir opton to pass to configure", metavar='[executable directory in PATH]') optparser.add_option("--verbose", "-v", dest="verbose", action="store_true", default=False, help="lame attempt at verbosity ") (opts, args) = optparser.parse_args() do_install = do_build = False for arg in args: if arg=='install': do_build=True do_install=True if arg=='build': do_build=True ## Okay, now time to configure, make, make install configure_cmd='./configure ' if opts.prefix != None: config_opts += "--prefix %s" % opts.prefix if opts.bindir != None: config_opts += "--bindir %s" % opts.bindir do_cmd(configure_cmd) if do_build: do_cmd("make") if do_install: do_cmd("make install") sys.exit(0) ### Maybe someday we'll do this: if False: from distutils.core import setup setup( name = "pydb", version = "1.26", description = "Improved Python Debugger", long_description = \ """pydb is an expanded version of the Python debugger loosely based on the gdb command set. It also has all of the features found in an earlier version of pydb.py that was distributed with the debugger GUI ddd. Some (but by no means all) of the features and changes from pdb.py: * thread debugging. (Experimental) * signal handling (similar to gdb's). * non-interactive POSIX-shell like line tracing. * disassembly of instructions * ipython support * ability to flexibly redirect debugger output to a file (useful for example in cgi's) * Many gdb commands such as the set/show/info commands * gdb-like help with subcommand-specific help available on info, set, or show subcommands; e.g. help info line works * Restart program saving settings (gdb's run) or a pure exec restart. (The latter reloads the entire debugger and will cause imports to get reloaded.) * debugger is installed in binary directory; i.e. one runs "pydb script..." rather than "python pdb.py script..." * Accepts debugger command options; e.g. redirecting debugger output, initial debugger script, or batch mode. * Perl's "examine" command to show info about a symbol. For functions, methods, classes and modules the documentation string if any is printed. For functions, we also show the argument list. For objects, instance variables of the class and object are shown. * More extensive and complete documentation. * Comes with regression tests. Can also be subclassed to capture debugger output. * Works with GUI frontend ddd. (For now a testing version of ddd is required.) """, author = "Rocky Bernstein", author_email = "rockyb@users.sourceforge.net", license = "BSD-like", url = "http://bashdb.sourceforge.net/pydb", packages = ['pydb'] ) ### pydb-1.26/THANKS0000644000175000017500000000130710711613670010237 00000000000000This debugger is an extension of the Python debugger pdb which did much of the heavy lifting. The manual also was taken from the Python debugger. But it also draws on my bashdb debugger reference and both of these at time use some of the organization and phrases from the GNU Debugger Manual (gdb). Stuart Frankel, Ph. Mad. did some amazing proof reading and editing of the manual. (I may have mucked it up some since then though.) Also thanks to: Stephen Emslie - Python Patch 1641544 Matt Fleming - Gdb-style signal handling and NetBSD packaging Oleksandr Moskalenko - Debian packaging Alberto Griggio - Annotate patch #1781965 $Id: THANKS,v 1.3 2007/10/30 11:37:42 rockyb Exp $ pydb-1.26/py-compile0000755000175000017500000001005611006750040011320 00000000000000#!/bin/sh # py-compile - Compile a Python program scriptversion=2005-05-14.22 # Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if [ -z "$PYTHON" ]; then PYTHON=python fi basedir= destdir= files= while test $# -ne 0; do case "$1" in --basedir) basedir=$2 if test -z "$basedir"; then echo "$0: Missing argument to --basedir." 1>&2 exit 1 fi shift ;; --destdir) destdir=$2 if test -z "$destdir"; then echo "$0: Missing argument to --destdir." 1>&2 exit 1 fi shift ;; -h|--h*) cat <<\EOF Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." Byte compile some python scripts FILES. Use --destdir to specify any leading directory path to the FILES that you don't want to include in the byte compiled file. Specify --basedir for any additional path information you do want to be shown in the byte compiled file. Example: py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py Report bugs to . EOF exit $? ;; -v|--v*) echo "py-compile $scriptversion" exit $? ;; *) files="$files $1" ;; esac shift done if test -z "$files"; then echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 fi # if basedir was given, then it should be prepended to filenames before # byte compilation. if [ -z "$basedir" ]; then pathtrans="path = file" else pathtrans="path = os.path.join('$basedir', file)" fi # if destdir was given, then it needs to be prepended to the filename to # byte compile but not go into the compiled file. if [ -z "$destdir" ]; then filetrans="filepath = path" else filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" fi $PYTHON -c " import sys, os, string, py_compile files = '''$files''' print 'Byte-compiling python modules...' for file in string.split(files): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue print file, sys.stdout.flush() py_compile.compile(filepath, filepath + 'c', path) print" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, string, py_compile files = '''$files''' print 'Byte-compiling python modules (optimized versions) ...' for file in string.split(files): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue print file, sys.stdout.flush() py_compile.compile(filepath, filepath + 'o', path) print" 2>/dev/null || : # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pydb-1.26/test/0000777000175000017500000000000011167772526010402 500000000000000pydb-1.26/test/test-skip.py.in0000644000175000017500000000446611143773507013224 00000000000000#!@PYTHON@ -t # $Id: test-skip.py.in,v 1.1 2009/02/09 09:28:39 rockyb Exp $ -*- Python -*- "Unit test of the file command for Extended Python debugger " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', outfile=None): global srcdir, builddir, pydir rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s %s" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, pythonfile, args) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_trace(self): """Test stepping""" result=run_debugger(testname='skip', pydb_opts='--basename', pythonfile='%sgcd.py' % srcdir) self.assertEqual(True, result, "pydb 'skip' command comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/sighandler.cmd0000644000175000017500000000054210550723335013111 00000000000000info signal hup info handle SIGHUP handle SIGINT handle SIGINT stop pass noprint info handle SIGINT handle SIGINT print info handle SIGINT handle SIGINT nopass noprint nostop info signal SIGINT # try changing fatal signal handlers (which are unchangable) handle SIGKILL stop info handle KILL handle SIGSTOP print info signal sigstop info signal INT quit pydb-1.26/test/run2.cmd0000644000175000017500000000164410556102043011654 00000000000000# Test of restart and linetracing # $Id: run2.cmd,v 1.3 2007/01/25 10:19:15 rockyb Exp $ # set basename on set trace-commands on info program continue info program ###################################### ### Program munges sys.argv ### see if we can rerun it okay ###################################### set interactive on run 3 5 ###################################### ### Break of a fn name and ### Try a return where there is none ### either because not in subroutine ### or no "return" statement ###################################### set interactive off break check_args return continue return ###################################### ### rerun wrong number of parameters ### that causes and exception ### and use "info program" to check ### termination ###################################### set interactive on info program run 5 10 continue break gcd continue info program set linetrace on set interactive off return where quit pydb-1.26/test/noscript.cmd0000664000175000017500000000036710454375600012642 00000000000000where break break ctest.c:5 cd . clear debug foo disassemble down info a info args info br info break info di info display info gl info globals info li info line info lo info locals info prog info program info so info source jump list run up quit pydb-1.26/test/test-linetrace.py.in0000755000175000017500000000451211117066431014207 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-linetrace.py.in,v 1.5 2008/12/08 00:40:57 rockyb Exp $ "Unit test for Extended Python debugger's set linetrace " import difflib, os, sys, time, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) def run_python(testname, pythonfile, args='', outfile=None): srcdir = os.path.join(top_srcdir, 'test') pythonfile = os.path.join(".", pythonfile) outfile_opt = '' if outfile is None: outfile = "%s.out" % testname if sys.hexversion >= 0x02050000: rightfile = os.path.join(srcdir, 'data', "%s-2.5.right" % testname) elif sys.version_info[0:2] == (2, 4) and sys.version_info[3] == 'final': rightfile = os.path.join(srcdir, 'data', "%s-2.4-final.right" % testname) else: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) if os.path.exists(outfile): os.unlink(outfile) cmd = "(@PYTHON@ %s %s) >%s 2>&1" % (pythonfile, args, outfile) os.system(cmd) # Do diff on output fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines()[1:-1] tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines()[1:-1] # 3rd line has a path in it. Pick out just the non-path tail of that fromlines[2] = fromlines[2][-24:] tolines[2] = tolines[2][-24:] diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_settrace(self): """Test that 'tracing and set_trace (debugger) work""" global builddir result = run_python("tracetest", "settrace.py") self.assertEqual(True, result, "hanoi trace output comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/brkpt3.right.in0000644000175000017500000000163010564316315013155 00000000000000+############################################################### +### Test bad command parameters +############################################################### +# Non integer argument +commands a *** 'commands' command: Expecting a positive integer, got: a +# No such breakpoint number +commands 5 *** No breakpoint numbered 5. +############################################################### +### Test valid command. Note that in order to do this +### here we need to use the "source" command so that +### input doesn't get confused. +### FIXME: somehow output isn't coming out. +### but at least we're testing part +### parsing to the "end" +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +cd @srcdir@ +source comm1.cmd +continue +break 31 Breakpoint 2 set in file gcd.py, line 31. +source comm2.cmd +cd @builddir@ +continue +quit pydb-1.26/test/withbug.py0000644000175000017500000000046610712235156012333 00000000000000from __future__ import with_statement class FakeClass: def __init__(self): x = 1 return def __enter__(self): return 1 def __exit__(self, type, value, traceback): return 2 def test(): with FakeClass() as f: print f return return test() pydb-1.26/test/settrace.py0000755000175000017500000000212511167754545012506 00000000000000#!/usr/bin/python """Towers of Hanoi""" import sys, os top_builddir = ".." if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = ".." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) def hanoi(n,a,b,c): if n-1 > 0: hanoi(n-1, a, c, b) print "Move disk %s to %s" % (a, b) if n-1 > 0: hanoi(n-1, c, b, a) i_args=len(sys.argv) if i_args > 3: print "usage %s [disks [cmdfile]]" % sys.argv[0] sys.exit(1) n=3 if i_args > 1: try: n = int(sys.argv[1]) except ValueError, msg: print "** Expecting an integer, got: %s" % repr(sys.argv[1]) sys.exit(2) if n < 1 or n > 100: print "*** number of disks should be between 1 and 100" sys.exit(2) dbg_cmds=['set basename on', 'where', 'list', 'step', 'step', 'where', 'info locals', 'set linetrace on', 'continue'] import pydb pydb.debugger(dbg_cmds) hanoi(n, "a", "b", "c") pydb-1.26/test/hanoi.py0000775000175000017500000000126610462354543011770 00000000000000#!/usr/bin/python """Towers of Hanoi""" import sys def hanoi(n,a,b,c): if n-1 > 0: hanoi(n-1, a, c, b) print "Move disk %s to %s" % (a, b) if n-1 > 0: hanoi(n-1, c, b, a) if __name__=='__main__': i_args=len(sys.argv) if i_args != 1 and i_args != 2: print "*** Need number of disks or no parameter" sys.exit(1) n=3 if i_args > 1: try: n = int(sys.argv[1]) except ValueError, msg: print "** Expecting an integer, got: %s" % repr(sys.argv[1]) sys.exit(2) if n < 1 or n > 100: print "*** number of disks should be between 1 and 100" sys.exit(2) hanoi(n, "a", "b", "c") pydb-1.26/test/file.right.in0000644000175000017500000000042010564315247012666 00000000000000+cd @srcdir@ +file hanoi.py +info line Line 2 of "hanoi.py" at instruction 0 +where 2 -> 0 in file 'hanoi.py' at line 2 ## 1 in exec cmd in globals, locals at line 1 +step 1+1 +where 2 -> 0 in file 'hanoi.py' at line 12 ## 1 in exec cmd in globals, locals at line 1 +quit pydb-1.26/test/settrace.py.in0000644000175000017500000000215310536710455013100 00000000000000#!/usr/bin/python """Towers of Hanoi""" import sys, os top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) def hanoi(n,a,b,c): if n-1 > 0: hanoi(n-1, a, c, b) print "Move disk %s to %s" % (a, b) if n-1 > 0: hanoi(n-1, c, b, a) i_args=len(sys.argv) if i_args > 3: print "usage %s [disks [cmdfile]]" % sys.argv[0] sys.exit(1) n=3 if i_args > 1: try: n = int(sys.argv[1]) except ValueError, msg: print "** Expecting an integer, got: %s" % repr(sys.argv[1]) sys.exit(2) if n < 1 or n > 100: print "*** number of disks should be between 1 and 100" sys.exit(2) dbg_cmds=['set basename on', 'where', 'list', 'step', 'step', 'where', 'info locals', 'set linetrace on', 'continue'] import pydb pydb.debugger(dbg_cmds) hanoi(n, "a", "b", "c") pydb-1.26/test/test-import.py.in0000755000175000017500000000166611117742256013570 00000000000000#!@PYTHON@ -t # $Id: test-import.py.in,v 1.2 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- "Unit test of 'import pydb'" import os, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep class PdbTests(unittest.TestCase): def test_import(self): """Test that 'import pydb' works""" cmd = ("@PYTHON@ -c 'import os, sys; " + "sys.path.insert(0, \"%s\"); " + "sys.path.insert(0, \"%s\"); " + "import pydb'" ) % (top_builddir, top_srcdir) rc = os.system(cmd) >> 8 self.assertEqual(0, rc, "python import pydb") return if __name__ == "__main__": unittest.main() pydb-1.26/test/logging.cmd0000664000175000017500000000041310405353502012410 00000000000000set logging file logging.out set logging on set logging redirect on show logging show logging redirect show logging file show logging overwrite set logging fdfsdasdfs set logging file /.bogus/bogusbogus/bogus/bogus/bogus set logging redirect oon set logging off quit pydb-1.26/test/gcd.py0000755000175000017500000000172110513031344011405 00000000000000#!/usr/bin/python """Greatest Common Divisor Some characterstics of this program used for testing check_args() does not have a 'return' statement. check_args() raises an uncaught exception when given the wrong number of parameters. """ import sys def check_args(): if len(sys.argv) != 3: # Rather than use sys.exit let's just raise an error raise Exception, "Need to give two numbers" for i in range(2): try: sys.argv[i+1] = int(sys.argv[i+1]) except ValueError: print "** Expecting an integer, got: %s" % repr(sys.argv[i]) sys.exit(2) def gcd(a,b): """ GCD. We assume positive numbers""" # Make: a <= b if a > b: (a, b) = (b, a) if a <= 0: return None if a == 1 or b-a == 0: return a return gcd(b-a, a) if __name__=='__main__': check_args() (a, b) = sys.argv[1:3] print "The GCD of %d and %d is %d" % (a, b, gcd(a, b)) pydb-1.26/test/test-disassem.py.in0000755000175000017500000000416511167745261014067 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-disassem.py.in,v 1.2 2009/03/31 19:52:59 rockyb Exp $ "Unit test for Extended Python debugger's signal handling commands " import inspect, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb class PdbTest(pydb.Pdb): def __init__(self): pydb.Pdb.__init__(self) self.errLines = [] self.msgLines = [] self.msg_last_nocr = False self.stack = self.curframe = self.botframe = None return def errmsg(self, msg): self.errLines.append(msg) return def msg(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = False return def msg_nocr(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = True return def msgReset(self): self.msgLines = [] return class PdbTests(unittest.TestCase): def test_disassemble(self): """Unit test dissassemble command""" import atexit deb = PdbTest() deb.curframe = inspect.currentframe() # deb.do_disassemble('atexit.register') # all_lines = len(deb.msgLines) # self.assertEqual(True, all_lines > 0) # deb.msgReset() deb.do_disassemble('+') all_lines = len(deb.msgLines) self.assertEqual(True, all_lines > 0) deb.msgReset() deb.do_disassemble('10') all_lines = len(deb.msgLines) self.assertEqual(True, all_lines > 0) deb.msgReset() deb.do_disassemble('1 100') all_lines = len(deb.msgLines) self.assertEqual(True, all_lines > 0) deb.msgReset() return if __name__ == "__main__": unittest.main() pydb-1.26/test/brkpt3.cmd.in0000644000175000017500000000152610564322076012610 00000000000000# # Test of breakpoint handling # $Id: brkpt3.cmd.in,v 1.1 2007/02/13 11:42:54 rockyb Exp $ # set basename on set trace-commands on ############################################################### ### Test bad command parameters ############################################################### # Non integer argument commands a # No such breakpoint number commands 5 ############################################################### ### Test valid command. Note that in order to do this ### here we need to use the "source" command so that ### input doesn't get confused. ### FIXME: somehow output isn't coming out. ### but at least we're testing part ### parsing to the "end" ############################################################### break 28 cd @srcdir@ source comm1.cmd continue break 31 source comm2.cmd cd @builddir@ continue quit pydb-1.26/test/run.cmd0000644000175000017500000000107610556102043011571 00000000000000# Test of restart and linetracing # $Id: run.cmd,v 1.6 2007/01/25 10:19:15 rockyb Exp $ # set basename on set trace-commands on info program continue ###################################### ### Now restart with a breakpoint ###################################### break hanoi show args run continue info args info program where 2 ###################################### ### We should be at that breakpoint ### delete it and run again ### this time changing a parameter ###################################### info break delete 1 run 1 continue show args info args #### quit pydb-1.26/test/test-save.py.in0000755000175000017500000000434411117742256013210 00000000000000#!@PYTHON@ -t # $Id: test-save.py.in,v 1.3 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- """Unit test of the save command.""" import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pydb_opts='', args=''): global srcdir, builddir, pydir rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s %s.py" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, args, '%sgcd' % srcdir) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_save(self): """Test running bug running "save" command""" result=run_debugger(testname='save', pydb_opts='--basename') self.assertEqual(True, result, "pydb 'save' command comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/filebug.cmd0000644000175000017500000000047310565552320012411 00000000000000# Test to see __file__ is set # $Id: filebug.cmd,v 1.2 2007/01/25 10:19:15 rockyb Exp $ set basename on set trace-commands on ############################################# ## Test to see that __file__ is set. ## Just run the program and it does the work. ############################################# continue quit pydb-1.26/test/Makefile.am0000644000175000017500000000462311167754512012352 00000000000000#$Id: Makefile.am,v 1.55 2009/04/10 23:42:02 rockyb Exp $ # Copyright (C) 2006, 2007, 2008 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. # SUBDIRS = data unit thread SUBDIRS = data unit check_DATA = \ .pydbrc \ brkpt1.cmd \ brkpt2.cmd \ cmdparse.cmd \ comm1.cmd \ comm2.cmd \ dbgcall.py \ except.py \ filebug.cmd \ filebug.py \ gcd.py \ hanoi.py \ history.cmd \ logging.cmd \ noscript.cmd \ pm.cmd \ pydbrc.cmd \ run.cmd \ run2.cmd \ save.cmd \ setshow.cmd \ settrace.py \ sighandler.cmd \ skip.cmd \ step.cmd \ sigtestexample.py \ withbug.cmd \ withbug.py TESTS = test.py \ test-complete.py \ test-contbug.py \ test-connect.py \ test-dbgcall.py \ test-disassem.py \ test-file.py \ test-fifo-connect.py \ test-fns.py \ test-help.py \ test-import.py \ test-linetrace.py \ test-pm.py \ test-run.py \ test-setshow.py \ test-sig.py \ test-sighandle.py \ test-save.py \ test-skip.py \ test-step.py \ test-trace.py \ test-tcp-connect.py \ test-trace.py \ test-with.py EXTRA_DIST = \ $(check_DATA) \ $(patsubst %.py,%.py.in, $(TESTS)) \ brkpt3.cmd.in \ .pydbrc.in \ file.right.in file-2.5.right.in file.cmd.in \ settrace.py.in test: check clean-generic: -rm $(top_builddir)/test/*.pyc \ $(top_builddir)/test/history.hst \ $(top_builddir)/test/savefile.txt pydb-1.26/test/test-pm.py.in0000755000175000017500000000534511117056317012664 00000000000000#!@PYTHON@ -t # $Id: test-pm.py.in,v 1.2 2008/11/17 19:06:39 rockyb Exp $ -*- Python -*- "Unit test for Extended Python debugger's Post-Mortem (pm) commands " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def raise_error(): raise FloatingPointError class PdbTests(unittest.TestCase): ## Don't use assertTrue to be compatible with older version of ## unittest def test_postmortem2(self): """Test post-mortem processing without a traceback""" pydb.post_mortem() self.assertEqual(True, True, "post-mortem test with no traceback") def test_postmortem(self): """Test post-mortem processing""" try: raise_error() except FloatingPointError: t = sys.exc_info()[2] outfile = 'pm.out' rightfile = os.path.join(srcdir, 'data', 'pm.right') errfile = 'pm.err' old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = open(outfile, 'w') sys.stderr = open(errfile, 'w') pydb.post_mortem(t=t, dbg_cmds=None, cmdfile=os.path.join(srcdir, 'pm.cmd')) sys.stdout.close() sys.stderr.close() sys.stdout = old_stdout sys.stderr = old_stderr fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) os.unlink(errfile) for line in diff: print line, self.assertEqual(0, len(diff), "post-mortem test") return if __name__ == "__main__": unittest.main() pydb-1.26/test/test.py.in0000755000175000017500000002647011125042055012245 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test.py.in,v 1.45 2008/12/26 02:40:45 rockyb Exp $ "Unit test for the Extended Python debugger's disassembler." import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb class PdbTest(pydb.Pdb): def __init__(self): pydb.Pdb.__init__(self) self.errLines = [] self.msgLines = [] self.msg_last_nocr = False self.stack = self.curframe = self.botframe = None return def errmsg(self, msg): self.errLines.append(msg) return def msg(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = False return def msg_nocr(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = True return def msgReset(self): self.msgLines = [] return builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) # FIXME! combine truncate and ingore_lines into a filter function # (create with lambda). And move all of this out to a helper function # anyway. def run_debugger(testname, pythonfile, args='', outfile=None, rightfile=None, pydb_opts='', truncate=None, cmdfile=None, ignore_line=None): global srcdir, builddir, pydir if cmdfile is None: cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile_opt = '' if outfile is None: test_dir = "@top_srcdir@" outfile = os.path.join("@top_srcdir@", "test", "%s.out" % testname) outfile_opt = '--output=%s ' % outfile if rightfile is None: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmd = "%s %s --command %s %s %s %s" % \ (pydb_path, pydb_opts, cmdfile, outfile_opt, pythonfile, args) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() if truncate: fromlines = fromlines[0:truncate] tolines = tolines[0:truncate] if ignore_line: del fromlines[ignore_line] del tolines[ignore_line] diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_brkpt(self): """Unit test breakpoint setting and display - part 1.""" result=run_debugger(testname='brkpt1', pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "brkpt1") result=run_debugger(testname='brkpt1', pythonfile='%shanoi.py' % srcdir, pydb_opts='--threading', rightfile=os.path.join(srcdir, 'data', "brkpt1t.right"), truncate=-2) self.assertEqual(True, result, "brkpt1 --threading") def test_brkpt2(self): """Unit test breakpoint setting and display - part 2.""" if sys.hexversion <= 0x020400f0: rightfile = os.path.join(srcdir, 'data', "brkpt2-2.3.right") else: rightfile = os.path.join(srcdir, 'data', "brkpt2.right") result=run_debugger(testname='brkpt2', pythonfile='%sgcd.py' % srcdir, args='3 5', rightfile=rightfile) self.assertEqual(True, result, "brkpt2") def test_brkpt3(self): """Unit test breakpoint setting and display - part 3.""" cmdfile=os.path.join(builddir, 'brkpt3.cmd') result=run_debugger(testname='brkpt3', pythonfile='%sgcd.py' % srcdir, rightfile=os.path.join(srcdir, 'data', "brkpt3.right"), args='3 5', truncate=-5, ignore_line=19, cmdfile=cmdfile) self.assertEqual(True, result, "brkpt3") if sys.hexversion >= 0x02050000: rightfile = os.path.join(srcdir, 'data', "brkpt3-2.5t.right") else: rightfile = os.path.join(srcdir, 'data', "brkpt3t.right") result=run_debugger(testname='brkpt3', pythonfile='%sgcd.py' % srcdir, args='3 5', pydb_opts='--threading', rightfile=rightfile, truncate=-2, ignore_line=20, cmdfile=cmdfile) self.assertEqual(True, result, "brkpt3 --threading") def test_cmdparse(self): """Unit test command parsing.""" result=run_debugger(testname='cmdparse', pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "cmdparse") def test_complete(self): """Test the 'complete' command.""" pdb = PdbTest() pdb.noninteractive = True if hasattr(pdb, 'do_complete'): print "Have complete" pdb.do_complete("c") correct = ['c', 'cd', 'cl', 'clear', 'commands', 'condition', 'continue'] self.failUnless( pdb.msgLines == correct, "Completion is not complete" ) pdb.msgReset() pdb.do_complete("set i") correct = ['set interactive'] self.failUnless( pdb.msgLines == correct, "Subcommand completion is not complete" ) pdb.msgReset() pdb.do_complete("info l") correct = ['info line', 'info locals'] self.failUnless( pdb.msgLines == correct, "Subcommand completion (info l) not complete" ) pdb.msgReset() pdb.do_complete("complete handler foo") correct = [] self.failUnless( pdb.msgLines == correct, "Subcommand completion (3) not complete" ) pdb.msgReset() pdb.do_complete("complete hand foo") correct = [] self.failUnless( pdb.msgLines == correct, "Subcommand completion (4) not complete" ) else: print "No complete" ## def test_debug(self): ## """Test (recursive) debug command""" ## result=run_debugger(testname='debug', ## pythonfile='%shanoi.py' % srcdir) ## self.assertEqual(True, result, "debug") def test_filebug(self): """Test __file__""" result=run_debugger(testname='filebug', pythonfile='%sfilebug.py' %srcdir) self.assertEqual(True, result, "filebug") def test_handle(self): """Unit test handle processing.""" result=run_debugger(testname='sighandler', pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "sighandler") def test_history(self): """Test the 'history' debugger command.""" try: import @READLINE@ except ImportError: return result=run_debugger(testname='history', pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "history") if os.path.exists("history.hst"): os.unlink("history.hst") def test_logging(self): """Test 'set logging' and 'show logging' debugger commands.""" global top_builddir logfile=os.path.join(top_builddir, "test", "logging.out") result=run_debugger(testname='logging', pythonfile='%shanoi.py' % srcdir, outfile=logfile) self.assertEqual(True, result, "logging") def test_no_script(self): """Test running without a script.""" result=run_debugger(testname='noscript', pythonfile="") self.assertEqual(True, result, "running without a Python script") def test_pwd_cd(self): """Test the 'pwd' and 'cd' debugger commands.""" pdb = PdbTest() pdb.noninteractive = True # Run pwd pdb.msgLines=[]; pdb.errLines=[] pdb.do_pwd("") self.assertEqual(True, len(pdb.errLines) == 0, "pwd gave error: " + str(pdb.errLines)) self.assertEqual(True, len(pdb.msgLines) == 1) my_cd = pdb.msgLines[0] # Run cd pdb.msgLines=[]; pdb.errLines=[] pdb.do_cd(".") self.assertEqual(True, len(pdb.errLines) == 0, "cd gave error: " + str(pdb.errLines)) self.assertEqual(True, len(pdb.msgLines) == 0) pdb.msgLines=[]; pdb.errLines=[] pdb.do_pwd("") self.assertEqual(True, pdb.msgLines[0] == my_cd) ## def test_return(self): ## """Test of run with return.""" ## if sys.version_info[0:2] == (2, 4) and sys.version_info[3] >= 2: ## print ## print "**********************************************************" ## print "*** NOTE ***" ## print "*** The traceback 'Need to give two numbers' is right ***" ## print "**********************************************************" ## result=run_debugger(testname='run2', ## pythonfile='%sgcd.py' % srcdir) ## self.assertEqual(True, result, "run2") def test_run(self): """Test 'run' and 'restart' debugger commands.""" # Python 2.3.5 stack traces look different and I # don't know enough about what version changes what. So for # now, we run the test and if it doesn't crash on anything # that is less than version 2.5 we'll call it a success. # For version 2.5 (and above?) we'll assume a more # stringent test. if sys.hexversion > '20400f0': result=run_debugger(testname='run', pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "run") if __name__ == "__main__": unittest.main() pydb-1.26/test/test-connect.py.in0000755000175000017500000001131410712315137013670 00000000000000#!@PYTHON@ -t # $Id: test-connect.py.in,v 1.1 2007/11/01 09:20:31 rockyb Exp $ -*- Python -*- # This unit test doesn't use any of the debugger code. It is meant solely # to test the connection classes. import os import sys import unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) # Global vars __addr__ = 'localhost:8002' MAXTRIES = 100 TESTFN = 'device' sys.path.append("..") from connection import ConnectionServerTCP, ConnectionClientTCP, \ ConnectionSerial, ConnectionFailed def repeatedConnect(client, addr): """Try to connect the client to addr either until we've tried MAXTRIES times or until it succeeds.""" for i in range(MAXTRIES): try: client.connect(addr) if client.connected: break except ConnectionFailed: pass class TestTCPConnections(unittest.TestCase): def setUp(self): self.server = ConnectionServerTCP() self.client = ConnectionClientTCP() ## def test_ErrorAddressAlreadyInUse(self): ## thread.start_new_thread(repeatedConnect, (self.client, __addr__)) ## self.server.connect(__addr__) ## # Set up second server on same port and do not reuse the addr ## s = ConnectionServerTCP() ## self.assertRaises(ConnectionFailed, s.connect, __addr__, False) ## def test_ConnectionRefused(self): ## self.assertRaises(ConnectionFailed, self.client.connect, __addr__) ## def test_ServerReadError(self): ## thread.start_new_thread(self.server.connect, (__addr__,)) ## while not self.server._sock: ## time.sleep(0.1) ## repeatedConnect(self.client, __addr__) ## # Wait to make _absolutely_ sure that the client has connected ## while not self.server.output: ## time.sleep(0.1) ## self.client.disconnect() ## self.assertRaises(ReadError, self.server.readline) ## self.server.disconnect() ## thread.start_new_thread(self.client.connect, (__addr__,)) ## self.server.connect(__addr__) ## self.server.disconnect() ## self.assertRaises(ReadError, self.client.readline) def tear_Down(self): self.server.disconnect() self.client.disconnect() class TestSerialConnections(unittest.TestCase): """ This test just uses a file instead of a serial device, which on *nix systems is just files anyway. """ def setUp(self): self.server = ConnectionSerial() self.client = ConnectionSerial() fd = open(TESTFN, "wr+") fd.close() self.server.connect(TESTFN) self.client.connect(TESTFN) def test_ClientToServerConnect(self): self.client.disconnect() self.server.disconnect() def test_ClientWriteRead(self): self.client.write('success!') line = self.server.readline() self.assertEquals('success!\n', line, 'Could not read from client.') # Unfortunately the text file doesn't erase what we've written like a # device of stream, so we have to close the the file and re-open it. self.server.disconnect() self.server.connect(TESTFN) self.server.write('great!') line = self.client.readline() self.assertEquals('great!\n', line, 'Could not read from server.') def test_DisconnectDisconnected(self): self.server.disconnect() def test_Readline(self): self.client.write('success!\nNext line.') self.client.disconnect() line = self.server.readline() self.assertEquals('success!\n', line, 'Could not read first line') line = self.server.readline() self.assertEquals('Next line.\n', line, 'Could not read second line.') line = self.server.readline() self.assertEquals('', line, 'Could not read third line.') def test_InvalidFilename(self): client = ConnectionSerial() self.assertRaises(ConnectionFailed, client.connect, '/dev/pleasepleasepleasedontexit') def tearDown(self): self.server.disconnect() self.client.disconnect() os.remove(TESTFN) def test_InvalidPipe(self): fname='invalid' self.assertRaises(ConnectionFailed,self.client.connect, fname) client_fname = fname+'0' if os.path.exists(client_fname): os.unlink(client_fname) def tear_Down(self): self.client.disconnect() self.server.disconnect() if __name__ == '__main__': unittest.main() pydb-1.26/test/test-step.py.in0000644000175000017500000000446611117742256013227 00000000000000#!@PYTHON@ -t # $Id: test-step.py.in,v 1.3 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- "Unit test of the file command for Extended Python debugger " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', outfile=None): global srcdir, builddir, pydir rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s %s" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, pythonfile, args) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_trace(self): """Test stepping""" result=run_debugger(testname='step', pydb_opts='--basename', pythonfile='%sgcd.py' % srcdir) self.assertEqual(True, result, "pydb 'step' command comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/except.py0000755000175000017500000000152011167754545012162 00000000000000#!/usr/bin/python -t # $Id: except.py.in,v 1.4 2007/01/25 19:04:45 rockyb Exp $ """Test to see if handles an exception when an error is raised.""" import os, sys top_builddir = ".." if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = ".." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) print __doc__ import pydb pydb.debugger() # we go into the debugger print "Returning from the debugger" # Set a variable so we can show the state is # somewhere after the above set_trace() z='After set_trace' try: # The below statement should not enter the debugger x=2/0 except: pass # We should enter the debugger on the next statement. y=1/0 # Bullwinkle: This time, for sure! pass pydb-1.26/test/test-file.py.in0000644000175000017500000000473311117742256013170 00000000000000#!@PYTHON@ -t # $Id: test-file.py.in,v 1.4 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- "Unit test of the file command for Extended Python debugger " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pydb_opts='', args=''): global srcdir, builddir, pydir if sys.hexversion >= 0x02050000: rightfile = os.path.join(srcdir, 'data', "%s-2.5.right" % testname) else: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(builddir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, args) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines()[0:-2] del fromlines[0] tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines()[0:-2] del tolines[0] diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_trace(self): """Test running program via the 'file' command""" result=run_debugger(testname='file', pydb_opts='--basename') self.assertEqual(True, result, "pydb 'file' command comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/test-tcp-connect.py.in0000644000175000017500000000772210712315140014453 00000000000000#!@PYTHON@ -t # $Id: test-tcp-connect.py.in,v 1.1 2007/11/01 09:20:32 rockyb Exp $ -*- Python -*- # This unit test doesn't use any of the debugger code. It is meant solely # to test the connection classes. import os, sys, threading, time, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import connection debug=True class TestTCPConnections(unittest.TestCase): def setUp(self): self.port = 8000 self.host = '127.0.0.1' self.server = connection.ConnectionServerTCP() self.client = connection.ConnectionClientTCP() def tear_Down(self): self.server.disconnect() self.client.disconnect() def repeated_connect(self, MAXTRIES=15): """Try to connect the client to self.addr either until we've tried MAXTRIES times or until it succeeds.""" for i in range(MAXTRIES): if self.server._sock is None: time.sleep(0.01) else: for j in range(MAXTRIES): try: self.client.connect(self.addr) if self.client.connected: if debug: print "client connected" return True except connection.ConnectionFailed, e: if debug: print e if debug: print "Client can't connect" return False def server_listen(self, MAXPORTS=20): """Try to start the server listening over a range of ports starting with self.port""" self.addr = "%s:%d" % (self.host, self.port) for i in range(MAXPORTS): try: self.server.connect(self.addr) if debug: print "Listening on socket %s" % self.addr return True except connection.ConnectionFailed, e: if e[0] == 'Address already in use': self.port += 1 print "Trying port %d" % self.port self.addr = "%s:%d" % (self.host, self.port) if debug: print "No free port found" return False def setup_client_and_server(self): t=threading.Thread(target=self.server_listen) t.start() if not self.repeated_connect(): return False for i in range(15): if self.server._sock is not None and \ self.server.output is not None: return True time.sleep(0.01) def test_client_server(self): """Test that the we can read and write between a TCP client and server""" if not self.setup_client_and_server(): self.server.disconnect() self.client.disconnect() return self.server.write("good") line = self.client.readline() self.assertEqual("good", line, "Server write to client read bad") self.client.write('success') line = self.server.readline() self.assertEqual('success\n', line, 'Client write to server read bad') def test_disconnect_disconnected(self): """Test disconnecting twice """ self.server.disconnect() self.server.disconnect() def test_invalid_address_port_pair(self): """Test an erroneous connection name""" addr = 'localhost 8000' self.assertRaises(connection.ConnectionFailed, self.server.connect, addr) def test_invalid_server_address(self): """Test an erroneous server address""" addr = 'fff.209320909xcmnm2iu3-=0-0-z.,x.,091209:2990' self.assertRaises(connection.ConnectionFailed, self.server.connect, addr) if __name__ == '__main__': unittest.main() pydb-1.26/test/test-fns.py.in0000644000175000017500000000714510712315137013031 00000000000000#!@PYTHON@ -t # $Id: test-fns.py.in,v 1.1 2007/11/01 09:20:31 rockyb Exp $ -*- Python -*- # This unit test doesn't use any of the debugger code. It is meant solely # to test the connection classes. import os, sys, thread, time, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import fns class TestFns(unittest.TestCase): def test_show_onoff(self): """Test of fns.show_onoff()""" self.assertEqual(fns.show_onoff(True), 'on') self.assertEqual(fns.show_onoff(False), 'off') def test_printf(self): """Test of fns.printf()""" self.assertEqual( fns.printf(31, "/o"), '037') self.assertEqual( fns.printf(31, "/t"), '00011111') self.assertEqual( fns.printf(33, "/c"), '!') self.assertEqual( fns.printf(33, "/x"), '0x21') def test_file_pyc2py(self): """Test file_pyc2py()""" self.assertEqual( "gcd.py", fns.file_pyc2py("gcd.pyo"), "xx.pyo should transform to xx.py") self.assertEqual( "/tmp/gcd.py", fns.file_pyc2py("/tmp/gcd.pyc"), "xx.pyc should transform to xx.py") self.assertEqual( "../gcd.py", fns.file_pyc2py("../gcd.py"), "Test null transform") def test_whence_file(self): """Test whence_file()""" fname = os.path.join(os.curdir, "thisfilenotthere") self.assertEqual( fname, fns.whence_file(fname), "whence should not change due to sep in name" ) os.environ["PATH"] = "" fname = "gcd.py" self.assertEqual( fname, fns.whence_file(fname), "Test of whence_file path expansion - not found " ) test_dir = os.path.join(top_srcdir, "test") os.environ["PATH"] = test_dir fname = "gcd.py" expand_fname = os.path.join(test_dir, fname) self.assertEqual( expand_fname, fns.whence_file(fname), "Test of whence_file path expansion - found" ) def test_columnize(self): self.assertEqual("['one', 'two', 'three']", fns.columnize_array(["one", "two", "three"])) self.assertEqual("[oneitem]", fns.columnize_array(["oneitem"])) self.assertEqual( """['one', 'two', 'three', '4ne', '5wo', '6hree', '7ne', '8wo', '9hree' '10e', '11o', '12ree', '13e', '14o', '15ree', '16e', '17o', '18ree' '19e', '20o', '21ree', '22e', '23o', '24ree', '25e', '26o', '27ree' '28e', '29o', '30ree', '31e', '32o', '33ree', '34e', '35o', '36ree' '37e', '38o', '39ree', '40e', '41o', '42ree', '43e', '44o', '45ree' '46e', '47o', '48ree', 'one'...]""", fns.columnize_array([ "one", "two", "three", "4ne", "5wo", "6hree", "7ne", "8wo", "9hree", "10e", "11o", "12ree", "13e", "14o", "15ree", "16e", "17o", "18ree", "19e", "20o", "21ree", "22e", "23o", "24ree", "25e", "26o", "27ree", "28e", "29o", "30ree", "31e", "32o", "33ree", "34e", "35o", "36ree", "37e", "38o", "39ree", "40e", "41o", "42ree", "43e", "44o", "45ree", "46e", "47o", "48ree", "one", "two", "three"])) if __name__ == '__main__': unittest.main() pydb-1.26/test/history.cmd0000644000175000017500000000063510556102043012466 00000000000000# Test of history mechanism # $Id: history.cmd,v 1.4 2007/01/25 10:19:15 rockyb Exp $ # set basename on set trace-commands on set history size 5 set history filename set history filename history.hst show history ######################################### # Test save on and off. # Test also using short abbreviated name ######################################### set his save off set hi save on list show hi quit pydb-1.26/test/test-sig.py.in0000644000175000017500000001303411167745261013031 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-sig.py.in,v 1.4 2009/01/22 03:50:13 rockyb Exp $ "Unit test for Extended Python debugger's signal handling commands " import os, sys, unittest, signal top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import sighandler builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) outfile = 'sighandler.out' program = os.path.join(srcdir, 'sigtestexample.py') class SigTests(unittest.TestCase): def tearDown(self): try: os.unlink(outfile) except OSError: pass try: os.unlink('log') except OSError: pass def create_pydb_proc(self, cmds,arg=None): """Run pydb on program with command string 'cmds', and pass arg if that is given. Debugger output is stored in outfile. Note that there is also output produced by the debugged program. """ os.environ['PYTHONPATH']=os.pathsep.join(sys.path) if arg: pid = os.spawnlp(os.P_WAIT, pydb_path, pydb_path, '--sigcheck', '-o', outfile, '-e', '%s' % cmds, program, arg) else: pid = os.spawnlp(os.P_NOWAIT, pydb_path, pydb_path, '--sigcheck', '-o', outfile, '-e', '%s' % cmds, program) return pid def test_signum_name(self): """Test that signal name and number lookup work """ for signum in range(signal.NSIG): signame = sighandler.lookup_signame(signum) if signame is not None: self.assertEqual(signum, sighandler.lookup_signum(signame)) # Try without the SIG prefix self.assertEqual(signum, sighandler.lookup_signum(signame[3:])) def test_noprint_nostop_pass(self): """Check to see the debugger does not intercepts a USR1 signal, doesn't print intercepting it but passes it along to the program.""" self.tearDown() cmds = 'handle SIGUSR1 noprint nostop pass;;next 10;;quit' pid = self.create_pydb_proc(cmds, 'signal') f = open(outfile, 'r') lines = f.readlines() f.close() self.assertEqual(False,'Program received signal SIGUSR1\n' in lines) f = open('log', 'r') line = f.readline() f.close() self.assertEqual(line, 'signal received\n') os.unlink('log') def test_noprint_nostop_nopass(self): """Check to see the debugger does not intercepts a USR1 signal, doesn't print intercepting and doesn't pass it along to the program.""" self.tearDown() cmds = 'handle SIGUSR1 noprint nostop nopass;;set sigcheck on;;continue;;quit' pid = self.create_pydb_proc(cmds, 'signal') f = open(outfile, 'r') lines = f.readlines() f.close() self.assertEqual(False,'Program received signal SIGUSR1\n' in lines) self.assertRaises(IOError, open, 'log', 'r') def test_print_nostop_nopass(self): """Check to see the debugger intercepts a USR1 signal, prints it and doesn't pass it along to the program. """ self.tearDown() cmds = "handle SIGUSR1 print nostop nopass;;set sigcheck on;;continue;;quit" pid = self.create_pydb_proc(cmds, 'signal') f = open(outfile, 'r') lines = f.readlines() f.close() self.assertEqual(True,'Program received signal SIGUSR1\n' in lines) self.assertRaises(IOError, open, 'log', 'r') def test_print_nostop_pass(self): """Check to see the debugger intercepts a USR1 signal, prints it and passes it along to the program. """ self.tearDown() cmds = "handle SIGUSR1 print nostop pass;;next 10;;quit" pid = self.create_pydb_proc(cmds, 'signal') f = open(outfile, 'r') lines = f.readlines() f.close() self.assertEqual(True,'Program received signal SIGUSR1\n' in lines) f = open('log', 'r') line = f.readline() f.close() self.assertEqual(line, 'signal received\n') os.unlink('log') def test_print_stop(self): """Check to see the debugger intercepts a USR1 signal and stops.""" self.tearDown() cmds = 'set basename on;;handle SIGUSR1 print stop;;continue;;where;;quit' pid = self.create_pydb_proc(cmds, 'signal') f = open(outfile, 'r') lines = f.readlines() f.close() self.assertEqual(True, 'Program received signal SIGUSR1\n' in lines) if sys.hexversion < 0x02050000: self.assertEqual(True, "-> 0 in file 'sigtestexample.py' at line 20\n" in lines) else: self.assertEqual(True, "-> 0 execfile() file 'sigtestexample.py' at line 20\n" in lines) self.assertRaises(IOError, open, 'log', 'r') if __name__ == '__main__': unittest.main() pydb-1.26/test/test-with.py.in0000755000175000017500000000607611117742256013231 00000000000000#!@PYTHON@ -t # $Id: test-with.py.in,v 1.7 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- """Unit test of the bug in using 'info local' when inside a "with" command.""" import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', rightfile=None, need_26=False): global srcdir, builddir, pydir if rightfile is None: rightfile = os.path.join(builddir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s %s" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, args, pythonfile) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines()[0:-1] tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines()[0:-1] if not need_26: tolines[4]= tolines[4][0:74] + "\n" diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_with(self): """Test running bug running "info local" inside a "with" command""" if sys.hexversion >= 0x02050000: if sys.hexversion >= 0x02060000: need_26 = True rightfile = os.path.join(srcdir, 'data', "withbug-2.6.right") else: need_26 = False rightfile = os.path.join(srcdir, 'data', "withbug.right") result=run_debugger(testname='withbug', pythonfile='%swithbug.py' % srcdir, pydb_opts='--basename', rightfile=rightfile, need_26=need_26) self.assertEqual(True, result, "pydb 'withbug' command comparision") self.assertTrue(True, 'With test skipped - not 2.5') return if __name__ == "__main__": unittest.main() pydb-1.26/test/step.cmd0000644000175000017500000000036011013527241011733 00000000000000# # Test of the 'step' and deftrace command # $Id: step.cmd,v 1.1 2008/05/17 10:08:33 rockyb Exp $ # set basename on set trace-commands on set deftrace off set listsize 1 step list set deftrace on step list set deftrace off step list quit pydb-1.26/test/setshow.cmd0000644000175000017500000000066011013521154012454 00000000000000# Test of set/show commands # $Id # set basename on show basename set annotate 0 show annotate set annotate 1 show annotate set args "abc" show args set flush on show flush set flush off show flush set fntrace on show fntrace set fntrace off show fntrace set listsize 10 show listsize set width 60 show width show history save set history size 100 show history size set deftrace off show deftrace set deftrace on show deftrace quit pydb-1.26/test/filebug.py0000664000175000017500000000032510366574214012301 00000000000000#!/usr/bin/python import os # Make sure __file__ is defined # http://groups.google.com/group/comp.lang.python/browse_frm/thread/cf2a718a50f9bb52/fb754e84298513db print "__file__: %s" % os.path.basename(__file__) pydb-1.26/test/test-complete.py.in0000644000175000017500000000376211167745261014066 00000000000000#!@PYTHON@ -t # $Id: test-complete.py.in,v 1.4 2009/02/09 09:28:39 rockyb Exp $ -*- Python -*- import os, sys, unittest try: import readline except ImportError: print "Completion test skipped - no readline" sys.exit(0) top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from complete import list_completions, all_completions class TestComplete(unittest.TestCase): def test_list_completions(self): c=[]; seen={} l=["a", "an", "another", "also", "boy"] self.assertEqual(list_completions(l, "a", seen, c), ['a', 'an', 'another', 'also']) self.assertEqual(list_completions(l, "b", seen, c), ['a', 'an', 'another', 'also', 'boy']) c=[]; seen={} self.assertEqual(list_completions(l, "a", seen, c, "foo "), ['foo a', 'foo an', 'foo another', 'foo also']) c=[]; seen={} self.assertEqual(list_completions(l, "an", seen, c), ['an', 'another']) c=[]; seen={} self.assertEqual(list_completions(l, "b", seen, c), ['boy']) c=[]; seen={} self.assertEqual(list_completions(l, "be", seen, c), []) return def test_all_completions(self): import pydb dbg = pydb.Pdb() dbg.curframe = None self.assertEqual( all_completions(dbg, "s"), ['s', 'save', 'set', 'shell', 'show', 'signal', 'skip', 'source', 'step']) self.assertEqual( all_completions(dbg, "set l"), ['set linetrace', 'set listsize', 'set logging']) self.assertEqual( all_completions(dbg, "set l", False), ['linetrace', 'listsize', 'logging']) return if __name__ == '__main__': unittest.main() pydb-1.26/test/test-dbgcall.py.in0000755000175000017500000000470611125042055013631 00000000000000#!@PYTHON@ -t # $Id: test-dbgcall.py.in,v 1.3 2008/12/26 02:40:45 rockyb Exp $ -*- Python -*- "Unit test for Extended Python debugger's debugger() call" import difflib, os, sys, time, unittest from subprocess import * top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep class DbgCallTests(unittest.TestCase): def run_python(self, testname, pythonfile): global srcdir, builddir, pydir if sys.hexversion >= 0x02050000: rightfile = os.path.join(srcdir, 'data', "%s-2.5.right" % testname) else: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) pass outfile = 'dbgcall.out' cmd = '%s %s >%s' % ('@PYTHON@', pythonfile, outfile) os.system(cmd) # p = Popen(['@PYTHON@', pythonfile], stdout=PIPE) # output = p.communicate()[0] # if p.returncode != 0: # print output # print p.returncode # self.assertTrue(False, 'Could not run %s' % pythonfile) # return fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines[1:], tolines[1:], fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) else: for line in diff: print line, self.assertEqual(len(diff), 0) return ## Don't use assertTrue to be compatible with older version of ## unittest def test_debugger_call(self): """Test debugger with 'dbg_cmds', and 'continue'""" global srcdir testname = 'dbgcall' pythonfile = '%s%s.py' % (srcdir, testname,) self.run_python(testname, pythonfile) return if __name__ == "__main__": unittest.main() pydb-1.26/test/dbgcall.py0000755000175000017500000000172311125036527012252 00000000000000#!/usr/bin/python """Towers of Hanoi - testing calling debugger with continue and cmds""" import sys sys.path.insert(0, '..') import pydb pydb.debugger(dbg_cmds=['set basename on', 'set linetrace on', 'step 20']) def hanoi(n,a,b,c): if n-1 > 0: hanoi(n-1, a, c, b) print "Move disk %s to %s" % (a, b) if n-1 > 0: hanoi(n-1, c, b, a) if __name__=='__main__': i_args=len(sys.argv) if i_args != 1 and i_args != 2: print "*** Need number of disks or no parameter" sys.exit(1) n=3 sys.settrace(None) if i_args > 1: try: n = int(sys.argv[1]) except ValueError, msg: print "** Expecting an integer, got: %s" % repr(sys.argv[1]) sys.exit(2) pydb.debugger(status='continue', dbg_cmds=['p "continued"', 'step 2', 'c']) if n < 1 or n > 100: print "*** number of disks should be between 1 and 100" sys.exit(2) hanoi(n, "a", "b", "c") pydb-1.26/test/unit/0000777000175000017500000000000011167772526011361 500000000000000pydb-1.26/test/unit/checkline.py0000755000175000017500000000306411167754546013604 00000000000000#!/usr/bin/python -t # -*- Python -*- # $Id: checkline.py.in,v 1.2 2008/12/21 10:54:23 rockyb Exp $ "Unit test for checkline" import inspect, os, sys, unittest top_builddir = "../.." if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "../.." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import fns class CheckLine(unittest.TestCase): def errmsg(self, msg): self.errors.append(msg) return def test_basic(self): global top_srcdir self.curframe = inspect.currentframe() check_script = os.path.join(top_srcdir, 'test', 'data', 'checkline.py') for t in ( ( 1, True), ( 2, False), ( 3, False), # FIXME add 4 ( 5, False), ( 6, True), ( 7, False), ( 8, False), ( 9, True), (10, False), ): self.errors=[] result = fns.checkline(self, check_script, t[0]) if t[1]: self.assertEqual(t[0], result, "Should have worked") self.assertEqual(0, len(self.errors), "With no errors") else: self.assertNotEqual(t[0], result, "Should not have worked") self.assertEqual(1, len(self.errors), "and given an error") return if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/sighandler.py.in0000755000175000017500000000417011160144446014364 00000000000000#!@PYTHON@ -t 'Unit test for pydb.sighandler' import inspect, os, signal, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from sighandler import canonic_signame, lookup_signame, lookup_signum, YN class TestSigHandler(unittest.TestCase): def test_YN(self): for expect, b in (('Yes', True), ('No', False)): self.assertEqual(expect, YN(b)) pass return def test_canonic_signame(self): for expect, name_num in (('SIGTERM', '15'), ('SIGTERM', '-15'), ('SIGTERM', 'term'), ('SIGTERM', 'sigterm'), ('SIGTERM', 'TERM'), (None, '300'), (False, 'bogus')): self.assertEqual(expect, canonic_signame(name_num), 'name_num: %s' % name_num) pass pass def test_lookup_signame(self): for expect, num in (('SIGTERM', 15), ('SIGTERM', -15), (None, 300)): self.assertEqual(expect, lookup_signame(num)) pass return def test_lookup_signum(self): for expect, name in ((15, 'SIGTERM'), (15, 'TERM'), (15, 'term'), (None, 'nothere')): self.assertEqual(expect, lookup_signum(name)) pass return def test_lookup_signame_signum(self): for signum in range(signal.NSIG): signame = lookup_signame(signum) if signame is not None: self.assertEqual(signum, lookup_signum(signame)) # Try without the SIG prefix self.assertEqual(signum, lookup_signum(signame[3:])) pass pass return pass if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/bytecode.py.in0000755000175000017500000000207711160144446014046 00000000000000#!@PYTHON@ -t 'Unit test for pydb.bytecode' import inspect, os, sys, unittest top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from bytecode import op_at_frame, stmt_contains_make_function, is_def_stmt class TestByteCode(unittest.TestCase): def test_contains_make_function(self): def sqr(x): return x * x frame = inspect.currentframe() co = frame.f_code lineno = frame.f_lineno self.assertTrue(stmt_contains_make_function(co, lineno-4)) self.assertFalse(stmt_contains_make_function(co, lineno)) return def test_op_at_frame(self): frame = inspect.currentframe() self.assertEqual('CALL_FUNCTION', op_at_frame(frame)) return def test_is_def_frame(self): # Not a "def" statement because frame is wrong spot frame = inspect.currentframe() self.assertFalse(is_def_stmt('foo(): pass', frame)) return if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/fns.py.in0000755000175000017500000000200511160013712013014 00000000000000#!/usr/bin/env python 'Unit test for pydb.fns' import os, sys, unittest top_builddir = "../.." if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "../.." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from fns import printf, print_argspec class TestFns(unittest.TestCase): def test_fns_printf(self): self.assertEqual('037', printf(31, "/o")) self.assertEqual('00011111', printf(31, "/t")) self.assertEqual('!', printf(33, "/c")) self.assertEqual('0x21', printf(33, "/x")) return def test_fns_argspec(self): self.assertEqual('test_fns_argspec(self)', print_argspec(self.test_fns_argspec, 'test_fns_argspec')) self.assertFalse(print_argspec(None, 'invalid_fn')) return pass if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/Makefile.am0000644000175000017500000000031111165434651013314 00000000000000TESTS = bytecode.py checkline.py listsize.py abs_srcdir=@abs_srcdir@ abs_builddir=@abs_builddir@ TESTS_ENVIRONMENT = \ srcdir="$(abs_srcdir)" \ builddir="$(abs_builddir)" EXTRA_DIST = $(TESTS) pydb-1.26/test/unit/pydbcmd.py.in0000755000175000017500000000112611165434467013676 00000000000000#!@PYTHON@ -t 'Unit test for pydb.pydbcmd' import os, sys, unittest top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from pydbcmd import Cmd class TestCmd(Cmd): def do_a(self): return def do_b(self): return def do_a(self): return pass class TestPydbCmd(unittest.TestCase): def test_get_cmd(self): test_cmd = TestCmd() self.assertEqual(['a', 'b', 'h', 'help'], test_cmd.get_cmds()) return pass if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/bytecode.py0000755000175000017500000000207711167754546013460 00000000000000#!/usr/bin/python -t 'Unit test for pydb.bytecode' import inspect, os, sys, unittest top_srcdir = "../.." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) from bytecode import op_at_frame, stmt_contains_make_function, is_def_stmt class TestByteCode(unittest.TestCase): def test_contains_make_function(self): def sqr(x): return x * x frame = inspect.currentframe() co = frame.f_code lineno = frame.f_lineno self.assertTrue(stmt_contains_make_function(co, lineno-4)) self.assertFalse(stmt_contains_make_function(co, lineno)) return def test_op_at_frame(self): frame = inspect.currentframe() self.assertEqual('CALL_FUNCTION', op_at_frame(frame)) return def test_is_def_frame(self): # Not a "def" statement because frame is wrong spot frame = inspect.currentframe() self.assertFalse(is_def_stmt('foo(): pass', frame)) return if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/checkline.py.in0000644000175000017500000000307511123420137014162 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: checkline.py.in,v 1.2 2008/12/21 10:54:23 rockyb Exp $ "Unit test for checkline" import inspect, os, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import fns class CheckLine(unittest.TestCase): def errmsg(self, msg): self.errors.append(msg) return def test_basic(self): global top_srcdir self.curframe = inspect.currentframe() check_script = os.path.join(top_srcdir, 'test', 'data', 'checkline.py') for t in ( ( 1, True), ( 2, False), ( 3, False), # FIXME add 4 ( 5, False), ( 6, True), ( 7, False), ( 8, False), ( 9, True), (10, False), ): self.errors=[] result = fns.checkline(self, check_script, t[0]) if t[1]: self.assertEqual(t[0], result, "Should have worked") self.assertEqual(0, len(self.errors), "With no errors") else: self.assertNotEqual(t[0], result, "Should not have worked") self.assertEqual(1, len(self.errors), "and given an error") return if __name__ == '__main__': unittest.main() pydb-1.26/test/unit/listsize.py0000755000175000017500000000345111167754546013525 00000000000000#!/usr/bin/python -t "Unit test for Extended Python debugger listsize " import unittest, sys, os top_srcdir = "../.." if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb class PdbTest(pydb.Pdb): def __init__(self): pydb.Pdb.__init__(self) self.errLines = [] self.msgLines = [] self.msg_last_nocr = False def errmsg(self, msg): self.errLines.append(msg) def msg(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = False def msg_nocr(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = True class PdbListsize(unittest.TestCase): def test_listsize(self): """Test getting list command""" pydb = PdbTest() pydb.noninteractive = True # Run show listsize pydb.msgLines=[]; pydb.errLines=[]; pydb.do_show("listsize") self.assertTrue(len(pydb.errLines)==0 and len(pydb.msgLines)!=0, "'show listsize' command") # An invalid listsize command pydb.msgLines=[]; pydb.errLines=[]; pydb.do_set("listsize foo") self.assertTrue(len(pydb.errLines)!=0 and len(pydb.msgLines)==0, "Noninteger arg in 'set listsize'") pydb.msgLines=[]; pydb.errLines=[]; pydb.do_set("listsize 20") self.assertEqual(pydb.listsize, 20) self.assertTrue(len(pydb.errLines)==0, "No error in 'set listsize'") pydb.msgLines=[]; pydb.errLines=[]; if __name__ == "__main__": unittest.main() pydb-1.26/test/unit/listsize.py.in0000755000175000017500000000345111110053411014075 00000000000000#!@PYTHON@ -t "Unit test for Extended Python debugger listsize " import unittest, sys, os top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb class PdbTest(pydb.Pdb): def __init__(self): pydb.Pdb.__init__(self) self.errLines = [] self.msgLines = [] self.msg_last_nocr = False def errmsg(self, msg): self.errLines.append(msg) def msg(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = False def msg_nocr(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = True class PdbListsize(unittest.TestCase): def test_listsize(self): """Test getting list command""" pydb = PdbTest() pydb.noninteractive = True # Run show listsize pydb.msgLines=[]; pydb.errLines=[]; pydb.do_show("listsize") self.assertTrue(len(pydb.errLines)==0 and len(pydb.msgLines)!=0, "'show listsize' command") # An invalid listsize command pydb.msgLines=[]; pydb.errLines=[]; pydb.do_set("listsize foo") self.assertTrue(len(pydb.errLines)!=0 and len(pydb.msgLines)==0, "Noninteger arg in 'set listsize'") pydb.msgLines=[]; pydb.errLines=[]; pydb.do_set("listsize 20") self.assertEqual(pydb.listsize, 20) self.assertTrue(len(pydb.errLines)==0, "No error in 'set listsize'") pydb.msgLines=[]; pydb.errLines=[]; if __name__ == "__main__": unittest.main() pydb-1.26/test/unit/Makefile.in0000644000175000017500000002636411167754542013353 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = test/unit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/bytecode.py.in $(srcdir)/checkline.py.in \ $(srcdir)/fns.py.in $(srcdir)/listsize.py.in \ $(srcdir)/pydbcmd.py.in $(srcdir)/sighandler.py.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = bytecode.py checkline.py fns.py listsize.py \ pydbcmd.py sighandler.py SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CVS2CL = @CVS2CL@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIN_VERSION = @MIN_VERSION@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ READLINE = @READLINE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = bytecode.py checkline.py listsize.py TESTS_ENVIRONMENT = \ srcdir="$(abs_srcdir)" \ builddir="$(abs_builddir)" EXTRA_DIST = $(TESTS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/unit/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test/unit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh bytecode.py: $(top_builddir)/config.status $(srcdir)/bytecode.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ checkline.py: $(top_builddir)/config.status $(srcdir)/checkline.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ fns.py: $(top_builddir)/config.status $(srcdir)/fns.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ listsize.py: $(top_builddir)/config.status $(srcdir)/listsize.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pydbcmd.py: $(top_builddir)/config.status $(srcdir)/pydbcmd.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ sighandler.py: $(top_builddir)/config.status $(srcdir)/sighandler.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ distclean distclean-generic distdir dvi dvi-am html html-am \ info info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pydb-1.26/test/.pydbrc0000644000175000017500000000004111167754545011576 00000000000000alias myc tbreak %1 ;; continue pydb-1.26/test/cmdparse.cmd0000644000175000017500000000532511167745261012602 00000000000000# $Id: cmdparse.cmd,v 1.21 2009/03/18 10:15:23 rockyb Exp $ # This tests the functioning of some debugger command a # parsing and set/show processing set basename on set trace-commands on ### ******************************* ### *** Set/show commands *** ### ******************************* ######################################## ### test args and baseneme... ######################################## set args this is a test show args show basename set basename foo show base set basename off show basename set basename 0 show basename set basename 1 show basename ######################################## ### test listsize tests... ######################################## show listsize set listsize 10+10 show listsi set listsize abc set listsize -20 set listsize 20 forever ######################################## ### test linetrace... ######################################## set linetrace delay set linetrace delay 2 show linetrace delay set linetrace delay 0.5 show linetrace delay set linetrace delay foo show linetrace delay set linetrace on show linetrace set linetrace off show linetrace show maxargsize ######################################## ### bad enable disable ######################################## enable 10 disable 10 enable foo disable foo ######################################## ### test list ######################################## list list list - list 10 15 list 10 3 list hanoi.py:12 list hanoi list hanoi 10 list gcd.py:24 list . # first and last file names are different list gcd.py:24 hanoi.py:10 # File doesn't have 50 lines list 50 set listsi 6 list 5 # Invalid list command - need lineno or fn name list hanoi.py ######################################## ### test prompt, misc... ######################################## show prompt show foo cd ######################################## ### test numeric argument syntax ######################################## up fdsafdsa u='foo' down 1 b c frame foo step -1 next -1 ######################################## ### test info ######################################## info line info source ######################################## ### help/info stuff ######################################## help nogood help restart help run help set help set linesize help set listsize help show help show listsize help info ####################################### # The below "help info" lines should # have '.' append to the end whereas # in the above listing they were # omitted. ####################################### help info program help info source ####################################### # The below "help show" commands have # more than one line of output also # ommited in a simple "show" ####################################### help show args help show commands quit pydb-1.26/test/file.cmd.in0000644000175000017500000000026410564322076012320 00000000000000# # Test of the 'file' command # $Id: file.cmd.in,v 1.1 2007/02/13 11:42:54 rockyb Exp $ # set trace-commands on cd @srcdir@ file hanoi.py info line where 2 step 1+1 where 2 quit pydb-1.26/test/brkpt2.cmd0000644000175000017500000000303711117056317012176 00000000000000# # Test of breakpoint handling # $Id: brkpt2.cmd,v 1.10 2008/11/24 21:24:28 rockyb Exp $ # set basename on set trace-commands on ############################################################### ### Clear nonexist break; ############################################################### clear ############################################################### ### Multiple breakpoints on a line and clearing all ############################################################### break 28 break gcd.py:28 info break clear 28 ############################################################### ### Clear by current line number ############################################################### break 28 continue clear info break ############################################################### ### Test Delete: invalid/valid number. ############################################################### delete 1 break 11 info break delete 4 tbreak 31 continue info break ############################################################### ### Test Continue with a line number ############################################################### c 35 info break where 2 ############################################################### ### Test frame command ############################################################### frame frame abs(-1*2) frame -3 frame -2 frame 0 ############################################################### ### Test ignore ############################################################### ignore 0 1 ignore 4 -1 ## FIXME: need a real ignore test, not just invalid cases quit pydb-1.26/test/pm.cmd0000644000175000017500000000044411117202143011373 00000000000000# Test of restart and linetracing # $Id: pm.cmd,v 1.5 2008/12/08 11:26:27 rockyb Exp $ # set trace-commands on set interactive off set basename on show args info args list # Completion might not be available if no readline # complete s # complete help s where step next finish return quit pydb-1.26/test/comm2.cmd0000664000175000017500000000005110435727174012012 00000000000000commands 2 print "breakpoint 2 test" end pydb-1.26/test/file-2.5.right.in0000644000175000017500000000051010564315227013166 00000000000000+cd @srcdir@ +file hanoi.py +info line Line 2 of "hanoi.py" at instruction 0 +where 2 -> 0 () called from file 'hanoi.py' at line 2 ## 1 () called from file '' at line 1 +step 1+1 +where 2 -> 0 () called from file 'hanoi.py' at line 12 ## 1 () called from file '' at line 1 +quit pydb-1.26/test/skip.cmd0000644000175000017500000000036111143773507011743 00000000000000# # Test of the 'step' and deftrace command # $Id: skip.cmd,v 1.1 2009/02/09 09:28:39 rockyb Exp $ # set basename on set trace-commands on set deftrace off set linetrace on set listsize 1 skip list p sys skip foo skip 2 c 38 skip list quit pydb-1.26/test/save.cmd0000644000175000017500000000077211033115173011724 00000000000000# $Id: save.cmd,v 1.3 2008/07/03 09:23:07 rockyb Exp $ # Test of running "save" command # set basename on set autoeval on set trace-commands on save foo bar save foo bar baz save break ./savefile.txt p len(open('./savefile.txt').readlines()) source ./savefile.txt break 17 save break ./savefile.txt source ./savefile.txt p open('./savefile.txt').readlines() save settings ./savefile.txt source -v ./savefile.txt p len(open('./savefile.txt').readlines()) save all ./savefile.txt source ./savefile.txt quit pydb-1.26/test/comm1.cmd0000664000175000017500000000003210435726056012006 00000000000000commands print "test" end pydb-1.26/test/test-setshow.py.in0000755000175000017500000000546111117742256013747 00000000000000#!@PYTHON@ -t # $Id: test-setshow.py.in,v 1.5 2008/12/10 13:31:26 rockyb Exp $ -*- Python -*- "Unit test of the file command for Extended Python debugger " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', rightfile=None): global srcdir, builddir, pydir if rightfile is None: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmdfile = os.path.join(srcdir, "%s.cmd" % testname) outfile = "%s.out" % testname outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) cmd = "%s --command %s %s %s %s %s" % \ (pydb_path, cmdfile, outfile_opt, pydb_opts, args, pythonfile) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) # fromlines = open(fromfile, 'U').readlines()[0:-1] fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) # tolines = open(tofile, 'U').readlines()[0:-1] tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_setshow(self): """Test running program via the 'file' command""" try: import readline rightfile = os.path.join(srcdir, 'data', "setshow.right") except ImportError: rightfile = os.path.join(srcdir, 'data', "setshow-no-rl.right") result=run_debugger(testname='setshow', pythonfile='', pydb_opts='--basename', rightfile=rightfile) self.assertEqual(True, result, "pydb 'set/show' command comparision") return if __name__ == "__main__": unittest.main() pydb-1.26/test/test-contbug.py.in0000644000175000017500000000436611117066431013706 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-contbug.py.in,v 1.3 2008/12/08 00:40:57 rockyb Exp $ "Unit test for Extended Python debugger's runl and runv commands " import difflib, os, sys, unittest, signal, time top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def diff_files(outfile, rightfile): fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class RunTests(unittest.TestCase): def test_continue_bug(self): """Test --exec and a bug whith 'c lineno' when given initially.""" python_script = '%shanoi.py' % srcdir if sys.hexversion >= 0x02050000: rightfile = os.path.join(srcdir, 'data', "contbug-2.5.right") else: rightfile = os.path.join(srcdir, 'data', "contbug.right") outfile = 'contbug.out' if os.path.exists(outfile): os.unlink(outfile) args = ('--basename', '--nx', '--output', outfile, '--exec', "set linetrace off;; set trace-commands on;; c 12;; quit", python_script) pydb.runv(args) result = diff_files(outfile, rightfile) self.assertEqual(True, result, "continue bug (via runv)") if __name__ == '__main__': unittest.main() pydb-1.26/test/.pydbrc.in0000644000175000017500000000004110566633000012163 00000000000000alias myc tbreak %1 ;; continue pydb-1.26/test/withbug.cmd0000644000175000017500000000026710712235156012445 00000000000000# Test of running "info local" inside a "with" statement # $Id: withbug.cmd,v 1.1 2007/11/01 02:31:10 rockyb Exp $ # set basename on set trace-commands on continue 17 info local quit pydb-1.26/test/except.py.in0000644000175000017500000000153710556177515012571 00000000000000#!@PYTHON@ -t # $Id: except.py.in,v 1.4 2007/01/25 19:04:45 rockyb Exp $ """Test to see if handles an exception when an error is raised.""" import os, sys top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) print __doc__ import pydb pydb.debugger() # we go into the debugger print "Returning from the debugger" # Set a variable so we can show the state is # somewhere after the above set_trace() z='After set_trace' try: # The below statement should not enter the debugger x=2/0 except: pass # We should enter the debugger on the next statement. y=1/0 # Bullwinkle: This time, for sure! pass pydb-1.26/test/test-help.py.in0000755000175000017500000000522611117066431013174 00000000000000#!@PYTHON@ -t # $Id: test-help.py.in,v 1.3 2008/12/08 00:40:57 rockyb Exp $ "Unit test of getting help options " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', outfile=None, need_25=True): global srcdir, builddir, pydir if sys.hexversion >= 0x02050000 and need_25: rightfile = os.path.join(srcdir, 'data', "%s-2.5.right" % testname) else: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) outfile_opt = '' if outfile is None: outfile = os.path.join(builddir, "%s.out" % testname) if os.path.exists(outfile): os.unlink(outfile) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) os.environ['COLUMNS']='80' cmd = "%s %s %s %s >%s" % \ (pydb_path, pydb_opts, pythonfile, args, outfile) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines()[0:-2] tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines()[0:-2] # Curse you getopts! I'm so ashamed. tolines[0] = fromlines[0].lower() # Usage -> usage tolines[4] = fromlines[4].lower() # Options -> options diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_help(self): """Test getting help: --help and -h options""" for trace_opt in ['--help', '-h']: result=run_debugger(testname='help', pydb_opts='%s --help' % trace_opt, pythonfile='', need_25 = False) self.assertEqual(True, result, "help listing output comparision" ) if __name__ == "__main__": unittest.main() pydb-1.26/test/test-trace.py.in0000644000175000017500000001016311117066431013333 00000000000000#!@PYTHON@ -t # $Id: test-trace.py.in,v 1.4 2008/12/08 00:40:57 rockyb Exp $ -*- Python -*- "Unit test of program execution tracing using the Extended Python debugger " import difflib, os, time, sys, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def run_debugger(testname, pythonfile, pydb_opts='', args='', outfile=None, need_25=True): global srcdir, builddir, pydir if sys.hexversion >= 0x02050000 and need_25: rightfile = os.path.join(srcdir, 'data', "%s-2.5.right" % testname) elif (sys.version_info[0:2] == (2, 4) and sys.version_info[3] == 'final' and need_25): rightfile = os.path.join(srcdir, 'data', "%s-2.4-final.right" % testname) else: rightfile = os.path.join(srcdir, 'data', "%s.right" % testname) outfile_opt = '' if outfile is None: outfile = os.path.join(builddir, "%s.out" % testname) outfile_opt = '--output=%s ' % outfile # print "builddir: %s, cmdfile: %s, outfile: %s, rightfile: %s" % \ # (builddir, cmdfile, outfile, rightfile) if os.path.exists(outfile): os.unlink(outfile) os.environ['PYTHONPATH']=os.pathsep.join(sys.path) cmd = "%s %s %s %s %s" % \ (pydb_path, outfile_opt, pydb_opts, pythonfile, args) os.system(cmd) fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines()[0:-2] tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines()[0:-2] diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class PdbTests(unittest.TestCase): def test_linetrace(self): """Test running program tracing: --trace and -X options""" for trace_opt in ['--trace', '-X']: result=run_debugger(testname='trace', pydb_opts='%s --basename' % trace_opt, pythonfile='%shanoi.py' % srcdir) self.assertEqual(True, result, "hanoi line trace (%s) output comparision" % trace_opt) def test_fntrace(self): """Test running program tracing: --fntrace and -X options""" for trace_opt in ['--fntrace', '-F']: result=run_debugger(testname='fntrace', pydb_opts='%s --basename' % trace_opt, pythonfile='%sgcd.py' % srcdir, args='4 6', need_25 = False) self.assertEqual(True, result, "gcd function trace (%s) output comparision" % trace_opt) def test_trace_compiled(self): """Test running program tracing: --trace option after compiling""" opt_file = "%shanoi.pyc" % srcdir if os.path.exists(opt_file): os.unlink(opt_file) import py_compile py_compile.compile("%shanoi.py" % srcdir) if os.path.exists(opt_file): result=run_debugger(testname='trace', pydb_opts='--trace --basename', pythonfile=opt_file) self.assertEqual(True, result, "compiled hanoi trace output comparision") if __name__ == "__main__": unittest.main() pydb-1.26/test/test-sighandle.py.in0000644000175000017500000000546311167745261014214 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-sighandle.py.in,v 1.2 2009/03/06 08:51:46 rockyb Exp $ "Unit test for Extended Python debugger's signal handling commands " import os, time, sys, unittest, signal top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb, sighandler builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) outfile = 'sighandler.out' program = 'sigtestexample.py' class PdbTest(pydb.Pdb): def __init__(self): pydb.Pdb.__init__(self) self.errLines = [] self.msgLines = [] self.msg_last_nocr = False self.stack = self.curframe = self.botframe = None def resetmsg(self): self.msgLines=[] def errmsg(self, msg): self.errLines.append(msg) def msg(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = False def msg_nocr(self, msg): if self.msg_last_nocr: self.msgLines[-1] += msg else: self.msgLines.append(msg) self.msg_last_nocr = True class SigTests(unittest.TestCase): def test_settings(self): """Test setting signals""" p = PdbTest() h = sighandler.SignalManager(p) # Set to known value h.action('SIGUSR1 print pass') h.info_signal(['USR1']) correct = ["Signal Stop Print Stack Pass Description", "SIGUSR1 No Yes Yes No User-defined signal 1"] self.assertEqual(p.msgLines, correct) p.resetmsg() # noprint implies no stop h.action('SIGUSR1 noprint stack pass') h.info_signal(['USR1']) correct = ["Signal Stop Print Stack Pass Description", "SIGUSR1 No No Yes Yes User-defined signal 1"] self.assertEqual(p.msgLines, correct) # stop keyword implies print and nopass p.resetmsg() h.action('SIGUSR1 stop') h.info_signal(['USR1']) correct = ["Signal Stop Print Stack Pass Description", "SIGUSR1 Yes Yes No Yes User-defined signal 1"] self.assertEqual(p.msgLines, correct) if __name__ == '__main__': unittest.main() pydb-1.26/test/data/0000777000175000017500000000000011167772526011313 500000000000000pydb-1.26/test/data/tracetest-2.5.right0000644000175000017500000000555311131733276014564 00000000000000(/src/external-cvs/pydb/test/settrace.py:51): 51 hanoi(n, "a", "b", "c") -> 0 file 'settrace.py' at line 51 46 'continue'] 47 48 import pydb 49 pydb.debugger(dbg_cmds) 50 51 -> hanoi(n, "a", "b", "c") [EOF] --Call level -5 (settrace.py:14): hanoi 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi 15 if n-1 > 0: -> 0 hanoi(n=3, a='a', b='b', c='c') called from file 'settrace.py' at line 15 ## 1 file 'settrace.py' at line 51 a = 'a' c = 'c' b = 'b' n = 3 (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -4 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to c (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk b to c (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -4 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk c to a (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk c to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:51): + 51 hanoi(n, "a", "b", "c") pydb-1.26/test/data/noscript.right0000644000175000017500000000124111167745261014121 00000000000000No stack. No stack. No stack. No frame selected. No frame selected. No stack. No stack. No stack. No breakpoints. No breakpoints. There are no auto-display expressions now. There are no auto-display expressions now. No frame selected. No frame selected. No line number information available. No line number information available. No frame selected. No frame selected. The program being debugged is not being run. The program being debugged is not being run. No current source file. No current source file. *** The program being debugged is not being run. No Python program loaded. *** No Python program registered. *** Perhaps you want to use the 'file' command? No stack. pydb-1.26/test/data/checkline.py0000644000175000017500000000024411110051755013504 00000000000000def foo(): """Exception to raise to quit debugging. FIXME: we allow stopping here but we shouldn't """ return # Should not allow stopping here print "hi" pydb-1.26/test/data/contbug.right0000644000175000017500000000024211110340277013703 00000000000000(hanoi.py:2): 2 """Towers of Hanoi""" + c 12 Breakpoint 1 set in file hanoi.py, line 12. Deleted breakpoint 1 (hanoi.py:12): 12 if __name__=='__main__': + quit pydb-1.26/test/data/setshow-no-rl.right0000644000175000017500000000063711117201237014772 00000000000000basename is on. Annotation level is 0. Annotation level is 1. Argument list to give program being debugged when it is started is ""abc"". Flushing output is "on". Flushing output is "off". Function tracing is on. Function tracing is off. Number of source lines pydb will list by default is 10. Number of lines to show in listing is 60. *** History is not available (no readline?). deftrace is off. deftrace is on. pydb-1.26/test/data/trace-2.5.right0000644000175000017500000000635711167745261013675 00000000000000(hanoi.py:2): + 2 """Towers of Hanoi""" (hanoi.py:3): + 3 import sys (hanoi.py:5): + 5 def hanoi(n,a,b,c): (hanoi.py:12): + 12 if __name__=='__main__': (hanoi.py:13): + 13 i_args=len(sys.argv) (hanoi.py:14): + 14 if i_args != 1 and i_args != 2: (hanoi.py:18): + 18 n=3 (hanoi.py:20): + 20 if i_args > 1: (hanoi.py:27): + 27 if n < 1 or n > 100: (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") --Call level 0 hanoi(n=3, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ----Call level 1 hanoi(n=2, a='a', b='c', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='b', b='c', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ----Call level 1 hanoi(n=2, a='c', b='b', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='c', b='a', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) --Return from level 0 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") (:1): + pydb-1.26/test/data/brkpt2-2.3.right0000644000175000017500000000467111117072725013767 00000000000000+############################################################### +### Clear nonexist break; +############################################################### +clear *** No breakpoint at gcd.py:10. +############################################################### +### Multiple breakpoints on a line and clearing all +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +break gcd.py:28 Breakpoint 2 set in file gcd.py, line 28. +info break Num Type Disp Enb Where 1 breakpoint keep y at gcd.py:28 2 breakpoint keep y at gcd.py:28 +clear 28 Deleted breakpoints 1 2 +############################################################### +### Clear by current line number +############################################################### +break 28 Breakpoint 3 set in file gcd.py, line 28. +continue +clear Deleted breakpoint 3 +info break No breakpoints. +############################################################### +### Test Delete: invalid/valid number. +############################################################### +delete 1 *** Breakpoint (1) already deleted +break 11 Breakpoint 4 set in file gcd.py, line 11. +info break Num Type Disp Enb Where 4 breakpoint keep y at gcd.py:11 +delete 4 Deleted breakpoint 4 +tbreak 31 Breakpoint 5 set in file gcd.py, line 31. +continue Deleted breakpoint 5 +info break No breakpoints. +############################################################### +### Test Continue with a line number +############################################################### +c 35 Breakpoint 6 set in file gcd.py, line 35. Deleted breakpoint 6 +info break No breakpoints. +where 2 -> 0 gcd(a=3, b=5) called from file 'gcd.py' at line 35 ## 1 in file 'gcd.py' at line 41 +############################################################### +### Test frame command +############################################################### +frame (gcd.py:35): gcd 35 return gcd(b-a, a) +frame abs(-1*2) (:1): +frame -3 (gcd.py:41): 41 print "The GCD of %d and %d is %d" % (a, b, gcd(a, b)) +frame -2 (:1): +frame 0 (gcd.py:35): gcd 35 return gcd(b-a, a) +############################################################### +### Test ignore +############################################################### +ignore 0 1 *** Expecting integer value to be at least 1, got: 0. +ignore 4 -1 +## FIXME: need a real ignore test, not just invalid cases +quit pydb-1.26/test/data/sighandler.right0000644000175000017500000000150311167745261014401 00000000000000Signal Stop Print Stack Pass Description SIGHUP Yes Yes No No Hangup Signal Stop Print Stack Pass Description SIGHUP Yes Yes No No Hangup Signal Stop Print Stack Pass Description SIGINT Yes Yes No No Interrupt Signal Stop Print Stack Pass Description SIGINT No No Yes No Interrupt Signal Stop Print Stack Pass Description SIGINT No Yes Yes No Interrupt Signal Stop Print Stack Pass Description SIGINT No No No No Interrupt Signal Stop Print Stack Pass Description SIGKILL No No No Yes Killed Signal Stop Print Stack Pass Description SIGSTOP No No No Yes Stopped (signal) Signal Stop Print Stack Pass Description SIGINT No No No No Interrupt pydb-1.26/test/data/save.right0000644000175000017500000000144711110340277013210 00000000000000+save foo bar *** Action has to be 'all', 'break' or 'settings; got 'foo'. +save foo bar baz *** Expecting 0-2 arguments, got 3. +save break ./savefile.txt Breakpoints saved to file ./savefile.txt +p len(open('./savefile.txt').readlines()) 1 +source ./savefile.txt +break 17 Breakpoint 1 set in file gcd.py, line 17. +save break ./savefile.txt Breakpoints saved to file ./savefile.txt +source ./savefile.txt +p open('./savefile.txt').readlines() ['break gcd.py:17\n'] +save settings ./savefile.txt Settings saved to file ./savefile.txt +source -v ./savefile.txt +p len(open('./savefile.txt').readlines()) +p len(open('./savefile.txt').readlines()) 12 +save all ./savefile.txt +save all ./savefile.txt Settings and breakpoints saved to file ./savefile.txt +source ./savefile.txt +source ./savefile.txt +quit pydb-1.26/test/data/cmdparse.right0000644000175000017500000003127511167745261014070 00000000000000+### ******************************* +### *** Set/show commands *** +### ******************************* +######################################## +### test args and baseneme... +######################################## +set args this is a test +show args Argument list to give program being debugged when it is started is "this is a test". +show basename basename is on. +set basename foo *** Expecting 'on', 1, 'off', or 0. Got: foo. +show base basename is on. +set basename off +show basename basename is off. +set basename 0 +show basename basename is off. +set basename 1 +show basename basename is on. +######################################## +### test listsize tests... +######################################## +show listsize Number of source lines pydb will list by default is 10. +set listsize 10+10 +show listsi Number of source lines pydb will list by default is 20. +set listsize abc *** Expecting an integer, got: abc. +set listsize -20 +set listsize 20 forever +######################################## +### test linetrace... +######################################## +set linetrace delay *** Need a floating-point number (the 4th parameter) +set linetrace delay 2 +show linetrace delay line trace delay is 2.0. (In seconds) +set linetrace delay 0.5 +show linetrace delay line trace delay is 0.5. (In seconds) +set linetrace delay foo *** 4th argument foo is not a floating-point number +show linetrace delay line trace delay is 0.5. (In seconds) +set linetrace on +show linetrace line tracing is on. +set linetrace off +show linetrace line tracing is off. +show maxargsize Maximum number of characters in an argument list is 100 +######################################## +### bad enable disable +######################################## +enable 10 *** No breakpoint numbered 10. +disable 10 No breakpoint numbered 10. +enable foo *** Breakpoint index 'foo' is not a number +disable foo Breakpoint index 'foo' is not a number. +######################################## +### test list +######################################## +list 1 #!/usr/bin/python 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" 16 sys.exit(1) 17 18 n=3 19 20 if i_args > 1: +list 21 try: 22 n = int(sys.argv[1]) 23 except ValueError, msg: 24 print "** Expecting an integer, got: %s" % repr(sys.argv[1]) 25 sys.exit(2) 26 27 if n < 1 or n > 100: 28 print "*** number of disks should be between 1 and 100" 29 sys.exit(2) 30 31 hanoi(n, "a", "b", "c") [EOF] +list - 1 #!/usr/bin/python 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" 16 sys.exit(1) 17 18 n=3 19 20 if i_args > 1: +list 10 15 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" +list 10 3 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) +list hanoi.py:12 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" 16 sys.exit(1) 17 18 n=3 19 20 if i_args > 1: 21 try: +list hanoi 1 #!/usr/bin/python 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" 16 sys.exit(1) 17 18 n=3 19 20 if i_args > 1: +list hanoi 10 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) +list gcd.py:24 14 if len(sys.argv) != 3: 15 # Rather than use sys.exit let's just raise an error 16 raise Exception, "Need to give two numbers" 17 for i in range(2): 18 try: 19 sys.argv[i+1] = int(sys.argv[i+1]) 20 except ValueError: 21 print "** Expecting an integer, got: %s" % repr(sys.argv[i]) 22 sys.exit(2) 23 24 def gcd(a,b): 25 """ GCD. We assume positive numbers""" 26 27 # Make: a <= b 28 if a > b: 29 (a, b) = (b, a) 30 31 if a <= 0: 32 return None 33 if a == 1 or b-a == 0: +list . 1 #!/usr/bin/python 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) 11 12 if __name__=='__main__': 13 i_args=len(sys.argv) 14 if i_args != 1 and i_args != 2: 15 print "*** Need number of disks or no parameter" 16 sys.exit(1) 17 18 n=3 19 20 if i_args > 1: +# first and last file names are different +list gcd.py:24 hanoi.py:10 *** filename in the range must be the same +# File doesn't have 50 lines +list 50 [EOF] +set listsi 6 +list 5 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) +# Invalid list command - need lineno or fn name +list hanoi.py *** The specified object 'hanoi.py' is not a function, or not found along sys.path or no line given. +######################################## +### test prompt, misc... +######################################## +show prompt pydb's prompt is "(Pydb) ". +show foo *** Undefined show command "foo". +cd *** Argument required (new working directory). +######################################## +### test numeric argument syntax +######################################## +up fdsafdsa *** up command: Expecting an integer, got: fdsafdsa. +u='foo' +down 1 b c *** down command: Expecting an integer, got: 1 b c. +frame foo *** The 'frame' command requires a frame number. Got: foo +step -1 *** step command: Expecting a positive integer at least 0, got: -1. +next -1 *** next command: Expecting a positive integer at least 0, got: -1. +######################################## +### test info +######################################## +info line Line 2 of "hanoi.py" at instruction 0 +info source Current Python file is hanoi.py +######################################## +### help/info stuff +######################################## +help nogood Undefined command or invalid expression "nogood". Type "help" for a list of debugger commands. +help restart restart - Restart debugger and program via an exec call. All state is lost, and new copy of the debugger is used. +help run run [args...] Run or "soft" restart the debugged Python program. If a string is supplied, it is splitted with "shlex" but preserving embedded quotes. The result is used as the new sys.argv. History, breakpoints, actions and debugger options are preserved. R is a alias for 'run'. See also 'restart' for an exec-like restart. +help set This command modifies parts of the debugger environment. You can see these environment settings with the 'show' command. List of set subcommands: set annotate -- Set annotation level set args -- Set argument list to give program being debugged when it is started set autoeval -- Evaluate every unrecognized command set basename -- Set short filenames (the basename) in debug output set debug-pydb -- Set whether we allow tracing the debugger set deftrace -- Set stop before 'def' (method creation) statements set flush -- Set whether we flush output after each write set fntrace -- Set function execution tracing set history -- Generic command for setting command history parameters set interactive -- Set whether we are interactive set linetrace -- Set line execution tracing and delay on tracing set listsize -- Set number of source lines the debugger will list by default set logging -- Set logging options" set maxargsize -- Set maximum size to use in showing argument parameters set prompt -- Set debugger's prompt set sigcheck -- Set signal handler checking/adjusting set trace-commands -- Set echoing lines read from debugger command files set warnoptions -- Set the Python warning options that when a program is started or restarted. set width -- Set number of characters the debugger thinks are in a line +help set linesize *** Unknown 'help set' subcommand linesize +help set listsize Set number of source lines the debugger will list by default. +help show Generic command for showing things about the debugger. List of show subcommands: show annotate -- Show annotation_level show args -- Show argument list to give debugged program when it is started show autoeval -- Show if unrecognized command are evaluated show basename -- Show if we are to show short of long filenames show commands -- Show the history of commands you typed show debug-pydb -- Show whether tracebacks include debugger routines show deftrace -- Show if we are to show def (method creation) statements show directories -- Current search path for finding source files show flush -- Show whether we flush output after each write show fntrace -- Show the line function status. Can also add 'delay' show history -- Generic command for showing command history parameters show interactive -- Show whether we are interactive show linetrace -- Show the line tracing status. Can also add 'delay' show listsize -- Show number of source lines the debugger will list by default show logging -- Show logging options show maxargsize -- Show number maximum number of characters in argument list show prompt -- Show debugger's prompt show sigcheck -- Show status of signal checking/adjusting show trace-commands -- Show if we are to show debugger commands before running show version -- Show what version of the debugger this is show warnoptions -- Show Python warning options to be used in running programs show width -- Show number of characters gdb thinks are in a line +help show listsize Show number of source lines the debugger will list by default +help info Generic command for showing things about the program being debugged. List of info subcommands: info args -- Argument variables of current stack frame info breakpoints -- Status of user-settable breakpoints info display -- Expressions to display when program stops, with code numbers info globals -- Global variables of current stack frame info handle -- Print information about a signal info line -- Current line number in source file info locals -- Local variables of current stack frame info program -- Execution status of the program info signal -- Print information about a signal info source -- Information about the current Python file info threads -- List all currently-known thread names +####################################### +# The below "help info" lines should +# have '.' append to the end whereas +# in the above listing they were +# omitted. +####################################### +help info program Execution status of the program. +help info source Information about the current Python file. +####################################### +# The below "help show" commands have +# more than one line of output also +# ommited in a simple "show" +####################################### +help show args Show argument list to give debugged program when it is started. Follow this command with any number of args, to be passed to the program. +help show commands Show the history of commands you typed. You can supply a command number to start with, or a `+' to start after the previous command number shown. A negative number starts from the end. +quit pydb-1.26/test/data/dbgcall-2.5.right0000644000175000017500000000556011125036606014150 00000000000000(/src/external-vcs/pydb/test/dbgcall.py:17): 17 if __name__=='__main__': (dbgcall.py:18): + 18 i_args=len(sys.argv) (dbgcall.py:19): + 19 if i_args != 1 and i_args != 2: (dbgcall.py:23): + 23 n=3 (dbgcall.py:24): + 24 sys.settrace(None) (dbgcall.py:34): + 34 if n < 1 or n > 100: (dbgcall.py:38): + 38 hanoi(n, "a", "b", "c") --Call level -5 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -4 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to c (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk b to c (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) 'continued' Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -4 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk c to a (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk c to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:38): + 38 hanoi(n, "a", "b", "c") pydb-1.26/test/data/pydbrc.right0000644000175000017500000000012211110340277013522 00000000000000+# Test to see if ./.pydbrc gets loaded. +alias myc = tbreak %1 ;; continue +quit pydb-1.26/test/data/brkpt2.right0000644000175000017500000000474511167745261013500 00000000000000+############################################################### +### Clear nonexist break; +############################################################### +clear *** No breakpoint at gcd.py:10. +############################################################### +### Multiple breakpoints on a line and clearing all +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +break gcd.py:28 Breakpoint 2 set in file gcd.py, line 28. +info break Num Type Disp Enb Where 1 breakpoint keep y at gcd.py:28 2 breakpoint keep y at gcd.py:28 +clear 28 Deleted breakpoints 1 2 +############################################################### +### Clear by current line number +############################################################### +break 28 Breakpoint 3 set in file gcd.py, line 28. +continue +clear Deleted breakpoint 3 +info break No breakpoints. +############################################################### +### Test Delete: invalid/valid number. +############################################################### +delete 1 *** Breakpoint (1) already deleted +break 11 Breakpoint 4 set in file gcd.py, line 11. +info break Num Type Disp Enb Where 4 breakpoint keep y at gcd.py:11 +delete 4 Deleted breakpoint 4 +tbreak 31 Breakpoint 5 set in file gcd.py, line 31. +continue Deleted breakpoint 5 +info break No breakpoints. +############################################################### +### Test Continue with a line number +############################################################### +c 35 Breakpoint 6 set in file gcd.py, line 35. Deleted breakpoint 6 +info break No breakpoints. +where 2 -> 0 gcd(a=3, b=5) called from file 'gcd.py' at line 35 ## 1 execfile() file 'gcd.py' at line 41 +############################################################### +### Test frame command +############################################################### +frame (gcd.py:35): gcd 35 return gcd(b-a, a) +frame abs(-1*2) (:1): +frame -3 (gcd.py:41): 41 print "The GCD of %d and %d is %d" % (a, b, gcd(a, b)) +frame -2 (:1): +frame 0 (gcd.py:35): gcd 35 return gcd(b-a, a) +############################################################### +### Test ignore +############################################################### +ignore 0 1 *** Expecting integer value to be at least 1, got: 0. +ignore 4 -1 +## FIXME: need a real ignore test, not just invalid cases +quit pydb-1.26/test/data/help.right0000644000175000017500000000300411110340277013171 00000000000000usage: pydb.py [debugger-options] [python-script [script-options...]] Runs the extended python debugger options: --version show program's version number and exit -h, --help show this help message and exit -X, --trace Show lines before executing them. This option also sets --batch -F, --fntrace Show functions before executing them. This option also sets --batch --batch Don't run interactive commands shell on stops. --basename Filenames strip off basename, (e.g. for regression tests) -x FILE, --command=FILE Execute commands from FILE. --cd=DIR Change current directory to DIR. --error=FILE Write debugger's error output (stderr) to FILE -e EXECUTE, --exec=EXECUTE list of debugger commands to execute. Separate the commands with ;; -n, --nx Don't execute commands found in any initialization files -o FILE, --output=FILE Write debugger's output (stdout) to FILE --sigcheck Set to watch for signal handler changes -t TARGET, --target=TARGET Specify a target to connect to. Arguments should be of form, 'protocol address'. -T, --threading Start off with threading debug support --annotate=ANNOTATE Use annotations (to work inside emacs) pydb-1.26/test/data/brkpt1.right0000644000175000017500000000560711110340277013457 00000000000000+############################################################### +# Test the breakpoint by line number +############################################################### +info break No breakpoints. +break 30 *** Blank, doc string, or comment +info break No breakpoints. +############################################################### +### Test enable/disable... +############################################################### +enable *** No breakpoint number given +enable 1 *** No breakpoint numbered 1. +info break No breakpoints. +enable foo *** Breakpoint index 'foo' is not a number +disable 1 No breakpoint numbered 1. +disable *** No breakpoint number given. +info break No breakpoints. +################################################################ +### Try setting breakpoints outside of the file range... +############################################################### +break 0 *** End of file +break 1 *** Blank, doc string, or comment +break 99 *** End of file +# +# list breakpoints +L No breakpoints. +############################################################### +### *** Test using file:line format on break... +############################################################### +break hanoi.py:22 Breakpoint 1 set in file hanoi.py, line 22. +break ./hanoi.py:22 Breakpoint 2 set in file hanoi.py, line 22. +break ./hanoi.py:0 *** End of file +break ./dbg-test1.sh:1955 *** './dbg-test1.sh' not found using sys.path +info break Num Type Disp Enb Where 1 breakpoint keep y at hanoi.py:22 2 breakpoint keep y at hanoi.py:22 +#### Try deleting breakpoints... +delete 10 *** No breakpoint numbered 10. +delete 1 Deleted breakpoint 1 +clear 22 *** No breakpoint at hanoi.py:22. +info break No breakpoints. +break 22 Breakpoint 3 set in file hanoi.py, line 22. +############################################################### +### *** Test breakpoints with conditions... +############################################################### +condition 1 x==0 +### FIXME: there is no condition 2! +### condition 2 y > 25 +condition 2+2 y > 25 *** No breakpoint numbered 4. +info break Num Type Disp Enb Where 3 breakpoint keep y at hanoi.py:22 +### FIXME: there still is no condition 2 +### condition 2 +condition 4 *** No breakpoint numbered 4. +info break Num Type Disp Enb Where 3 breakpoint keep y at hanoi.py:22 +condition x==1 *** condition command: Expecting a positive integer, got: x==1 +condition bad *** condition command: Expecting a positive integer, got: bad +condition 30 y==1 *** No breakpoint numbered 30. +condition 0 y==1 *** condition command: Expecting a positive integer at least 1, got: 0. +############################################################### +### *** Test breakpoints by function name +############################################################### +break hanoi Breakpoint 4 set in file hanoi.py, line 5. +clear hanoi Deleted breakpoint 4 +q pydb-1.26/test/data/Makefile.am0000644000175000017500000000221411167746432013257 00000000000000check_DATA = \ brkpt1.right \ brkpt1t.right \ brkpt2-2.3.right \ brkpt2.right \ brkpt3t.right \ brkpt3-2.5t.right \ brkpt3.right \ checkline.py \ cmdparse.right \ contbug-2.5.right \ contbug.right \ dbgcall.right \ dbgcall-2.5.right \ file.right \ file-2.5.right \ filebug.right \ fntrace.right \ help.right \ history.right \ logging.right \ noscript.right \ pm.right \ pydbrc.right \ run.right \ run2.right \ save.right \ setshow.right \ setshow-no-rl.right \ sighandler.right \ skip.right \ step.right \ trace-2.4-final.right \ trace-2.5.right \ trace.right \ tracetest-2.4-final.right \ tracetest-2.5.right \ tracetest.right \ withbug.right \ withbug-2.6.right EXTRA_DIST = $(check_DATA) pydb-1.26/test/data/fntrace.right0000644000175000017500000000071211110340277013666 00000000000000--Call level 0 check_args() (gcd.py:13): check_args + 13 def check_args(): --Return from level 0 () --Call level 0 gcd(a=4, b=6) (gcd.py:24): gcd + 24 def gcd(a,b): ----Call level 1 gcd(a=2, b=4) (gcd.py:24): gcd + 24 def gcd(a,b): ------Call level 2 gcd(a=2, b=2) (gcd.py:24): gcd + 24 def gcd(a,b): ------Return from level 2 => 2 () ----Return from level 1 => 2 () --Return from level 0 => 2 () pydb-1.26/test/data/file-2.5.right0000644000175000017500000000045511167745261013507 00000000000000+cd . +file hanoi.py +info line Line 2 of "hanoi.py" at instruction 0 +where 2 -> 0 execfile() file 'hanoi.py' at line 2 ## 1 exec() file '' at line 1 +step 1+1 +where 2 -> 0 execfile() file 'hanoi.py' at line 12 ## 1 exec() file '' at line 1 +quit pydb-1.26/test/data/logging.right0000644000175000017500000000063011110340277013671 00000000000000Future logs will be written to logging.out. Logs will be appended to the log file. Output will be sent only to the log file. The logging output mode is on. The current logfile is "logging.out". Whether logging overwrites or appends to the log file is off. *** Undefined set logging command "fdfsdasdfs". *** Error in opening /.bogus/bogusbogus/bogus/bogus/bogus *** Expecting 'on', 1, 'off', or 0. Got: oon. pydb-1.26/test/data/trace.right0000644000175000017500000000620211110340277013342 00000000000000(hanoi.py:2): + 2 """Towers of Hanoi""" (hanoi.py:3): + 3 import sys (hanoi.py:5): + 5 def hanoi(n,a,b,c): (hanoi.py:12): + 12 if __name__=='__main__': (hanoi.py:13): + 13 i_args=len(sys.argv) (hanoi.py:14): + 14 if i_args != 1 and i_args != 2: (hanoi.py:18): + 18 n=3 (hanoi.py:20): + 20 if i_args > 1: (hanoi.py:27): + 27 if n < 1 or n > 100: (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") --Call level 0 hanoi(n=3, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ----Call level 1 hanoi(n=2, a='a', b='c', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='b', b='c', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ----Call level 1 hanoi(n=2, a='c', b='b', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='c', b='a', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) --Return from level 0 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") (:1): + pydb-1.26/test/data/contbug-2.5.right0000644000175000017500000000026411110340277014211 00000000000000(hanoi.py:2): 2 """Towers of Hanoi""" + c 12 Breakpoint 1 set in file hanoi.py, line 12. Deleted breakpoint 1 (hanoi.py:12): 12 if __name__=='__main__': + quit pydb-1.26/test/data/withbug-2.6.right0000644000175000017500000000015011117125461014217 00000000000000+continue 17 Breakpoint 1 set in file withbug.py, line 17. Deleted breakpoint 1 +info local f = 1 +quit pydb-1.26/test/data/run.right0000644000175000017500000000225311110340277013052 00000000000000+info program Program stopped. It stopped after stepping, next'ing or initial start. +continue The program finished and will be restarted +###################################### +### Now restart with a breakpoint +###################################### +break hanoi Breakpoint 1 set in file hanoi.py, line 5. +show args Argument list to give program being debugged when it is started is "". +run Restarting hanoi.py with arguments: +continue +info args n= 3 a= a b= b c= c +info program Program stopped. It stopped at breakpoint 1. +where 2 -> 0 hanoi(n=3, a='a', b='b', c='c') called from file 'hanoi.py' at line 6 ## 1 in file 'hanoi.py' at line 31 +###################################### +### We should be at that breakpoint +### delete it and run again +### this time changing a parameter +###################################### +info break Num Type Disp Enb Where 1 breakpoint keep y at hanoi.py:5 breakpoint already hit 2 times +delete 1 Deleted breakpoint 1 +run 1 Restarting hanoi.py with arguments: 1 +continue The program finished and will be restarted +show args Argument list to give program being debugged when it is started is "1". +info args +#### +quit pydb-1.26/test/data/brkpt1t.right0000644000175000017500000000577211110340277013646 00000000000000--Call level -1 +############################################################### +# Test the breakpoint by line number +############################################################### +info break No breakpoints. +break 30 *** Blank, doc string, or comment +info break No breakpoints. +############################################################### +### Test enable/disable... +############################################################### +enable *** No breakpoint number given +enable 1 *** No breakpoint numbered 1. +info break No breakpoints. +enable foo *** Breakpoint index 'foo' is not a number +disable 1 No breakpoint numbered 1. +disable *** No breakpoint number given. +info break No breakpoints. +################################################################ +### Try setting breakpoints outside of the file range... +############################################################### +break 0 *** End of file +break 1 *** Blank, doc string, or comment +break 99 *** End of file +# +# list breakpoints +L No breakpoints. +############################################################### +### *** Test using file:line format on break... +############################################################### +break hanoi.py:22 Breakpoint 1 set in file hanoi.py, line 22. +break ./hanoi.py:22 Breakpoint 2 set in file hanoi.py, line 22. +break ./hanoi.py:0 *** End of file +break ./dbg-test1.sh:1955 *** './dbg-test1.sh' not found using sys.path +info break Num Type Disp Enb Where 1 breakpoint keep y at hanoi.py:22 2 breakpoint keep y at hanoi.py:22 +#### Try deleting breakpoints... +delete 10 *** No breakpoint numbered 10. +delete 1 Deleted breakpoint 1 +clear 22 *** No breakpoint at hanoi.py:22. +info break No breakpoints. +break 22 Breakpoint 3 set in file hanoi.py, line 22. +############################################################### +### *** Test breakpoints with conditions... +############################################################### +condition 1 x==0 +### FIXME: there is no condition 2! +### condition 2 y > 25 +condition 2+2 y > 25 *** No breakpoint numbered 4. +info break Num Type Disp Enb Where 3 breakpoint keep y at hanoi.py:22 +### FIXME: there still is no condition 2 +### condition 2 +condition 4 *** No breakpoint numbered 4. +info break Num Type Disp Enb Where 3 breakpoint keep y at hanoi.py:22 +condition x==1 *** condition command: Expecting a positive integer, got: x==1 +condition bad *** condition command: Expecting a positive integer, got: bad +condition 30 y==1 *** No breakpoint numbered 30. +condition 0 y==1 *** condition command: Expecting a positive integer at least 1, got: 0. +############################################################### +### *** Test breakpoints by function name +############################################################### +break hanoi Breakpoint 4 set in file hanoi.py, line 5. +clear hanoi Deleted breakpoint 4 +q Requesting exit from MainThread (id -1209805136) The program exited via sys.exit(). Exit status: pydb-1.26/test/data/tracetest-2.4-final.right0000644000175000017500000000551011110340277015633 00000000000000(/tmp/pydb-1.23cvs/test/settrace.py:51): 51 hanoi(n, "a", "b", "c") -> 0 in file 'settrace.py' at line 51 46 'continue'] 47 48 import pydb 49 pydb.debugger(dbg_cmds) 50 51 -> hanoi(n, "a", "b", "c") [EOF] --Call level -5 (settrace.py:14): hanoi 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi 15 if n-1 > 0: -> 0 hanoi(n=3, a='a', b='b', c='c') called from file 'settrace.py' at line 15 ## 1 in file 'settrace.py' at line 51 a = 'a' c = 'c' b = 'b' n = 3 (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -4 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to c (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk b to c (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -4 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:16): hanoi + 16 hanoi(n-1, a, c, b) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk c to a (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk c to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) --Call level -3 (settrace.py:14): hanoi + 14 def hanoi(n,a,b,c): (settrace.py:15): hanoi + 15 if n-1 > 0: (settrace.py:17): hanoi + 17 print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:18): hanoi + 18 if n-1 > 0: (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:19): hanoi + 19 hanoi(n-1, c, b, a) (settrace.py:51): + 51 hanoi(n, "a", "b", "c") pydb-1.26/test/data/run2.right0000644000175000017500000000314411110340277013134 00000000000000+info program Program stopped. It stopped after stepping, next'ing or initial start. +continue *** Uncaught exception. Entering post mortem debugging *** Running 'c' or 'step' will restart the program +info program The program being debugged is not being run. +###################################### +### Program munges sys.argv +### see if we can rerun it okay +###################################### +set interactive on +run 3 5 Restarting gcd.py with arguments: 3 5 +###################################### +### Break of a fn name and +### Try a return where there is none +### either because not in subroutine +### or no "return" statement +###################################### +set interactive off +break check_args Breakpoint 1 set in file gcd.py, line 13. +return *** I don't see that we are in a subroutine. +continue +return Sorry; a return statement was not found. +###################################### +### rerun wrong number of parameters +### that causes and exception +### and use "info program" to check +### termination +###################################### +set interactive on +info program Program stopped. It stopped at breakpoint 1. +run 5 10 Restarting gcd.py with arguments: 5 10 +continue +break gcd Breakpoint 2 set in file gcd.py, line 24. +continue +info program Program stopped. It stopped at breakpoint 2. +set linetrace on +set interactive off +return (gcd.py:32): gcd +where -> 0 gcd(a=5, b=10) called from file 'gcd.py' at line 32 ## 1 in file 'gcd.py' at line 41 ## 2 in exec cmd in globals, locals at line 1 ## 3 run(self=<__main__.Pdb instance a...) called from file 'bdb.py' at line 366 +quit pydb-1.26/test/data/history.right0000644000175000017500000000167011110340277013751 00000000000000+set history size 5 +set history filename *** Argument required (filename to set it to). +set history filename history.hst +show history filename: The filename in which to record the command history is "history.hst". save: Saving of the history record on exit is off size: The size of the command history is 5 +######################################### +# Test save on and off. +# Test also using short abbreviated name +######################################### +set his save off +set hi save on +list 1 #!/usr/bin/python 2 -> """Towers of Hanoi""" 3 import sys 4 5 def hanoi(n,a,b,c): 6 if n-1 > 0: 7 hanoi(n-1, a, c, b) 8 print "Move disk %s to %s" % (a, b) 9 if n-1 > 0: 10 hanoi(n-1, c, b, a) +show hi filename: The filename in which to record the command history is "history.hst". save: Saving of the history record on exit is on size: The size of the command history is 5 +quit pydb-1.26/test/data/skip.right0000644000175000017500000000070011143773507013223 00000000000000+set deftrace off +set linetrace on +set listsize 1 +skip (gcd.py:11): 11 import sys +list 11 -> import sys +p sys +skip foo *** skip command: Expecting a positive integer, got: foo +skip 2 (gcd.py:24): 24 def gcd(a,b): +c 38 Breakpoint 1 set in file gcd.py, line 38. +skip (gcd.py:38): 38 check_args() +list 38 B-> check_args() +quit (gcd.py:38): + 38 check_args() pydb-1.26/test/data/tracetest.right0000644000175000017500000000552211110340277014246 00000000000000--Return-- --Call-- (/export/home/src/build/pydb-1.20/test/settrace.py:14): hanoi -> 0 hanoi(n=3, a='a', b='b', c='c') called from file 'settrace.py' at line 14 ## 1 in file 'settrace.py' at line 51 9 top_srcdir = ".." 10 if top_srcdir[-1] != os.path.sep: 11 top_srcdir += os.path.sep 12 sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) 13 14 -> def hanoi(n,a,b,c): 15 if n-1 > 0: 16 hanoi(n-1, a, c, b) 17 print "Move disk %s to %s" % (a, b) 18 if n-1 > 0: (settrace.py:15): hanoi (settrace.py:16): hanoi -> 0 hanoi(n=3, a='a', b='b', c='c') called from file 'settrace.py' at line 16 ## 1 in file 'settrace.py' at line 51 a = 'a' c = 'c' b = 'b' n = 3 --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:16): hanoi + hanoi(n-1, a, c, b) --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:18): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk a to c (settrace.py:18): hanoi + if n-1 > 0: (settrace.py:19): hanoi + hanoi(n-1, c, b, a) --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk b to c (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:19): hanoi + hanoi(n-1, c, b, a) (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + if n-1 > 0: (settrace.py:19): hanoi + hanoi(n-1, c, b, a) --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:16): hanoi + hanoi(n-1, a, c, b) --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk c to a (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:18): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk c to b (settrace.py:18): hanoi + if n-1 > 0: (settrace.py:19): hanoi + hanoi(n-1, c, b, a) --Call-- (settrace.py:14): hanoi +def hanoi(n,a,b,c): (settrace.py:15): hanoi + if n-1 > 0: (settrace.py:17): hanoi + print "Move disk %s to %s" % (a, b) Move disk a to b (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:18): hanoi + if n-1 > 0: --Return-- (settrace.py:19): hanoi + hanoi(n-1, c, b, a) --Return-- (settrace.py:19): hanoi + hanoi(n-1, c, b, a) --Return-- (settrace.py:51): +hanoi(n, "a", "b", "c") pydb-1.26/test/data/step.right0000644000175000017500000000027511110340277013223 00000000000000+set deftrace off +set listsize 1 +step +list 11 -> import sys +set deftrace on +step +list 13 -> def check_args(): +set deftrace off +step +list 37 -> if __name__=='__main__': +quit pydb-1.26/test/data/dbgcall.right0000644000175000017500000000544011125041021013626 00000000000000(/tmp/pydb-1.25/test/dbgcall.py:17): 17 if __name__=='__main__': (dbgcall.py:18): + 18 i_args=len(sys.argv) (dbgcall.py:19): + 19 if i_args != 1 and i_args != 2: (dbgcall.py:23): + 23 n=3 (dbgcall.py:24): + 24 sys.settrace(None) (dbgcall.py:34): + 34 if n < 1 or n > 100: (dbgcall.py:38): + 38 hanoi(n, "a", "b", "c") --Call level -5 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -4 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to c (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk b to c (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) 'continued' Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -4 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:12): hanoi + 12 hanoi(n-1, a, c, b) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk c to a (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk c to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) --Call level -3 (dbgcall.py:10): hanoi + 10 def hanoi(n,a,b,c): (dbgcall.py:11): hanoi + 11 if n-1 > 0: (dbgcall.py:13): hanoi + 13 print "Move disk %s to %s" % (a, b) Move disk a to b (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:14): hanoi + 14 if n-1 > 0: (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:15): hanoi + 15 hanoi(n-1, c, b, a) (dbgcall.py:38): + 38 hanoi(n, "a", "b", "c") pydb-1.26/test/data/brkpt3-2.5t.right0000644000175000017500000000177311110340277014147 00000000000000--Call level -1 +############################################################### +### Test bad command parameters +############################################################### +# Non integer argument +commands a *** 'commands' command: Expecting a positive integer, got: a +# No such breakpoint number +commands 5 *** No breakpoint numbered 5. +############################################################### +### Test valid command. Note that in order to do this +### here we need to use the "source" command so that +### input doesn't get confused. +### FIXME: somehow output isn't coming out. +### but at least we're testing part +### parsing to the "end" +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +cd . +source comm1.cmd +continue +break 31 Breakpoint 2 set in file gcd.py, line 31. +source comm2.cmd +cd . +continue +quit Requesting exit from MainThread (id -1210472784) The program exited via sys.exit(). Exit status: pydb-1.26/test/data/filebug.right0000644000175000017500000000035611110340277013665 00000000000000+############################################# +## Test to see that __file__ is set. +## Just run the program and it does the work. +############################################# +continue The program finished and will be restarted +quit pydb-1.26/test/data/brkpt3.right0000644000175000017500000000161011110340277013447 00000000000000+############################################################### +### Test bad command parameters +############################################################### +# Non integer argument +commands a *** 'commands' command: Expecting a positive integer, got: a +# No such breakpoint number +commands 5 *** No breakpoint numbered 5. +############################################################### +### Test valid command. Note that in order to do this +### here we need to use the "source" command so that +### input doesn't get confused. +### FIXME: somehow output isn't coming out. +### but at least we're testing part +### parsing to the "end" +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +cd . +source comm1.cmd +continue +break 31 Breakpoint 2 set in file gcd.py, line 31. +source comm2.cmd +cd . +continue +quit pydb-1.26/test/data/withbug.right0000644000175000017500000000026311110340277013716 00000000000000+continue 17 Breakpoint 1 set in file withbug.py, line 17. Deleted breakpoint 1 +info local _[1] = 0 in file 'hanoi.py' at line 2 ## 1 in exec cmd in globals, locals at line 1 +step 1+1 +where 2 -> 0 in file 'hanoi.py' at line 12 ## 1 in exec cmd in globals, locals at line 1 +quit pydb-1.26/test/data/trace-2.4-final.right0000644000175000017500000000620211110340277014732 00000000000000(hanoi.py:2): + 2 """Towers of Hanoi""" (hanoi.py:3): + 3 import sys (hanoi.py:5): + 5 def hanoi(n,a,b,c): (hanoi.py:12): + 12 if __name__=='__main__': (hanoi.py:13): + 13 i_args=len(sys.argv) (hanoi.py:14): + 14 if i_args != 1 and i_args != 2: (hanoi.py:18): + 18 n=3 (hanoi.py:20): + 20 if i_args > 1: (hanoi.py:27): + 27 if n < 1 or n > 100: (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") --Call level 0 hanoi(n=3, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ----Call level 1 hanoi(n=2, a='a', b='c', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='b', b='c', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ----Call level 1 hanoi(n=2, a='c', b='b', c='a') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:7): hanoi + 7 hanoi(n-1, a, c, b) ------Call level 2 hanoi(n=1, a='c', b='a', c='b') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) ------Call level 2 hanoi(n=1, a='a', b='b', c='c') (hanoi.py:5): hanoi + 5 def hanoi(n,a,b,c): (hanoi.py:6): hanoi + 6 if n-1 > 0: (hanoi.py:8): hanoi + 8 print "Move disk %s to %s" % (a, b) (hanoi.py:9): hanoi + 9 if n-1 > 0: ------Return from level 2 () (hanoi.py:9): hanoi + 9 if n-1 > 0: ----Return from level 1 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) --Return from level 0 () (hanoi.py:10): hanoi + 10 hanoi(n-1, c, b, a) (hanoi.py:31): + 31 hanoi(n, "a", "b", "c") (:1): + pydb-1.26/test/data/pm.right0000644000175000017500000000153311117176400012664 00000000000000+set interactive off +set basename on +show args Argument list to give program being debugged when it is started is "". +info args +list 29 pydir = os.path.join(top_builddir, "pydb") 30 pydb_short = "pydb.py" 31 pydb_path = os.path.join(pydir, pydb_short) 32 33 def raise_error(): 34 -> raise FloatingPointError 35 36 class PdbTests(unittest.TestCase): 37 38 ## Don't use assertTrue to be compatible with older version of +# Completion might not be available if no readline +# complete s +# complete help s +where +step *** The program being debugged is not being run. +next *** The program being debugged is not being run. +finish *** The program being debugged is not being run. +return *** The program being debugged is not being run. +quit (test-pm.py:34): raise_error 34 raise FloatingPointError pydb-1.26/test/data/setshow.right0000644000175000017500000000070511110340277013742 00000000000000basename is on. Annotation level is 0. Annotation level is 1. Argument list to give program being debugged when it is started is ""abc"". Flushing output is "on". Flushing output is "off". Function tracing is on. Function tracing is off. Number of source lines pydb will list by default is 10. Number of lines to show in listing is 60. Saving of the history record on exit is off The size of the command history is 100 deftrace is off. deftrace is on. pydb-1.26/test/data/Makefile.in0000644000175000017500000002220711167754542013275 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = test/data DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CVS2CL = @CVS2CL@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIN_VERSION = @MIN_VERSION@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ READLINE = @READLINE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ check_DATA = \ brkpt1.right \ brkpt1t.right \ brkpt2-2.3.right \ brkpt2.right \ brkpt3t.right \ brkpt3-2.5t.right \ brkpt3.right \ checkline.py \ cmdparse.right \ contbug-2.5.right \ contbug.right \ dbgcall.right \ dbgcall-2.5.right \ file.right \ file-2.5.right \ filebug.right \ fntrace.right \ help.right \ history.right \ logging.right \ noscript.right \ pm.right \ pydbrc.right \ run.right \ run2.right \ save.right \ setshow.right \ setshow-no-rl.right \ sighandler.right \ skip.right \ step.right \ trace-2.4-final.right \ trace-2.5.right \ trace.right \ tracetest-2.4-final.right \ tracetest-2.5.right \ tracetest.right \ withbug.right \ withbug-2.6.right EXTRA_DIST = $(check_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/data/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test/data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_DATA) check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pydb-1.26/test/data/brkpt3t.right0000644000175000017500000000177311110340277013645 00000000000000--Call level -1 +############################################################### +### Test bad command parameters +############################################################### +# Non integer argument +commands a *** 'commands' command: Expecting a positive integer, got: a +# No such breakpoint number +commands 5 *** No breakpoint numbered 5. +############################################################### +### Test valid command. Note that in order to do this +### here we need to use the "source" command so that +### input doesn't get confused. +### FIXME: somehow output isn't coming out. +### but at least we're testing part +### parsing to the "end" +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +cd . +source comm1.cmd +continue +break 31 Breakpoint 2 set in file gcd.py, line 31. +source comm2.cmd +cd . +continue +quit Requesting exit from MainThread (id -1209792848) The program exited via sys.exit(). Exit status: pydb-1.26/test/test-run.py.in0000755000175000017500000000737211117742256013062 00000000000000#!@PYTHON@ -t # -*- Python -*- # $Id: test-run.py.in,v 1.5 2008/12/10 13:31:26 rockyb Exp $ "Unit test for Extended Python debugger's runl and runv commands " import difflib, os, sys, unittest, signal, time top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import pydb builddir = "@builddir@" if builddir[-1] != os.path.sep: builddir += os.path.sep srcdir = "@srcdir@" if srcdir[-1] != os.path.sep: srcdir += os.path.sep pydir = os.path.join(top_builddir, "pydb") pydb_short = "pydb.py" pydb_path = os.path.join(pydir, pydb_short) def diff_files(outfile, rightfile): fromfile = rightfile fromdate = time.ctime(os.stat(fromfile).st_mtime) fromlines = open(fromfile, 'U').readlines() tofile = outfile todate = time.ctime(os.stat(tofile).st_mtime) tolines = open(tofile, 'U').readlines() diff = list(difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate)) if len(diff) == 0: os.unlink(outfile) for line in diff: print line, return len(diff) == 0 class RunTests(unittest.TestCase): def test_runl(self): """Test pydb.runl()""" python_script = '%sgcd.py' % srcdir cmdfile = '%sbrkpt2.cmd' % srcdir if sys.hexversion <= 0x020400f0: rightfile = os.path.join(top_srcdir, 'test', 'data', 'brkpt2-2.3.right') else: rightfile = os.path.join(top_srcdir, 'test', 'data', 'brkpt2.right') outfile = 'runtest.out' if os.path.exists(outfile): os.unlink(outfile) pydb.runl('--basename', '--batch', '--nx', '--output', outfile, '--command', cmdfile, python_script, '3', '5') result = diff_files(outfile, rightfile) self.assertEqual(True, result, "brkpt2 (via runl)") def test_runv(self): """Test pydb.runl()""" python_script = '%shanoi.py' % srcdir cmdfile = '%scmdparse.cmd' % srcdir rightfile = os.path.join(top_srcdir, 'test', 'data', 'cmdparse.right') outfile = 'runtest.out' if os.path.exists(outfile): os.unlink(outfile) args = ('--basename', '--batch', '--nx', '--output', outfile, '--command', cmdfile, python_script) pydb.runv(args) result = diff_files(outfile, rightfile) self.assertEqual(True, result, "cmdparse (via runv)") def test_pydbrc(self): """Test pydb.runl()""" python_script = '%shanoi.py' % srcdir cmdfile = '%spydbrc.cmd' % srcdir rightfile = os.path.join(top_srcdir, 'test', 'data', 'pydbrc.right') outfile = 'pydbrc.out' if os.path.exists(outfile): os.unlink(outfile) os.environ['HOME'] = srcdir args = ('--basename', '--batch', '--output', outfile, '--command', cmdfile, python_script) pydb.runv(args) result = diff_files(outfile, rightfile) self.assertEqual(True, result, "pydbrc test") if srcdir[-1] == os.path.sep: # Chop off pathsep to make sure that works os.environ['HOME'] = srcdir[0:-1] else: # Add of pathsep to make sure that works os.environ['HOME'] = srcdir + os.path.sep pydb.runv(args) result = diff_files(outfile, rightfile) if __name__ == '__main__': unittest.main() pydb-1.26/test/pydbrc.cmd0000644000175000017500000000020310566636253012257 00000000000000# $Id: pydbrc.cmd,v 1.1 2007/02/20 18:23:39 rockyb Exp $ set trace-commands on # Test to see if ./.pydbrc gets loaded. alias quit pydb-1.26/test/brkpt1.cmd0000644000175000017500000000332610556377273012213 00000000000000# # Test of breakpoint handling # $Id: brkpt1.cmd,v 1.7 2007/01/26 13:14:35 rockyb Exp $ # set base on set trace-commands on ############################################################### # Test the breakpoint by line number ############################################################### info break break 30 info break ############################################################### ### Test enable/disable... ############################################################### enable enable 1 info break enable foo disable 1 disable info break ################################################################ ### Try setting breakpoints outside of the file range... ############################################################### break 0 break 1 break 99 # # list breakpoints L ############################################################### ### *** Test using file:line format on break... ############################################################### break hanoi.py:22 break ./hanoi.py:22 break ./hanoi.py:0 break ./dbg-test1.sh:1955 info break #### Try deleting breakpoints... delete 10 delete 1 clear 22 info break break 22 ############################################################### ### *** Test breakpoints with conditions... ############################################################### condition 1 x==0 ### FIXME: there is no condition 2! ### condition 2 y > 25 condition 2+2 y > 25 info break ### FIXME: there still is no condition 2 ### condition 2 condition 4 info break condition x==1 condition bad condition 30 y==1 condition 0 y==1 ############################################################### ### *** Test breakpoints by function name ############################################################### break hanoi clear hanoi q pydb-1.26/test/exceptbug.py.in0000644000175000017500000000117010557343571013256 00000000000000#!@PYTHON@ -t from __future__ import with_statement import os, sys import threading top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) def f(): l = threading.Lock() with l: print "hello" raise Exception("error") print "world" try: f() except: import pydb # pydb.pm() pydb.pm(['set basename on','set interactive off', 'where','quit']) pydb-1.26/test/test-fifo-connect.py.in0000644000175000017500000000357510712315137014620 00000000000000#!@PYTHON@ -t # $Id: test-fifo-connect.py.in,v 1.1 2007/11/01 09:20:31 rockyb Exp $ -*- Python -*- # This unit test doesn't use any of the debugger code. It is meant solely # to test the connection classes. import os, sys, thread, time, unittest top_builddir = "@top_builddir@" if top_builddir[-1] != os.path.sep: top_builddir += os.path.sep sys.path.insert(0, os.path.join(top_builddir, 'pydb')) top_srcdir = "@top_srcdir@" if top_srcdir[-1] != os.path.sep: top_srcdir += os.path.sep sys.path.insert(0, os.path.join(top_srcdir, 'pydb')) import connection class TestFIFOConnections(unittest.TestCase): def test_client_server(self): """Test that the we can read and write between a FIFO client and server""" fname='fifotest' server = connection.ConnectionFIFO(is_server=True) client = connection.ConnectionFIFO(is_server=False) thread.start_new_thread(server.connect, (fname,)) for i in range(10): if not hasattr(server, 'outp') or server.outp is None: time.sleep(0.05) client.connect(fname) line = 'this is a test\n' client.write(line) for i in range(10): if not os.path.exists('fifotest.out'): time.sleep(0.05) else: break self.assertEqual(True, os.path.exists('fifotest.out')) for i in range(10): if not hasattr(server, 'inp') or server.inp is None: time.sleep(0.05) l2 = server.readline() self.assertEqual(l2, line, "client to server") line = 'Another test\n' server.write(line) l2 = client.readline() self.assertEqual(l2, line, "server to client") client.disconnect() server.disconnect() # And again just to see what will happen server.disconnect() if __name__ == '__main__': unittest.main() pydb-1.26/test/sigtestexample.py0000644000175000017500000000135610512253753013720 00000000000000#!/usr/bin/env python # $Id: sigtestexample.py,v 1.5 2006/10/08 19:56:27 rockyb Exp $ """Something to use to test signal handling. Basically we just need a program that installs a signal handler. """ import sys, os def signal_handler(num, f): f = open('log', 'w+') f.write('signal received\n') f.close() sys.exit(0) import signal signal.signal(signal.SIGUSR1, signal_handler) if len(sys.argv) > 1 and sys.argv[1] == 'signal': os.kill(os.getpid(), signal.SIGUSR1) # We need a statement after the above kill so we can see if the # debugger stop works. pass else: print "Pid %d" % os.getpid() reply = raw_input("Waiting in a read for signal USR1. " + "Type any key to terminate now.") pydb-1.26/test/brkpt3t.right.in0000644000175000017500000000201310612662573013341 00000000000000--Call level -1 +############################################################### +### Test bad command parameters +############################################################### +# Non integer argument +commands a *** 'commands' command: Expecting a positive integer, got: a +# No such breakpoint number +commands 5 *** No breakpoint numbered 5. +############################################################### +### Test valid command. Note that in order to do this +### here we need to use the "source" command so that +### input doesn't get confused. +### FIXME: somehow output isn't coming out. +### but at least we're testing part +### parsing to the "end" +############################################################### +break 28 Breakpoint 1 set in file gcd.py, line 28. +cd @srcdir@ +source comm1.cmd +continue +break 31 Breakpoint 2 set in file gcd.py, line 31. +source comm2.cmd +cd @builddir@ +continue +quit Requesting exit from MainThread (id -1209792848) The program exited via sys.exit(). Exit status: pydb-1.26/test/Makefile.in0000644000175000017500000005726711167754542012402 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #$Id: Makefile.am,v 1.55 2009/04/10 23:42:02 rockyb Exp $ # Copyright (C) 2006, 2007, 2008 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = test DIST_COMMON = $(srcdir)/.pydbrc.in $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/brkpt3.cmd.in \ $(srcdir)/brkpt3.right.in $(srcdir)/brkpt3t.right.in \ $(srcdir)/except.py.in $(srcdir)/exceptbug.py.in \ $(srcdir)/file-2.5.right.in $(srcdir)/file.cmd.in \ $(srcdir)/file.right.in $(srcdir)/settrace.py.in \ $(srcdir)/test-complete.py.in $(srcdir)/test-connect.py.in \ $(srcdir)/test-contbug.py.in $(srcdir)/test-dbgcall.py.in \ $(srcdir)/test-disassem.py.in \ $(srcdir)/test-fifo-connect.py.in $(srcdir)/test-file.py.in \ $(srcdir)/test-fns.py.in $(srcdir)/test-help.py.in \ $(srcdir)/test-import.py.in $(srcdir)/test-linetrace.py.in \ $(srcdir)/test-pm.py.in $(srcdir)/test-run.py.in \ $(srcdir)/test-save.py.in $(srcdir)/test-setshow.py.in \ $(srcdir)/test-sig.py.in $(srcdir)/test-sighandle.py.in \ $(srcdir)/test-skip.py.in $(srcdir)/test-step.py.in \ $(srcdir)/test-tcp-connect.py.in $(srcdir)/test-trace.py.in \ $(srcdir)/test-with.py.in $(srcdir)/test.py.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = .pydbrc brkpt3.cmd brkpt3.right brkpt3t.right \ except.py exceptbug.py file-2.5.right file.cmd file.right \ settrace.py test-complete.py test-connect.py test-contbug.py \ test-disassem.py test-dbgcall.py test-fifo-connect.py \ test-file.py test-fns.py test-help.py test-import.py \ test-linetrace.py test-pm.py test-run.py test-save.py \ test-setshow.py test-sig.py test-sighandle.py test-skip.py \ test-step.py test-tcp-connect.py test-trace.py test-with.py \ test.py SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CVS2CL = @CVS2CL@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIN_VERSION = @MIN_VERSION@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ READLINE = @READLINE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # SUBDIRS = data unit thread SUBDIRS = data unit check_DATA = \ .pydbrc \ brkpt1.cmd \ brkpt2.cmd \ cmdparse.cmd \ comm1.cmd \ comm2.cmd \ dbgcall.py \ except.py \ filebug.cmd \ filebug.py \ gcd.py \ hanoi.py \ history.cmd \ logging.cmd \ noscript.cmd \ pm.cmd \ pydbrc.cmd \ run.cmd \ run2.cmd \ save.cmd \ setshow.cmd \ settrace.py \ sighandler.cmd \ skip.cmd \ step.cmd \ sigtestexample.py \ withbug.cmd \ withbug.py TESTS = test.py \ test-complete.py \ test-contbug.py \ test-connect.py \ test-dbgcall.py \ test-disassem.py \ test-file.py \ test-fifo-connect.py \ test-fns.py \ test-help.py \ test-import.py \ test-linetrace.py \ test-pm.py \ test-run.py \ test-setshow.py \ test-sig.py \ test-sighandle.py \ test-save.py \ test-skip.py \ test-step.py \ test-trace.py \ test-tcp-connect.py \ test-trace.py \ test-with.py EXTRA_DIST = \ $(check_DATA) \ $(patsubst %.py,%.py.in, $(TESTS)) \ brkpt3.cmd.in \ .pydbrc.in \ file.right.in file-2.5.right.in file.cmd.in \ settrace.py.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh .pydbrc: $(top_builddir)/config.status $(srcdir)/.pydbrc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ brkpt3.cmd: $(top_builddir)/config.status $(srcdir)/brkpt3.cmd.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ brkpt3.right: $(top_builddir)/config.status $(srcdir)/brkpt3.right.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ brkpt3t.right: $(top_builddir)/config.status $(srcdir)/brkpt3t.right.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ except.py: $(top_builddir)/config.status $(srcdir)/except.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ exceptbug.py: $(top_builddir)/config.status $(srcdir)/exceptbug.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ file-2.5.right: $(top_builddir)/config.status $(srcdir)/file-2.5.right.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ file.cmd: $(top_builddir)/config.status $(srcdir)/file.cmd.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ file.right: $(top_builddir)/config.status $(srcdir)/file.right.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ settrace.py: $(top_builddir)/config.status $(srcdir)/settrace.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-complete.py: $(top_builddir)/config.status $(srcdir)/test-complete.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-connect.py: $(top_builddir)/config.status $(srcdir)/test-connect.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-contbug.py: $(top_builddir)/config.status $(srcdir)/test-contbug.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-disassem.py: $(top_builddir)/config.status $(srcdir)/test-disassem.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-dbgcall.py: $(top_builddir)/config.status $(srcdir)/test-dbgcall.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-fifo-connect.py: $(top_builddir)/config.status $(srcdir)/test-fifo-connect.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-file.py: $(top_builddir)/config.status $(srcdir)/test-file.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-fns.py: $(top_builddir)/config.status $(srcdir)/test-fns.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-help.py: $(top_builddir)/config.status $(srcdir)/test-help.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-import.py: $(top_builddir)/config.status $(srcdir)/test-import.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-linetrace.py: $(top_builddir)/config.status $(srcdir)/test-linetrace.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-pm.py: $(top_builddir)/config.status $(srcdir)/test-pm.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-run.py: $(top_builddir)/config.status $(srcdir)/test-run.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-save.py: $(top_builddir)/config.status $(srcdir)/test-save.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-setshow.py: $(top_builddir)/config.status $(srcdir)/test-setshow.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-sig.py: $(top_builddir)/config.status $(srcdir)/test-sig.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-sighandle.py: $(top_builddir)/config.status $(srcdir)/test-sighandle.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-skip.py: $(top_builddir)/config.status $(srcdir)/test-skip.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-step.py: $(top_builddir)/config.status $(srcdir)/test-step.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-tcp-connect.py: $(top_builddir)/config.status $(srcdir)/test-tcp-connect.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-trace.py: $(top_builddir)/config.status $(srcdir)/test-trace.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test-with.py: $(top_builddir)/config.status $(srcdir)/test-with.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test.py: $(top_builddir)/config.status $(srcdir)/test.py.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-TESTS check-am clean clean-generic \ ctags ctags-recursive distclean distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am test: check clean-generic: -rm $(top_builddir)/test/*.pyc \ $(top_builddir)/test/history.hst \ $(top_builddir)/test/savefile.txt # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pydb-1.26/configure0000755000175000017500000034642111167754542011256 00000000000000#! /bin/sh # From configure.ac Id: configure.ac,v 1.84 2009/04/10 23:41:58 rockyb Exp . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for pydb 1.26. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='pydb' PACKAGE_TARNAME='pydb' PACKAGE_VERSION='1.26' PACKAGE_STRING='pydb 1.26' PACKAGE_BUGREPORT='bashdb-pydb-devel@lists.sourceforge.net' ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias MIN_VERSION EMACS EMACSLOADPATH lispdir INSTALL_EMACS_LISP_TRUE INSTALL_EMACS_LISP_FALSE READLINE PYTHON PYTHON_VERSION PYTHON_PREFIX PYTHON_EXEC_PREFIX PYTHON_PLATFORM pythondir pkgpythondir pyexecdir pkgpyexecdir MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA am__isrc CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CVS2CL LN_S LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias EMACS EMACSLOADPATH' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pydb 1.26 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pydb] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pydb 1.26:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pyreadline Use pyreadline instead of readline --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-lispdir override the default lisp directory --with-site-packages place to install module --with-python set path to Python Some influential environment variables: EMACS the Emacs editor command EMACSLOADPATH the Emacs library search path Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pydb configure 1.26 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pydb $as_me 1.26, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >>confdefs.h <<\_ACEOF #define PACKAGE pydb _ACEOF MIN_VERSION='2.4.0' ## ## Find out where to install the debugger emacs lisp files ## # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= for ac_prog in emacs xemacs do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_EMACS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$EMACS"; then ac_cv_prog_EMACS="$EMACS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_EMACS="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi EMACS=$ac_cv_prog_EMACS if test -n "$EMACS"; then { echo "$as_me:$LINENO: result: $EMACS" >&5 echo "${ECHO_T}$EMACS" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$EMACS" && break done test -n "$EMACS" || EMACS="no" # Check whether --with-lispdir was given. if test "${with_lispdir+set}" = set; then withval=$with_lispdir; lispdir="$withval" { echo "$as_me:$LINENO: checking where .elc files should go" >&5 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $lispdir" >&5 echo "${ECHO_T}$lispdir" >&6; } else { echo "$as_me:$LINENO: checking where .elc files should go" >&5 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6; } if test "${am_cv_lispdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test $EMACS != "no"; then if test x${lispdir+set} != xset; then # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly # Some emacsen will start up in interactive mode, requiring C-x C-c to exit, # which is non-obvious for non-emacs users. # Redirecting /dev/null should help a bit; pity we can't detect "broken" # emacsen earlier and avoid running this altogether. { (echo "$as_me:$LINENO: \$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) \"\\n\")) (setq load-path (cdr load-path)))' conftest.out") >&5 ($EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' conftest.out) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } am_cv_lispdir=`sed -n \ -e 's,/$,,' \ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \ conftest.out` rm conftest.out fi fi test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp' fi { echo "$as_me:$LINENO: result: $am_cv_lispdir" >&5 echo "${ECHO_T}$am_cv_lispdir" >&6; } lispdir="$am_cv_lispdir" fi # Extract the first word of "emacs", so it can be a program name with args. set dummy emacs; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_EMACS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $EMACS in [\\/]* | ?:[\\/]*) ac_cv_path_EMACS="$EMACS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_EMACS="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_EMACS" && ac_cv_path_EMACS="no" ;; esac fi EMACS=$ac_cv_path_EMACS if test -n "$EMACS"; then { echo "$as_me:$LINENO: result: $EMACS" >&5 echo "${ECHO_T}$EMACS" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test x$EMACS != xno ; then $EMACS -batch -q -no-site-file -eval \ '(if (<= emacs-major-version 21) (progn (error "You need GNU Emacs 22 or better for GNU Emacs support.") (kill-emacs 1) ))' if test $? -ne 0 ; then EMACS=no fi fi if test "x$lispdir" != "x" -a "x$EMACS" != "xno"; then INSTALL_EMACS_LISP_TRUE= INSTALL_EMACS_LISP_FALSE='#' else INSTALL_EMACS_LISP_TRUE='#' INSTALL_EMACS_LISP_FALSE= fi ## ## AM_PATH_PYTHON seems to use PACKAGE and AC_INIT sets PACKAGE_NAME. if test -z "$PACKAGE" ; then PACKAGE=$PACKAGE_NAME fi ## ## Get user-specified Python site-packages location. This should ## come before getting user-specified Python or looking for that. ## find_pythondir=yes # Check whether --with-site-packages was given. if test "${with_site_packages+set}" = set; then withval=$with_site_packages; pythondir=$withval; pkgpythondir=${pythondir}/$PACKAGE_NAME find_pythondir=no fi if test "$find_pythondir" != yes; then am_cv_python_pythondir=$pythondir fi READLINE=readline # Check whether --enable-pyreadline was given. if test "${enable_pyreadline+set}" = set; then enableval=$enable_pyreadline; if test "${enable_readline}" = "yes"; then READLINE=pyreadline fi fi ## ## Get user-specified Python location ## # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= for ac_prog in emacs xemacs do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_EMACS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$EMACS"; then ac_cv_prog_EMACS="$EMACS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_EMACS="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi EMACS=$ac_cv_prog_EMACS if test -n "$EMACS"; then { echo "$as_me:$LINENO: result: $EMACS" >&5 echo "${ECHO_T}$EMACS" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$EMACS" && break done test -n "$EMACS" || EMACS="no" # Check whether --with-lispdir was given. if test "${with_lispdir+set}" = set; then withval=$with_lispdir; lispdir="$withval" { echo "$as_me:$LINENO: checking where .elc files should go" >&5 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $lispdir" >&5 echo "${ECHO_T}$lispdir" >&6; } else { echo "$as_me:$LINENO: checking where .elc files should go" >&5 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6; } if test "${am_cv_lispdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test $EMACS != "no"; then if test x${lispdir+set} != xset; then # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly # Some emacsen will start up in interactive mode, requiring C-x C-c to exit, # which is non-obvious for non-emacs users. # Redirecting /dev/null should help a bit; pity we can't detect "broken" # emacsen earlier and avoid running this altogether. { (echo "$as_me:$LINENO: \$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) \"\\n\")) (setq load-path (cdr load-path)))' conftest.out") >&5 ($EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' conftest.out) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } am_cv_lispdir=`sed -n \ -e 's,/$,,' \ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \ conftest.out` rm conftest.out fi fi test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp' fi { echo "$as_me:$LINENO: result: $am_cv_lispdir" >&5 echo "${ECHO_T}$am_cv_lispdir" >&6; } lispdir="$am_cv_lispdir" fi # Check whether --with-python was given. if test "${with_python+set}" = set; then withval=$with_python; PYTHON=$withval fi ## ## Check for Python interpreter and make we have a recent version. ## if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { echo "$as_me:$LINENO: checking whether $PYTHON version >= $MIN_VERSION" >&5 echo $ECHO_N "checking whether $PYTHON version >= $MIN_VERSION... $ECHO_C" >&6; } prog="import sys, string # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. minver = map(int, string.split('$MIN_VERSION', '.')) + [0, 0, 0] minverhex = 0 for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { { echo "$as_me:$LINENO: error: too old" >&5 echo "$as_me: error: too old" >&2;} { (exit 1); exit 1; }; } fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { echo "$as_me:$LINENO: checking for a Python interpreter with version >= $MIN_VERSION" >&5 echo $ECHO_N "checking for a Python interpreter with version >= $MIN_VERSION... $ECHO_C" >&6; } if test "${am_cv_pathless_PYTHON+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else for am_cv_pathless_PYTHON in python python2 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys, string # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. minver = map(int, string.split('$MIN_VERSION', '.')) + [0, 0, 0] minverhex = 0 for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then break fi done fi { echo "$as_me:$LINENO: result: $am_cv_pathless_PYTHON" >&5 echo "${ECHO_T}$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_PYTHON+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { echo "$as_me:$LINENO: result: $PYTHON" >&5 echo "${ECHO_T}$PYTHON" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then { { echo "$as_me:$LINENO: error: Debugger known only to work with Python $MIN_VERSION or greater" >&5 echo "$as_me: error: Debugger known only to work with Python $MIN_VERSION or greater" >&2;} { (exit 1); exit 1; }; } else { echo "$as_me:$LINENO: checking for $am_display_PYTHON version" >&5 echo $ECHO_N "checking for $am_display_PYTHON version... $ECHO_C" >&6; } if test "${am_cv_python_version+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_python_version=`$PYTHON -c "import sys; print sys.version[:3]"` fi { echo "$as_me:$LINENO: result: $am_cv_python_version" >&5 echo "${ECHO_T}$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { echo "$as_me:$LINENO: checking for $am_display_PYTHON platform" >&5 echo $ECHO_N "checking for $am_display_PYTHON platform... $ECHO_C" >&6; } if test "${am_cv_python_platform+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"` fi { echo "$as_me:$LINENO: result: $am_cv_python_platform" >&5 echo "${ECHO_T}$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform { echo "$as_me:$LINENO: checking for $am_display_PYTHON script directory" >&5 echo $ECHO_N "checking for $am_display_PYTHON script directory... $ECHO_C" >&6; } if test "${am_cv_python_pythondir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null || echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` fi { echo "$as_me:$LINENO: result: $am_cv_python_pythondir" >&5 echo "${ECHO_T}$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { echo "$as_me:$LINENO: checking for $am_display_PYTHON extension module directory" >&5 echo $ECHO_N "checking for $am_display_PYTHON extension module directory... $ECHO_C" >&6; } if test "${am_cv_python_pyexecdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null || echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"` fi { echo "$as_me:$LINENO: result: $am_cv_python_pyexecdir" >&5 echo "${ECHO_T}$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi ## Automake doesn't get Python's install path correct. So we ## figure it out and set it ourself. ## This must come after looking for Python since we use that below. if test "$find_pythondir" = yes; then { echo "$as_me:$LINENO: Trying to reset site-packages a the default often gets this wrong" >&5 echo "$as_me: Trying to reset site-packages a the default often gets this wrong" >&6;} pythondir=`$PYTHON ${srcdir}/site-packages-path.py` if test $? != 0 ; then { { echo "$as_me:$LINENO: error: Didn't get Python site packages install path. Set it with --with-site-packages" >&5 echo "$as_me: error: Didn't get Python site packages install path. Set it with --with-site-packages" >&2;} { (exit 1); exit 1; }; } fi pkgpythondir=\${pythondir}/$PACKAGE_NAME fi ## ## ## In maintainer mode we produce a ChangeLog ## { echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ## ## make sure we are using a recent autoconf version ## test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm -f conftest.sed am__api_version='1.10' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { echo "$as_me:$LINENO: result: $MKDIR_P" >&5 echo "${ECHO_T}$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='pydb' VERSION='1.26' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ## ## cvs2cl is used to create the ChangeLog when we create a distribution ## CVS2CL=${CVS2CL-"${am_missing_run}cvs2cl"} ## ## A symbolic links is used to link a name in users PATH to the python ## script. ## { echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6; } fi ## ## Produced derived files. ## ac_config_files="$ac_config_files Doc/Makefile" ac_config_files="$ac_config_files Doc/pydb.1" ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files emacs/Makefile" ac_config_files="$ac_config_files emacs/pydb-test.el" ac_config_files="$ac_config_files pydb/__init__.py" ac_config_files="$ac_config_files pydb/gdb.py" ac_config_files="$ac_config_files pydb/pydb.py" ac_config_files="$ac_config_files setup.py" ac_config_files="$ac_config_files test/.pydbrc" # Just to get this into builddir ac_config_files="$ac_config_files test/Makefile" ac_config_files="$ac_config_files test/data/Makefile" ac_config_files="$ac_config_files test/unit/Makefile" ac_config_files="$ac_config_files test/brkpt3.cmd" ac_config_files="$ac_config_files test/brkpt3.right" ac_config_files="$ac_config_files test/brkpt3t.right" ac_config_files="$ac_config_files test/except.py" ac_config_files="$ac_config_files test/exceptbug.py" ac_config_files="$ac_config_files test/file-2.5.right" ac_config_files="$ac_config_files test/file.cmd" ac_config_files="$ac_config_files test/file.right" ac_config_files="$ac_config_files test/settrace.py" ac_config_files="$ac_config_files test/test-complete.py" ac_config_files="$ac_config_files test/test-connect.py" ac_config_files="$ac_config_files test/test-contbug.py" ac_config_files="$ac_config_files test/test-disassem.py" ac_config_files="$ac_config_files test/test-dbgcall.py" ac_config_files="$ac_config_files test/test-fifo-connect.py" ac_config_files="$ac_config_files test/test-file.py" ac_config_files="$ac_config_files test/test-fns.py" ac_config_files="$ac_config_files test/test-help.py" ac_config_files="$ac_config_files test/test-import.py" ac_config_files="$ac_config_files test/test-linetrace.py" ac_config_files="$ac_config_files test/test-pm.py" ac_config_files="$ac_config_files test/test-run.py" ac_config_files="$ac_config_files test/test-save.py" ac_config_files="$ac_config_files test/test-setshow.py" ac_config_files="$ac_config_files test/test-sig.py" ac_config_files="$ac_config_files test/test-sighandle.py" ac_config_files="$ac_config_files test/test-skip.py" ac_config_files="$ac_config_files test/test-step.py" ac_config_files="$ac_config_files test/test-tcp-connect.py" ac_config_files="$ac_config_files test/test-trace.py" ac_config_files="$ac_config_files test/test-with.py" ac_config_files="$ac_config_files test/test.py" ac_config_files="$ac_config_files test/unit/bytecode.py" ac_config_files="$ac_config_files test/unit/checkline.py" ac_config_files="$ac_config_files test/unit/fns.py" ac_config_files="$ac_config_files test/unit/listsize.py" ac_config_files="$ac_config_files test/unit/pydbcmd.py" ac_config_files="$ac_config_files test/unit/sighandler.py" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${INSTALL_EMACS_LISP_TRUE}" && test -z "${INSTALL_EMACS_LISP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"INSTALL_EMACS_LISP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"INSTALL_EMACS_LISP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pydb $as_me 1.26, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ pydb config.status 1.26 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Doc/Makefile") CONFIG_FILES="$CONFIG_FILES Doc/Makefile" ;; "Doc/pydb.1") CONFIG_FILES="$CONFIG_FILES Doc/pydb.1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "emacs/Makefile") CONFIG_FILES="$CONFIG_FILES emacs/Makefile" ;; "emacs/pydb-test.el") CONFIG_FILES="$CONFIG_FILES emacs/pydb-test.el" ;; "pydb/__init__.py") CONFIG_FILES="$CONFIG_FILES pydb/__init__.py" ;; "pydb/gdb.py") CONFIG_FILES="$CONFIG_FILES pydb/gdb.py" ;; "pydb/pydb.py") CONFIG_FILES="$CONFIG_FILES pydb/pydb.py" ;; "setup.py") CONFIG_FILES="$CONFIG_FILES setup.py" ;; "test/.pydbrc") CONFIG_FILES="$CONFIG_FILES test/.pydbrc" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "test/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/data/Makefile" ;; "test/unit/Makefile") CONFIG_FILES="$CONFIG_FILES test/unit/Makefile" ;; "test/brkpt3.cmd") CONFIG_FILES="$CONFIG_FILES test/brkpt3.cmd" ;; "test/brkpt3.right") CONFIG_FILES="$CONFIG_FILES test/brkpt3.right" ;; "test/brkpt3t.right") CONFIG_FILES="$CONFIG_FILES test/brkpt3t.right" ;; "test/except.py") CONFIG_FILES="$CONFIG_FILES test/except.py" ;; "test/exceptbug.py") CONFIG_FILES="$CONFIG_FILES test/exceptbug.py" ;; "test/file-2.5.right") CONFIG_FILES="$CONFIG_FILES test/file-2.5.right" ;; "test/file.cmd") CONFIG_FILES="$CONFIG_FILES test/file.cmd" ;; "test/file.right") CONFIG_FILES="$CONFIG_FILES test/file.right" ;; "test/settrace.py") CONFIG_FILES="$CONFIG_FILES test/settrace.py" ;; "test/test-complete.py") CONFIG_FILES="$CONFIG_FILES test/test-complete.py" ;; "test/test-connect.py") CONFIG_FILES="$CONFIG_FILES test/test-connect.py" ;; "test/test-contbug.py") CONFIG_FILES="$CONFIG_FILES test/test-contbug.py" ;; "test/test-disassem.py") CONFIG_FILES="$CONFIG_FILES test/test-disassem.py" ;; "test/test-dbgcall.py") CONFIG_FILES="$CONFIG_FILES test/test-dbgcall.py" ;; "test/test-fifo-connect.py") CONFIG_FILES="$CONFIG_FILES test/test-fifo-connect.py" ;; "test/test-file.py") CONFIG_FILES="$CONFIG_FILES test/test-file.py" ;; "test/test-fns.py") CONFIG_FILES="$CONFIG_FILES test/test-fns.py" ;; "test/test-help.py") CONFIG_FILES="$CONFIG_FILES test/test-help.py" ;; "test/test-import.py") CONFIG_FILES="$CONFIG_FILES test/test-import.py" ;; "test/test-linetrace.py") CONFIG_FILES="$CONFIG_FILES test/test-linetrace.py" ;; "test/test-pm.py") CONFIG_FILES="$CONFIG_FILES test/test-pm.py" ;; "test/test-run.py") CONFIG_FILES="$CONFIG_FILES test/test-run.py" ;; "test/test-save.py") CONFIG_FILES="$CONFIG_FILES test/test-save.py" ;; "test/test-setshow.py") CONFIG_FILES="$CONFIG_FILES test/test-setshow.py" ;; "test/test-sig.py") CONFIG_FILES="$CONFIG_FILES test/test-sig.py" ;; "test/test-sighandle.py") CONFIG_FILES="$CONFIG_FILES test/test-sighandle.py" ;; "test/test-skip.py") CONFIG_FILES="$CONFIG_FILES test/test-skip.py" ;; "test/test-step.py") CONFIG_FILES="$CONFIG_FILES test/test-step.py" ;; "test/test-tcp-connect.py") CONFIG_FILES="$CONFIG_FILES test/test-tcp-connect.py" ;; "test/test-trace.py") CONFIG_FILES="$CONFIG_FILES test/test-trace.py" ;; "test/test-with.py") CONFIG_FILES="$CONFIG_FILES test/test-with.py" ;; "test/test.py") CONFIG_FILES="$CONFIG_FILES test/test.py" ;; "test/unit/bytecode.py") CONFIG_FILES="$CONFIG_FILES test/unit/bytecode.py" ;; "test/unit/checkline.py") CONFIG_FILES="$CONFIG_FILES test/unit/checkline.py" ;; "test/unit/fns.py") CONFIG_FILES="$CONFIG_FILES test/unit/fns.py" ;; "test/unit/listsize.py") CONFIG_FILES="$CONFIG_FILES test/unit/listsize.py" ;; "test/unit/pydbcmd.py") CONFIG_FILES="$CONFIG_FILES test/unit/pydbcmd.py" ;; "test/unit/sighandler.py") CONFIG_FILES="$CONFIG_FILES test/unit/sighandler.py" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim MIN_VERSION!$MIN_VERSION$ac_delim EMACS!$EMACS$ac_delim EMACSLOADPATH!$EMACSLOADPATH$ac_delim lispdir!$lispdir$ac_delim INSTALL_EMACS_LISP_TRUE!$INSTALL_EMACS_LISP_TRUE$ac_delim INSTALL_EMACS_LISP_FALSE!$INSTALL_EMACS_LISP_FALSE$ac_delim READLINE!$READLINE$ac_delim PYTHON!$PYTHON$ac_delim PYTHON_VERSION!$PYTHON_VERSION$ac_delim PYTHON_PREFIX!$PYTHON_PREFIX$ac_delim PYTHON_EXEC_PREFIX!$PYTHON_EXEC_PREFIX$ac_delim PYTHON_PLATFORM!$PYTHON_PLATFORM$ac_delim pythondir!$pythondir$ac_delim pkgpythondir!$pkgpythondir$ac_delim pyexecdir!$pyexecdir$ac_delim pkgpyexecdir!$pkgpyexecdir$ac_delim MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim MAINT!$MAINT$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim am__isrc!$am__isrc$ac_delim CYGPATH_W!$CYGPATH_W$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim ACLOCAL!$ACLOCAL$ac_delim AUTOCONF!$AUTOCONF$ac_delim AUTOMAKE!$AUTOMAKE$ac_delim AUTOHEADER!$AUTOHEADER$ac_delim MAKEINFO!$MAKEINFO$ac_delim install_sh!$install_sh$ac_delim STRIP!$STRIP$ac_delim INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim mkdir_p!$mkdir_p$ac_delim AWK!$AWK$ac_delim SET_MAKE!$SET_MAKE$ac_delim am__leading_dot!$am__leading_dot$ac_delim AMTAR!$AMTAR$ac_delim am__tar!$am__tar$ac_delim am__untar!$am__untar$ac_delim CVS2CL!$CVS2CL$ac_delim LN_S!$LN_S$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 82; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; esac case $ac_file$ac_mode in "pydb/pydb.py":F) chmod +x pydb/pydb.py ;; "setup.py":F) chmod +x setup.py ;; "test/except.py":F) chmod +x test/except.py ;; "test/exceptbug.py":F) chmod +x test/exceptbug.py ;; "test/settrace.py":F) chmod +x test/settrace.py ;; "test/test-complete.py":F) chmod +x test/test-complete.py ;; "test/test-connect.py":F) chmod +x test/test-connect.py ;; "test/test-contbug.py":F) chmod +x test/test-contbug.py ;; "test/test-disassem.py":F) chmod +x test/test-disassem.py ;; "test/test-dbgcall.py":F) chmod +x test/test-dbgcall.py ;; "test/test-fifo-connect.py":F) chmod +x test/test-fifo-connect.py ;; "test/test-file.py":F) chmod +x test/test-file.py ;; "test/test-fns.py":F) chmod +x test/test-fns.py ;; "test/test-help.py":F) chmod +x test/test-help.py ;; "test/test-import.py":F) chmod +x test/test-import.py ;; "test/test-linetrace.py":F) chmod +x test/test-linetrace.py ;; "test/test-pm.py":F) chmod +x test/test-pm.py ;; "test/test-run.py":F) chmod +x test/test-run.py ;; "test/test-save.py":F) chmod +x test/test-save.py ;; "test/test-setshow.py":F) chmod +x test/test-setshow.py ;; "test/test-sig.py":F) chmod +x test/test-sig.py ;; "test/test-sighandle.py":F) chmod +x test/test-sighandle.py ;; "test/test-skip.py":F) chmod +x test/test-skip.py ;; "test/test-step.py":F) chmod +x test/test-step.py ;; "test/test-tcp-connect.py":F) chmod +x test/test-tcp-connect.py ;; "test/test-trace.py":F) chmod +x test/test-trace.py ;; "test/test-with.py":F) chmod +x test/test-with.py ;; "test/test.py":F) chmod +x test/test.py ;; "test/unit/bytecode.py":F) chmod +x test/unit/bytecode.py ;; "test/unit/checkline.py":F) chmod +x test/unit/checkline.py ;; "test/unit/fns.py":F) chmod +x test/unit/fns.py ;; "test/unit/listsize.py":F) chmod +x test/unit/listsize.py ;; "test/unit/pydbcmd.py":F) chmod +x test/unit/pydbcmd.py ;; "test/unit/sighandler.py":F) chmod +x test/unit/sighandler.py ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi pydb-1.26/TODO0000644000175000017500000000242410552146445010021 00000000000000Note invalid combinations "stop pass", "noprint stack" is buggy. break line thread-name buggy investigate quit exception passing through in ipython. Add to ddd recent features, e.g. assembly, threads, display expressions Write Bdb documentation. Remote debugging add for threading: step [count] Thread-name next [count] Thread-name Mock objects for thread id's/names. Then more tests on thread code. reinstate "thread" command? Add watchpoints. (Mentioned in pdbimprovements) The main pydb.py file size has been reduced but it is still bit large. If we can break out into more files that might be nice. Some more regression tests should to be written. They've been invaluable so far and maintain quality. Especially for the large changes. Redo post_mortem, pm, set_step to funnel through parse_options rather than taking the optional cmdfile and opts parameters. gdb return command relies on the existence of a return statement in the code. Add online debugger concept help and in LaTeX? Add in patches of various Bdb's such as the one in Eric. Better history completion. Better history completion interaction inside ipython and with or without Emacs. Eric or Idle integration. Use inspect module get_stack rather than bdb's? $Id: TODO,v 1.21 2007/01/13 12:14:29 rockyb Exp $ pydb-1.26/aclocal.m40000644000175000017500000007722511167754541011211 00000000000000# generated automatically by aclocal 1.10.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(AC_AUTOCONF_VERSION, [2.61],, [m4_warning([this file was generated for autoconf 2.61. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.10' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.10.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.10.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 13 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, # 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # AM_PATH_LISPDIR # --------------- AC_DEFUN([AM_PATH_LISPDIR], [AC_PREREQ([2.60])dnl # If set to t, that means we are running in a shell under Emacs. # If you have an Emacs named "t", then use the full path. test x"$EMACS" = xt && EMACS= AC_CHECK_PROGS([EMACS], [emacs xemacs], [no]) AC_ARG_VAR([EMACS], [the Emacs editor command]) AC_ARG_VAR([EMACSLOADPATH], [the Emacs library search path]) AC_ARG_WITH([lispdir], [ --with-lispdir override the default lisp directory], [ lispdir="$withval" AC_MSG_CHECKING([where .elc files should go]) AC_MSG_RESULT([$lispdir])], [ AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [ if test $EMACS != "no"; then if test x${lispdir+set} != xset; then # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly # Some emacsen will start up in interactive mode, requiring C-x C-c to exit, # which is non-obvious for non-emacs users. # Redirecting /dev/null should help a bit; pity we can't detect "broken" # emacsen earlier and avoid running this altogether. AC_RUN_LOG([$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' conftest.out]) am_cv_lispdir=`sed -n \ -e 's,/$,,' \ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \ conftest.out` rm conftest.out fi fi test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp' ]) lispdir="$am_cv_lispdir" ]) AC_SUBST([lispdir]) ])# AM_PATH_LISPDIR AU_DEFUN([ud_PATH_LISPDIR], [AM_PATH_LISPDIR]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 1.5 are not dnl supported because the default installation locations changed from dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages dnl in 1.5. m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python2.5 python2.4 python2.3 python2.2 dnl python2.1 python2.0 python1.6 python1.5]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT(yes)], [AC_MSG_ERROR(too old)]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; print sys.version[[:3]]"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null || echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. distutils does not exist in dnl Python 1.5, so we fall back to the hardcoded directory if it dnl doesn't work. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null || echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # hexversion has been introduced in Python 1.5.2; it's probably not # worth to support older versions (1.5.1 was released on October 31, 1998). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys, string # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. minver = map(int, string.split('$2', '.')) + [[0, 0, 0]] minverhex = 0 for i in xrange(0, 4): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR pydb-1.26/setup.py.in0000644000175000017500000001071411042724566011452 00000000000000#!/usr/bin/env python # # Copyright (C) 2006 Rocky Bernstein # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose with or without fee is hereby granted, # provided that the above copyright notice and this permission notice # appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. from optparse import OptionParser import sys, os def do_cmd(cmd): """Run a command and possibly print it out first. If the command fails, we die!""" global opts if opts.verbose: print cmd exit_status = os.system(cmd) if exit_status != 0: sys.exit(exit_status) print """Note: we don't do python-style install yet. But as a service we'll try to transfer your call, but don't expect too much.""" optparser = OptionParser() optparser.add_option("--prefix", "", dest="prefix", action="store", help="--prefix option to pass to configure", metavar='[prefix directory]') optparser.add_option("--install-scripts", "", dest="bindir", action="store", help="--bindir opton to pass to configure", metavar='[executable directory in PATH]') optparser.add_option("--verbose", "-v", dest="verbose", action="store_true", default=False, help="lame attempt at verbosity ") (opts, args) = optparser.parse_args() do_install = do_build = False for arg in args: if arg=='install': do_build=True do_install=True if arg=='build': do_build=True ## Okay, now time to configure, make, make install configure_cmd='./configure ' if opts.prefix != None: config_opts += "--prefix %s" % opts.prefix if opts.bindir != None: config_opts += "--bindir %s" % opts.bindir do_cmd(configure_cmd) if do_build: do_cmd("make") if do_install: do_cmd("make install") sys.exit(0) ### Maybe someday we'll do this: if False: from distutils.core import setup setup( name = "pydb", version = "@PACKAGE_VERSION@", description = "Improved Python Debugger", long_description = \ """pydb is an expanded version of the Python debugger loosely based on the gdb command set. It also has all of the features found in an earlier version of pydb.py that was distributed with the debugger GUI ddd. Some (but by no means all) of the features and changes from pdb.py: * thread debugging. (Experimental) * signal handling (similar to gdb's). * non-interactive POSIX-shell like line tracing. * disassembly of instructions * ipython support * ability to flexibly redirect debugger output to a file (useful for example in cgi's) * Many gdb commands such as the set/show/info commands * gdb-like help with subcommand-specific help available on info, set, or show subcommands; e.g. help info line works * Restart program saving settings (gdb's run) or a pure exec restart. (The latter reloads the entire debugger and will cause imports to get reloaded.) * debugger is installed in binary directory; i.e. one runs "pydb script..." rather than "python pdb.py script..." * Accepts debugger command options; e.g. redirecting debugger output, initial debugger script, or batch mode. * Perl's "examine" command to show info about a symbol. For functions, methods, classes and modules the documentation string if any is printed. For functions, we also show the argument list. For objects, instance variables of the class and object are shown. * More extensive and complete documentation. * Comes with regression tests. Can also be subclassed to capture debugger output. * Works with GUI frontend ddd. (For now a testing version of ddd is required.) """, author = "Rocky Bernstein", author_email = "rockyb@users.sourceforge.net", license = "BSD-like", url = "http://bashdb.sourceforge.net/pydb", packages = ['pydb'] ) ### pydb-1.26/pydb/0000777000175000017500000000000011167772525010360 500000000000000pydb-1.26/pydb/fns.py0000644000175000017500000005071011167745261011434 00000000000000"""Functions to support the Extended Python Debugger. $Id: fns.py,v 1.60 2009/03/20 01:30:51 rockyb Exp $""" # -*- coding: utf-8 -*- # Copyright (C) 2007, 2008, 2009 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import dis, inspect, linecache, os, shlex, sys, re, traceback, types from opcode import opname # A pattern for a def header seems to be used a couple of times. _re_def_str = r'^\s*def\s' _re_def = re.compile(_re_def_str) # arg_split culled from ipython's routine def arg_split(s,posix=False): """Split a command line's arguments in a shell-like manner. This is a modified version of the standard library's shlex.split() function, but with a default of posix=False for splitting, so that quotes in inputs are respected.""" lex = shlex.shlex(s, posix=posix) lex.whitespace_split = True return list(lex) def checkline(obj, filename, lineno): """Check whether specified line seems to be executable. Return LINENO if it is, 0 if not (e.g. a docstring, comment, blank line or EOF). Warning: testing is not comprehensive. """ if (2 == linecache.getline.func_code.co_argcount or not obj.curframe): line = linecache.getline(filename, lineno) else: line = linecache.getline(filename, lineno, obj.curframe.f_globals) pass if not line: obj.errmsg('End of file') return 0 line = line.strip() # Don't allow setting breakpoint at a blank line if (not line or (line[0] == '#') or (line[:3] == '"""') or line[:3] == "'''"): obj.errmsg('Blank, doc string, or comment') return 0 return lineno def columnize_array(list, max_elts=50, displaywidth=80): """Display an array as a compact column-aligned set of columns. Columns are separated by two spaces (one was not legible enough). """ if not list: return "\n" if len(list) > max_elts: list = list[0:max_elts-1] elipsis = True else: elipsis = False nonscalars = [i for i in range(len(list)) if not (type(list[i]) in [types.BooleanType, types.FloatType, types.IntType, types.StringType, types.UnicodeType, types.NoneType, types.LongType])] if nonscalars: return ("list[i] not a scalar for i in %s" % ", ".join(map(str, nonscalars))) size = len(list) if size == 1: return '[%s]' % str(list[0]) # Consider arranging list in 1 rows total, then 2 rows... # Stop when at the smallest number of rows which # can be arranged less than the display width. for nrows in range(1, len(list)): ncols = (size+nrows-1) // nrows # ceil(size/nrows) colwidths = [] totwidth = -2 # get max column width for this column for col in range(ncols): colwidth = 0 for row in range(nrows): i = row*ncols + col # [rows, cols] if i >= size: break x = list[i] colwidth = max(colwidth, len(repr(x))) colwidths.append(colwidth) totwidth += colwidth + 2 if totwidth > displaywidth: break if totwidth <= displaywidth: break else: nrows = len(list) ncols = 1 colwidths = [0] # The smallest number of rows computed and the # max widths for each column has been obtained. # Now we just have to format each of the # rows. s = '[' for row in range(nrows): texts = [] for col in range(ncols): i = row*ncols + col if i >= size: x = "" else: x = list[i] texts.append(x) while texts and not texts[-1]: del texts[-1] for col in range(len(texts)): texts[col] = repr(texts[col]).ljust(colwidths[col]) s += ("%s\n "%str(", ".join(texts))) s = s[0:-2] if elipsis: s += "..." s += ']' return s def count_frames(frame, count_start=0): "Return a count of number of frames" count = -count_start while frame: count += 1 frame = frame.f_back return count def decorate_fn_with_doc(new_fn, old_fn, additional_text=""): """Make new_fn have old_fn's doc string. This is particularly useful for the do_... commands that hook into the help system. Adapted from from a comp.lang.python posting by Duncan Booth.""" def wrapper(*args, **kw): return new_fn(*args, **kw) wrapper.__doc__ = old_fn.__doc__ + additional_text return wrapper def file_pyc2py(filename): """Given a file name, if the suffix is pyo or pyc (an optimized bytecode file), change that to the py equivalent""" if (filename.endswith(".pyc") or filename.endswith(".pyo")): return filename[:-1] return filename def file2module(filename): """Given a file name, extract the most likely module name. """ basename = os.path.basename(filename) if '.' in basename: pos = basename.rfind('.') return basename[:pos] else: return basename return None def find_function(funcname, filename): try: cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname)) # cre = re.compile(r'%s\s*%s\s*[(]' % (_re_def_str, funcname)) except: return None try: fp = open(filename) except IOError: return None # consumer of this info expects the first line to be 1 lineno = 1 answer = None while True: line = fp.readline() if line == '': break if cre.match(line): answer = funcname, filename, lineno break lineno += 1 fp.close() return answer def get_confirmation(obj, prompt, default=False): """ Called when a dangerous action is about to be done to make sure it's okay. Get a yes/no answer to `prompt' which is printed, suffixed with a question mark and the default value. The user response converted to a boolean is returned. obj is an object that has a boolean `noninteractive' attribute and a `msg' method. The default value is used for the return if we aren't interactive. """ if default: prompt += '? (Y or n) ' else: prompt += '? (N or y) ' pass while True and not obj.noninteractive: try: reply = raw_input(prompt).strip() reply = reply.strip().lower() except EOFError: reply = 'no' if reply in ('y', 'yes'): return True elif reply in ('n', 'no'): return False else: obj.msg("Please answer y or n.") return default def get_exec_string(frame, max=30): """get_exec_string(frame, max)->prefix string Get the initial part the string in an exec command. frame is the frame, and max characters of the string will be returned adjusted with a trailing ... and any quote mark. A real hack until tracebacks do better in location reporting. """ if frame == None: return None fi, li, fn, text = traceback.extract_stack(frame)[-1] re_exec = re.compile(r'(^|\s+)exec\s+(.*)') mo = re_exec.search(text) if mo: exec_arg = mo.group(2) if len(exec_arg) > max: if exec_arg[0] == '"' or \ exec_arg[0] == "'": quote=exec_arg[0] else: quote='' return "%s...%s" % (exec_arg[0:max], quote) else: return exec_arg return None def is_exec_stmt(frame): """Return True if we are looking at an exec statement""" return frame.f_back is not None and op_at_frame(frame.f_back)=='EXEC_STMT' def get_call_function_name(frame): """If f_back is looking at a call function, return the name for it. Otherwise return None""" f_back = frame.f_back if not f_back: return None if 'CALL_FUNCTION' != op_at_frame(f_back): return None co = f_back.f_code code = co.co_code labels = dis.findlabels(code) linestarts = dict(dis.findlinestarts(co)) inst = f_back.f_lasti while inst >= 0: c = code[inst] op = ord(c) if inst in linestarts: inst += 1 oparg = ord(code[inst]) + (ord(code[inst+1]) << 8) return co.co_names[oparg] inst -= 1 pass return None def get_last_tb_or_frame_tb(): """Intended to be used going into post mortem routines. If sys.last_traceback is set, we will return that and assume that this is what post-mortem will want. If sys.last_traceback has not been set, then perhaps we *about* to raise an error and are fielding an exception. So assume that sys.exc_info()[2] is where we want to look.""" tb = sys.exc_info()[2] try: if inspect.istraceback(sys.last_traceback): # We do have a traceback so prefer that. tb = sys.last_traceback except AttributeError: pass return tb def get_brkpt_lineno(obj, arg): """get_brkpt_lineno(obj,arg)->(filename, file, lineno) See if arg is a line number or a function name. Return what we've found. None can be returned as a value in the triple. obj should be some sort of Gdb object and contain a curframe, errmsg and lineinfo method. """ funcname, filename = (None, None) try: # First see if the breakpoint is an integer lineno = int(arg) filename = obj.curframe.f_code.co_filename except ValueError: try: func = eval(arg, obj.curframe.f_globals, obj.curframe.f_locals) except: func = arg try: # See if agument is a function name if hasattr(func, 'im_func'): func = func.im_func code = func.func_code # use co_name to identify the bkpt (function names #could be aliased, but co_name is invariant) lineno = code.co_firstlineno filename = code.co_filename except: # The last possibility is that a breakpoint argument can be # is some sort of file + linenumber. (ok, filename, ln) = obj.lineinfo(arg) if not ok: obj.errmsg(('The specified object %s is not' +' a function, or not found' +' along sys.path or no line given.') % str(repr(arg))) return (None, None, None) funcname = ok lineno = int(ln) return (funcname, filename, lineno) def print_dict(s, obj, title): if hasattr(obj, "__dict__"): d=obj.__dict__ if type(d) == types.DictType or type(d) == types.DictProxyType: s += "\n%s:\n" % title keys = d.keys() keys.sort() for key in keys: s+=" '%s':\t%s\n" % (key, d[key]) return s def print_argspec(obj, obj_name): '''A slightly decorated version of inspect.format_argspec''' try: return obj_name + inspect.formatargspec(*inspect.getargspec(obj)) except: return None return # Not reached def print_obj(arg, frame, format=None, short=False): """Return a string representation of an object """ try: if not frame: # ?? Should we have set up a dummy globals # to have persistence? obj = eval(arg, None, None) else: obj = eval(arg, frame.f_globals, frame.f_locals) except: return 'No symbol "' + arg + '" in current context.' #format and print what = arg if format: what = format + ' ' + arg obj = printf(val, format) s = '%s = %s' % (what, obj) if not short: s += '\ntype = %s' % type(obj) if callable(obj): argspec = print_argspec(obj, arg) if argspec: s += ':\n\t' if inspect.isclass(obj): s += 'Class constructor information:\n\t' obj = obj.__init__ elif type(obj) is types.InstanceType: obj = obj.__call__ pass s+= argspec pass # Try to list the members of a class. # Not sure if this is correct or the # best way to do. s = print_dict(s, obj, "object variables") if hasattr(obj, "__class__"): s = print_dict(s, obj.__class__, "class variables") pass return s pconvert = {'c':chr, 'x': hex, 'o': oct, 'f': float, 's': str} twos = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111') def printf(val, fmt): global pconvert, twos if not fmt: fmt = ' ' # not 't' nor in pconvert # Strip leading '/' if fmt[0] == '/': fmt = fmt[1:] f = fmt[0] if f in pconvert.keys(): try: return apply(pconvert[f], (val,)) except: return str(val) # binary (t is from 'twos') if f == 't': try: res = '' while val: res = twos[val & 0xf] + res val = val >> 4 return res except: return str(val) return str(val) def op_at_frame(frame, pos=None): code = frame.f_code.co_code if pos is None: pos = frame.f_lasti try: op = ord(code[pos]) except IndexError: return 'got IndexError' return opname[op] def print_stack_entry(obj, i_stack): frame_lineno = obj.stack[len(obj.stack)-i_stack-1] frame, lineno = frame_lineno if frame is obj.curframe: obj.msg_nocr('->') else: obj.msg_nocr('##') obj.msg("%d %s" % (i_stack, obj.format_stack_entry(frame_lineno))) def print_stack_trace(obj, count=None): "Print count entries of the stack trace" if count is None: n=len(obj.stack) else: n=min(len(obj.stack), count) try: for i in range(n): print_stack_entry(obj, i) except KeyboardInterrupt: pass return def runhooks(obj, hook_list, *args): for hook in hook_list: try: hook(obj, args) except: pass return def search_python_file(filename, directories=sys.path, module_globals=None): fullname = filename try: stat = os.stat(fullname) except os.error, msg: basename = os.path.split(filename)[1] # Try for a __loader__, if available if module_globals and '__loader__' in module_globals: name = module_globals.get('__name__') loader = module_globals['__loader__'] get_source = getattr(loader, 'get_source', None) if name and get_source: if basename.startswith(name.split('.')[-1]+'.'): try: data = get_source(name) except (ImportError, IOError): pass else: if data is None: # No luck, the PEP302 loader cannot find the source # for this module. return [] cache[filename] = ( len(data), None, [line+'\n' for line in data.splitlines()], fullname ) return cache[filename][2] # Try looking through the module search path, taking care to handle packages. if basename == '__init__.py': # filename referes to a package basename = filename for dirname in sys.path: # When using imputil, sys.path may contain things other than # strings; ignore them when it happens. try: fullname = os.path.join(dirname, basename) except (TypeError, AttributeError): # Not sufficiently string-like to do anything useful with. pass else: try: stat = os.stat(fullname) break except os.error: pass else: # No luck ## print '*** Cannot stat', filename, ':', msg return [] try: fp = open(fullname, 'rU') lines = fp.readlines() fp.close() except IOError, msg: ## print '*** Cannot open', fullname, ':', msg return [] def search_file(filename, directories, cdir): """Return a full pathname for filename if we can find one. path is a list of directories to prepend to filename. If no file is found we'll return None""" for trydir in directories: # Handle $cwd and $cdir if trydir =='$cwd': trydir='.' elif trydir == '$cdir': trydir = cdir tryfile = os.path.abspath(os.path.join(trydir, filename)) if os.path.isfile(tryfile): return tryfile return None def show_onoff(bool): """Return 'on' for True and 'off' for False, and ?? for anything else.""" if type(bool) != types.BooleanType: return "??" if bool: return "on" return "off" def parse_filepos(obj, arg): """parse_filepos(obj, arg)->(fn, filename, lineno) Parse arg as [filename:]lineno | function Make sure it works for C:\foo\bar.py:12 """ colon = arg.rfind(':') if colon >= 0: filename = arg[:colon].rstrip() f = obj.lookupmodule(filename) if not f: obj.errmsg("'%s' not found using sys.path" % filename) return (None, None, None) else: filename = f arg = arg[colon+1:].lstrip() try: lineno = int(arg) except TypeError: obj.errmsg("Bad lineno: %s", str(arg)) return (None, filename, None) return (None, filename, lineno) else: # no colon: can be lineno or function return get_brkpt_lineno(obj, arg) def whence_file(py_script): """Do a shell-like path lookup for py_script and return the results. If we can't find anything return py_script""" if py_script.find(os.sep) != -1: # Don't search since this name has path separator components return py_script for dirname in os.environ['PATH'].split(os.pathsep): py_script_try = os.path.join(dirname, py_script) if os.path.exists(py_script_try): return py_script_try # Failure return py_script if __name__ == '__main__': print "show_onoff(True is %s)" % str(show_onoff(True)) assert show_onoff(True) == 'on' print "show_onoff(False is %s)" % str(show_onoff(False)) print print_argspec(show_onoff, 'show_onoff') assert show_onoff(False) == 'off' print "search_file('fns.py', '.', '.'): %s" % ( search_file("fns.py", ["$cwd", "$cdir"], ".")) assert printf(31, "/o") == '037' assert printf(31, "/t") == '00011111' assert printf(33, "/c") == '!' assert printf(33, "/x") == '0x21' assert file2module("/tmp/gcd.py") == 'gcd' assert columnize_array(["a"]) == "[a]" print columnize_array([ "one", "two", "three", "4ne", "5wo", "6hree", "7ne", "8wo", "9hree", "10e", "11o", "12ree", "13e", "14o", "15ree", "16e", "17o", "18ree", "19e", "20o", "21ree", "22e", "23o", "24ree", "25e", "26o", "27ree", "28e", "29o", "30ree", "31e", "32o", "33ree", "34e", "35o", "36ree", "37e", "38o", "39ree", "40e", "41o", "42ree", "43e", "44o", "45ree", "46e", "47o", "48ree", "one", "two", "three"]) pass pydb-1.26/pydb/threadinfo.py0000644000175000017500000003161510563223152012761 00000000000000"""Routines to show Thread information $Id: threadinfo.py,v 1.5 2007/02/10 01:56:58 rockyb Exp $""" # -*- coding: utf-8 -*- # Copyright (C) 2006, 2007 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import inspect, os, sys, threading def find_nondebug_frame(obj, f): """Find the first frame that isn't a debugger frame. Generally we want traceback information without polluting it with debugger information. """ if obj.dbg_pydb: return f f = obj.is_in_dbg(f) ### FIXME: would like a routine like is_in_threaddb_dispatch ### but works with threading instead. Decorating or subclassing ### threadding might do the trick. (filename, line_no, routine) = inspect.getframeinfo(f)[0:3] (path, basename)=os.path.split(filename) while (basename.startswith('threading.py') or basename.startswith('gdb.py') or basename.startswith('threaddbg.py') or basename.startswith('subcmd.py') or basename.startswith('pydb.py') or routine == 'trace_dispatch_gdb') and f.f_back: f = f.f_back (filename, line_no, routine) = \ inspect.getframeinfo(f)[0:3] (path, basename)=os.path.split(filename) return f def id2threadName(thread_id): """Turn a thread id into a thread name. Works in Python 2.5 or greater.""" return threading.Thread.getName(threading._active[thread_id]) def is_in_threaddbg_dispatch(f): """Returns True if frame f is the threaddbg dispatch routine""" ## First check that the routine name and prefix of the filename's ## basename are what we expect. (filename, line_no, routine) = inspect.getframeinfo(f)[0:3] (path, basename)=os.path.split(filename) ## print routine, filename if routine != 'trace_dispatch' or not basename.startswith('threaddbg.py'): return False # Next check to see that local variable breadcrumb exists and # has the magic dynamic value. if 'breadcrumb' in f.f_locals: if is_in_threaddbg_dispatch == f.f_locals['breadcrumb']: return True return False def is_in_threaddbg(f): """Find the first frame that isn't a debugger frame. Generally we want traceback information without polluting it with debugger information. """ """Returns the most recent frame that doesn't contain a threaddbg frame as its parent. Note this frame is not part of threaddbg. If there is no frame (i.e. no thread debugging) then f would be returned.""" return_frame=f while f: if is_in_threaddbg_dispatch(f): # Can't use previous return_frame return_frame = f.f_back f = f.f_back return return_frame def is_in_gdb_dispatch(f): """Returns True if frame f is the threaddbg dispatch routine""" ## First check that the routine name and prefix of the filename's ## basename are what we expect. (filename, line_no, routine) = inspect.getframeinfo(f)[0:3] (path, basename)=os.path.split(filename) ## print routine, filename if (routine != 'trace_dispatch_gdb' or not basename.startswith('gdb.py')): return False # Next check to see that local variable breadcrumb exists and # has the magic dynamic value. if 'breadcrumb' in f.f_locals: if is_in_gdb_dispatch == f.f_locals['breadcrumb']: return True return False def is_in_gdb(f): """Find the first frame that isn't a debugger frame. Generally we want traceback information without polluting it with debugger information. """ """Returns the most recent frame that doesn't contain a gdb_dbg frame as its parent. Note this frame is not part of dbg. If there is no frame (i.e. no thread debugging) then f would be returned.""" return_frame=f while f: if is_in_gdb_dispatch(f): # Can't use previous return_frame return_frame = f.f_back f = f.f_back return return_frame def stack_trace(obj, f): """A mini stack trace routine for threads.""" f = find_nondebug_frame(obj, f) while f: is_in_threaddbg_dispatch(f) s = obj.format_stack_entry((f, f.f_lineno)) obj.msg(" "*4 + s) f = f.f_back # For Python before 2.5b1 and no threadframe module def info_thread_old(obj, args, short_display=False): """List all currently-known thread names. This routine is used when the version of Python is prior to 2.5 and threadframe has not been installed.""" obj.thread_name = threading.currentThread().getName() if len(args) == 2: if args[1].startswith('terse'): obj.info_thread_terse() return if len(args) > 1: if hasattr(obj, "traced"): if args[1] not in obj.traced.keys(): obj.msg("Don't know about thread %s" % args[1]) obj.info_thread_terse() return else: obj.errmsg("thread support not enabled; use --threading option") return obj.msg("Current thread is %s" % obj.thread_name) if len(args) == 3 and args[2].startswith('terse'): obj.info_thread_terse(args[2]) return for t in threading.enumerate(): obj.msg(t) obj.info_thread_terse() return ## FIXME remove common code with info_thread_new # For Python with threadframe def info_threadframe(obj, args, short_display=False): """List all currently-known thread names. info thread [thread-name|thread-id] [terse|verbose] If no thread name is given, we list info for all threads. A terse listing just gives the thread name and thread id. If 'verbose' appended to the end of the command, then the entire stack trace is given for each frame. This routine uses threadframe. Better support however is available starting with Python version 2.5.""" obj.thread_name = threading.currentThread().getName() threads = sys._current_frames() all_verbose = False if len(args) == 2: if args[1].startswith('verbose'): all_verbose = True elif args[1].startswith('terse'): obj.info_thread_terse() return if len(args) > 1 and not all_verbose: thread_name = args[1] if thread_name == '.': thread_name = threading.currentThread().getName() try: thread_id = int(thread_name) if thread_id not in threads.keys(): obj.msg("Don't know about thread number %s" % thread_name) obj.info_thread_terse() return except ValueError: if thread_name not in obj.traced.keys(): obj.msg("Don't know about thread %s" % thread_name) obj.info_thread_terse() return thread_id = obj.traced[thread_name] frame = threads[thread_id] frame = find_nondebug_frame(obj, frame) stack_trace(obj, frame) return thread_id2name = {} if hasattr(obj, "traced"): for thread_name in obj.traced.keys(): if obj.get_threadframe_frame(thread_name) is not None: thread_id2name[obj.traced[thread_name]] = thread_name # Show info about *all* threads # FIXME: sort by thread name for thread_id in threads.keys(): s = '' # Print location where thread was created and line number if thread_id in thread_id2name.keys(): thread_name = thread_id2name[thread_id] if thread_name == obj.thread_name: prefix='-> ' else: prefix=' ' s += "%s%s" % (prefix, thread_name) if all_verbose: s += ": %d" % thread_id else: s += " thread id: %d" % thread_id s += "\n " frame = find_nondebug_frame(obj, threads[thread_id]) s += obj.format_stack_entry((frame, frame.f_lineno)) obj.msg('-' * 40) obj.msg(s) frame = frame.f_back if all_verbose and frame: stack_trace(obj, frame) return False ## FIXME remove common code with info_thread_new # For Python on or after 2.5b1 def info_thread_new(obj, args, short_display=False): """List all currently-known thread names. info thread [thread-name|thread-number] [terse|verbose] If no thread name is given, we list info for all threads. Unless a terse listing, for each thread we give: - the class, thread name, and status as - the top-most call-stack information for that thread. Generally the top-most calls into the debugger and dispatcher are omitted unless set debug-pydb is True. If 'verbose' appended to the end of the command, then the entire stack trace is given for each frame. If 'terse' is appended we just list the thread name and thread id. To get the full stack trace for a specific thread pass in the thread name. This is the Python 2.5 version of this routine.""" obj.thread_name = threading.currentThread().getName() threads = sys._current_frames() all_verbose = False if len(args) == 2: if args[1].startswith('verbose'): all_verbose = True elif args[1].startswith('terse'): obj.info_thread_terse() return if len(args) > 1 and not all_verbose: thread_name = args[1] if thread_name == '.': thread_name = threading.currentThread().getName() try: thread_id = int(thread_name) if thread_id not in threads.keys(): obj.msg("Don't know about thread number %s" % thread_name) obj.info_thread_terse() return except ValueError: if (not hasattr(obj, "traced") or thread_name not in obj.traced.keys()): obj.msg("Don't know about thread %s" % thread_name) obj.info_thread_terse() return thread_id = obj.traced[thread_name] frame = threads[thread_id] frame = find_nondebug_frame(obj, frame) stack_trace(obj, frame) return # Show info about *all* threads thread_key_list = threads.keys() thread_key_list.sort(key=id2threadName) for thread_id in thread_key_list: frame = threads[thread_id] frame = find_nondebug_frame(obj, frame) s = '' # Print location where thread was created and line number if thread_id in threading._active: thread_name = id2threadName(thread_id) if thread_name == obj.thread_name: prefix='-> ' else: prefix=' ' s += "%s%s" % (prefix, str(threading._active[thread_id])) if all_verbose: s += ": %d" % thread_id else: s += " thread id: %d" % thread_id s += "\n " s += obj.format_stack_entry((frame, frame.f_lineno)) obj.msg('-' * 40) obj.msg(s) frame = frame.f_back if all_verbose and frame: stack_trace(obj, frame) return False def info_thread_line(obj, thread_name): prefix=' ' if not hasattr(obj, "thread_name"): obj.msg("%s%s" % (prefix, thread_name)) return if thread_name == obj.thread_name: prefix='-> ' obj.msg("%s%s: %d" % (prefix, thread_name, obj.traced[thread_name])) return def info_thread_missing(obj): """Show information about threads we might not know about""" if not hasattr(obj, "traced"): return if (hasattr(sys, "_current_frames") and len(obj.traced) != len(sys._current_frames())): frames = sys._current_frames() thread_ids = frames.keys() obj.msg("Untraced/unknown threads:") for thread_id in thread_ids: if thread_id not in obj.traced.values(): obj.msg("\t%d" % thread_id) return def info_thread_terse(obj, arg=None): if arg is not None: thread_name = arg if thread_name in obj.traced_keys(): obj.info_thread_line(thread_name) else: obj.msg("Don't know about thread name %s" % thread_name) return # Show all threads thread_name_list = obj.traced.keys() thread_name_list.sort() for thread_name in thread_name_list: obj.info_thread_line(thread_name) obj.info_thread_missing() return False pydb-1.26/pydb/sighandler.py0000644000175000017500000004224111167745261012766 00000000000000# -*- coding: utf-8 -*- """$Id: sighandler.py,v 1.36 2009/03/07 04:20:25 rockyb Exp $ Handles signal handlers within Pydb. """ #TODO: # - Doublecheck handle_pass and other routines. # - can remove signal handler altogether when # ignore=True, print=False, pass=True # # import signal, types def YN(bool): """Return 'Yes' for True and 'No' for False, and ?? for anything else.""" if type(bool) != types.BooleanType: return "??" if bool: return "Yes" return "No" def lookup_signame(num): """Find the corresponding signal name for 'num'. Return None if 'num' is invalid.""" signames = signal.__dict__ num = abs(num) for signame in signames.keys(): if signames[signame] == num: return signame pass # Something went wrong. Should have returned above return def lookup_signum(name): """Find the corresponding signal number for 'name'. Return None if 'name' is invalid.""" uname = name.upper() if (uname.startswith('SIG') and hasattr(signal, uname)): return getattr(signal, uname) else: uname = "SIG"+uname if hasattr(signal, uname): return getattr(signal, uname) return None return # Not reached def canonic_signame(name_num): """Return a signal name for a signal name or signal number. Return None is name_num is an int but not a valid signal number and False if name_num is a not number. If name_num is a signal name or signal number, the canonic if name is returned.""" signum = lookup_signum(name_num) if signum is None: # Maybe signame is a number? try: num = int(name_num) signame = lookup_signame(num) if signame is None: return None except: return False return signame signame = name_num.upper() if not signame.startswith('SIG'): return 'SIG'+signame return signame fatal_signals = ['SIGKILL', 'SIGSTOP'] # I copied these from GDB source code. signal_description = { "SIGHUP" : "Hangup", "SIGINT" : "Interrupt", "SIGQUIT" : "Quit", "SIGILL" : "Illegal instruction", "SIGTRAP" : "Trace/breakpoint trap", "SIGABRT" : "Aborted", "SIGEMT" : "Emulation trap", "SIGFPE" : "Arithmetic exception", "SIGKILL" : "Killed", "SIGBUS" : "Bus error", "SIGSEGV" : "Segmentation fault", "SIGSYS" : "Bad system call", "SIGPIPE" : "Broken pipe", "SIGALRM" : "Alarm clock", "SIGTERM" : "Terminated", "SIGURG" : "Urgent I/O condition", "SIGSTOP" : "Stopped (signal)", "SIGTSTP" : "Stopped (user)", "SIGCONT" : "Continued", "SIGCHLD" : "Child status changed", "SIGTTIN" : "Stopped (tty input)", "SIGTTOU" : "Stopped (tty output)", "SIGIO" : "I/O possible", "SIGXCPU" : "CPU time limit exceeded", "SIGXFSZ" : "File size limit exceeded", "SIGVTALRM" : "Virtual timer expired", "SIGPROF" : "Profiling timer expired", "SIGWINCH" : "Window size changed", "SIGLOST" : "Resource lost", "SIGUSR1" : "User-defined signal 1", "SIGUSR2" : "User-defined signal 2", "SIGPWR" : "Power fail/restart", "SIGPOLL" : "Pollable event occurred", "SIGWIND" : "SIGWIND", "SIGPHONE" : "SIGPHONE", "SIGWAITING": "Process's LWPs are blocked", "SIGLWP" : "Signal LWP", "SIGDANGER" : "Swap space dangerously low", "SIGGRANT" : "Monitor mode granted", "SIGRETRACT": "Need to relinquish monitor mode", "SIGMSG" : "Monitor mode data available", "SIGSOUND" : "Sound completed", "SIGSAK" : "Secure attention" } class SignalManager: """Manages Signal Handling information for the debugger - Do we print/not print when signal is caught - Do we pass/not pass the signal to the program - Do we stop/not stop when signal is caught Parameter pydb is an optional Pdb class. ignore is a list of signals to ignore. If you want no signals, use [] as None uses the default set. Parameter default_print specifies whether or not we print receiving a signals that is not ignored. All the methods which change these attributes return None on error, or True/False if we have set the action (pass/print/stop) for a signal handler. """ def __init__(self, pydb=None, ignore_list=None, default_print=True): if pydb is None: import pydb self.pydb = pydb.Pdb() else: self.pydb = pydb pass self.sigs = {} self.siglist = [] # List of signals. Dunno why signal doesn't provide. # Ignore signal handling initially for these known signals. if ignore_list is None: ignore_list = ['SIGALRM', 'SIGCHLD', 'SIGURG', 'SIGIO', 'SIGCLD', 'SIGVTALRM' 'SIGPROF', 'SIGWINCH', 'SIGPOLL', 'SIGWAITING', 'SIGLWP', 'SIGCANCEL', 'SIGTRAP', 'SIGTERM', 'SIGQUIT', 'SIGILL'] self.ignore_list = ignore_list self.info_fmt='%-14s%-4s\t%-4s\t%-5s\t%-4s\t%s' self.header = self.info_fmt % ('Signal', 'Stop', 'Print', 'Stack', 'Pass', 'Description') if default_print: default_print = self.pydb.msg for signame in signal.__dict__.keys(): # Look for a signal name on this os. if signame.startswith('SIG') and '_' not in signame: self.siglist.append(signame) if signame not in fatal_signals + ignore_list: self.sigs[signame] = self.SigHandler(signame, default_print, self.pydb.set_next, print_stack=False, pass_along=False) pass pass pass self.action('SIGINT stop print nostack nopass') return def check_and_adjust_sighandler(self, signame, sigs): """Check to see if a single signal handler that we are interested in has changed or has not been set initially. On return self.sigs[signame] should have our signal handler. True is returned if the same or adjusted, False or None if error or not found.""" signum = lookup_signum(signame) try: old_handler = signal.getsignal(signum) except ValueError: # On some OS's (Redhat 8), SIGNUM's are listed (like # SIGRTMAX) that getsignal can't handle. if signame in self.sigs: sigs.pop(signame) pass return None if old_handler != self.sigs[signame].handle: if old_handler not in [signal.SIG_IGN, signal.SIG_DFL]: # save the program's signal handler sigs[signame].old_handler = old_handler pass # set/restore _our_ signal handler try: signal.signal(signum, self.sigs[signame].handle) except ValueError: # Probably not in main thread return False pass return True def check_and_adjust_sighandlers(self): """Check to see if any of the signal handlers we are interested in have changed or is not initially set. Change any that are not right. """ for signame in self.sigs.keys(): if not self.check_and_adjust_sighandler(signame, self.sigs): break pass return def is_name_or_number(self, name_num): signame = canonic_signame(name_num) if signame is None: self.pydb.errmsg(("%s is not a signal number I know about.") % name_num) return False elif False == signame: self.pydb.errmsg(("%s is not a signal name I know about.") % name_num) return False return signame def print_info_signal_entry(self, signame): """Print status for a single signal name (signame)""" if signame in signal_description: description=signal_description[signame] else: description="" pass if signame not in self.sigs.keys(): # Fake up an entry as though signame were in sigs. self.pydb.msg(self.info_fmt % (signame, 'No', 'No', 'No', 'Yes', description)) return sig_obj = self.sigs[signame] self.pydb.msg(self.info_fmt % (signame, YN(sig_obj.stop_method is not None), YN(sig_obj.print_method is not None), YN(sig_obj.pass_along), YN(sig_obj.print_stack), description )) return def info_signal(self, args): """Print information about a signal""" if len(args) == 0: return None signame = args[0] if signame in ['handle', 'signal']: # This has come from pydb's info command if len(args) == 1: # Show all signal handlers self.pydb.msg(self.header) self.pydb.msg("") for signame in self.siglist: self.print_info_signal_entry(signame) return True else: signame = args[1] pass pass signame = self.is_name_or_number(signame) self.pydb.msg(self.header) self.print_info_signal_entry(signame) return True def action(self, arg): """Delegate the actions specified in 'arg' to another method. """ if not arg: self.info_signal(['handle']) return True args = arg.split() signame = args[0] signame = self.is_name_or_number(args[0]) if not signame: return if len(args) == 1: self.info_signal([signame]) return True # We can display information about 'fatal' signals, but not # change their actions. if signame in fatal_signals: return None if signame not in self.sigs.keys(): if signame in self.ignore_list: self.sigs[signame] = self.SigHandler(signame, self.msg, self.stop_next, print_stack=False, pass_along=False) else: self.pydb.errmsg('sighandler action: internal error') return None pass # multiple commands might be specified, i.e. 'nopass nostop' for attr in args[1:]: if attr.startswith('no'): on = False attr = attr[2:] else: on = True if 'stop'.startswith(attr): self.handle_stop(signame, on) elif 'print'.startswith(attr) and len(attr) >= 2: self.handle_print(signame, on) elif 'pass'.startswith(attr): self.handle_pass(signame, on) elif 'stack'.startswith(attr): self.handle_print_stack(signame, on) else: self.pydb.errmsg('Invalid arguments') pass pass return self.check_and_adjust_sighandler(signame, self.sigs) def handle_print_stack(self, signame, print_stack): """Set whether we stop or not when this signal is caught. If 'set_stop' is True your program will stop when this signal happens.""" self.sigs[signame].print_stack = print_stack return print_stack def handle_stop(self, signame, set_stop): """Set whether we stop or not when this signal is caught. If 'set_stop' is True your program will stop when this signal happens.""" if set_stop: self.sigs[signame].stop_method = self.pydb.set_next # stop keyword implies print AND nopass self.sigs[signame].print_method = self.pydb.msg self.sigs[signame].pass_along = False else: self.sigs[signame].stop_method = None pass return set_stop def handle_pass(self, signame, set_pass): """Set whether we pass this signal to the program (or not) when this signal is caught. If set_pass is True, Pydb should allow your program to see this signal. """ self.sigs[signame].pass_along = set_pass if set_pass: # Pass implies nostop self.sigs[signame].stop_method = None pass return set_pass def handle_ignore(self, signame, set_ignore): """'pass' and 'noignore' are synonyms. 'nopass and 'ignore' are synonyms.""" self.handle_pass(signame, not set_ignore) return set_ignore def handle_print(self, signame, set_print): """Set whether we print or not when this signal is caught.""" if set_print: self.sigs[signame].print_method = self.pydb.msg else: self.sigs[signame].print_method = None pass return set_print ## SigHandler is a class private to SignalManager class SigHandler: """Store information about what we do when we handle a signal, - Do we print/not print when signal is caught - Do we pass/not pass the signal to the program - Do we stop/not stop when signal is caught Parameters: signame : name of signal (e.g. SIGUSR1 or USR1) print_method routine to use for "print" stop routine to call to invoke debugger when stopping pass_along: True is signal is to be passed to user's handler """ def __init__(self, signame, print_method, stop_method, print_stack=False, pass_along=True): self.signum = lookup_signum(signame) if not self.signum: return try: self.old_handler = signal.getsignal(self.signum) except ValueError: # On some OS's (Redhat 8), SIGNUM's are listed (like # SIGRTMAX) that getsignal can't handle. if signame in self.sigs: self.sigs.pop(signame) pass self.pass_along = pass_along self.print_method = print_method self.signame = signame self.print_stack = print_stack self.stop_method = stop_method return def handle(self, signum, frame): """This method is called when a signal is received.""" if self.print_method: self.print_method('\nProgram received signal %s' % self.signame) if self.print_stack: import traceback strings = traceback.format_stack(frame) for s in strings: if s[-1] == '\n': s = s[0:-1] self.print_method(s) if self.pass_along: # pass the signal to the program if self.old_handler: self.old_handler(signum, frame) if self.stop_method is not None: ## FIXME not sure if this is really right if frame.f_trace is None: import pydb pydb.debugger() else: self.stop_method(frame) pass pass return pass pass # When invoked as main program, do some basic tests of a couple of functions if __name__=='__main__': for b in (True, False,): print 'YN of %s is %s' % (repr(b), YN(b)) pass for signum in range(signal.NSIG): signame = lookup_signame(signum) if signame is not None: assert(signum == lookup_signum(signame)) # Try without the SIG prefix assert(signum == lookup_signum(signame[3:])) pass pass for i in (15, -15, 300): print 'lookup_signame(%d): %s' % (i, lookup_signame(i)) pass for i in ('term', 'TERM', 'NotThere'): print 'lookup_signum(%s): %s' % (i, repr(lookup_signum(i))) pass for i in ('15', '-15', 'term', 'sigterm', 'TERM', '300', 'bogus'): print 'canonic_signame(%s): %s' % (i, canonic_signame(i)) pass h = SignalManager() h.info_signal(["TRAP"]) # Set to known value h.action('SIGUSR1') h.action('usr1 print pass stop') h.info_signal(['USR1']) # noprint implies no stop h.action('SIGUSR1 noprint') h.info_signal(['USR1']) h.action('foo nostop') # stop keyword implies print h.action('SIGUSR1 stop') h.info_signal(['SIGUSR1']) h.action('SIGUSR1 noprint') h.info_signal(['SIGUSR1']) h.action('SIGUSR1 nopass stack') h.info_signal(['SIGUSR1']) pass pydb-1.26/pydb/pydbbdb.py0000644000175000017500000004603511167745261012261 00000000000000"""$Id: pydbbdb.py,v 1.57 2009/03/06 09:41:37 rockyb Exp $ Routines here have to do with the subclassing of bdb. Defines Python debugger Basic Debugger (Bdb) class. This file could/should probably get merged into bdb.py """ import bdb, bytecode, inspect, linecache, time, types from repr import Repr from fns import * ## from complete import rl_complete def frame2file(obj, frame): return obj.filename(obj.canonic_filename(frame)) class Bdb(bdb.Bdb): # Additional levels call frames usually on the stack. # Perhaps should be an instance variable? extra_call_frames = 7 # Yes, it's really that many! def __init__(self): bdb.Bdb.__init__(self) self.bdb_set_trace = bdb.Bdb.set_trace ## self.complete = lambda arg: complete.rl_complete(self, arg) # Create a custom safe Repr instance and increase its maxstring. # The default of 30 truncates error messages too easily. self._repr = Repr() self._repr.maxstring = 100 self._repr.maxother = 60 self._repr.maxset = 10 self._repr.maxfrozen = 10 self._repr.array = 10 self._saferepr = self._repr.repr # Certain debugger commands are and actions only applicable # for running programs. Thus we record the running status of # the debugged code. self.running = False # A 0 value means stop on this occurrence. A positive value means to # skip that many more step/next's. self.step_ignore = 0 # Do we want to show/stop at def statements before they are run? self.deftrace = False return def __print_call_params(self, frame): "Show call paramaters and values" self.setup(frame) # Does format_stack_entry() have an 'include_location' parameter? fse_code = self.format_stack_entry.func_code fse_args = fse_code.co_varnames if 'include_location' in fse_args: self.msg(self.format_stack_entry(self.stack[-1], include_location=False)) else: self.msg(self.format_stack_entry(self.stack[-1])) return return def __print_location_if_trace(self, frame, include_fntrace=True): if self.linetrace or (self.fntrace and include_fntrace): self.setup(frame) self.print_location(print_line=True) self.display.display(self.curframe) if self.linetrace_delay: time.sleep(self.linetrace_delay) return return return def bp_commands(self, frame): """Call every command that was set for the current active breakpoint (if there is one) Returns True if the normal interaction function must be called, False otherwise """ # self.currentbp is set in bdb.py in bdb.break_here if # a breakpoint was hit if getattr(self,"currentbp",False) and self.currentbp in self.commands: currentbp = self.currentbp self.currentbp = 0 lastcmd_back = self.lastcmd self.setup(frame, None) for line in self.commands[currentbp]: self.onecmd(line) self.lastcmd = lastcmd_back if not self.commands_silent[currentbp]: self.print_location(print_line=self.linetrace) if self.commands_doprompt[currentbp]: self.cmdloop() self.forget() return False return True def is_running(self): if self.running: return True self.errmsg('The program being debugged is not being run.') return False def lookupmodule(self, filename): """Helper function for break/clear parsing -- may be overridden. lookupmodule() translates (possibly incomplete) file or module name into an absolute file name. """ if os.path.isabs(filename) and os.path.exists(filename): return filename f = os.path.join(sys.path[0], filename) if os.path.exists(f) and self.canonic(f) == self.mainpyfile: return f root, ext = os.path.splitext(filename) if ext == '': filename = filename + '.py' if os.path.isabs(filename): return filename for dirname in sys.path: while os.path.islink(dirname): dirname = os.readlink(dirname) fullname = os.path.join(dirname, filename) if os.path.exists(fullname): return fullname return None # Override Bdb methods def bpprint(self, bp, out=None): if bp.temporary: disp = 'del ' else: disp = 'keep ' if bp.enabled: disp = disp + 'y ' else: disp = disp + 'n ' self.msg('%-4dbreakpoint %s at %s:%d' % (bp.number, disp, self.filename(bp.file), bp.line), out) if bp.cond: self.msg('\tstop only if %s' % (bp.cond)) if bp.ignore: self.msg('\tignore next %d hits' % (bp.ignore), out) if (bp.hits): if (bp.hits > 1): ss = 's' else: ss = '' self.msg('\tbreakpoint already hit %d time%s' % (bp.hits, ss), out) return def output_break_commands(self): """Return a list of 'break' commands. This could be used to save and restore breakpoint status across a restart""" # FIXME: We are going to assume no breakpoints set # previously. bp_no is renumbered breakpoint numbers used # in subsequent "disable" commands. bp_no = 0 out = [] for bp in bdb.Breakpoint.bpbynumber: if bp: bp_no += 1 if bp.cond: condition = bp.cond else: condition = '' out.append("break %s:%s%s" % (self.filename(bp.file), bp.line, condition)) if not bp.enabled: out.append("disable %s" % bp_no) return out def break_here(self, frame): """This routine is almost copy of bdb.py's routine. Alas what pdb calls clear gdb calls delete and gdb's clear command is different. I tried saving/restoring method names, but that didn't catch all of the places break_here was called. """ filename = self.canonic(frame.f_code.co_filename) if not filename in self.breaks: return False lineno = frame.f_lineno if not lineno in self.breaks[filename]: # The line itself has no breakpoint, but maybe the line is the # first line of a function with breakpoint set by function name. lineno = frame.f_code.co_firstlineno if not lineno in self.breaks[filename]: return False # flag says ok to delete temp. bp (bp, flag) = bdb.effective(filename, lineno, frame) if bp: ## This is new when we have thread debugging. self.currentbp = bp.number if hasattr(bp, 'thread_name') and hasattr(self, 'thread_name') \ and bp.thread_name != self.thread_name: return False if (flag and bp.temporary): #### ARG. All for the below name change. self.do_delete(str(bp.number)) return True return False def canonic(self, filename): """ Overrides bdb canonic. We need to ensure the file we return exists! """ if filename == "<" + filename[1:-1] + ">": return filename canonic = self.fncache.get(filename) if not canonic: lead_dir = filename.split(os.sep)[0] if lead_dir == os.curdir or lead_dir == os.pardir: # We may have invoked the program from a directory # other than where the program resides. filename is # relative to where the program resides. So make sure # to use that. canonic = os.path.abspath(os.path.join(self.main_dirname, filename)) else: canonic = os.path.abspath(filename) if not os.path.isfile(canonic): canonic = search_file(filename, self.search_path, self.main_dirname) # Not if this is right for utter failure. if not canonic: canonic = filename canonic = os.path.realpath(os.path.normcase(canonic)) self.fncache[filename] = canonic return canonic return canonic def canonic_filename(self, frame): return self.canonic(frame.f_code.co_filename) def clear_break(self, filename, lineno): filename = self.canonic(filename) if not filename in self.breaks: self.errmsg('No breakpoint at %s:%d.' % (self.filename(filename), lineno)) return [] if lineno not in self.breaks[filename]: self.errmsg('No breakpoint at %s:%d.' % (self.filename(filename), lineno)) return [] # If there's only one bp in the list for that file,line # pair, then remove the breaks entry brkpts = [] for bp in bdb.Breakpoint.bplist[filename, lineno][:]: brkpts.append(bp.number) bp.deleteMe() if not bdb.Breakpoint.bplist.has_key((filename, lineno)): self.breaks[filename].remove(lineno) if not self.breaks[filename]: del self.breaks[filename] return brkpts return brkpts def complete(self, text, state): "A readline complete replacement" if hasattr(self, "completer"): if self.readline: line_buffer = self.readline.get_line_buffer() cmds = self.all_completions(line_buffer, False) else: line_buffer = '' cmds = self.all_completions(text, False) self.completer.namespace = dict(zip(cmds, cmds)) args=line_buffer.split() if len(args) < 2: self.completer.namespace.update(self.curframe.f_globals.copy()) self.completer.namespace.update(self.curframe.f_locals) return self.completer.complete(text, state) return None def filename(self, filename=None): """Return filename or the basename of that depending on the self.basename setting""" if filename is None: if self.mainpyfile: filename = self.mainpyfile else: return None if self.basename: return(os.path.basename(filename)) return filename def format_stack_entry(self, frame_lineno, lprefix=': ', include_location=True): """Format and return a stack entry gdb-style. Note: lprefix is not used. It is kept for compatibility. """ import repr as repr_mod frame, lineno = frame_lineno filename = frame2file(self, frame) s = '' if frame.f_code.co_name: s = frame.f_code.co_name else: s = "" args, varargs, varkw, local_vars = inspect.getargvalues(frame) if '' == s and ([], None, None,) == (args, varargs, varkw,): is_module = True if is_exec_stmt(frame): s += ' exec()' else: fn_name = get_call_function_name(frame) if fn_name: s += ' %s()' % fn_name pass else: is_module = False parms=inspect.formatargvalues(args, varargs, varkw, local_vars) if len(parms) >= self.maxargstrsize: parms = "%s...)" % parms[0:self.maxargstrsize] pass s += parms pass # ddd can't handle wrapped stack entries. # if len(s) >= 35: # s += "\n " if '__return__' in frame.f_locals: rv = frame.f_locals['__return__'] s += '->' s += repr_mod.repr(rv) add_quotes_around_file = True if include_location: if is_module: s += ' file' elif s == '?()': if is_exec_stmt(frame): s = 'in exec' exec_str = get_exec_string(frame.f_back) if exec_str != None: filename = exec_str add_quotes_around_file = False else: s = 'in file' else: s += ' called from file' if add_quotes_around_file: filename = "'%s'" % filename s += " %s at line %r" % (filename, lineno) return s return s # The following two methods can be called by clients to use # a debugger to debug a statement, given as a string. def run(self, cmd, globals=None, locals=None): """A copy of bdb's run but with a local variable added so we can find it it a call stack and hide it when desired (which is probably most of the time). """ breadcrumb = self.run if globals is None: import __main__ globals = __main__.__dict__ if locals is None: locals = globals self.reset() sys.settrace(self.trace_dispatch) if not isinstance(cmd, types.CodeType): cmd = cmd+'\n' try: self.running = True try: exec cmd in globals, locals except bdb.BdbQuit: pass finally: self.quitting = 1 self.running = False sys.settrace(None) return def reset(self): bdb.Bdb.reset(self) self.forget() return def set_trace(self, frame=None): """Wrapper to accomodate different versions of Python""" if sys.version_info[0] == 2 and sys.version_info[1] >= 4: if frame is None: frame = self.curframe self.bdb_set_trace(self, frame) else: # older versions self.bdb_set_trace(self) return def user_call(self, frame, argument_list): """This method is called when there is the remote possibility that we ever need to stop in this function. Note argument_list isn't used. It is kept for compatibility""" self.stop_reason = 'call' if self._wait_for_mainpyfile: return if self.stop_here(frame): frame_count = count_frames(frame, Bdb.extra_call_frames) self.msg_nocr('--%sCall level %d' % ('-' * (2*frame_count), frame_count)) if frame_count >= 0: self.__print_call_params(frame) else: self.msg("") if self.linetrace or self.fntrace: self.__print_location_if_trace(frame) if not self.break_here(frame): return self.interaction(frame, None) return return def user_exception(self, frame, (exc_type, exc_value, exc_traceback)): """This function is called if an exception occurs, but only if we are to stop at or just below this level.""" self.stop_reason = 'exception' # Remove any pending source lines. self.rcLines = [] frame.f_locals['__exception__'] = exc_type, exc_value if type(exc_type) == types.StringType: exc_type_name = exc_type else: exc_type_name = exc_type.__name__ self.msg("%s:%s" % (str(exc_type_name), str(self._saferepr(exc_value)))) self.interaction(frame, exc_traceback) return def user_line(self, frame): """This function is called when we stop or break at this line. However it's *also* called when line OR function tracing is in effect. A little bit confusing and this code needs to be simplified.""" self.stop_reason = 'line' if self._wait_for_mainpyfile: if (self.mainpyfile != self.canonic_filename(frame) or inspect.getlineno(frame) <= 0): return self._wait_for_mainpyfile = False if self.stop_here(frame) or self.linetrace or self.fntrace: # Don't stop if we are looking at a def for which a breakpoint # has not been set. filename = frame2file(self, frame) # Python 2.5 or greater has 3 arg getline which handles # eggs and zip files if 3 == linecache.getline.func_code.co_argcount: line = linecache.getline(filename, inspect.getlineno(frame), frame.f_globals) else: line = linecache.getline(filename, inspect.getlineno(frame)) pass # No, we don't have a breakpoint. So we are either # stepping or here because of line tracing. if self.step_ignore > 0: # Don't stop this time, just note a step was done in # step count self.step_ignore -= 1 self.__print_location_if_trace(frame, False) return elif self.step_ignore < 0: # We are stepping only because we tracing self.__print_location_if_trace(frame, False) return if not self.break_here(frame): if bytecode.is_def_stmt(line, frame) and not self.deftrace: self.__print_location_if_trace(frame, False) return elif self.fntrace: # The above test is a real hack. We need to clean # up this code. return else: if not self.break_here(frame) and self.step_ignore > 0: self.__print_location_if_trace(frame, False) self.step_ignore -= 1 return if self.bp_commands(frame): self.interaction(frame, None) return return def user_return(self, frame, return_value): """This function is called when a return trap is set here.""" self.stop_reason = 'return' frame.f_locals['__return__'] = return_value frame_count = count_frames(frame, Bdb.extra_call_frames) if frame_count >= 0: self.msg_nocr("--%sReturn from level %d" % ('-' * (2*frame_count), frame_count)) if type(return_value) in [types.StringType, types.IntType, types.FloatType, types.BooleanType]: self.msg_nocr('=> %s' % repr(return_value)) self.msg('(%s)' % repr(type(return_value))) self.stop_reason = 'return' self.__print_location_if_trace(frame, False) if self.returnframe != None: self.interaction(frame, None) return return pydb-1.26/pydb/show.py0000644000175000017500000002030711167745261011625 00000000000000"""show subcommands, except those that need some sort of text substitution. (Those are in gdb.py.in.) """ __revision = "$Id: show.py,v 1.23 2009/01/14 02:50:28 rockyb Exp $" # Copyright (C) 2006, 2007, 2008 Rocky Bernstein (rocky@gnu.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import fns, sys class SubcmdShow: """Handle show subcommands. This class isn't usuable in of itself, but is expected to be called with something that subclasses it and adds other methods and instance variables like msg and _program_sys_argv.""" def get_annotate(self): return self.annotate def get_args(self): return " ".join(self._program_sys_argv[1:]) def get_autoeval(self): return fns.show_onoff(self.autoeval) def get_basename(self): return fns.show_onoff(self.basename) def get_cmdtrace(self): return fns.show_onoff(self.cmdtrace) def get_dbg_pydb(self): return self.msg(fns.show_onoff(self.dbg_pydb)) # def get_debug_signal - later def get_deftrace(self): return fns.show_onoff(self.deftrace) def get_directories(self): return str(self.search_path) def get_flush(self): return fns.show_onoff(self.flush) def get_fntrace(self): return fns.show_onoff(self.fntrace) def get_interactive(self): return fns.show_onoff(not self.noninteractive) def get_linetrace(self): return fns.show_onoff(self.linetrace) def get_listsize(self): return self.listsize def get_maxargsize(self): return self.maxargstrsize def get_sigcheck(self): return fns.show_onoff(self.sigcheck) def get_width(self): return self.width ######## Note: the docstrings of methods here get used in ######## help output. def show_annotate(self, args): """Show annotation_level. 0 == normal; 1 == fullname (for use when running under emacs). """ self.msg("Annotation level is %d." % self.get_annotate()) return False def show_args(self, args): """Show argument list to give debugged program when it is started. Follow this command with any number of args, to be passed to the program.""" self.msg("Argument list to give program being debugged " + "when it is started is ") self.msg('"%s".' % self.get_args()) return False def show_autoeval(self, args): """Show if unrecognized command are evaluated""" self.msg("autoeval is %s." % self.get_autoeval()) return False def show_basename(self, args): """Show if we are to show short of long filenames""" self.msg("basename is %s." % self.get_basename()) return False def show_cmdtrace(self, args): "Show if we are to show debugger commands before running" self.msg("cmdtrace is %s." % self.get_cmdtrace()) return False def show_dbg_pydb(self, args): """Show whether tracebacks include debugger routines""" self.msg("dbg_pydb is %s." % self.get_dbg_pydb()) return False def show_debug_signal(self, arg): """Show the signal currently used for triggering debugging of an already running process. """ if not self.debug_signal: self.msg('debug-signal not set.') return False self.msg('debug-signal is %s' % self.debug_signal) def show_deftrace(self, args): "Show if we are to show def (method creation) statements" self.msg("deftrace is %s." % self.get_deftrace()) return False def show_directories(self, args): """Current search path for finding source files. $cwd in search path means the current working directory. $cdir in the path means the compilation directory of the source file.""" self.msg("Source directories searched:\n\t%s." % self.get_search_path()) def show_flush(self, args): """Show whether we flush output after each write.""" self.msg('Flushing output is "%s".' % self.get_flush()) return False def show_fntrace(self, args): "Show the line function status. Can also add 'delay'" self.msg("Function tracing is %s." % self.get_fntrace()) return False def show_interactive(self, args): """Show whether we are interactive""" self.msg("interactive is %s." % self.get_interactive()) return False def show_linetrace(self, args): "Show the line tracing status. Can also add 'delay'" self.msg("line tracing is %s." % self.get_linetrace()) return False def show_listsize(self, args): """Show number of source lines the debugger will list by default.""" self.msg("Number of lines to show in listing is %s." % self.get_listsize()) return False def show_logging(self, args): "Show logging options" if len(args) > 1 and args[1]: if args[1] == 'file': self.msg('The current logfile is "%s".' % self.logging_file) elif args[1] == 'overwrite': self.msg('Whether logging overwrites or appends to the' + ' log file is %s.' % fns.show_onoff(self.logging_overwrite)) elif args[1] == 'redirect': self.msg('The logging output mode is %s.' % fns.show_onoff(self.logging_redirect)) return False else: self.undefined_cmd("show logging", args[1]) return False else: self.msg('Future logs will be written to %s.' % self.logging_file) if self.logging_overwrite: self.msg('Logs will overwrite the log file.') else: self.msg('Logs will be appended to the log file.') if self.logging_redirect: self.msg("Output will be sent only to the log file.") else: self.msg("Output will be logged and displayed.") return False return False def show_maxargsize(self, args): """Show number maximum number of characters in argument list.""" self.msg("Maximum number of characters in an argument list is %s" % self.get_maxargsize()) return False def show_sigcheck(self, args): """Show status of signal checking/adjusting. See also set sigcheck.""" self.msg("sigcheck is %s." % self.get_sigcheck()) return False def show_target_address(self, arg): """Show connection parameters used in remote debugging. This command doesn't make sense if you are not debugging a remote program. See also 'set target-address' and 'attach'.""" if self.target == 'local': self.msg("Debugging is local. No target address.") return False else: self.msg('target-address is %s.' % self.target_addr.__repr__()) return False return False def show_warnoptions(self, args): """Show Python warning options to be used in running programs.""" if len(sys.warnoptions): self.msg('Warning options used in running a Python program:') self.msg("\t -W%s" % ', -W'.join(sys.warnoptions)) return False else: self.msg('No warning options have been set.') return False return False def show_width(self, args): """Show number of characters gdb thinks are in a line.""" self.msg("Number of lines to show in listing is %s." % self.get_width()) return False pydb-1.26/pydb/set.py0000644000175000017500000003274511117742361011442 00000000000000"""set subcommands, except those that need some sort of text substitution. (Those are in gdb.py.in.) """ __revision__ = "$Id: set.py,v 1.25 2008/12/09 20:06:10 rockyb Exp $" # -*- coding: utf-8 -*- # Copyright (C) 2006, 2007, 2008 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import inspect, os, re, sighandler, sys class SubcmdSet: """Handle set subcommands. This class isn't usuable in of itself, but is expected to be called with something that subclasses it and adds other methods and instance variables like msg and _program_sys_argv.""" def __open_log(self, filename): open_mode = ('w', 'a')[self.logging_overwrite] try: self.logging_fileobj = open(filename, open_mode) self.logging_file = filename except: self.errmsg("Error in opening %s" % filename) return ######## Note: the docstrings of methods here get used in ######## help output. def set_annotate(self, args): """Set annotation level 0 == normal; 1 == fullname (for use when running under emacs) 2 == output annotated suitably for use by programs that control GDB. """ try: self.annotate = self.get_int(args[1]) except ValueError: pass return def set_args(self, args): """Set argument list to give program being debugged when it is started. Follow this command with any number of args, to be passed to the program.""" argv_start = self._program_sys_argv[0:1] if len(args): self._program_sys_argv = args[0:] else: self._program_sys_argv = [] self._program_sys_argv[:0] = argv_start return def set_autoeval(self, args): """Evaluate every unrecognized command.""" try: self.autoeval = self.get_onoff(args[1]) except ValueError: pass return def set_basename(self, args): """Set short filenames (the basename) in debug output. Setting this causes the debugger output to give just the basename for filenames. This is useful in debugger testing or possibly showing examples where you don't want to hide specific filesystem and installation information.""" try: self.basename = self.get_onoff(args[1]) except ValueError: pass return def set_cmdtrace(self, args): """Set echoing lines read from debugger command files""" try: self.cmdtrace = self.get_onoff(args[1]) except ValueError: pass return def set_dbg_pydb(self, args): """Set whether we allow tracing the debugger. This is used for debugging pydb and getting access to some of its object variables. """ try: self.dbg_pydb = self.get_onoff(args[1]) if self.dbg_pydb: frame = inspect.currentframe() self.stack, self.curindex = self.get_stack(frame, None) self.curframe = self.stack[self.curindex][0] except ValueError: pass return def set_debug_signal(self, args): """Set the signal sent to a process to trigger debugging.""" if len(args) <= 1: self.errmsg('Need a signal name or number') signame = args[1] try: signum = int(signame) signame = sighandler.lookup_signame(signum) if signame is None: self.errmsg('Invalid signal number: %d' % signum) return except: signum = sighandler.lookup_signum(signame) if signum is not None: # Canonicalize name signame = sighandler.lookup_signame(signum) else: self.errmsg('Invalid signal name: %s' % signame) return self.debug_signal = signame self.do_handle("%s noprint nostop pass" % signame) ## FIXME assign signal handler here. self.msg('debug-signal set to: %s' % self.debug_signal) return False def set_deftrace(self, args): """Set stop before 'def' (method creation) statements. Classes may have many methods and stand-alone programs may have many functions. Generally there isn't much value to stopping before adding a method or function to Python's symbol table. (More to the point, it can be an annoyance.) However if you do want this, e.g. you want to debug methods is over-writing one another, then set this.""" try: self.deftrace = self.get_onoff(args[1]) except ValueError: pass return def set_flush(self, args): """Set whether we flush output after each write.""" try: self.flush = self.get_onoff(args[1]) except ValueError: pass return def set_fntrace(self, args): """Set function execution tracing""" try: self.fntrace = self.get_onoff(args[1]) except ValueError: pass return def set_history(self, args): """Generic command for setting command history parameters. set history filename - set location to save history set history save [on|off] - specify whether or not ot save history set history size n - set number of commands to save in history """ if args[1] == 'filename': if len(args) < 3: self.errmsg("Argument required (filename to set it to).") return self.histfile = args[2] elif args[1] == 'save': self.hist_save = ( (len(args) >=3 and self.get_onoff(args[2])) or True ) elif args[1] == 'size': try: size = self.get_int(args[2], cmdname="set history size") if self.set_history_length: self.set_history_length(size) else: self.errmsg("History is not available (no readline?).") except ValueError: return else: self.undefined_cmd("set history", args[0]) def set_interactive(self, args): """Set whether we are interactive. Some dangerous commands prompt for confirmation before they are run. However if we are not interactive, this is not done """ try: self.noninteractive = not self.get_onoff(args[1]) except ValueError: pass return def set_linetrace(self, args): """Set line execution tracing and delay on tracing. Set linetrace {on|off}. Turns line tracing on or off. Set linetrace delay `delay'. 'delay' is a fixed or floating-point number. This is only meaningful when line tracing is on. The DELAY value sets the time to sleep between printing line-trace output. This might be useful if you are showing output in a front-end. """ if args[1] == 'delay': try: delay = float(args[2]) self.linetrace_delay = delay except IndexError: self.errmsg("Need a floating-point number (the 4th parameter)") except ValueError: self.errmsg(("4th argument %s is not a floating-point " + "number") % str(args[2]) ) else: try: self.linetrace = self.get_onoff(args[1]) except ValueError: pass return def set_listsize(self, args): """Set number of source lines the debugger will list by default.""" try: self.listsize = self.get_int(args[1]) except ValueError: pass return def set_logging(self, args): """Set logging options". set logging {on|off}. set logging file `filename' set logging redirect {on|off} The first form turns logging on or off. If it is on, then the second form indicates where the file where output will be logged to. If redirect is on then output will only go to the log file, otherwise it goes both to the console and the log file. """ if len(args): try: old_logging = self.logging self.logging = self.get_onoff(args[1], default=None, print_error=False) if old_logging and not self.logging \ and self.logging_fileobj is not None: self.logging_fileobj.close() if not old_logging and self.logging \ and not self.logging_fileobj: self.__open_log(self.logging_file) return except ValueError: try: if args[1] == 'file': if len(args) > 2: self.__open_log(args[2]) elif args[1] == 'overwrite': self.logging_overwrite = self.get_onoff(args[2], default=True, print_error=True ) elif args[1] == 'redirect': self.logging_redirect = self.get_onoff(args[2], default=True, print_error=True) else: self.undefined_cmd("set logging", args[1]) except (IndexError, ValueError): return else: self.msg("""Usage: set logging on set logging off set logging file `filename' set logging overwrite {on|off} set logging redirect {on|off}""") return def set_maxargsize(self, args): """Set maximum size to use in showing argument parameters. If a parameter value is longer than the maximum, the output printed is truncated to that size and '...' is appended to indicate the elision.""" try: self.maxargstrsize = self.get_int(args[1]) except ValueError: pass return def set_prompt(self, args): """Set debugger's prompt. Generally this is a bad idea. However in some special circumstances such as running from an alternate front-end like ipython you may want to do this.""" # Use the original prompt so we keep spaces and punctuation # just skip over the work prompt. re_prompt = re.compile(r'\s*prompt\s(.*)$') mo = re_prompt.search(args) if mo: self.prompt = mo.group(1) else: self.errmsg("Something went wrong trying to find the prompt") return def set_sigcheck(self, args): """Set signal handler checking/adjusting. Turning this on causes the debugger to check after every statement whether a signal handler has changed from one of those that is to be handled by the debugger. Because this may add a bit of overhead to the running of the debugged program, by default it is set off. However if you want to ensure that the debugger takes control when a particular signal is encountered you should set this on.""" try: sigcheck = self.get_onoff(args[1]) if sigcheck != self.sigcheck: if sigcheck: # Turn on signal checking/adjusting self.sigmgr.check_and_adjust_sighandlers() self.break_anywhere = self.break_anywhere_gdb self.set_continue = self.set_continue_gdb self.trace_dispatch = self.trace_dispatch_gdb else: # Turn off signal checking/adjusting self.break_anywhere = self.break_anywhere_old self.set_continue = self.set_continue_old self.trace_dispatch = self.trace_dispatch_old self.sigcheck = sigcheck except ValueError: pass return def set_target_address(self, args): """Set the address of a target.""" self.target_addr = "".join(["%s " % a for a in args[1:]]) self.target_addr = self.target_addr.strip() self.msg('target address set to %s' % self.target_addr) return def set_warnoptions(self, args): """Set the Python warning options that when a program is started or restarted. On the command line, these are the -W options, e.g. -Werror, or -We::Deprecation. However options should not contain leading -W's and should be separated with white space only, e.g. don't use commas. Examples: set warn error e::Deprecation set warnoptions """ sys.warnoptions = args[1:] self.show_warnoptions(args) return def set_width(self, args): """Set number of characters the debugger thinks are in a line. We also change OS environment variable COLUMNS.""" try: self.width = self.get_int(args[1]) os.environ['COLUMNS'] = args[1] except ValueError: pass return pydb-1.26/pydb/gdb.py.in0000644000175000017500000025200011167745261012003 00000000000000"""Handles gdb-like command processing. (See also @PACKAGE_NAME@.doc for documentation.) $Id: gdb.py.in,v 1.174 2009/03/31 19:52:58 rockyb Exp $""" # -*- coding: utf-8 -*- # Copyright (C) 2007, 2008, 2009 Rocky Bernstein (rocky@gnu.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. _debugger_name = '@PACKAGE_NAME@' # The name of the debugger we are currently going by. _version = '@PACKAGE_VERSION@' import atexit, inspect, linecache, os, pprint, pydoc, shlex import bdb, dis, disassemble, re, subcmd, sys, types import bytecode, pydbcmd, pydbbdb import signal import sighandler from complete import * ## from connection import ConnectionServerFactory, ConnectionClientFactory, ConnectionFailed from bdb import BdbQuit from display import Display, DisplayNode from fns import * from info import * from set import * from show import * from pydbcmd import Cmd from pydbbdb import Bdb from threadinfo import * class Restart(Exception): """Causes a debugger to be restarted for the debugged Python program.""" pass class Gdb(Bdb, Cmd, SubcmdInfo, SubcmdSet, SubcmdShow): """A debugger class for Python that resembles the gdb (GNU debugger) command set. Parameter completekey specifies the what to use for command completion. pass None if no command completion is desired. Parameters stdin and stdout specify where debugger input and output are to come from. Parameter siglist gives a list of signals to intercept and ignore. None means the default set. If you want *no* signals, use []. """ def __init__(self, completekey='tab', stdin=None, stdout=None, siglist=None): pydbbdb.Bdb.__init__(self) pydbcmd.Cmd.__init__(self, completekey, stdin, stdout) self._program_sys_argv = [] # sys.argv after options are stripped self._re_linetrace_delay = re.compile(r'\s*linetrace\s+delay') self._wait_for_mainpyfile = False # set up signal handling self.sigmgr = sighandler.SignalManager(self, ignore_list=siglist) self._reset_handler = None self.__init_info() # Initialize 'info' subcommands self.__init_set() # Initialize 'set' subcommands self.__init_show() # Initialize 'show' subcommands self.all_completions = lambda arg, left=True: \ all_completions(self, arg, left) self.autoeval = True self.basename = False self.connection = None # For out-of-process communication self.currentbp = None # for "info program" self.cur_frame = None # current stack frame self.dbg_pydb = False # Debug the debugger? self.def_trace = False # Show/stop at method create statements? self.debug_signal = None # The signal used by 'attach' self.display = Display() self.fntrace = False # Tracing functions/methods self.gdb_dialect = True # Controls how stack is shown self.field_BdbQuit = False # does dispatcher field BdbQuit? # A list of the commands for which the first argument can be a # Python object. This is used by subcommand completions. self.first_can_be_obj = [ "disassemble", "examine", "help", "p", "pp", "pydoc", "x", "whatis" ] self.is_in_dbg = is_in_gdb self.lastcmd = '' # last debugger command run self.linetrace = False self.linetrace_delay = 0 self.listsize = 10 # main_dirname is the directory where the script resides; # "import" statments are relative to this location. self.main_dirname = os.curdir self.mainpyfile = '' self.maxargstrsize = 100 # max length to show of parameter string self.moduletodebug = "" self.noninteractive = False # Controls whether to prompt on # potentially dangerous commands. self.originalpath = sys.path[:] self.orig_stdin = self.stdin self.orig_stdout = self.stdout self.running = False self.search_path = sys.path # source name search path self.sigcheck = True self.stop_reason = None # Why are we in the debugger? self._sys_argv = [] # exec sys.argv, e.g. may include pydb self.set_history_length = None self.stepping = False # used in thread debugging self.target = 'local' # local connections by default self.target_addr = '' # target address used by 'attach' self.width = 80 # Assume a printed line is this wide # self.break_anywhere, self.set_continue and # self.trace_dispatch are changed depending on the value of # 'set sigcheck'. We may "decorate", in the design pattern # sense, the routines from bdb, so we need to save them. self.break_anywhere_old = self.break_anywhere self.set_continue_old = self.set_continue self.trace_dispatch_old = self.trace_dispatch ## FIXME: for now we'll turn on signal trace dispatching self.break_anywhere = self.break_anywhere_gdb self.set_continue = self.set_continue_gdb self.trace_dispatch = self.trace_dispatch_gdb # associates a command list to breakpoint numbers self.commands = {} # for each bp num, tells if the prompt must be disp. after # execing the cmd list self.commands_doprompt = {} # for each bp num, tells if the stack trace must be disp. after # execing the cmd list self.commands_silent = {} # True while in the process of defining a command list self.commands_defining = False # The breakpoint number for which we are defining a list self.commands_bnum = None # # list of all the commands making the program # resume execution. self.commands_resuming = ['do_continue', 'do_jump', 'do_next', 'do_quit', 'do_return', 'do_step'] self.do_L = self.info_breakpoints # Try to load readline if it exists try: import @READLINE@ import rlcompleter self.readline = readline self.completer = rlcompleter.Completer(sys._getframe().f_locals) self.hist_last = 0 self.hist_save = False self.set_history_length = readline.set_history_length # Set history length using gdb's rule. try: history_length = int(os.environ['HISTSIZE']) except: history_length = 256 self.set_history_length(history_length) # An application like ipython may have its own # history set up beforehand, clear that so we don't back up # into that. Note that ipython saves and restores its own # history. if hasattr(readline, "clear_history"): readline.clear_history() # Read history file and set up to write history file when we # exit. global _debugger_name self.histfile = os.path.join(os.environ["HOME"], ".%shist" % _debugger_name) try: readline.read_history_file(self.histfile) except IOError: pass atexit.register(self.write_history_file) self.do_complete = self.__do_complete except ImportError: self.histfile = None return return def break_anywhere_gdb(self, frame): """Decorate bdb break_anywhere to consider the sigcheck and linetrace flags.""" if self.sigcheck or self.linetrace or self.fntrace: return True return self.break_anywhere(frame) ### FIXME: trace_dispatch could be a performance bottleneck. If ### so, consider reassigning the routine when don't have any ### signals registered. def trace_dispatch_gdb(self, frame, event, arg): """Check to see if the signal handler's we are interested have changed. If so we'll intercept them. """ if (not hasattr(self, 'thread_name') or self.thread_name == 'MainThread'): self.sigmgr.check_and_adjust_sighandlers() # The below variable will be used to scan down frames to determine # if trace_dispatch has been called. We key on the variable # name, method name, type of variable and even the value. breadcrumb = is_in_gdb_dispatch try: return self.trace_dispatch_old(frame, event, arg) except BdbQuit: if self.field_BdbQuit: # If we have one thread (and know that this this is the case), # then we can use sys.exit(). Otherwise kill is the # only way to leave. if hasattr(sys, '_current_frames'): if len(sys._current_frames()) == 1: sys.exit() if self.noninteractive: arg='unconditionally' else: arg='' self.do_kill('') return False else: raise BdbQuit def __adjust_frame(self, pos, absolute_pos): """Adjust stack frame by pos positions. If absolute_pos then pos is an absolute number. Otherwise it is a relative number. If self.gdb_dialect is True, the 0 position is the newest entry and doesn't match Python's indexing. Otherwise it does. A negative number indexes from the other end.""" if not self.curframe: self.msg("No stack.") return # Below we remove any negativity. At the end, pos will be # the new value of self.curindex. if absolute_pos: if self.gdb_dialect: if pos >= 0: pos = len(self.stack)-pos-1 else: pos = -pos-1 elif pos < 0: pos = len(self.stack)+pos else: pos += self.curindex if pos < 0: self.errmsg("Adjusting would put us beyond the oldest frame") return elif pos >= len(self.stack): self.errmsg("Adjusting would put us beyond the newest frame") return self.curindex = pos self.curframe = self.stack[self.curindex][0] self.print_location() self.lineno = None def __do_complete(self, arg): """Print a list of command names that can start with the supplied command prefix. If there is no completion nothing is printed.""" completions = self.all_completions(arg) if completions is None: return for complete in completions: self.msg(complete) return def __init_info(self): """Initialize info subcommands. Note: instance variable name has to be infocmds ('info' + 'cmds') for subcommand completion to work.""" self.infocmds=subcmd.Subcmd("info", self.help_info.__doc__) self.infocmds.add('args', self.info_args) self.infocmds.add('breakpoints', self.info_breakpoints) self.infocmds.add('display', self.info_display) self.infocmds.add('handle', self.sigmgr.info_signal, 1, False) self.infocmds.add('globals', self.info_globals, 1, False) self.infocmds.add('line', self.info_line) self.infocmds.add('locals', self.info_locals, 1, False) self.infocmds.add('program', self.info_program) self.infocmds.add('signal', self.sigmgr.info_signal, 2, False) self.infocmds.add('source', self.info_source, 2) if hasattr(sys, "_current_frames"): self.info_threads = lambda arg: info_thread_new(self, arg) doc = info_thread_new.__doc__ else: try: import threadframe sys._current_frames = threadframe.dict # Make it look like 2.5 self.info_threads = lambda arg: info_threadframe(self, arg) doc = info_threadframe.__doc__ except: self.info_threads = lambda arg: info_thread_old(self, arg) doc = info_thread_old.__doc__ self.info_threads.__doc__ = doc self.infocmds.add('threads', self.info_threads, 2) ## self.infocmds.add('target', self.info_target) return def __init_set(self): """Initialize set subcommands. Note: instance variable name has to be setcmds ('set' + 'cmds') for subcommand completion to work.""" self.setcmds=subcmd.Subcmd("set", self.help_set.__doc__) self.setcmds.add('annotate', self.set_annotate, 2) self.setcmds.add('args', self.set_args, 2) self.setcmds.add('autoeval', self.set_autoeval, 2) self.setcmds.add('basename', self.set_basename) self.setcmds.add('debug-pydb', self.set_dbg_pydb, 2) self.setcmds.add('deftrace', self.set_deftrace, 2) self.setcmds.add('flush', self.set_flush) self.setcmds.add('fntrace', self.set_fntrace, 2) ## self.setcmds.add('debug-signal', self.set_debug_signal) self.setcmds.add('history', self.set_history) self.setcmds.add('interactive', self.set_interactive) self.setcmds.add('linetrace', self.set_linetrace, 3) self.setcmds.add('listsize', self.set_listsize, 3) self.setcmds.add('logging', self.set_logging, 2) self.setcmds.add('maxargsize', self.set_maxargsize, 2) self.setcmds.add('prompt', self.set_prompt) self.setcmds.add('sigcheck', self.set_sigcheck) ## self.setcmds.add('target-address', self.set_target_address) self.setcmds.add('trace-commands', self.set_cmdtrace) self.setcmds.add('warnoptions', self.set_warnoptions, 2) self.setcmds.add('width', self.set_width, 2) return def __init_show(self): """Initialize show subcommands. Note: instance variable name has to be setcmds ('set' + 'cmds') for subcommand completion to work.""" self.showcmds=subcmd.Subcmd("show", self.help_show.__doc__) self.showcmds.add('args', self.show_args) self.showcmds.add('annotate', self.show_annotate, 2) self.showcmds.add('autoeval', self.show_autoeval, 2) self.showcmds.add('basename', self.show_basename) self.showcmds.add('debug-pydb', self.show_dbg_pydb) ## self.showcmds.add('debug-signal', self.show_debug_signal) self.showcmds.add('deftrace', self.show_deftrace, 3) self.showcmds.add('commands', self.show_commands, 2, False) self.showcmds.add('directories', self.show_directories, 1) self.showcmds.add('fntrace', self.show_fntrace, 2) self.showcmds.add('flush', self.show_flush) self.showcmds.add('history', self.show_history) self.showcmds.add('interactive', self.show_interactive) self.showcmds.add('linetrace', self.show_linetrace, 3) self.showcmds.add('listsize', self.show_listsize, 3) self.showcmds.add('logging', self.show_logging, 2) self.showcmds.add('maxargsize', self.show_maxargsize, 2) self.showcmds.add('prompt', self.show_prompt) self.showcmds.add('sigcheck', self.show_sigcheck) ## self.showcmds.add('target-address', self.show_target_address) self.showcmds.add('trace-commands', self.show_cmdtrace, 1) self.showcmds.add('version', self.show_version) self.showcmds.add('warnoptions', self.show_warnoptions, 2) self.showcmds.add('width', self.show_width, 2) # To be overridden in derived debuggers def defaultFile(self): """Produce a reasonable default.""" filename = self.curframe.f_code.co_filename # Consider using is_exec_stmt(). I just don't understand # the conditions under which the below test is true. if filename == '' and self.mainpyfile: filename = self.mainpyfile return filename def display_enable(self, arg, flag): # arg is list of display points for i in arg: i = self.get_an_int(i, 'index %r is not a number' % i) if i is not None: self.display.enable_disable(i, flag) pass pass return def lineinfo(self, identifier): failed = (None, None, None) # Input is identifier, may be in single quotes idstring = identifier.split("'") if len(idstring) == 1: # not in single quotes ident = idstring[0].strip() elif len(idstring) == 3: # quoted ident = idstring[1].strip() else: return failed if ident == '': return failed parts = ident.split('.') # Protection for derived debuggers if parts[0] == 'self': del parts[0] if len(parts) == 0: return failed # Best first guess at file to look at fname = self.defaultFile() if len(parts) == 1: item = parts[0] else: # More than one part. # First is module, second is method/class f = self.lookupmodule(parts[0]) if f: fname = f item = parts[1] answer = find_function(item, fname) return answer or failed def forget(self): self.lineno = None self.stack = [] self.curindex = 0 self.curframe = None return def interaction(self, frame, tb): """Possibly goes into loop to read debugger commands.""" do_loop = self.setup(frame, tb) != 1 if do_loop: if frame or tb: self.print_location(print_line=self.linetrace or self.fntrace) self.display.display(self.curframe) if not self.noninteractive: try: self.cmdloop() except KeyboardInterrupt: self.do_quit(None) self.currentbp = None # Can forget it now that we're moving on self.forget() if not do_loop: # Tell cmdloop to break out of its loop. return True return False def parse_list_cmd(self, arg): """Parses arguments for the "list" command and returns the tuple filename, start, last or sets these to None if there was some problem.""" if not self.curframe: self.msg("No Python program loaded.") return (None, None, None) self.lastcmd = 'list' last = None filename = self.curframe.f_code.co_filename if arg: if arg == '-': first = max(1, self.lineno - 2*self.listsize - 1) elif arg == '.': first = max(1, inspect.getlineno(self.curframe) - self.listsize/2) else: args = arg.split() (modfunc, filename, first) = parse_filepos(self, args[0]) if first == None and modfunc == None: # error should have been shown previously return (None, None, None) if len(args) == 1: first = max(1, first - (self.listsize/2)) elif len(args) == 2: (modfunc, last_filename, last) = \ parse_filepos(self, args[1]) if filename != last_filename \ and filename is not None and last_filename is not None: self.errmsg('filename in the range must be the same') return (None, None, None) if last < first: i = self.get_an_int(args[1], ('2nd number (%s) is less than the' + ' 1st number %d, but it does not' + ' evaluate to an integer') % (args[1], first)) if i is None: return (None, None, None) # Assume last is a count rather than an end line number last = first + last elif len(args) > 2: self.errmsg('At most 2 arguments allowed. Saw: %d' % len(args)) return (None, None, None) elif self.lineno is None or not self.running: first = max(1, inspect.getlineno(self.curframe) - self.listsize/2) else: first = self.lineno + 1 if last is None: last = first + self.listsize - 1 return (filename, first, last) def set_continue_gdb(self): """Like bdb's set_continue but we don't have the run fast option""" self.stopframe = self.botframe self.returnframe = None self.quitting = 0 return def setup(self, frame, tb=None): """Initialization done before entering the debugger-command loop. In particular we set up the call stack used for local variable lookup and frame/up/down commands. We return True if we should NOT enter the debugger-command loop.""" self.forget() if self.dbg_pydb: frame = inspect.currentframe() if frame or tb: self.stack, self.curindex = self.get_stack(frame, tb) self.curframe = self.stack[self.curindex][0] else: self.stack = self.curframe = self.botframe = None if self.execRcLines()==1: return True return False def setup_source(self, arg, showError=False): """Set up to read commands from a source file""" try: rcFile = open(os.path.join(arg)) except IOError, (errno, strerror): if showError: self.errmsg("Error opening debugger command file %s: %s" % (arg, strerror)) pass else: for line in rcFile.readlines(): self.rcLines.append(line) rcFile.close() return def show_commands(self, arg): """Show the history of commands you typed. You can supply a command number to start with, or a `+' to start after the previous command number shown. A negative number starts from the end.""" try: import @READLINE@ if self.histfile is not None: hist_max = readline.get_current_history_length() if len(arg) <= 1: first=1 self.hist_last=hist_max else: if arg[1] == '+': first = self.hist_last+1 self.hist_last = min(hist_max, first + self.listsize) else: try: center = self.get_int(arg[1], cmdname="show commands") except ValueError: return if center < 0: center = hist_max + center + 1 first = max(1, center - (self.listsize/2)) self.hist_last = min(hist_max, center + (self.listsize/2)) i=first while i<=self.hist_last: self.msg("%5d %s" % (i, readline.get_history_item(i))) i += 1 else: self.errmsg("History mechanism turned off.") except ImportError: self.errmsg("Readline not available.") def show_history(self, args): """Generic command for showing command history parameters""" try: import @READLINE@ if len(args) > 1 and args[1]: show_save = show_size = show_filename = False show_prefix = False if args[1] == 'filename': show_filename = True elif args[1] == 'save': show_save = True elif args[1] == 'size': show_size = True else: self.undefined_cmd("show history", args[1]) return else: show_save = show_size = show_filename = True show_prefix = True if show_filename: if show_prefix: prefix='filename: ' else: prefix='' self.msg("""%sThe filename in which to record the command history is "%s".""" % (prefix, self.histfile)) if show_save: if show_prefix: prefix='save: ' else: prefix='' self.msg("%sSaving of the history record on exit is %s" % (prefix, show_onoff(self.hist_save))) if show_size: if show_prefix: prefix='size: ' else: prefix='' self.msg("%sThe size of the command history is %d" % (prefix, readline.get_history_length())) except ImportError: pass def show_listsize(self, args): "Show number of source lines the debugger will list by default" self.msg("Number of source lines %s will list by default is %d." \ % (_debugger_name, self.listsize)) def show_prompt(self, args): "Show debugger's prompt" self.msg("""%s's prompt is "%s".""" % (_debugger_name, self.prompt)) return def show_version(self, args): """Show what version of the debugger this is""" global _version self.msg("""%s version %s.""" % (_debugger_name, _version)) return def write_history_file(self): """Write the command history file -- possibly.""" if self.hist_save: try: import @READLINE@ try: readline.write_history_file(self.histfile) except IOError: pass except ImportError: pass ################################################################### # Command definitions, called by cmdloop() # The argument is the remaining string on the command line # Return true to exit from the command loop ################################################################### def do_alias(self, arg): """alias [name [command [parameter parameter ...] ]] Creates an alias called 'name' the executes 'command'. The command must *not* be enclosed in quotes. Replaceable parameters are indicated by %1, %2, and so on, while %* is replaced by all the parameters. If no command is given, the current alias for name is shown. If no name is given, all aliases are listed. Aliases may be nested and can contain anything that can be legally typed at the debugger prompt. Note! You *can* override internal debugger commands with aliases! Those internal commands are then hidden until the alias is removed. Aliasing is recursively applied to the first word of the command line; all other words in the line are left alone. Some useful aliases (especially when placed in the .@PACKAGE_NAME@src file) are: #Print instance variables (usage "pi classInst") alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] #Print instance variables in self alias ps pi self """ args = arg.split() if len(args) == 0: keys = self.aliases.keys() keys.sort() for alias in keys: self.msg("%s = %s" % (alias, self.aliases[alias])) return if args[0] in self.aliases and len(args) == 1: self.msg("%s = %s" % (args[0], self.aliases[args[0]])) else: self.aliases[args[0]] = ' '.join(args[1:]) def do_break(self, arg, temporary = 0, thread_name=None): """b(reak) [[file:]lineno | function] [, condition] With a line number argument, set a break there in the current file. With a function name, set a break at first executable line of that function. Without argument, set a breakpoint at current location. If a second argument is present, it is a string specifying an expression which must evaluate to true before the breakpoint is honored. The line number may be prefixed with a filename and a colon, to specify a breakpoint in another file (probably one that hasn't been loaded yet). The file is searched for on sys.path; the .py suffix may be omitted.""" if not self.curframe: self.msg("No stack.") return cond = None funcname = None if not arg: if self.lineno is None: lineno = max(1, inspect.getlineno(self.curframe)) else: lineno = self.lineno + 1 filename = self.curframe.f_code.co_filename else: # parse arguments; comma has lowest precedence # and cannot occur in filename filename = None lineno = None comma = arg.find(',') if comma > 0: # parse stuff after comma: "condition" cond = arg[comma+1:].lstrip() arg = arg[:comma].rstrip() (funcname, filename, lineno) = parse_filepos(self, arg) if lineno is None: return # FIXME This default setting doesn't match that used in # do_clear. Perhaps one is non-optimial. if not filename: filename = self.defaultFile() # Check for reasonable breakpoint line = checkline(self, filename, lineno) if line: # now set the break point # Python 2.3.5 takes 5 args rather than 6. # There is another way in configure to test for the version, # but this works too. try: err = self.set_break(filename, line, temporary, cond, funcname) except TypeError: err = self.set_break(filename, line, temporary, cond) if err: self.errmsg(err) else: bp = self.get_breaks(filename, line)[-1] if thread_name is None: self.msg("Breakpoint %d set in file %s, line %d." % (bp.number, self.filename(bp.file), bp.line)) else: bp.thread_name = thread_name self.msg("Breakpoint %d set in file %s, line %d, thread %s." % (bp.number, self.filename(bp.file), bp.line, thread_name)) do_b = do_break def do_cd(self, arg): """Set working directory to DIRECTORY for debugger and program being debugged. """ if not arg: self.errmsg("Argument required (new working directory).") else: os.chdir(arg) return return def do_clear(self, arg): """cl(ear) {[file:]linenumber | function} Clear breakpoint at specified line or function. Argument may be line number, function name, or '*' and an address. If line number is specified, all breakpoints in that line are cleared. If function is specified, breakpoints at beginning of function are cleared. If an address is specified, breakpoints at that address are cleared. With no argument, clears all breakpoints in the line that the selected frame is executing in. See also the 'delete' command which clears breakpoints by number. """ if not self.curframe: self.msg("No frame selected.") return False if not arg: frame, lineno = self.stack[self.curindex] filename = self.canonic_filename(self.curframe) else: if ':' in arg: # Make sure it works for "clear C:\foo\bar.py:12" i = arg.rfind(':') filename = arg[:i] arg = arg[i+1:] try: lineno = int(arg) except: self.errmsg("Invalid line number (%s)" % arg) return False else: (funcname, filename, lineno) = get_brkpt_lineno(self, arg) if lineno is None: return False # FIXME This default setting doesn't match that used in # do_break. Perhaps one is non-optimial. if filename is None: filename = self.canonic_filename(self.curframe) brkpts = self.clear_break(filename, lineno) if len(brkpts) > 0: if len(brkpts) == 1: self.msg("Deleted breakpoint %d" % brkpts[0]) else: self.msg("Deleted breakpoints " + ' '.join(map(lambda b: str(b), brkpts))) return False return False return False do_cl = do_clear def do_commands(self, arg): """Defines a list of commands associated to a breakpoint Those commands will be executed whenever the breakpoint causes the program to stop execution.""" if not arg: bnum = len(bdb.Breakpoint.bpbynumber)-1 else: try: bnum = self.get_pos_int(arg, min_value=0, default=None, cmdname="'commands'") except ValueError: return False if not (bnum < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % bnum) return False self.commands_bnum = bnum self.commands[bnum] = [] self.commands_doprompt[bnum] = True self.commands_silent[bnum] = False self.commands_defining = True if self.setup(self.curframe) == 1: self.commands_defining = False return False prompt_back = self.prompt self.prompt = '>' self.msg("Type commands for when breakpoint %d is hit, one per line." % bnum) self.msg('End with a line saying just "end".') self.cmdloop() self.commands_defining = False self.prompt = prompt_back return False def do_condition(self, arg): """condition bpnumber str_condition str_condition is a string specifying an expression which must evaluate to true before the breakpoint is honored. If str_condition is absent, any existing condition is removed; i.e., the breakpoint is made unconditional.""" args = arg.split(' ', 1) try: bpnum = self.get_pos_int(args[0].strip(), min_value=1, cmdname='condition') except ValueError: return except IndexError: self.errmsg("Breakpoint number required.") try: cond = args[1] except: cond = None try: bp = bdb.Breakpoint.bpbynumber[bpnum] except IndexError: self.errmsg("No breakpoint numbered %d." % bpnum) return False if bp: bp.cond = cond if not cond: self.msg('Breakpoint %d is now unconditional.' % bpnum) # Note: ddd only uses first line of docstring after the command name. # That is the part that starts Continue execution... # So make sure this is a complete sentence. def do_continue(self, arg): """c(ontinue) [[file:]lineno | function] Continue execution; only stop when a breakpoint is encountered. If a line position is given, continue until that line is reached. This is exactly the same thing as setting a temporary breakpoint at that position before running an (unconditional) continue.""" if not self.is_running(): return if self.linetrace or self.fntrace: # linetracing is like stepping, but we just don't stop. If # we were to calling set_continue, it *might* remove all # stopping if there were no breakpoints. self.step_ignore = -1 self.set_step() self.stepping = True else: self.stepping = False if arg: (funcname, filename, lineno) = parse_filepos(self, arg) if lineno: self.do_tbreak(arg) # This has to be done after do_tbreak if not (self.linetrace or self.fntrace): self.set_continue() # Tell cmdloop to break out of its loop. return True do_c = do_continue def do_debug(self, arg): """debug code Enter a recursive debugger that steps through the code argument (which is an arbitrary expression or statement to be executed in the current environment).""" if not self.curframe: self.msg("No frame selected.") return sys.settrace(None) global_vars = self.curframe.f_globals local_vars = self.curframe.f_locals p = Gdb() p.prompt = "(%s) " % self.prompt.strip() self.msg("ENTERING RECURSIVE DEBUGGER") # Inherit some values from current environemnt p.aliases = self.aliases p.basename = self.basename p.cmdtrace = self.cmdtrace p.fntrace = self.fntrace p.gdb_dialect = self.gdb_dialect p.infocmds = self.infocmds p.linetrace = self.linetrace p.linetrace_delay = self.linetrace_delay p.listsize = self.listsize p.noninteractive = self.noninteractive for attr in ('thread_name', 'no_thread_do_break', 'nothread_do_tbreak', 'nothread_trace_dispatch', 'nothread_quit', 'desired_thread'): if hasattr(self, attr): setattr(p, attr, getattr(self, attr)) # Some values that are different from the current environment # and different from the default initialization values. p.running = True # We *are* trying to run something p.step_ignore = 1 # We need to skip one statement sys.call_tracing(p.run, (arg, global_vars, local_vars)) self.msg("LEAVING RECURSIVE DEBUGGER") # sys.settrace() seems to mess up self.print_location # so print location first. self.print_location() sys.settrace(self.trace_dispatch) self.lastcmd = p.lastcmd return False def do_delete(self, arg): """delete [bpnumber [bpnumber...]] - Delete some breakpoints. Arguments are breakpoint numbers with spaces in between. To delete all breakpoints, give no argument. those breakpoints. Without argument, clear all breaks (but first ask confirmation). See also the 'clear' command which clears breakpoints by line/file number..""" if not arg: if get_confirmation(self, 'Delete all breakpoints'): self.clear_all_breaks() return numberlist = arg.split() for arg in numberlist: try: i = self.get_pos_int(arg, min_value=1, default=None, cmdname='delete') except ValueError: continue if not (i < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % i) continue err = self.clear_bpbynumber(i) if err: self.errmsg(err) else: self.msg('Deleted breakpoint %d' % i) def do_directory(self, arg): """Add directory DIR to beginning of search path for source files. Forget cached info on source file locations and line positions. DIR can also be $cwd for the current working directory, or $cdir for the directory in which the source file was compiled into object code. With no argument, reset the search path to $cdir:$cwd, the default.""" args = arg.split() if len(args) == 0: if get_confirmation(self, 'Reinitialize source path to empty'): self.search_path=[] return else: # FIXME: Loop over arguments checking for directory? self.search_path.insert(0, args[0]) def do_disable(self, arg): """disable [display] bpnumber [bpnumber ...] Disables the breakpoints given as a space separated list of bp numbers.""" args = arg.split() if len(args) == 0: self.errmsg('No breakpoint number given.') return if args[0] == 'display': self.display_enable(args[1:], 0) return for i in args: try: i = int(i) except ValueError: self.msg('Breakpoint index %r is not a number.' % i) continue if not (0 <= i < len(bdb.Breakpoint.bpbynumber)): self.msg('No breakpoint numbered %d.' % i) continue bp = bdb.Breakpoint.bpbynumber[i] if bp: bp.disable() def do_disassemble(self, arg): """disassemble [obj-or-class] [[+|-]start-line [[+|-]end-line]] With no argument, disassemble the current frame. With a start-line integer, the disassembly is narrowed to show lines starting at that line number or later; with an end-line number, disassembly stops when the next line would be greater than that or the end of the code is hit. If start-line or end-line has a plus or minus prefix, then the line number is relative to the current frame number. With a class, method, function, code or string argument disassemble that.""" if arg: args = arg.split() else: args = [] start_line = end_line = None relative_pos = False if len(args) > 0: if args[0] in ['+', '-']: start_line = self.curframe.f_lineno relative_pos = True else: start_line = int(args[0]) if args[0][0:1] in ['+', '-']: relative_pos = True start_line += self.curframe.f_lineno pass pass if len(args) == 2: try: end_line = self.get_int(args[1], cmdname="disassemble") except ValueError: return False elif len(args) > 2: self.errmsg("Expecting 1-2 line parameters, got %d" % len(args)) return False if not self.curframe: self.errmsg("No frame selected.") return False disassemble.disassemble(self, self.curframe.f_code, start_line=start_line, end_line=end_line, relative_pos=relative_pos) pass try: if len(args) > 1: try: start_line = self.get_int(args[1], cmdname="disassemble") if args[1][0:1] in ['+', '-']: relative_pos = True start_line += self.curframe.f_lineno pass if len(args) == 3: end_line = self.get_int(args[2], cmdname="disassemble") elif len(args) > 3: self.errmsg("Expecting 0-3 parameters, got %d" % len(args)) return False except ValueError: return False pass if hasattr(self, 'curframe') and self.curframe: obj=self.getval(args[0]) else: obj=eval(args[0]) pass disassemble.dis(self, obj, start_line=start_line, end_line=end_line, relative_pos=relative_pos) except NameError: self.errmsg("Object '%s' is not something we can disassemble" % args[0]) return False def do_display(self, arg): """display [format] EXP Print value of expression EXP each time the program stops. FMT may be used before EXP and may be one of 'c' for char, 'x' for hex, 'o' for octal, 'f' for float or 's' for string. With no argument, display all currently requested auto-display expressions. Use "undisplay" to cancel display requests previously made.""" if not arg: # Display anything active self.display.display(self.curframe) else: # Set up a display arglist = arg.split() if len(arglist) == 2: format, variable = arglist else: format = "" variable = arglist[0] dp = DisplayNode(self.curframe, variable, format) res = dp.checkValid(self.curframe) self.msg(res) return False def do_down(self, arg): """d(own) [count] Move the current frame one level down in the stack trace (to a newer frame). If using gdb dialect up matches the gdb: 0 is the most recent frame. Otherwise we match Python's stack: 0 is the oldest frame. """ try: count = self.get_int(arg, cmdname="down") except ValueError: return if self.gdb_dialect: count = -count self.__adjust_frame(pos=-count, absolute_pos=False) return False def do_enable(self, arg): """enable [display] bpnumber [bpnumber ...]] Enables the breakpoints given as a space separated list of bp numbers.""" args = arg.split() if len(args) == 0: self.errmsg('No breakpoint number given') return if args[0] == 'display': self.display_enable(args[1:], True) return for i in args: i = self.get_an_int(i, 'Breakpoint index %r is not a number' % i) if i is None: continue if not (1 <= i < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % i) continue bp = bdb.Breakpoint.bpbynumber[i] if bp: bp.enable() def do_examine(self, arg): """examine expression - Print the expression, its value, type, and object attributes.""" s = print_obj(arg, self.curframe) self.msg(s) do_x = do_examine def do_file(self, fname): """Use FILE as the Python program to be debugged. It is compiled and becomes is the program executed when you use the `run' command. If no filename is given, this means to set things so there is no Python file.""" if fname == "": if self.mainpyfile == "": self.msg('No exec file now.\nNo symbol file now.') return else: # should confirm this per if get_confirmation(self, "Discard symbol table from '%s'" % self.mainpyfile): # XXX how to clean up name space ?? self._program_sys_argv = None self.mainpyfile = '' else: # XXX how to clean up name space ?? if os.path.exists(fname): self.mainpyfile=fname self._program_sys_argv = [self.mainpyfile] self._runscript(self.mainpyfile) # Fake up curframe? return self.quitting else: self.errmsg("file '%s' does not exist" % fname) return None pass pass def do_finish(self, arg): """finish Continue execution until the current function returns.""" if not self.is_running(): return self.set_return(self.curframe) self.stepping = False if self.linetrace: self.stepping = True self.step_ignore = -1 self.stopframe = None # Tell cmdloop to break out of its loop. return True def do_frame(self, arg): """frame [frame-number] Move the current frame to frame `frame-number' if specified, or the current frame, 0 if no frame number specified. A negative number indicates position from the other end. So 'frame -1' moves when gdb dialect is in effect moves to the oldest frame, and 'frame 0' moves to the newest frame.""" if not self.stack: self.msg("Program has no stack frame set.") return False arg = arg.strip() or '0' arg = self.get_an_int(arg, ("The 'frame' command requires a frame number."+ " Got: %s") % arg) if arg is None: return False i_stack = len(self.stack) if arg < -i_stack or arg > i_stack-1: self.errmsg('Frame number has to be in the range %d to %d' \ % (-i_stack, i_stack-1)) else: self.__adjust_frame(pos=arg, absolute_pos=True) return False def do_handle(self, arg): """Specify how to handle a signal. Args are signals and actions to apply to those signals. recognized actions include "stop", "nostop", "print", "noprint", "pass", "nopass", "ignore", or "noignore". - Stop means reenter debugger if this signal happens (implies print and nopass). - Print means print a message if this signal happens. - Pass means let program see this signal; otherwise program doesn't know. - Ignore is a synonym for nopass and noignore is a synonym for pass. - Pass and Stop may not be combined. (This is different from gdb) """ self.sigmgr.action(arg) def do_ignore(self,arg): """ignore bpnumber count Sets the ignore count for the given breakpoint number. A breakpoint becomes active when the ignore count is zero. When non-zero, the count is decremented each time the breakpoint is reached and the breakpoint is not disabled and any associated condition evaluates to true.""" args = arg.split() bpnum = self.get_an_int(args[0], ("ignore: bpnumber %s does not evaluate to an" + " integer") % args[0], min_value=1) if bpnum is None: return False if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % bpnum) return False if len(args) > 1: count = self.get_an_int(args[1], ("ignore: count %s does not evaluate to an" + " integer.") % args[0], min_value=0) if count is None: return False else: count = 0 bp = bdb.Breakpoint.bpbynumber[bpnum] if bp: bp.ignore = count if count > 0: reply = 'Will ignore next ' if count > 1: reply = reply + '%d crossings' % count else: reply = reply + '1 crossing' self.msg('%s of breakpoint %d.' % (reply, bpnum)) else: self.msg('Will stop next time breakpoint %d is reached.' % bpnum) return False return False def do_ipython(self, arg_str): """ipython [ipython-opt1 ipython-opt2 ...] Run IPython as a command subshell. You need to have ipython installed for this command to work. If no IPython options are given, the following options are passed: -noconfirm_exit -prompt_in1 'Pydbgr In [\#]: ' You can access debugger state via local variable "ipydb". Debugger commands like are installed as IPython magic commands, e.g. %list, %up, %where. """ if not self.is_running(): return False if arg_str: argv = arg_split(arg_str, posix=True) else: argv = ['-noconfirm_exit','-prompt_in1', 'Pydb In [\\#]: '] pass if self.curframe and self.curframe.f_locals: user_ns = self.curframe.f_locals else: user_ns = {} # IPython does it's own history thing. # Make sure it doesn't damage ours. if self.readline: try: self.write_history_file() except IOError: pass # ipython should be around - it was before. try: import IPython except ImportError: self.errmsg("IPython doesn't seem to be importable.") return False user_ns['ipydb'] = self ipshell = IPython.Shell.IPShellEmbed(argv=argv, user_ns=user_ns) user_ns['ipshell'] = ipshell # Give ipython and the user a way to get access to the debugger setattr(ipshell, 'ipydb', self) if hasattr(ipshell.IP, "magic_pydb"): # We get an infinite loop when doing recursive edits self.msg("Removing magic %pydb") delattr(ipshell.IP, "magic_pydb") pass # add IPython "magic" commands for all debugger comamnds and # aliases. No doubt, this probably could be done in a # better way without "exec". (Someone just needs to suggest # a way...) ip = IPython.ipapi.get() magic_fn_template=""" def ipy_%s(self, args): dbg = self.user_ns['ipydb'] dbg.continue_running = dbg.do_%s(args) if dbg.continue_running: self.shell.exit() return ip.expose_magic("%s", ipy_%s) """ expose_magic_template = 'ip.expose_magic("%s", ipy_%s)' for name in self.get_cmds(): exec magic_fn_template % ((name,) * 4) pass # And just when you thought we've forgotten about running # the shell... ipshell() # Restore our history if we can do so. if self.readline and self.histfile is not None: try: self.readline.read_history_file(self.histfile) except IOError: pass return False return self.continue_running def do_info(self, arg): """Generic command for showing things about the program being debugged. You can give unique prefix of the name of a subcommand to get info about just that subcommand.""" if not arg: for subcommand in self.infocmds.list(): # Some commands have lots of output. # they are excluded here because 'in_list' is false. if self.infocmds.subcmds[subcommand]['in_list']: self.msg_nocr("%s: " % subcommand) self.do_info(subcommand) return else: args = arg.split() self.infocmds.do(self, args[0], args) def do_jump(self, arg, cmdname='Jump'): """jump lineno Set the next line that will be executed.""" if not self.is_running(): return False if self.curindex + 1 != len(self.stack): self.errmsg("You can only jump within the bottom frame") return False arg = self.get_an_int(str(arg), "jump: a line number is required, got %s." % arg) if arg is None: return False try: # Do the jump, fix up our copy of the stack, and display the # new position self.curframe.f_lineno = arg self.stack[self.curindex] = self.stack[self.curindex][0], arg self.print_location() except ValueError, e: self.errmsg('%s failed: %s' % (cmdname, e)) return False def do_kill(self, arg): """kill [unconditionally] Kill execution of program being debugged. Equivalent of kill -KILL where is os.getpid(), the current debugged process. This is an unmaskable signal. When all else fails, e.g. in thread code, use this. If 'unconditionally' is given, no questions are asked. Otherwise, if we are in interactive mode, we'll prompt to make sure. """ if len(arg) > 0 and 'unconditionally'.startswith(arg) or \ get_confirmation(self, 'Really do a hard kill', True): os.kill(os.getpid(), signal.SIGKILL) return False # Possibly not reached pass def do_list(self, arg): """l(ist) [- | . | first [last or count]] List source code. Without arguments, list LISTSIZE lines centered around the current line or continue the previous listing. "list -" lists LISTSIZE lines before a previous listing. "list ." means list centered around the current frame pointer. With one argument other than "-" or '.', list LISTSIZE lines centered around the specified position. With two arguments, list the given range; if the second argument is less than the first, it is a count. First and last can be either a function name, a line number or file:line""" filename, first, last = self.parse_list_cmd(arg) if filename is None: return breaklist = self.get_file_breaks(filename) # Python 2.5 or greater has 3 arg getline which handles # eggs and zip files if 3 == linecache.getline.func_code.co_argcount: getline = lambda f, l: linecache.getline(f, l, self.curframe.f_globals) else: getline = lambda f, l: linecache.getline(f, l) pass # We now have range information. Do the listing. try: for lineno in range(first, last+1): line = getline(filename, lineno) if not line: self.msg('[EOF]') break else: s = self._saferepr(lineno).rjust(3) if len(s) < 4: s = s + ' ' if lineno in breaklist: s = s + 'B' else: s = s + ' ' if lineno == inspect.getlineno(self.curframe) \ and filename == self.curframe.f_code.co_filename: s = s + '->' self.msg_nocr(s + '\t' + line) self.lineno = lineno except KeyboardInterrupt: pass return False do_l = do_list def do_next(self, arg): """n(ext) [count] Continue execution until the next line in the current function is reached or it returns. With an integer argument, perform 'next' that many times.""" if not self.is_running(): return try: # 0 means stop now or step 1, so we subtract 1. self.step_ignore = self.get_pos_int(arg, default=1, cmdname='next') - 1 except ValueError: return False self.stepping = True # Used in thread debugging self.set_next(self.curframe) # Tell cmdloop to break out of its loop. return True do_n = do_next def do_p(self, arg): """Print the value of the expression. Variables accessible are those of the environment of the selected stack frame, plus globals. The expression may be preceded with /FMT where FMT is one of the format letters 'c', 'x', 'o', 'f', or 's' for chr, hex, oct, float or str respectively. If the length output string large, the first part of the value is shown and ... indicates it has been truncated See also `pp' and `examine' for commands which do more in the way of formatting.""" args = arg.split() if len(args) > 1 and '/' == args[0][0]: fmt = args[0] del args[0] arg = ' '.join(args) else: fmt = None pass try: val = self.getval(arg) if fmt: val = fns.printf(val, fmt) pass self.msg(self._saferepr(val)) except: pass def do_pdef(self, arg): """pdef obj Print the definition header for a callable object. If the object is a class, print the constructor information. See also pydoc.""" args = arg.split() if len(args) != 1: return obj_name = args[0] try: obj = eval(arg, self.curframe.f_globals, self.curframe.f_locals) except: return if not callable(obj): self.errmsg('Object %s is not callable.' % obj_name) return if inspect.isclass(obj): self.msg('Class constructor information:') obj = obj.__init__ elif type(obj) is types.InstanceType: obj = obj.__call__ pass output = print_argspec(obj, obj_name) if output is None: self.errmsg('No definition header found for %s' % obj_name) else: self.msg(output) pass return def do_pp(self, arg): """pp expression Pretty-print the value of the expression.""" try: val = self.getval(arg) if type(val) == types.ListType: # Handle simple case where list is not nested simple = True for i in range(len(val)): if not (type(val[i]) in [types.BooleanType, types.FloatType, types.IntType, types.StringType, types.UnicodeType, types.NoneType, types.LongType]): simple = False break if simple: self.msg(fns.columnize_array(val, self.width)) return False self.msg(pprint.pformat(val)) except: pass def do_pwd(self, arg): "Print working directory." self.msg('Working directory ' + os.getcwd() + '.') def do_pydoc(self, arg): """pydoc ... Show pydoc documentation on something. may be the name of a Python keyword, topic, function, module, or package, or a dotted reference to a class or function within a module or module in a package. If contains a '/', it is used as the path to a Python source file to document. If name is 'keywords', 'topics', or 'modules', a listing of these things is displayed. """ sys_path_save = list(sys.path) sys_argv_save = list(sys.argv) sys.argv = ['pydoc'] + shlex.split(arg) pydoc.cli() sys.argv = sys_argv_save sys.path = sys_path_save return False def do_python(self, arg_str): """python Run python as a command subshell. """ # See if python's code module is around try: from code import interact except ImportError: self.msg("python code doesn't seem to be importable.") return False # Python does it's own history thing. # Make sure it doesn't damage ours. if hasattr(self, 'readline') and self.readline: try: self.write_history_file() except IOError: pass local = None if self.curframe: if self.curframe.f_locals: local = dict(self.curframe.f_locals) local.update(self.curframe.f_globals) else: local = self.curframe.f_globals pass if local: interact(banner='Pydb python shell', local=local) else: interact(banner='Pydb python shell') # Restore our history if we can do so. if hasattr(self, 'readline') and self.readline and self.histfile is not None: try: self.readline.read_history_file(self.histfile) except IOError: pass return False return False def do_quit(self, arg): """q(uit) or exit - Quit the debugger. The program being executed is aborted.""" if self.target != 'local': self._rebind_output(self.orig_stdout) self._rebind_input(self.orig_stdin) self._disconnect() self.target = 'local' sys.settrace(None) self._user_requested_quit = True self.running = False self.set_quit() # Tell cmdloop to break out of its loop. return True do_q = do_quit def do_restart(self, arg): """restart - Restart debugger and program via an exec call. All state is lost, and new copy of the debugger is used.""" # We don't proceed with the restart until the action has been # ACK'd by any connected clients if self.connection != None: self.msg('restarting (connection)') line = "" while not 'ACK:restart_now' in line: line = self.connection.readline() self.do_rquit(None) else: if self._sys_argv[0]: self.msg("Re exec'ing:\n\t%s" % self._sys_argv) os.execvp(self._sys_argv[0], self._sys_argv) else: self.msg("No exectuable file specified.") return False def do_return(self, arg): """Make selected stack frame return to its caller. Control remains in the debugger, but when you continue execution will resume at the return statement found inside the subroutine or method. At present we are only able to perform this if we are in a subroutine that has a 'return' statement in it.""" if not self.is_running(): return frame = self.curframe if '?' == frame.f_code.co_name and not '__args__' in frame.f_locals: self.errmsg("I don't see that we are in a subroutine.") return while True and not self.noninteractive: try: # reply = raw_input('Make %s return now? (y or n) ') reply = raw_input('Return now? (y or n) ').strip() except EOFError: reply = 'no' reply = reply.strip().lower() if reply in ('y', 'yes'): break elif reply in ('n', 'no'): return else: self.msg("Please answer y or n.") co = frame.f_code code = co.co_code labels = dis.findlabels(code) linestarts = dict(dis.findlinestarts(co)) i=frame.f_lasti last_line = inspect.getlineno(frame) # last_stmt = i # print "++i: %d, len(code): %d" % (i, len(code)) while i < len(code): i += 1 if i in labels: # print "++last_stmt %d" % i # last_stmt = i last_line = None if i in linestarts and i > 0: # print "++last_line %d" % linestarts[i] last_line = linestarts[i] if 'RETURN_VALUE' == op_at_frame(frame, i): break if i == len(self.stack) or last_line is None: self.msg("Sorry; a return statement was not found.") return # print "++i: %d, last_stmt %d, line: %d " % (i, last_stmt, last_line) self.do_jump(last_line, "Return") return False def do_run(self, arg_str): """run [args...] Run or "soft" restart the debugged Python program. If a string is supplied, it is splitted with "shlex" but preserving embedded quotes. The result is used as the new sys.argv. History, breakpoints, actions and debugger options are preserved. R is a alias for 'run'. See also 'restart' for an exec-like restart.""" if not self._program_sys_argv: self.errmsg("No Python program registered.") self.errmsg("Perhaps you want to use the 'file' command?") return if arg_str: argv_start = self._program_sys_argv[0:1] self._program_sys_argv = arg_split(arg_str) self._program_sys_argv[:0] = argv_start raise Restart do_R = do_run def do_save(self, arg): """save [all|break|settings] [filename] Save specified settings to a file as a script Use the 'source' command in another debug session to restore them.""" args = arg.split() actions = ['all', 'break', 'settings'] filename = os.path.expanduser("~/pydb-restart.txt") if 0 == len(args): what = 'all' elif 1 == len(args): if args[0] in actions: what = args[0] else: filename = os.path.expanduser(args[0]) what = 'all' elif 2 == len(args): what = args[0] if args[0] not in actions: self.errmsg("Action has to be 'all', 'break' or 'settings; " "got '%s'." % args[0]) return False filename = os.path.expanduser(args[1]) else: # len(args) > 2: self.errmsg("Expecting 0-2 arguments, got %d." % len(args)) return False restart_file = open(filename, 'w') what_str = '' if what in ('all', 'break'): lines = self.output_break_commands() restart_file.write("\n".join(lines) + "\n") what_str = 'Breakpoints' if what in ('all', 'settings'): if '' == what_str: what_str = 'Settings' else: what_str = 'Settings and breakpoints' for subcommand in self.setcmds.list(): if subcommand in ['args', 'debug-pydb', 'history', 'logging', 'prompt', 'trace-commands', 'warnoptions']: continue # commands that have lots of output we can't handle right now. if not self.showcmds.subcmds[subcommand]['in_list']: continue val = eval('self.get_%s()' % subcommand) restart_file.write('set %s %s\n' % (subcommand, val)) if what_str != '': restart_file.close() self.msg('%s saved to file %s' % (what_str, restart_file.name)) return False return False def do_set(self, arg): """See help_set""" args = arg.split() if len(args) == 1 and 'warnoptions'.startswith(args[0]): self.setcmds.do(self, args[0], args) return if len(args) < 2: self.errmsg("Expecting at least 2 arguments, got %d." % len(args)) return False self.setcmds.do(self, args[0], args) return False def do_shell(self, arg): """Execute the rest of the line as a shell command.""" os.system(arg) return False def do_show(self, arg): """Generic command for showing things about the debugger. You can give unique prefix of the name of a subcommand to get info about just that subcommand.""" if not arg: for subcommand in self.showcmds.list(): # Some commands have lots of output. # they are excluded here because 'in_list' is false. if self.showcmds.subcmds[subcommand]['in_list']: self.msg_nocr("%s: " % subcommand) self.do_show(subcommand) return False if self._re_linetrace_delay.match(arg): self.msg("line trace delay is %s. (In seconds)" % self.linetrace_delay) else: args = arg.split() self.showcmds.do(self, args[0], args) return False def do_signal(self, arg): """signal [signum|signame] Send a signal to the debugged process. """ if arg =='': signum = 0 else: try: signum = int(eval(arg)) if sighandler.lookup_signame(signum) == None: self.msg("Signal number %d not a known signal number." % signum) return except ValueError: signum = sighandler.lookup_signum(arg) if signum == None: self.msg("Signal name %s not a known signal name." % arg) return os.kill(os.getpid(), signum) return False def do_skip(self, arg): """skip [count] Set the next line that will be executed. The line must be within the stopped or bottom-most execution frame frame.""" if not self.is_running(): return None if self.curindex + 1 != len(self.stack): self.errmsg("You can only skip within the bottom frame.") return None if self.curframe.f_trace is None: self.errmsg("Sigh - operation can't be done here.") return None try: count = self.get_pos_int(arg, default=1, cmdname='skip') except ValueError: return None co = self.curframe.f_code offset = self.curframe.f_lasti if count is None: return False lineno = bytecode.next_linestart(co, offset, count) if lineno < 0: self.errmsg('No next line found') return False try: # Set to change position, update our copy of the stack, # and display the new position self.curframe.f_lineno = lineno self.stack[self.curindex] = self.stack[self.curindex][0], lineno self.print_location() except ValueError, e: self.errmsg('skip failed: %s' % e) return None def do_source(self, arg): """source [-v] FILE Read debugger commands from a file named FILE. Optional -v switch (before the filename) causes each command in FILE to be echoed as it is executed. Note that the file '.@PACKAGE_NAME@rc' is read automatically in this way when @PACKAGE_NAME@ is started. An error in any command terminates execution of the command file and control is returned to the console.""" args = arg.split() verbose=False if len(args) == 2 and args[0] == '-v': arg=args[1] verbose=True self.setup_source(os.path.expanduser(arg), True); rc = self.execRcLines(verbose) if rc == 1: return True return False def do_step(self, arg): """s(tep) [count] Execute the current line, stop at the first possible occasion (either in a function that is called or in the current function). With an integer argument, step that many times.""" if not self.is_running(): return None try: # 0 means stop now or step 1, so we subtract 1. self.step_ignore = self.get_pos_int(arg, default=1, cmdname='step') - 1 except ValueError: return self.stepping = True # Used in thread debugging self.set_step() # Tell cmdloop to break out of its loop. return True do_s = do_step def do_tbreak(self, arg, thread_name=None): """tbreak [ ([filename:]lineno | function) [, condition] ] Set a temporary breakpoint. Arguments are like the "break" command. Like "break" except the breakoint is only temporary, so it will be deleted when hit.""" self.do_break(arg, 1, thread_name) def do_unalias(self, arg): """unalias name Deletes the specified alias.""" args = arg.split() if len(args) == 0: return if args[0] in self.aliases: del self.aliases[args[0]] return False # Print a traceback starting at the top stack frame. # The most recently entered frame is printed last; # this is different from dbx and gdb, but consistent with # the Python interpreter's stack trace. # It is also consistent with the up/down commands (which are # compatible with dbx and gdb: up moves towards 'main()' # and down moves towards the most recent stack frame). def do_undisplay(self, arg): """Cancel some expressions to be displayed when program stops. Arguments are the code numbers of the expressions to stop displaying. No argument means cancel all automatic-display expressions. "delete display" has the same effect as this command. Do "info display" to see current list of code numbers.""" if arg: args = arg.split() if len(args) == 1: self.display.clear() return for i in args: i = self.get_an_int(i, 'index %r is not a number' % i) if i is not None: if not self.display.delete_index(i): self.errmsg("No display number %d." % i) return pass pass return False def do_up(self, arg): """up [count] Move the current frame one level up in the stack trace (to an older frame). If using gdb dialect up matches the gdb: 0 is the most recent frame. Otherwise we match Python's stack: 0 is the oldest frame. """ try: count = self.get_int(arg, cmdname="up") except ValueError: return if self.gdb_dialect: count = -count self.__adjust_frame(pos=count, absolute_pos=False) return False def do_whatis(self, arg): """whatis arg Prints the type of the argument which can be a Python expression.""" try: if not self.curframe: # ?? Should we have set up a dummy globals # to have persistence? value = eval(arg, None, None) else: value = eval(arg, self.curframe.f_globals, self.curframe.f_locals) except: t, v = sys.exc_info()[:2] if type(t) == types.StringType: exc_type_name = t else: exc_type_name = t.__name__ if exc_type_name == 'NameError': self.errmsg("Name Error: %s" % arg) else: self.errmsg("%s: %s" % (exc_type_name, self._saferepr(v))) return False if inspect.ismethod(value): self.msg('method %s%s' % (value.func_code.co_name, inspect.formatargspec(inspect.getargspec(value)))) if inspect.getdoc(value): self.msg('%s:\n%s' % (value, inspect.getdoc(value))) return False elif inspect.isfunction(value): self.msg('function %s%s' % (value.func_code.co_name, inspect.formatargspec(inspect.getargspec(value)))) if inspect.getdoc(value): self.msg('%s:\n%s' % (value, inspect.getdoc(value))) return False # None of the above... self.msg(type(value)) return False def do_where(self, arg): """where [count] Print a stack trace, with the most recent frame at the top. With a positive number, print at most many entries. An arrow indicates the 'current frame', which determines the context of most commands. 'bt' and 'T' are short command names for this.""" try: count = self.get_pos_int(arg, default=None, cmdname="where") except ValueError: return False if not self.curframe: self.msg("No stack.") return False print_stack_trace(self, count) return False do_T = do_bt = do_where def do_EOF(self, arg): """EOF Handles the receipt of EOF as a command.""" self.msg("") self._user_requested_quit = True self.set_quit() # Tell cmdloop to break out of its loop. return True ######################################################### # Help methods (derived from @PACKAGE@.doc or vice versa) ######################################################### for fn in ('EOF', 'alias', 'break', 'cd', 'clear', 'condition', 'continue', 'debug', 'disable', 'delete' , 'disassemble', 'display', 'down', 'enable', 'examine', 'finish', 'frame', 'help', 'ignore', 'info', 'jump', 'list', 'next', 'p', 'pp', 'pwd', 'quit', 'restart', 'retval', 'run', 'set', 'show', 'shell', 'source', 'step', 'tbreak', 'unalias', 'undisplay', 'up', 'whatis', 'where'): exec 'def help_%s(self, *arg): self.msg(self.do_%s.__doc__)' \ % (fn, fn) # Is this the right way to do this? ## Remove duplicate short names ## help_h = help_help ## help_R = help_run ## help_bt = help_T = help_where def help_commands(self, *arg): print """commands [bpnumber] >... >end (Pydb) Set commands to be executed when a breakpoint is hit. Give breakpoint number as the argument after "commands". With no bpnumber argument, commands refers to the last one set. The commands themselves follow starting on the next line. Type a line containing "end" to terminate the commands. To remove all commands from a breakpoint, type commands and follow it immediately with end; that is, give no commands. You can use breakpoint commands to start your program up again. Simply use the continue command, or step, or any other command that resumes execution. Specifying any command resuming execution (currently continue, step, next, return, jump, and quit) terminates the command list as if that command was immediately followed by 'end'. This is because any time you resume execution (even with a simple next or step), you may encounter another breakpoint--which could have its own command list, leading to ambiguities about which list to execute. If you use the 'silent' command in the command list, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If none of the other commands print anything, you see no sign that the breakpoint was reached. """ def help_exec(self, *arg): self.msg("""(!) statement Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To assign to a global variable you must always prefix the command with a 'global' command, e.g.: %sglobal list_options; list_options = ['-l'] %s""" % (self.prompt, self.prompt)) return # Note: format of help is compatible with ddd. def help_info(self, args): """Generic command for showing things about the program being debugged.""" if len(args) == 0: self.infocmds.help(self, '') else: self.infocmds.help(self, args[0]) return return # Note: format of help is compatible with ddd. def help_set(self, args): """This command modifies parts of the debugger environment. You can see these environment settings with the 'show' command.""" if len(args) == 0: self.setcmds.help(self, '') else: self.setcmds.help(self, args[0]) return return # Note: format of help is compatible with ddd. def help_show(self, args): """Generic command for showing things about the debugger.""" if len(args) == 0: self.showcmds.help(self, '') else: self.showcmds.help(self, args[0]) return return def help_unalias(self): print """unalias name Deletes the specified alias.""" return ####### End of help section ######## # # Local variables: # mode: Python # End: pydb-1.26/pydb/disassemble.py0000644000175000017500000001276111167745261013145 00000000000000# Modified from dis. Changed output to use msg and msg_nocr. # Added first_line and last_line parameters import types from dis import distb, findlabels, findlinestarts from opcode import * def dis(obj, x=None, start_line=-1, end_line=None, relative_pos = False): """Disassemble classes, methods, functions, or code. With no argument, disassemble the last traceback. """ if x is None: distb() return if type(x) is types.InstanceType: x = x.__class__ if hasattr(x, 'im_func'): obj.msg("Dissassembly of %s: " % x) x = x.im_func if hasattr(x, 'func_code'): obj.msg("Dissassembly of %s: " % x) x = x.func_code elif hasattr(x, 'f_code'): obj.msg("Dissassembly of %s: " % x) x = x.f_code pass elif inspect.iscode(x): pass if hasattr(x, '__dict__'): items = x.__dict__.items() items.sort() for name, x1 in items: if type(x1) in (types.MethodType, types.FunctionType, types.CodeType, types.ClassType): try: dis(obj, x1, start_line=start_line, end_line=end_line) except TypeError, msg: obj.errmsg("Sorry:", msg) obj.msg("") elif hasattr(x, 'co_code'): disassemble(obj, x, start_line=start_line, end_line=end_line, relative_pos=relative_pos) elif isinstance(x, str): dis.disassemble_string(x) else: obj.errmsg("Don't know how to disassemble %s objects." % type(x).__name__) return def disassemble(obj, co, lasti=-1, start_line=-1, end_line=None, relative_pos=False): """Disassemble a code object.""" disassemble_string(obj, co.co_code, lasti, co.co_firstlineno, start_line, end_line, relative_pos, co.co_varnames, co.co_names, co.co_consts, co.co_cellvars, co.co_freevars, dict(findlinestarts(co))) return def disassemble_string(obj, code, lasti=-1, cur_line=0, start_line=-1, end_line=None, relative_pos=False, varnames=(), names=(), consts=(), cellvars=(), freevars=(), linestarts={}): """Disassemble byte string of code. If end_line is negative it counts the number of statement linestarts to use.""" statement_count = 10000 if end_line is None: end_line = 10000 elif relative_pos: end_line += start_line -1 pass labels = findlabels(code) n = len(code) i = 0 extended_arg = 0 free = None null_print = lambda x: None if start_line > cur_line: msg_nocr = null_print msg = null_print else: msg_nocr = obj.msg_nocr msg = obj.msg while i < n and statement_count >= 0: c = code[i] op = ord(c) if i in linestarts: if i > 0: msg("") cur_line = linestarts[i] if start_line and start_line > cur_line: msg_nocr = null_print msg = null_print else: statement_count -= 1 msg_nocr = obj.msg_nocr msg = obj.msg if cur_line > end_line: break msg_nocr("%3d" % cur_line) else: msg_nocr(' ') if i == lasti: msg_nocr('-->') else: msg_nocr(' ') if i in labels: msg_nocr('>>') else: msg_nocr(' ') msg_nocr(repr(i).rjust(4)) msg_nocr(opname[op].ljust(20)) i += 1 if op >= HAVE_ARGUMENT: oparg = ord(code[i]) + ord(code[i+1])*256 + extended_arg extended_arg = 0 i += 2 if op == EXTENDED_ARG: extended_arg = oparg*65536L msg_nocr(repr(oparg).rjust(5)) if op in hasconst: msg_nocr('(' + repr(consts[oparg]) + ')') elif op in hasname: msg_nocr('(' + names[oparg] + ')') elif op in hasjrel: msg_nocr('(to ' + repr(i + oparg) + ')') elif op in haslocal: msg_nocr('(' + varnames[oparg] + ')') elif op in hascompare: msg_nocr('(' + cmp_op[oparg] + ')') elif op in hasfree: if free is None: free = cellvars + freevars msg_nocr('(' + free[oparg] + ')') msg("") return import marshal, struct, time # Inspired by show_file from: # http://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html def pyc2code(fname): '''Return a code object from a Python compiled file''' f = open(fname, "rb") magic = f.read(4) moddate = f.read(4) modtime = time.localtime(struct.unpack('L', moddate)[0]) code = marshal.load(f) f.close() return magic, moddate, modtime, code if __name__ == '__main__': class DisassembleTestClass: def errmsg(self, msg): print('*** %s' % msg) return def msg(self, msg): print(msg) return def msg_nocr(self, msg): print msg, return pass import inspect dt = DisassembleTestClass() curframe = inspect.currentframe() dis(dt, curframe) dis(dt, dt.errmsg) import sys magic, moddate, modtime, co = pyc2code(sys.modules['types'].__file__) disassemble(dt, co, -1, 1, 70) pass pydb-1.26/pydb/threaddbg.py0000644000175000017500000007276711167745261012612 00000000000000# -*- coding: utf-8 -*- """Thread debugging support. $Id: threaddbg.py,v 1.42 2009/02/28 11:26:18 rockyb Exp $""" ### TODO ### - Go over for robustness, import bdb, inspect, os, pydb, sys import fns import thread, threading from gdb import Restart from threadinfo import * class threadDbg(pydb.Pdb): """A class to extend the Pdb class to add thread debugging. The notable extensions are gdb-like: info thread - what threads are out there thread - switch thread """ def __init__(self, completekey='tab', stdin=None, stdout=None): pydb.Pdb.__init__(self, completekey, stdin, stdout) self.add_hook() self.stack = self.curframe = self.botframe = None # desired_thread is a lists of threads allowed to run. # It is part of the mechanism used to switch threads and thus # We set in the "thread" command. It is cleared then in the # dispatcher after getting one of the desired threads. # If the variable is None than any thread can run. self.desired_thread=None self.is_in_dbg = is_in_threaddbg self.thread_id = thread.get_ident() self.thread_name = threading.currentThread().getName() self.curframe_thread_name = self.thread_name self.nothread_do_break = pydb.Pdb.do_break self.nothread_do_tbreak = pydb.Pdb.do_tbreak self.nothread_trace_dispatch = bdb.Bdb.trace_dispatch self.nothread_quit = pydb.Pdb.do_quit # List of threads that we know about and have the possibility # of switching to. This is Indexed by thread name and # the value is the thread id. self.traced = {} self.end_thread=-1 # Highest short name in use. if hasattr(sys, "_current_frames"): self.do_tracethread = self.new_do_tracethread ## self.do_thread = self.new_do_thread self.info_thread = self.info_thread_new else: try: import threadframe self.do_tracethread = self.new_do_tracethread self.info_thread = self.info_threadframe sys._current_frames = threadframe.dict # Make it look like 2.5 except: self.info_thread = self.info_thread_old ## self.traceall() self.infocmds.add('threads', self.info_thread, 2, False) def get_threadframe_frame(self, thread_name): """Return the frame having thread name that we look up in self.traced.""" if thread_name not in self.traced.keys(): return None frames = sys._current_frames() thread_id = self.traced[thread_name] return frames[thread_id] def add_hook(self): """Set new threads to be traced. This is it's own routine rather than in __init__ so we can turn on/and off at will. """ # threading_lock makes sure there is only one thread # running at a time. Later on we may want to relax this # condition. self.threading_lock=threading.Lock() # threading_cond is used to indicate a particular thread # should get control. It's conceivable that this could be # combined with threading_lock but so far it seems more # complicated (if not error prone) that way. self.threading_cond=threading.Condition(threading.Lock()) self.threading_imported=True self.running=True threading.settrace(self.trace_dispatch) def do_break(self, arg, temporary=0, thread_name=None): """b(reak) {[file:]lineno | function} [thread Thread-name] [, condition] With a line number argument, set a break there in the current file. With a function name, set a break at first executable line of that function. Without argument, set a breakpoint at current location. If a second argument is present, it is a string specifying an expression which must evaluate to true before the breakpoint is honored. The line number may be prefixed with a filename and a colon, to specify a breakpoint in another file (probably one that hasn't been loaded yet). The file is searched for on sys.path; the .py suffix may be omitted. If a thread name is given we will stop only if the the thread has that name; dot (.) can be used to indicate the current thread.""" # Decorate non-thread break to strip out 'thread Thread-name' args = arg.split() if len(args) > 2 and args[1] == 'thread': thread_name = args[2] if thread_name == '.': thread_name = threading.currentThread().getName() del args[1:3] arg = ' '.join(args) if thread_name and thread_name not in self.traced.keys(): self.errmsg("I don't know about thread %s" % thread_name) if not fns.get_confirmation(self, 'Really set anyway (y or n)? '): return self.nothread_do_break(self, arg, temporary=temporary, thread_name=thread_name) def do_frame(self, arg): """frame [thread-Name|thread-number] [frame-number] Move the current frame to the specified frame number. If a Thread-Name is given, move the current frame to that. Dot (.) can be used to indicate the name of the current frame. A thread number can be used in Python 2.5 or greater. 0 is the most recent frame. A negative number indicates position from the other end. So 'frame -1' moves when gdb dialect is in effect moves to the oldest frame, and 'frame 0' moves to the newest frame.""" args = arg.split() if len(args) > 0: thread_name = args[0] try: thread_id = int(thread_name) if hasattr(sys, '_current_frames'): threads = sys._current_frames() if thread_id not in threads.keys(): self.errmsg("I don't know about thread number %s" % thread_name) self.info_thread_terse() return frame = threads[thread_id] newframe = find_nondebug_frame(self, frame) if newframe is not None: frame = newframe self.stack, self.curindex = self.get_stack(frame, None) if len(args) == 1: arg = '0' else: arg = ' '.join(args[1:]) except ValueError: # Must be frame command without a frame number if thread_name == '.': thread_name = threading.currentThread().getName() if thread_name not in self.traced.keys(): self.errmsg("I don't know about thread %s" % thread_name) return thread_id = self.traced[thread_name] if hasattr(sys, '_current_frames'): frames = sys._current_frames() if thread_id in frames.keys(): self.curframe_thread_name = thread_name frame = frames[thread_id] else: self.errmsg("Frame selection not supported. Upgrade to") self.errmsg("Python 2.5 or install threadframe.") return newframe = find_nondebug_frame(self, frame) if newframe is not None: frame = newframe self.stack, self.curindex = self.get_stack(frame, None) if len(args) == 1: arg = '0' else: arg = ' '.join(args[1:]) self.thread_name = threading.currentThread().getName() pydb.Pdb.do_frame(self, arg) def do_quit(self, arg): """If all threads are blocked in the debugger, tacitly quit. If some are not, then issue a warning and prompt for quit.""" really_quit = True threading_list = threading.enumerate() if (len(threading_list) == 1 and threading_list[0].getName() == 'MainThread'): # We just have a main thread so that's safe to quit return self.nothread_quit(self, arg) if hasattr(sys, "_current_frames"): frames = sys._current_frames() else: frames = None for thread_obj in threading_list: thread_name = thread_obj.getName() if not thread_name in self.traced.keys(): self.msg("I don't know about state of %s" % thread_name) really_quit = False break thread_id = self.traced[thread_name] if frames: if thread_id in frames.keys(): frame = frames[thread_id] if not self.is_in_dbg(frame): self.msg("Thread %s is not blocked by the debugger." % thread_name) really_quit = False break else: self.msg("Thread ID for thread %s not found. Weird." % thread_name) really_quit = False break if not really_quit: really_quit = fns.get_confirmation(self, 'Really quit anyway (y or n)? ', True) self.msg("Quit for threading not fully done yet. Try kill.") return if really_quit: self.nothread_quit(self, arg) def do_qt(self, arg): """Quit the current thread.""" thread_name=threading.currentThread().getName() self.msg( "quitting thread %s" % thread_name) del self.traced[thread_name] self.threading_lock.release() thread.exit() def do_tbreak(self, arg): """tbreak {[file:]lineno | function} [thread Thread-name] [, condition] Set a temporary breakpoint. Arguments are like the "break" command. Like "break" except the breakoint is only temporary, so it will be deleted when hit. If a thread name is given we will stop only if the the thread has that name.""" # Decorate non-thread break to strip out 'thread Thread-name' args = arg.split() thread_name = None if len(args) > 2 and args[1] == 'thread': thread_name = args[2] if thread_name == '.': thread_name = threading.currentThread().getName() if thread_name not in self.traced.keys(): self.errmsg("I don't know about thread %s" % thread_name) if not fns.get_confirmation(self, 'Really set anyway (y or n)? '): return del args[1:3] arg = ' '.join(args) self.nothread_do_tbreak(self, arg, thread_name) return def do_tracethread(self, args): """Set to trace all threads. However Python 2.5 or the threadframe module is needed for this and it appear you have neither installed.""" return def new_do_tracethread(self, args): """Make sure all frames are set to be traced under the Python 2.5 regime. This would needed if we started debugging mid-way via say set_trace and threads have already been created. """ threads = sys._current_frames() for t in threads.keys(): frame = find_nondebug_frame(self, threads[t]) self.set_trace(frame) def do_where(self, arg): """where [count] Print a stack trace, with the most recent frame at the top. With a positive number, print at most many entries. An arrow indicates the 'current frame', which determines the context of most commands. 'bt' and 'T' are short command names for this.""" # Decorate old 'where' to show current thread. self.print_frame_thread() pydb.Pdb.do_where(self, arg) # For Python before 2.5b1 and no threadframe module def info_thread_old(self, args, short_display=False): """IDs of currently known threads.""" self.thread_name = threading.currentThread().getName() if len(args) == 2: if args[1].startswith('terse'): self.info_thread_terse() return if len(args) > 1: if args[1] not in self.traced.keys(): self.errmsg("I don't know about thread %s" % args[1]) self.info_thread_terse() return self.msg("Current thread is %s" % self.thread_name) if len(args) == 3 and args[2].startswith('terse'): self.info_thread_terse(args[2]) return for t in threading.enumerate(): self.msg(t) self.info_thread_terse() return ## FIXME remove common code with info_thread_new # For Python with threadframe def info_threadframe(self, args, short_display=False): """info thread [thread-name|thread-id] [terse|verbose] List all currently-known thread name(s). If no thread name is given, we list info for all threads. A terse listing just gives the thread name and thread id. If 'verbose' appended to the end of the command, then the entire stack trace is given for each frame. """ self.thread_name = threading.currentThread().getName() threads = sys._current_frames() all_verbose = False if len(args) == 2: if args[1].startswith('verbose'): all_verbose = True elif args[1].startswith('terse'): self.info_thread_terse() return if len(args) > 1 and not all_verbose: thread_name = args[1] if thread_name == '.': thread_name = threading.currentThread().getName() try: thread_id = int(thread_name) if thread_id not in threads.keys(): self.errmsg("I don't know about thread number %s" % thread_name) self.info_thread_terse() return except ValueError: if thread_name not in self.traced.keys(): self.errmsg("I don't know about thread %s" % thread_name) self.info_thread_terse() return thread_id = self.traced[thread_name] frame = threads[thread_id] frame = find_nondebug_frame(self, frame) stack_trace(self, frame) return thread_id2name = {} for thread_name in self.traced.keys(): if self.get_threadframe_frame(thread_name) is not None: thread_id2name[self.traced[thread_name]] = thread_name # Show info about *all* threads # FIXME: sort by thread name for thread_id in threads.keys(): s = '' # Print location where thread was created and line number if thread_id in thread_id2name.keys(): thread_name = thread_id2name[thread_id] if thread_name == self.thread_name: prefix='-> ' else: prefix=' ' s += "%s%s" % (prefix, thread_name) if all_verbose: s += ": %d" % thread_id else: s += " thread id: %d" % thread_id s += "\n " frame = find_nondebug_frame(self, threads[thread_id]) s += self.format_stack_entry((frame, frame.f_lineno)) self.msg('-' * 40) self.msg(s) frame = frame.f_back if all_verbose and frame: stack_trace(self, frame) return ## FIXME remove common code with info_thread_new # For Python on or after 2.5b1 def info_thread_new(self, args, short_display=False): """info thread [thread-name|thread-number] [terse|verbose] List all currently-known thread name(s). If no thread name is given, we list info for all threads. Unless a terse listing, for each thread we give: - the class, thread name, and status as - the top-most call-stack information for that thread. Generally the top-most calls into the debugger and dispatcher are omitted unless set debug-pydb is True. If 'verbose' appended to the end of the command, then the entire stack trace is given for each frame. If 'terse' is appended we just list the thread name and thread id. To get the full stack trace for a specific thread pass in the thread name. """ self.thread_name = threading.currentThread().getName() threads = sys._current_frames() all_verbose = False if len(args) == 2: if args[1].startswith('verbose'): all_verbose = True elif args[1].startswith('terse'): self.info_thread_terse() return if len(args) > 1 and not all_verbose: thread_name = args[1] if thread_name == '.': thread_name = threading.currentThread().getName() try: thread_id = int(thread_name) if thread_id not in threads.keys(): self.errmsg("I don't know about thread number %s" % thread_name) self.info_thread_terse() return except ValueError: if thread_name not in self.traced.keys(): self.errmsg("I don't know about thread %s" % thread_name) self.info_thread_terse() return thread_id = self.traced[thread_name] frame = threads[thread_id] frame = find_nondebug_frame(self, frame) stack_trace(self, frame) return # Show info about *all* threads thread_key_list = threads.keys() thread_key_list.sort(key=id2threadName) for thread_id in thread_key_list: frame = threads[thread_id] frame = find_nondebug_frame(self, frame) s = '' # Print location where thread was created and line number if thread_id in threading._active: thread_name = id2threadName(thread_id) if thread_name == self.thread_name: prefix='-> ' else: prefix=' ' s += "%s%s" % (prefix, str(threading._active[thread_id])) if all_verbose: s += ": %d" % thread_id else: s += " thread id: %d" % thread_id s += "\n " s += self.format_stack_entry((frame, frame.f_lineno)) self.msg('-' * 40) self.msg(s) frame = frame.f_back if all_verbose and frame: stack_trace(self, frame) return def info_thread_line(self, thread_name): if thread_name == self.thread_name: prefix='-> ' else: prefix=' ' self.msg("%s%s: %d" % (prefix, thread_name, self.traced[thread_name])) return def info_thread_missing(self): """Show information about threads we might not know about""" if hasattr(sys, "_current_frames") and \ len(self.traced) != len(sys._current_frames()): frames = sys._current_frames() thread_ids = frames.keys() self.msg("Untraced/unknown threads:") for thread_id in thread_ids: if thread_id not in self.traced.values(): self.msg("\t%d" % thread_id) return def info_thread_terse(self, arg=None): if arg is not None: thread_name = arg if thread_name in self.traced_keys(): self.info_thread_line(thread_name) else: self.errmsg("I don't know about thread name %s" % thread_name) return # Show all threads thread_name_list = self.traced.keys() thread_name_list.sort() for thread_name in thread_name_list: self.info_thread_line(thread_name) self.info_thread_missing() return ## def new_do_thread(self, arg): ## """thread [thread-name1 [thread-name2]..] ## Use this command to specifiy a set of threads which you ## want to switch to. The new thread name must be currently known by the ## debugger. ## If no thread name is given, we'll give information about ## the current thread. (That is this is the same as "info thread terse".""" ## args = arg.split() ## if len(args) == 0: ## self.info_thread(args=arg, short_display=True) ## return ## retval = False ## for thread_name in args: ## if thread_name in self.traced.keys(): ## cur_thread = threading.currentThread() ## threads = sys._current_frames() ## t = self.traced[thread_name] ## if t in threads.keys(): ## frame = threads[t] ## if is_in_threaddbg(frame): ## if len(args) == 1: ## if thread_name == cur_thread.getName(): ## self.msg("We are thread %s. No switch done." ## % thread_name) ## continue ## self.msg("Switching to %s" % thread_name) ## else: ## self.msg(("Adding %s to list of switchable " + ## "threads") % thread_name) ## if self.desired_thread: ## self.desired_thread.append(thread_name) ## else: ## self.desired_thread = [thread_name] ## retval = True ## else: ## self.msg("Thread %s is not currently blocked in the" ## + "debugger.") ## else: ## self.msg("Can't find %s in list of active threads" % ## thread_name) ## else: ## self.msg("Don't know about thread %s" % thread_name) ## if not retval: ## self.msg("Here are the threads I know about:") ## self.info_thread(args=[thread_name], short_display=True) ## self.msg(str(self.traced)) ## return False ## else: ## # Here's where we arrange to switch threads ## self.threading_cond.acquire() ## self.threading_cond.notify() ## self.threading_cond.release() ## return retval def print_frame_thread(self): """Print the thread name and current frame thread name to Pdb's print_location, if it is different from the thread name.""" thread_name = threading.currentThread().getName() if self.curframe_thread_name != thread_name: self.msg("Frame thread is %s, Current thread is %s" % (self.curframe_thread_name, thread_name)) else: self.msg("Current thread is %s" % thread_name) def print_location(self, print_line=False): """Add thread name and current frame thread name to Pdb's print_location, if it is different from the thread name.""" # Decorator pattern self.print_frame_thread() pydb.Pdb.print_location(self, print_line) def remove_hook(self): if self.threading_imported: threading.settrace(None) thread_id = thread.get_ident() if thread_id in self.traced.keys(): del self.traced[thread_id] def trace_dispatch(self, frame, event, arg): """Called from Python when some event-like stepping or returning occurs """ # The below variable will be used to scan down frames to determine # if trace_dispatch has been called. We key on the variable # name, method name, type of variable and even the value. # Note this is the first statement of this method. breadcrumb = is_in_threaddbg_dispatch # There's some locking interaction between this code and # threading code which can cause a deadlock. So avoid the # problem rather than try to cope with it - don't trace # into threading. # FIXME: the below code is not clean or reliable. # Make more like is_in_threaddbg try: # "inspect" can return IOError, and on some version of # Python 2.4 inspect has raises an IndexError see # bug #1673507 (filename, line_no, routine) = inspect.getframeinfo(frame)[0:3] except: return self.trace_dispatch (path, basename)=os.path.split(filename) if basename.startswith('threading.py'): return self.trace_dispatch # Note: until locking is done below we should not update and # save self.thread_name and self.thread_id but use # threading.currentThread().getname and thread.get_ident() instead. last_thread_id = self.thread_id # Record in my own table a list of thread names if not threading.currentThread().getName() in self.traced.keys(): self.traced[threading.currentThread().getName()] = \ thread.get_ident() have_single_entry_lock = False while not self._user_requested_quit: # See if there was a request to switch to a specific thread while self.desired_thread is not None \ and self.thread_name not in self.desired_thread: self.threading_cond.acquire() self.threading_cond.wait() self.threading_cond.release() # One at a time, please. self.threading_lock.acquire() have_single_entry_lock = True if self.desired_thread is None \ or threading.currentThread().getName() in self.desired_thread: break if self._user_requested_quit: break self.threading_lock.release() if self.desired_thread != None: # We are switching from another thread # If a breakpoint isn't set at the current # location, we should set up a temporary # breakpoint. if not self.stop_here(self.setup(frame)): arg = str(inspect.getlineno(frame)) self.do_tbreak(arg) self.desired_thread = None if self._user_requested_quit: self.msg("%s (id %ld) is quitting." % (threading.currentThread().getName(), thread.get_ident())) if have_single_entry_lock: self.threading_lock.release() thread.exit() return # Because of locks above there should not be any chance # that the following assignments will change during the course # of debugger command loop. self.curframe_thread_name = self.thread_name = \ threading.currentThread().getName() self.thread_id = thread.get_ident() if self.linetrace: # self.msg("thread %s event %s" % (thread_name, event)) self.setup(frame) self.print_location() else: while True: try: if self.stepping and last_thread_id != thread.get_ident(): botframe = self.botframe self.botframe = frame #print "Thread switch %s %d %d" % (self.thread_name, # last_thread_id, # self.thread_id) self.nothread_trace_dispatch(self, frame, event, arg) break except Restart: sys.argv = list(self._program_sys_argv) self.msg("'run' command not implemented for thread " + "debugging. Try 'restart'.") # self.msg("Should Restart %s with arguments:\n\t%s" # % (self.filename(sys.argv[0]), # " ".join(self._program_sys_argv[1:]))) except bdb.BdbQuit: self.msg("Requesting exit from %s (id %ld)" % (threading.currentThread().getName(), thread.get_ident())) self._user_requested_quit = True self.desired_thread = None self.threading_cond.acquire() self.threading_cond.notify() self.threading_cond.release() self.threading_lock.release() thread.exit() return self.threading_lock.release() return self.trace_dispatch def _runscript(self, filename): # Start with fresh empty copy of globals and locals and tell the script # that it's being run as __main__ to avoid scripts being able to access # the tpdb.py namespace. mainpyfile = self.canonic(filename) globals_ = {"__name__" : "__main__", "__file__" : mainpyfile, "__builtins__" : __builtins__, } locals_ = globals_ statement = 'execfile( "%s")' % filename self.running = True self.run(statement, globals=globals_, locals=locals_) pydb-1.26/pydb/info.py0000644000175000017500000001510611167745261011601 00000000000000"""'show' subcommands, except those that need some sort of text substitution. (Those are in gdb.py.in.) """ __revision = "$Id: info.py,v 1.16 2009/03/06 09:41:37 rockyb Exp $" # -*- coding: utf-8 -*- # Copyright (C) 2006, 2007 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import bdb, fns, inspect, os, pprint, sys # ALB this is a fix for a problem with the new 'with' statement. It seems to # work, but I don't know exactly why... (the problem was in self.getval called # by info_locals) import re # when the "with" statement is used we seem to get variables having names # _[1], _[2], etc. _with_local_varname = re.compile(r'_\[[0-9+]\]') # from threadinfo import * class SubcmdInfo: """Handle info subcommands. This class isn't usuable in of itself, but is expected to be called with something that subclasses it and adds other methods and instance variables like msg and curframe.""" ######## Note: the docstrings of methods here get used in ######## help output. def info_args(self, arg): """Argument variables of current stack frame.""" if not self.curframe: self.msg("No stack.") return f = self.curframe co = f.f_code d = f.f_locals n = co.co_argcount if co.co_flags & inspect.CO_VARARGS: n += 1 if co.co_flags & inspect.CO_VARKEYWORDS: n += 1 for i in range(n): name = co.co_varnames[i] self.msg_nocr("%s=" % name) if name in d: self.msg(d[name]) else: self.msg("*** undefined ***") return False def info_breakpoints(self, arg): """Status of user-settable breakpoints. Without argument, list info about all breakpoints. With an integer argument, list info on that breakpoint. The short command name is L.""" if self.breaks: # There's at least one self.msg("Num Type Disp Enb Where") for bp in bdb.Breakpoint.bpbynumber: if bp: self.bpprint(bp) else: self.msg("No breakpoints.") return False def info_display(self, arg): """Expressions to display when program stops, with code numbers.""" if not self.display.all(): self.msg('There are no auto-display expressions now.') return False def info_globals(self, arg): """Global variables of current stack frame""" if not self.curframe: self.msg("No frame selected.") return self.msg("\n".join(["%s = %s" % (l, pprint.pformat(self.getval(l))) for l in self.curframe.f_globals])) return False def info_line(self, arg): """Current line number in source file""" #info line identifier if not self.curframe: self.msg("No line number information available.") return if len(arg) == 2: # lineinfo returns (item, file, lineno) or (None,) answer = self.lineinfo(arg[1]) if answer[0]: item, filename, lineno = answer if not os.path.isfile(filename): filename = fns.search_file(filename, self.search_path, self.main_dirname) self.msg('Line %s of "%s" <%s>' % (lineno, filename, item)) return filename=self.canonic_filename(self.curframe) if not os.path.isfile(filename): filename = fns.search_file(filename, self.search_path, self.main_dirname) self.msg('Line %d of \"%s\" at instruction %d' % (inspect.getlineno(self.curframe), self.filename(self.canonic_filename(self.curframe)), self.curframe.f_lasti)) return False def filter_local(self, varname): """When the "with" statement is used, we seem to get variables having names _[1], _[2], etc. We can't "eval" these because this will raise a NameError. """ if _with_local_varname.match(varname): return self.curframe.f_locals[varname] else: return pprint.pformat(self.getval(varname)) return def info_locals(self, arg): """Local variables of current stack frame""" if not self.curframe: self.msg("No frame selected.") return self.msg("\n".join(["%s = %s" % (l, self.filter_local(l)) for l in self.curframe.f_locals])) def info_program(self, arg): """Execution status of the program.""" if not self.curframe: self.msg("The program being debugged is not being run.") return if self.is_running(): self.msg('Program stopped.') if self.currentbp: self.msg('It stopped at breakpoint %d.' % self.currentbp) elif self.stop_reason == 'call': self.msg('It stopped at a call.') elif self.stop_reason == 'exception': self.msg('It stopped as a result of an exception.') elif self.stop_reason == 'return': self.msg('It stopped at a return.') else: self.msg("It stopped after stepping, next'ing " + "or initial start.") return False def info_source(self, arg): """Information about the current Python file.""" if not self.curframe: self.msg("No current source file.") return self.msg('Current Python file is %s' % self.filename(self.canonic_filename(self.curframe))) return False def info_target(self, args): """Display information about the current target.""" self.msg('target is %s' % self.target) return False pydb-1.26/pydb/gdb.py0000644000175000017500000025166411167754545011422 00000000000000"""Handles gdb-like command processing. (See also pydb.doc for documentation.) $Id: gdb.py.in,v 1.174 2009/03/31 19:52:58 rockyb Exp $""" # -*- coding: utf-8 -*- # Copyright (C) 2007, 2008, 2009 Rocky Bernstein (rocky@gnu.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. _debugger_name = 'pydb' # The name of the debugger we are currently going by. _version = '1.26' import atexit, inspect, linecache, os, pprint, pydoc, shlex import bdb, dis, disassemble, re, subcmd, sys, types import bytecode, pydbcmd, pydbbdb import signal import sighandler from complete import * ## from connection import ConnectionServerFactory, ConnectionClientFactory, ConnectionFailed from bdb import BdbQuit from display import Display, DisplayNode from fns import * from info import * from set import * from show import * from pydbcmd import Cmd from pydbbdb import Bdb from threadinfo import * class Restart(Exception): """Causes a debugger to be restarted for the debugged Python program.""" pass class Gdb(Bdb, Cmd, SubcmdInfo, SubcmdSet, SubcmdShow): """A debugger class for Python that resembles the gdb (GNU debugger) command set. Parameter completekey specifies the what to use for command completion. pass None if no command completion is desired. Parameters stdin and stdout specify where debugger input and output are to come from. Parameter siglist gives a list of signals to intercept and ignore. None means the default set. If you want *no* signals, use []. """ def __init__(self, completekey='tab', stdin=None, stdout=None, siglist=None): pydbbdb.Bdb.__init__(self) pydbcmd.Cmd.__init__(self, completekey, stdin, stdout) self._program_sys_argv = [] # sys.argv after options are stripped self._re_linetrace_delay = re.compile(r'\s*linetrace\s+delay') self._wait_for_mainpyfile = False # set up signal handling self.sigmgr = sighandler.SignalManager(self, ignore_list=siglist) self._reset_handler = None self.__init_info() # Initialize 'info' subcommands self.__init_set() # Initialize 'set' subcommands self.__init_show() # Initialize 'show' subcommands self.all_completions = lambda arg, left=True: \ all_completions(self, arg, left) self.autoeval = True self.basename = False self.connection = None # For out-of-process communication self.currentbp = None # for "info program" self.cur_frame = None # current stack frame self.dbg_pydb = False # Debug the debugger? self.def_trace = False # Show/stop at method create statements? self.debug_signal = None # The signal used by 'attach' self.display = Display() self.fntrace = False # Tracing functions/methods self.gdb_dialect = True # Controls how stack is shown self.field_BdbQuit = False # does dispatcher field BdbQuit? # A list of the commands for which the first argument can be a # Python object. This is used by subcommand completions. self.first_can_be_obj = [ "disassemble", "examine", "help", "p", "pp", "pydoc", "x", "whatis" ] self.is_in_dbg = is_in_gdb self.lastcmd = '' # last debugger command run self.linetrace = False self.linetrace_delay = 0 self.listsize = 10 # main_dirname is the directory where the script resides; # "import" statments are relative to this location. self.main_dirname = os.curdir self.mainpyfile = '' self.maxargstrsize = 100 # max length to show of parameter string self.moduletodebug = "" self.noninteractive = False # Controls whether to prompt on # potentially dangerous commands. self.originalpath = sys.path[:] self.orig_stdin = self.stdin self.orig_stdout = self.stdout self.running = False self.search_path = sys.path # source name search path self.sigcheck = True self.stop_reason = None # Why are we in the debugger? self._sys_argv = [] # exec sys.argv, e.g. may include pydb self.set_history_length = None self.stepping = False # used in thread debugging self.target = 'local' # local connections by default self.target_addr = '' # target address used by 'attach' self.width = 80 # Assume a printed line is this wide # self.break_anywhere, self.set_continue and # self.trace_dispatch are changed depending on the value of # 'set sigcheck'. We may "decorate", in the design pattern # sense, the routines from bdb, so we need to save them. self.break_anywhere_old = self.break_anywhere self.set_continue_old = self.set_continue self.trace_dispatch_old = self.trace_dispatch ## FIXME: for now we'll turn on signal trace dispatching self.break_anywhere = self.break_anywhere_gdb self.set_continue = self.set_continue_gdb self.trace_dispatch = self.trace_dispatch_gdb # associates a command list to breakpoint numbers self.commands = {} # for each bp num, tells if the prompt must be disp. after # execing the cmd list self.commands_doprompt = {} # for each bp num, tells if the stack trace must be disp. after # execing the cmd list self.commands_silent = {} # True while in the process of defining a command list self.commands_defining = False # The breakpoint number for which we are defining a list self.commands_bnum = None # # list of all the commands making the program # resume execution. self.commands_resuming = ['do_continue', 'do_jump', 'do_next', 'do_quit', 'do_return', 'do_step'] self.do_L = self.info_breakpoints # Try to load readline if it exists try: import readline import rlcompleter self.readline = readline self.completer = rlcompleter.Completer(sys._getframe().f_locals) self.hist_last = 0 self.hist_save = False self.set_history_length = readline.set_history_length # Set history length using gdb's rule. try: history_length = int(os.environ['HISTSIZE']) except: history_length = 256 self.set_history_length(history_length) # An application like ipython may have its own # history set up beforehand, clear that so we don't back up # into that. Note that ipython saves and restores its own # history. if hasattr(readline, "clear_history"): readline.clear_history() # Read history file and set up to write history file when we # exit. global _debugger_name self.histfile = os.path.join(os.environ["HOME"], ".%shist" % _debugger_name) try: readline.read_history_file(self.histfile) except IOError: pass atexit.register(self.write_history_file) self.do_complete = self.__do_complete except ImportError: self.histfile = None return return def break_anywhere_gdb(self, frame): """Decorate bdb break_anywhere to consider the sigcheck and linetrace flags.""" if self.sigcheck or self.linetrace or self.fntrace: return True return self.break_anywhere(frame) ### FIXME: trace_dispatch could be a performance bottleneck. If ### so, consider reassigning the routine when don't have any ### signals registered. def trace_dispatch_gdb(self, frame, event, arg): """Check to see if the signal handler's we are interested have changed. If so we'll intercept them. """ if (not hasattr(self, 'thread_name') or self.thread_name == 'MainThread'): self.sigmgr.check_and_adjust_sighandlers() # The below variable will be used to scan down frames to determine # if trace_dispatch has been called. We key on the variable # name, method name, type of variable and even the value. breadcrumb = is_in_gdb_dispatch try: return self.trace_dispatch_old(frame, event, arg) except BdbQuit: if self.field_BdbQuit: # If we have one thread (and know that this this is the case), # then we can use sys.exit(). Otherwise kill is the # only way to leave. if hasattr(sys, '_current_frames'): if len(sys._current_frames()) == 1: sys.exit() if self.noninteractive: arg='unconditionally' else: arg='' self.do_kill('') return False else: raise BdbQuit def __adjust_frame(self, pos, absolute_pos): """Adjust stack frame by pos positions. If absolute_pos then pos is an absolute number. Otherwise it is a relative number. If self.gdb_dialect is True, the 0 position is the newest entry and doesn't match Python's indexing. Otherwise it does. A negative number indexes from the other end.""" if not self.curframe: self.msg("No stack.") return # Below we remove any negativity. At the end, pos will be # the new value of self.curindex. if absolute_pos: if self.gdb_dialect: if pos >= 0: pos = len(self.stack)-pos-1 else: pos = -pos-1 elif pos < 0: pos = len(self.stack)+pos else: pos += self.curindex if pos < 0: self.errmsg("Adjusting would put us beyond the oldest frame") return elif pos >= len(self.stack): self.errmsg("Adjusting would put us beyond the newest frame") return self.curindex = pos self.curframe = self.stack[self.curindex][0] self.print_location() self.lineno = None def __do_complete(self, arg): """Print a list of command names that can start with the supplied command prefix. If there is no completion nothing is printed.""" completions = self.all_completions(arg) if completions is None: return for complete in completions: self.msg(complete) return def __init_info(self): """Initialize info subcommands. Note: instance variable name has to be infocmds ('info' + 'cmds') for subcommand completion to work.""" self.infocmds=subcmd.Subcmd("info", self.help_info.__doc__) self.infocmds.add('args', self.info_args) self.infocmds.add('breakpoints', self.info_breakpoints) self.infocmds.add('display', self.info_display) self.infocmds.add('handle', self.sigmgr.info_signal, 1, False) self.infocmds.add('globals', self.info_globals, 1, False) self.infocmds.add('line', self.info_line) self.infocmds.add('locals', self.info_locals, 1, False) self.infocmds.add('program', self.info_program) self.infocmds.add('signal', self.sigmgr.info_signal, 2, False) self.infocmds.add('source', self.info_source, 2) if hasattr(sys, "_current_frames"): self.info_threads = lambda arg: info_thread_new(self, arg) doc = info_thread_new.__doc__ else: try: import threadframe sys._current_frames = threadframe.dict # Make it look like 2.5 self.info_threads = lambda arg: info_threadframe(self, arg) doc = info_threadframe.__doc__ except: self.info_threads = lambda arg: info_thread_old(self, arg) doc = info_thread_old.__doc__ self.info_threads.__doc__ = doc self.infocmds.add('threads', self.info_threads, 2) ## self.infocmds.add('target', self.info_target) return def __init_set(self): """Initialize set subcommands. Note: instance variable name has to be setcmds ('set' + 'cmds') for subcommand completion to work.""" self.setcmds=subcmd.Subcmd("set", self.help_set.__doc__) self.setcmds.add('annotate', self.set_annotate, 2) self.setcmds.add('args', self.set_args, 2) self.setcmds.add('autoeval', self.set_autoeval, 2) self.setcmds.add('basename', self.set_basename) self.setcmds.add('debug-pydb', self.set_dbg_pydb, 2) self.setcmds.add('deftrace', self.set_deftrace, 2) self.setcmds.add('flush', self.set_flush) self.setcmds.add('fntrace', self.set_fntrace, 2) ## self.setcmds.add('debug-signal', self.set_debug_signal) self.setcmds.add('history', self.set_history) self.setcmds.add('interactive', self.set_interactive) self.setcmds.add('linetrace', self.set_linetrace, 3) self.setcmds.add('listsize', self.set_listsize, 3) self.setcmds.add('logging', self.set_logging, 2) self.setcmds.add('maxargsize', self.set_maxargsize, 2) self.setcmds.add('prompt', self.set_prompt) self.setcmds.add('sigcheck', self.set_sigcheck) ## self.setcmds.add('target-address', self.set_target_address) self.setcmds.add('trace-commands', self.set_cmdtrace) self.setcmds.add('warnoptions', self.set_warnoptions, 2) self.setcmds.add('width', self.set_width, 2) return def __init_show(self): """Initialize show subcommands. Note: instance variable name has to be setcmds ('set' + 'cmds') for subcommand completion to work.""" self.showcmds=subcmd.Subcmd("show", self.help_show.__doc__) self.showcmds.add('args', self.show_args) self.showcmds.add('annotate', self.show_annotate, 2) self.showcmds.add('autoeval', self.show_autoeval, 2) self.showcmds.add('basename', self.show_basename) self.showcmds.add('debug-pydb', self.show_dbg_pydb) ## self.showcmds.add('debug-signal', self.show_debug_signal) self.showcmds.add('deftrace', self.show_deftrace, 3) self.showcmds.add('commands', self.show_commands, 2, False) self.showcmds.add('directories', self.show_directories, 1) self.showcmds.add('fntrace', self.show_fntrace, 2) self.showcmds.add('flush', self.show_flush) self.showcmds.add('history', self.show_history) self.showcmds.add('interactive', self.show_interactive) self.showcmds.add('linetrace', self.show_linetrace, 3) self.showcmds.add('listsize', self.show_listsize, 3) self.showcmds.add('logging', self.show_logging, 2) self.showcmds.add('maxargsize', self.show_maxargsize, 2) self.showcmds.add('prompt', self.show_prompt) self.showcmds.add('sigcheck', self.show_sigcheck) ## self.showcmds.add('target-address', self.show_target_address) self.showcmds.add('trace-commands', self.show_cmdtrace, 1) self.showcmds.add('version', self.show_version) self.showcmds.add('warnoptions', self.show_warnoptions, 2) self.showcmds.add('width', self.show_width, 2) # To be overridden in derived debuggers def defaultFile(self): """Produce a reasonable default.""" filename = self.curframe.f_code.co_filename # Consider using is_exec_stmt(). I just don't understand # the conditions under which the below test is true. if filename == '' and self.mainpyfile: filename = self.mainpyfile return filename def display_enable(self, arg, flag): # arg is list of display points for i in arg: i = self.get_an_int(i, 'index %r is not a number' % i) if i is not None: self.display.enable_disable(i, flag) pass pass return def lineinfo(self, identifier): failed = (None, None, None) # Input is identifier, may be in single quotes idstring = identifier.split("'") if len(idstring) == 1: # not in single quotes ident = idstring[0].strip() elif len(idstring) == 3: # quoted ident = idstring[1].strip() else: return failed if ident == '': return failed parts = ident.split('.') # Protection for derived debuggers if parts[0] == 'self': del parts[0] if len(parts) == 0: return failed # Best first guess at file to look at fname = self.defaultFile() if len(parts) == 1: item = parts[0] else: # More than one part. # First is module, second is method/class f = self.lookupmodule(parts[0]) if f: fname = f item = parts[1] answer = find_function(item, fname) return answer or failed def forget(self): self.lineno = None self.stack = [] self.curindex = 0 self.curframe = None return def interaction(self, frame, tb): """Possibly goes into loop to read debugger commands.""" do_loop = self.setup(frame, tb) != 1 if do_loop: if frame or tb: self.print_location(print_line=self.linetrace or self.fntrace) self.display.display(self.curframe) if not self.noninteractive: try: self.cmdloop() except KeyboardInterrupt: self.do_quit(None) self.currentbp = None # Can forget it now that we're moving on self.forget() if not do_loop: # Tell cmdloop to break out of its loop. return True return False def parse_list_cmd(self, arg): """Parses arguments for the "list" command and returns the tuple filename, start, last or sets these to None if there was some problem.""" if not self.curframe: self.msg("No Python program loaded.") return (None, None, None) self.lastcmd = 'list' last = None filename = self.curframe.f_code.co_filename if arg: if arg == '-': first = max(1, self.lineno - 2*self.listsize - 1) elif arg == '.': first = max(1, inspect.getlineno(self.curframe) - self.listsize/2) else: args = arg.split() (modfunc, filename, first) = parse_filepos(self, args[0]) if first == None and modfunc == None: # error should have been shown previously return (None, None, None) if len(args) == 1: first = max(1, first - (self.listsize/2)) elif len(args) == 2: (modfunc, last_filename, last) = \ parse_filepos(self, args[1]) if filename != last_filename \ and filename is not None and last_filename is not None: self.errmsg('filename in the range must be the same') return (None, None, None) if last < first: i = self.get_an_int(args[1], ('2nd number (%s) is less than the' + ' 1st number %d, but it does not' + ' evaluate to an integer') % (args[1], first)) if i is None: return (None, None, None) # Assume last is a count rather than an end line number last = first + last elif len(args) > 2: self.errmsg('At most 2 arguments allowed. Saw: %d' % len(args)) return (None, None, None) elif self.lineno is None or not self.running: first = max(1, inspect.getlineno(self.curframe) - self.listsize/2) else: first = self.lineno + 1 if last is None: last = first + self.listsize - 1 return (filename, first, last) def set_continue_gdb(self): """Like bdb's set_continue but we don't have the run fast option""" self.stopframe = self.botframe self.returnframe = None self.quitting = 0 return def setup(self, frame, tb=None): """Initialization done before entering the debugger-command loop. In particular we set up the call stack used for local variable lookup and frame/up/down commands. We return True if we should NOT enter the debugger-command loop.""" self.forget() if self.dbg_pydb: frame = inspect.currentframe() if frame or tb: self.stack, self.curindex = self.get_stack(frame, tb) self.curframe = self.stack[self.curindex][0] else: self.stack = self.curframe = self.botframe = None if self.execRcLines()==1: return True return False def setup_source(self, arg, showError=False): """Set up to read commands from a source file""" try: rcFile = open(os.path.join(arg)) except IOError, (errno, strerror): if showError: self.errmsg("Error opening debugger command file %s: %s" % (arg, strerror)) pass else: for line in rcFile.readlines(): self.rcLines.append(line) rcFile.close() return def show_commands(self, arg): """Show the history of commands you typed. You can supply a command number to start with, or a `+' to start after the previous command number shown. A negative number starts from the end.""" try: import readline if self.histfile is not None: hist_max = readline.get_current_history_length() if len(arg) <= 1: first=1 self.hist_last=hist_max else: if arg[1] == '+': first = self.hist_last+1 self.hist_last = min(hist_max, first + self.listsize) else: try: center = self.get_int(arg[1], cmdname="show commands") except ValueError: return if center < 0: center = hist_max + center + 1 first = max(1, center - (self.listsize/2)) self.hist_last = min(hist_max, center + (self.listsize/2)) i=first while i<=self.hist_last: self.msg("%5d %s" % (i, readline.get_history_item(i))) i += 1 else: self.errmsg("History mechanism turned off.") except ImportError: self.errmsg("Readline not available.") def show_history(self, args): """Generic command for showing command history parameters""" try: import readline if len(args) > 1 and args[1]: show_save = show_size = show_filename = False show_prefix = False if args[1] == 'filename': show_filename = True elif args[1] == 'save': show_save = True elif args[1] == 'size': show_size = True else: self.undefined_cmd("show history", args[1]) return else: show_save = show_size = show_filename = True show_prefix = True if show_filename: if show_prefix: prefix='filename: ' else: prefix='' self.msg("""%sThe filename in which to record the command history is "%s".""" % (prefix, self.histfile)) if show_save: if show_prefix: prefix='save: ' else: prefix='' self.msg("%sSaving of the history record on exit is %s" % (prefix, show_onoff(self.hist_save))) if show_size: if show_prefix: prefix='size: ' else: prefix='' self.msg("%sThe size of the command history is %d" % (prefix, readline.get_history_length())) except ImportError: pass def show_listsize(self, args): "Show number of source lines the debugger will list by default" self.msg("Number of source lines %s will list by default is %d." \ % (_debugger_name, self.listsize)) def show_prompt(self, args): "Show debugger's prompt" self.msg("""%s's prompt is "%s".""" % (_debugger_name, self.prompt)) return def show_version(self, args): """Show what version of the debugger this is""" global _version self.msg("""%s version %s.""" % (_debugger_name, _version)) return def write_history_file(self): """Write the command history file -- possibly.""" if self.hist_save: try: import readline try: readline.write_history_file(self.histfile) except IOError: pass except ImportError: pass ################################################################### # Command definitions, called by cmdloop() # The argument is the remaining string on the command line # Return true to exit from the command loop ################################################################### def do_alias(self, arg): """alias [name [command [parameter parameter ...] ]] Creates an alias called 'name' the executes 'command'. The command must *not* be enclosed in quotes. Replaceable parameters are indicated by %1, %2, and so on, while %* is replaced by all the parameters. If no command is given, the current alias for name is shown. If no name is given, all aliases are listed. Aliases may be nested and can contain anything that can be legally typed at the debugger prompt. Note! You *can* override internal debugger commands with aliases! Those internal commands are then hidden until the alias is removed. Aliasing is recursively applied to the first word of the command line; all other words in the line are left alone. Some useful aliases (especially when placed in the .pydbsrc file) are: #Print instance variables (usage "pi classInst") alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] #Print instance variables in self alias ps pi self """ args = arg.split() if len(args) == 0: keys = self.aliases.keys() keys.sort() for alias in keys: self.msg("%s = %s" % (alias, self.aliases[alias])) return if args[0] in self.aliases and len(args) == 1: self.msg("%s = %s" % (args[0], self.aliases[args[0]])) else: self.aliases[args[0]] = ' '.join(args[1:]) def do_break(self, arg, temporary = 0, thread_name=None): """b(reak) [[file:]lineno | function] [, condition] With a line number argument, set a break there in the current file. With a function name, set a break at first executable line of that function. Without argument, set a breakpoint at current location. If a second argument is present, it is a string specifying an expression which must evaluate to true before the breakpoint is honored. The line number may be prefixed with a filename and a colon, to specify a breakpoint in another file (probably one that hasn't been loaded yet). The file is searched for on sys.path; the .py suffix may be omitted.""" if not self.curframe: self.msg("No stack.") return cond = None funcname = None if not arg: if self.lineno is None: lineno = max(1, inspect.getlineno(self.curframe)) else: lineno = self.lineno + 1 filename = self.curframe.f_code.co_filename else: # parse arguments; comma has lowest precedence # and cannot occur in filename filename = None lineno = None comma = arg.find(',') if comma > 0: # parse stuff after comma: "condition" cond = arg[comma+1:].lstrip() arg = arg[:comma].rstrip() (funcname, filename, lineno) = parse_filepos(self, arg) if lineno is None: return # FIXME This default setting doesn't match that used in # do_clear. Perhaps one is non-optimial. if not filename: filename = self.defaultFile() # Check for reasonable breakpoint line = checkline(self, filename, lineno) if line: # now set the break point # Python 2.3.5 takes 5 args rather than 6. # There is another way in configure to test for the version, # but this works too. try: err = self.set_break(filename, line, temporary, cond, funcname) except TypeError: err = self.set_break(filename, line, temporary, cond) if err: self.errmsg(err) else: bp = self.get_breaks(filename, line)[-1] if thread_name is None: self.msg("Breakpoint %d set in file %s, line %d." % (bp.number, self.filename(bp.file), bp.line)) else: bp.thread_name = thread_name self.msg("Breakpoint %d set in file %s, line %d, thread %s." % (bp.number, self.filename(bp.file), bp.line, thread_name)) do_b = do_break def do_cd(self, arg): """Set working directory to DIRECTORY for debugger and program being debugged. """ if not arg: self.errmsg("Argument required (new working directory).") else: os.chdir(arg) return return def do_clear(self, arg): """cl(ear) {[file:]linenumber | function} Clear breakpoint at specified line or function. Argument may be line number, function name, or '*' and an address. If line number is specified, all breakpoints in that line are cleared. If function is specified, breakpoints at beginning of function are cleared. If an address is specified, breakpoints at that address are cleared. With no argument, clears all breakpoints in the line that the selected frame is executing in. See also the 'delete' command which clears breakpoints by number. """ if not self.curframe: self.msg("No frame selected.") return False if not arg: frame, lineno = self.stack[self.curindex] filename = self.canonic_filename(self.curframe) else: if ':' in arg: # Make sure it works for "clear C:\foo\bar.py:12" i = arg.rfind(':') filename = arg[:i] arg = arg[i+1:] try: lineno = int(arg) except: self.errmsg("Invalid line number (%s)" % arg) return False else: (funcname, filename, lineno) = get_brkpt_lineno(self, arg) if lineno is None: return False # FIXME This default setting doesn't match that used in # do_break. Perhaps one is non-optimial. if filename is None: filename = self.canonic_filename(self.curframe) brkpts = self.clear_break(filename, lineno) if len(brkpts) > 0: if len(brkpts) == 1: self.msg("Deleted breakpoint %d" % brkpts[0]) else: self.msg("Deleted breakpoints " + ' '.join(map(lambda b: str(b), brkpts))) return False return False return False do_cl = do_clear def do_commands(self, arg): """Defines a list of commands associated to a breakpoint Those commands will be executed whenever the breakpoint causes the program to stop execution.""" if not arg: bnum = len(bdb.Breakpoint.bpbynumber)-1 else: try: bnum = self.get_pos_int(arg, min_value=0, default=None, cmdname="'commands'") except ValueError: return False if not (bnum < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % bnum) return False self.commands_bnum = bnum self.commands[bnum] = [] self.commands_doprompt[bnum] = True self.commands_silent[bnum] = False self.commands_defining = True if self.setup(self.curframe) == 1: self.commands_defining = False return False prompt_back = self.prompt self.prompt = '>' self.msg("Type commands for when breakpoint %d is hit, one per line." % bnum) self.msg('End with a line saying just "end".') self.cmdloop() self.commands_defining = False self.prompt = prompt_back return False def do_condition(self, arg): """condition bpnumber str_condition str_condition is a string specifying an expression which must evaluate to true before the breakpoint is honored. If str_condition is absent, any existing condition is removed; i.e., the breakpoint is made unconditional.""" args = arg.split(' ', 1) try: bpnum = self.get_pos_int(args[0].strip(), min_value=1, cmdname='condition') except ValueError: return except IndexError: self.errmsg("Breakpoint number required.") try: cond = args[1] except: cond = None try: bp = bdb.Breakpoint.bpbynumber[bpnum] except IndexError: self.errmsg("No breakpoint numbered %d." % bpnum) return False if bp: bp.cond = cond if not cond: self.msg('Breakpoint %d is now unconditional.' % bpnum) # Note: ddd only uses first line of docstring after the command name. # That is the part that starts Continue execution... # So make sure this is a complete sentence. def do_continue(self, arg): """c(ontinue) [[file:]lineno | function] Continue execution; only stop when a breakpoint is encountered. If a line position is given, continue until that line is reached. This is exactly the same thing as setting a temporary breakpoint at that position before running an (unconditional) continue.""" if not self.is_running(): return if self.linetrace or self.fntrace: # linetracing is like stepping, but we just don't stop. If # we were to calling set_continue, it *might* remove all # stopping if there were no breakpoints. self.step_ignore = -1 self.set_step() self.stepping = True else: self.stepping = False if arg: (funcname, filename, lineno) = parse_filepos(self, arg) if lineno: self.do_tbreak(arg) # This has to be done after do_tbreak if not (self.linetrace or self.fntrace): self.set_continue() # Tell cmdloop to break out of its loop. return True do_c = do_continue def do_debug(self, arg): """debug code Enter a recursive debugger that steps through the code argument (which is an arbitrary expression or statement to be executed in the current environment).""" if not self.curframe: self.msg("No frame selected.") return sys.settrace(None) global_vars = self.curframe.f_globals local_vars = self.curframe.f_locals p = Gdb() p.prompt = "(%s) " % self.prompt.strip() self.msg("ENTERING RECURSIVE DEBUGGER") # Inherit some values from current environemnt p.aliases = self.aliases p.basename = self.basename p.cmdtrace = self.cmdtrace p.fntrace = self.fntrace p.gdb_dialect = self.gdb_dialect p.infocmds = self.infocmds p.linetrace = self.linetrace p.linetrace_delay = self.linetrace_delay p.listsize = self.listsize p.noninteractive = self.noninteractive for attr in ('thread_name', 'no_thread_do_break', 'nothread_do_tbreak', 'nothread_trace_dispatch', 'nothread_quit', 'desired_thread'): if hasattr(self, attr): setattr(p, attr, getattr(self, attr)) # Some values that are different from the current environment # and different from the default initialization values. p.running = True # We *are* trying to run something p.step_ignore = 1 # We need to skip one statement sys.call_tracing(p.run, (arg, global_vars, local_vars)) self.msg("LEAVING RECURSIVE DEBUGGER") # sys.settrace() seems to mess up self.print_location # so print location first. self.print_location() sys.settrace(self.trace_dispatch) self.lastcmd = p.lastcmd return False def do_delete(self, arg): """delete [bpnumber [bpnumber...]] - Delete some breakpoints. Arguments are breakpoint numbers with spaces in between. To delete all breakpoints, give no argument. those breakpoints. Without argument, clear all breaks (but first ask confirmation). See also the 'clear' command which clears breakpoints by line/file number..""" if not arg: if get_confirmation(self, 'Delete all breakpoints'): self.clear_all_breaks() return numberlist = arg.split() for arg in numberlist: try: i = self.get_pos_int(arg, min_value=1, default=None, cmdname='delete') except ValueError: continue if not (i < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % i) continue err = self.clear_bpbynumber(i) if err: self.errmsg(err) else: self.msg('Deleted breakpoint %d' % i) def do_directory(self, arg): """Add directory DIR to beginning of search path for source files. Forget cached info on source file locations and line positions. DIR can also be $cwd for the current working directory, or $cdir for the directory in which the source file was compiled into object code. With no argument, reset the search path to $cdir:$cwd, the default.""" args = arg.split() if len(args) == 0: if get_confirmation(self, 'Reinitialize source path to empty'): self.search_path=[] return else: # FIXME: Loop over arguments checking for directory? self.search_path.insert(0, args[0]) def do_disable(self, arg): """disable [display] bpnumber [bpnumber ...] Disables the breakpoints given as a space separated list of bp numbers.""" args = arg.split() if len(args) == 0: self.errmsg('No breakpoint number given.') return if args[0] == 'display': self.display_enable(args[1:], 0) return for i in args: try: i = int(i) except ValueError: self.msg('Breakpoint index %r is not a number.' % i) continue if not (0 <= i < len(bdb.Breakpoint.bpbynumber)): self.msg('No breakpoint numbered %d.' % i) continue bp = bdb.Breakpoint.bpbynumber[i] if bp: bp.disable() def do_disassemble(self, arg): """disassemble [obj-or-class] [[+|-]start-line [[+|-]end-line]] With no argument, disassemble the current frame. With a start-line integer, the disassembly is narrowed to show lines starting at that line number or later; with an end-line number, disassembly stops when the next line would be greater than that or the end of the code is hit. If start-line or end-line has a plus or minus prefix, then the line number is relative to the current frame number. With a class, method, function, code or string argument disassemble that.""" if arg: args = arg.split() else: args = [] start_line = end_line = None relative_pos = False if len(args) > 0: if args[0] in ['+', '-']: start_line = self.curframe.f_lineno relative_pos = True else: start_line = int(args[0]) if args[0][0:1] in ['+', '-']: relative_pos = True start_line += self.curframe.f_lineno pass pass if len(args) == 2: try: end_line = self.get_int(args[1], cmdname="disassemble") except ValueError: return False elif len(args) > 2: self.errmsg("Expecting 1-2 line parameters, got %d" % len(args)) return False if not self.curframe: self.errmsg("No frame selected.") return False disassemble.disassemble(self, self.curframe.f_code, start_line=start_line, end_line=end_line, relative_pos=relative_pos) pass try: if len(args) > 1: try: start_line = self.get_int(args[1], cmdname="disassemble") if args[1][0:1] in ['+', '-']: relative_pos = True start_line += self.curframe.f_lineno pass if len(args) == 3: end_line = self.get_int(args[2], cmdname="disassemble") elif len(args) > 3: self.errmsg("Expecting 0-3 parameters, got %d" % len(args)) return False except ValueError: return False pass if hasattr(self, 'curframe') and self.curframe: obj=self.getval(args[0]) else: obj=eval(args[0]) pass disassemble.dis(self, obj, start_line=start_line, end_line=end_line, relative_pos=relative_pos) except NameError: self.errmsg("Object '%s' is not something we can disassemble" % args[0]) return False def do_display(self, arg): """display [format] EXP Print value of expression EXP each time the program stops. FMT may be used before EXP and may be one of 'c' for char, 'x' for hex, 'o' for octal, 'f' for float or 's' for string. With no argument, display all currently requested auto-display expressions. Use "undisplay" to cancel display requests previously made.""" if not arg: # Display anything active self.display.display(self.curframe) else: # Set up a display arglist = arg.split() if len(arglist) == 2: format, variable = arglist else: format = "" variable = arglist[0] dp = DisplayNode(self.curframe, variable, format) res = dp.checkValid(self.curframe) self.msg(res) return False def do_down(self, arg): """d(own) [count] Move the current frame one level down in the stack trace (to a newer frame). If using gdb dialect up matches the gdb: 0 is the most recent frame. Otherwise we match Python's stack: 0 is the oldest frame. """ try: count = self.get_int(arg, cmdname="down") except ValueError: return if self.gdb_dialect: count = -count self.__adjust_frame(pos=-count, absolute_pos=False) return False def do_enable(self, arg): """enable [display] bpnumber [bpnumber ...]] Enables the breakpoints given as a space separated list of bp numbers.""" args = arg.split() if len(args) == 0: self.errmsg('No breakpoint number given') return if args[0] == 'display': self.display_enable(args[1:], True) return for i in args: i = self.get_an_int(i, 'Breakpoint index %r is not a number' % i) if i is None: continue if not (1 <= i < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % i) continue bp = bdb.Breakpoint.bpbynumber[i] if bp: bp.enable() def do_examine(self, arg): """examine expression - Print the expression, its value, type, and object attributes.""" s = print_obj(arg, self.curframe) self.msg(s) do_x = do_examine def do_file(self, fname): """Use FILE as the Python program to be debugged. It is compiled and becomes is the program executed when you use the `run' command. If no filename is given, this means to set things so there is no Python file.""" if fname == "": if self.mainpyfile == "": self.msg('No exec file now.\nNo symbol file now.') return else: # should confirm this per if get_confirmation(self, "Discard symbol table from '%s'" % self.mainpyfile): # XXX how to clean up name space ?? self._program_sys_argv = None self.mainpyfile = '' else: # XXX how to clean up name space ?? if os.path.exists(fname): self.mainpyfile=fname self._program_sys_argv = [self.mainpyfile] self._runscript(self.mainpyfile) # Fake up curframe? return self.quitting else: self.errmsg("file '%s' does not exist" % fname) return None pass pass def do_finish(self, arg): """finish Continue execution until the current function returns.""" if not self.is_running(): return self.set_return(self.curframe) self.stepping = False if self.linetrace: self.stepping = True self.step_ignore = -1 self.stopframe = None # Tell cmdloop to break out of its loop. return True def do_frame(self, arg): """frame [frame-number] Move the current frame to frame `frame-number' if specified, or the current frame, 0 if no frame number specified. A negative number indicates position from the other end. So 'frame -1' moves when gdb dialect is in effect moves to the oldest frame, and 'frame 0' moves to the newest frame.""" if not self.stack: self.msg("Program has no stack frame set.") return False arg = arg.strip() or '0' arg = self.get_an_int(arg, ("The 'frame' command requires a frame number."+ " Got: %s") % arg) if arg is None: return False i_stack = len(self.stack) if arg < -i_stack or arg > i_stack-1: self.errmsg('Frame number has to be in the range %d to %d' \ % (-i_stack, i_stack-1)) else: self.__adjust_frame(pos=arg, absolute_pos=True) return False def do_handle(self, arg): """Specify how to handle a signal. Args are signals and actions to apply to those signals. recognized actions include "stop", "nostop", "print", "noprint", "pass", "nopass", "ignore", or "noignore". - Stop means reenter debugger if this signal happens (implies print and nopass). - Print means print a message if this signal happens. - Pass means let program see this signal; otherwise program doesn't know. - Ignore is a synonym for nopass and noignore is a synonym for pass. - Pass and Stop may not be combined. (This is different from gdb) """ self.sigmgr.action(arg) def do_ignore(self,arg): """ignore bpnumber count Sets the ignore count for the given breakpoint number. A breakpoint becomes active when the ignore count is zero. When non-zero, the count is decremented each time the breakpoint is reached and the breakpoint is not disabled and any associated condition evaluates to true.""" args = arg.split() bpnum = self.get_an_int(args[0], ("ignore: bpnumber %s does not evaluate to an" + " integer") % args[0], min_value=1) if bpnum is None: return False if not (0 <= bpnum < len(bdb.Breakpoint.bpbynumber)): self.errmsg('No breakpoint numbered %d.' % bpnum) return False if len(args) > 1: count = self.get_an_int(args[1], ("ignore: count %s does not evaluate to an" + " integer.") % args[0], min_value=0) if count is None: return False else: count = 0 bp = bdb.Breakpoint.bpbynumber[bpnum] if bp: bp.ignore = count if count > 0: reply = 'Will ignore next ' if count > 1: reply = reply + '%d crossings' % count else: reply = reply + '1 crossing' self.msg('%s of breakpoint %d.' % (reply, bpnum)) else: self.msg('Will stop next time breakpoint %d is reached.' % bpnum) return False return False def do_ipython(self, arg_str): """ipython [ipython-opt1 ipython-opt2 ...] Run IPython as a command subshell. You need to have ipython installed for this command to work. If no IPython options are given, the following options are passed: -noconfirm_exit -prompt_in1 'Pydbgr In [\#]: ' You can access debugger state via local variable "ipydb". Debugger commands like are installed as IPython magic commands, e.g. %list, %up, %where. """ if not self.is_running(): return False if arg_str: argv = arg_split(arg_str, posix=True) else: argv = ['-noconfirm_exit','-prompt_in1', 'Pydb In [\\#]: '] pass if self.curframe and self.curframe.f_locals: user_ns = self.curframe.f_locals else: user_ns = {} # IPython does it's own history thing. # Make sure it doesn't damage ours. if self.readline: try: self.write_history_file() except IOError: pass # ipython should be around - it was before. try: import IPython except ImportError: self.errmsg("IPython doesn't seem to be importable.") return False user_ns['ipydb'] = self ipshell = IPython.Shell.IPShellEmbed(argv=argv, user_ns=user_ns) user_ns['ipshell'] = ipshell # Give ipython and the user a way to get access to the debugger setattr(ipshell, 'ipydb', self) if hasattr(ipshell.IP, "magic_pydb"): # We get an infinite loop when doing recursive edits self.msg("Removing magic %pydb") delattr(ipshell.IP, "magic_pydb") pass # add IPython "magic" commands for all debugger comamnds and # aliases. No doubt, this probably could be done in a # better way without "exec". (Someone just needs to suggest # a way...) ip = IPython.ipapi.get() magic_fn_template=""" def ipy_%s(self, args): dbg = self.user_ns['ipydb'] dbg.continue_running = dbg.do_%s(args) if dbg.continue_running: self.shell.exit() return ip.expose_magic("%s", ipy_%s) """ expose_magic_template = 'ip.expose_magic("%s", ipy_%s)' for name in self.get_cmds(): exec magic_fn_template % ((name,) * 4) pass # And just when you thought we've forgotten about running # the shell... ipshell() # Restore our history if we can do so. if self.readline and self.histfile is not None: try: self.readline.read_history_file(self.histfile) except IOError: pass return False return self.continue_running def do_info(self, arg): """Generic command for showing things about the program being debugged. You can give unique prefix of the name of a subcommand to get info about just that subcommand.""" if not arg: for subcommand in self.infocmds.list(): # Some commands have lots of output. # they are excluded here because 'in_list' is false. if self.infocmds.subcmds[subcommand]['in_list']: self.msg_nocr("%s: " % subcommand) self.do_info(subcommand) return else: args = arg.split() self.infocmds.do(self, args[0], args) def do_jump(self, arg, cmdname='Jump'): """jump lineno Set the next line that will be executed.""" if not self.is_running(): return False if self.curindex + 1 != len(self.stack): self.errmsg("You can only jump within the bottom frame") return False arg = self.get_an_int(str(arg), "jump: a line number is required, got %s." % arg) if arg is None: return False try: # Do the jump, fix up our copy of the stack, and display the # new position self.curframe.f_lineno = arg self.stack[self.curindex] = self.stack[self.curindex][0], arg self.print_location() except ValueError, e: self.errmsg('%s failed: %s' % (cmdname, e)) return False def do_kill(self, arg): """kill [unconditionally] Kill execution of program being debugged. Equivalent of kill -KILL where is os.getpid(), the current debugged process. This is an unmaskable signal. When all else fails, e.g. in thread code, use this. If 'unconditionally' is given, no questions are asked. Otherwise, if we are in interactive mode, we'll prompt to make sure. """ if len(arg) > 0 and 'unconditionally'.startswith(arg) or \ get_confirmation(self, 'Really do a hard kill', True): os.kill(os.getpid(), signal.SIGKILL) return False # Possibly not reached pass def do_list(self, arg): """l(ist) [- | . | first [last or count]] List source code. Without arguments, list LISTSIZE lines centered around the current line or continue the previous listing. "list -" lists LISTSIZE lines before a previous listing. "list ." means list centered around the current frame pointer. With one argument other than "-" or '.', list LISTSIZE lines centered around the specified position. With two arguments, list the given range; if the second argument is less than the first, it is a count. First and last can be either a function name, a line number or file:line""" filename, first, last = self.parse_list_cmd(arg) if filename is None: return breaklist = self.get_file_breaks(filename) # Python 2.5 or greater has 3 arg getline which handles # eggs and zip files if 3 == linecache.getline.func_code.co_argcount: getline = lambda f, l: linecache.getline(f, l, self.curframe.f_globals) else: getline = lambda f, l: linecache.getline(f, l) pass # We now have range information. Do the listing. try: for lineno in range(first, last+1): line = getline(filename, lineno) if not line: self.msg('[EOF]') break else: s = self._saferepr(lineno).rjust(3) if len(s) < 4: s = s + ' ' if lineno in breaklist: s = s + 'B' else: s = s + ' ' if lineno == inspect.getlineno(self.curframe) \ and filename == self.curframe.f_code.co_filename: s = s + '->' self.msg_nocr(s + '\t' + line) self.lineno = lineno except KeyboardInterrupt: pass return False do_l = do_list def do_next(self, arg): """n(ext) [count] Continue execution until the next line in the current function is reached or it returns. With an integer argument, perform 'next' that many times.""" if not self.is_running(): return try: # 0 means stop now or step 1, so we subtract 1. self.step_ignore = self.get_pos_int(arg, default=1, cmdname='next') - 1 except ValueError: return False self.stepping = True # Used in thread debugging self.set_next(self.curframe) # Tell cmdloop to break out of its loop. return True do_n = do_next def do_p(self, arg): """Print the value of the expression. Variables accessible are those of the environment of the selected stack frame, plus globals. The expression may be preceded with /FMT where FMT is one of the format letters 'c', 'x', 'o', 'f', or 's' for chr, hex, oct, float or str respectively. If the length output string large, the first part of the value is shown and ... indicates it has been truncated See also `pp' and `examine' for commands which do more in the way of formatting.""" args = arg.split() if len(args) > 1 and '/' == args[0][0]: fmt = args[0] del args[0] arg = ' '.join(args) else: fmt = None pass try: val = self.getval(arg) if fmt: val = fns.printf(val, fmt) pass self.msg(self._saferepr(val)) except: pass def do_pdef(self, arg): """pdef obj Print the definition header for a callable object. If the object is a class, print the constructor information. See also pydoc.""" args = arg.split() if len(args) != 1: return obj_name = args[0] try: obj = eval(arg, self.curframe.f_globals, self.curframe.f_locals) except: return if not callable(obj): self.errmsg('Object %s is not callable.' % obj_name) return if inspect.isclass(obj): self.msg('Class constructor information:') obj = obj.__init__ elif type(obj) is types.InstanceType: obj = obj.__call__ pass output = print_argspec(obj, obj_name) if output is None: self.errmsg('No definition header found for %s' % obj_name) else: self.msg(output) pass return def do_pp(self, arg): """pp expression Pretty-print the value of the expression.""" try: val = self.getval(arg) if type(val) == types.ListType: # Handle simple case where list is not nested simple = True for i in range(len(val)): if not (type(val[i]) in [types.BooleanType, types.FloatType, types.IntType, types.StringType, types.UnicodeType, types.NoneType, types.LongType]): simple = False break if simple: self.msg(fns.columnize_array(val, self.width)) return False self.msg(pprint.pformat(val)) except: pass def do_pwd(self, arg): "Print working directory." self.msg('Working directory ' + os.getcwd() + '.') def do_pydoc(self, arg): """pydoc ... Show pydoc documentation on something. may be the name of a Python keyword, topic, function, module, or package, or a dotted reference to a class or function within a module or module in a package. If contains a '/', it is used as the path to a Python source file to document. If name is 'keywords', 'topics', or 'modules', a listing of these things is displayed. """ sys_path_save = list(sys.path) sys_argv_save = list(sys.argv) sys.argv = ['pydoc'] + shlex.split(arg) pydoc.cli() sys.argv = sys_argv_save sys.path = sys_path_save return False def do_python(self, arg_str): """python Run python as a command subshell. """ # See if python's code module is around try: from code import interact except ImportError: self.msg("python code doesn't seem to be importable.") return False # Python does it's own history thing. # Make sure it doesn't damage ours. if hasattr(self, 'readline') and self.readline: try: self.write_history_file() except IOError: pass local = None if self.curframe: if self.curframe.f_locals: local = dict(self.curframe.f_locals) local.update(self.curframe.f_globals) else: local = self.curframe.f_globals pass if local: interact(banner='Pydb python shell', local=local) else: interact(banner='Pydb python shell') # Restore our history if we can do so. if hasattr(self, 'readline') and self.readline and self.histfile is not None: try: self.readline.read_history_file(self.histfile) except IOError: pass return False return False def do_quit(self, arg): """q(uit) or exit - Quit the debugger. The program being executed is aborted.""" if self.target != 'local': self._rebind_output(self.orig_stdout) self._rebind_input(self.orig_stdin) self._disconnect() self.target = 'local' sys.settrace(None) self._user_requested_quit = True self.running = False self.set_quit() # Tell cmdloop to break out of its loop. return True do_q = do_quit def do_restart(self, arg): """restart - Restart debugger and program via an exec call. All state is lost, and new copy of the debugger is used.""" # We don't proceed with the restart until the action has been # ACK'd by any connected clients if self.connection != None: self.msg('restarting (connection)') line = "" while not 'ACK:restart_now' in line: line = self.connection.readline() self.do_rquit(None) else: if self._sys_argv[0]: self.msg("Re exec'ing:\n\t%s" % self._sys_argv) os.execvp(self._sys_argv[0], self._sys_argv) else: self.msg("No exectuable file specified.") return False def do_return(self, arg): """Make selected stack frame return to its caller. Control remains in the debugger, but when you continue execution will resume at the return statement found inside the subroutine or method. At present we are only able to perform this if we are in a subroutine that has a 'return' statement in it.""" if not self.is_running(): return frame = self.curframe if '?' == frame.f_code.co_name and not '__args__' in frame.f_locals: self.errmsg("I don't see that we are in a subroutine.") return while True and not self.noninteractive: try: # reply = raw_input('Make %s return now? (y or n) ') reply = raw_input('Return now? (y or n) ').strip() except EOFError: reply = 'no' reply = reply.strip().lower() if reply in ('y', 'yes'): break elif reply in ('n', 'no'): return else: self.msg("Please answer y or n.") co = frame.f_code code = co.co_code labels = dis.findlabels(code) linestarts = dict(dis.findlinestarts(co)) i=frame.f_lasti last_line = inspect.getlineno(frame) # last_stmt = i # print "++i: %d, len(code): %d" % (i, len(code)) while i < len(code): i += 1 if i in labels: # print "++last_stmt %d" % i # last_stmt = i last_line = None if i in linestarts and i > 0: # print "++last_line %d" % linestarts[i] last_line = linestarts[i] if 'RETURN_VALUE' == op_at_frame(frame, i): break if i == len(self.stack) or last_line is None: self.msg("Sorry; a return statement was not found.") return # print "++i: %d, last_stmt %d, line: %d " % (i, last_stmt, last_line) self.do_jump(last_line, "Return") return False def do_run(self, arg_str): """run [args...] Run or "soft" restart the debugged Python program. If a string is supplied, it is splitted with "shlex" but preserving embedded quotes. The result is used as the new sys.argv. History, breakpoints, actions and debugger options are preserved. R is a alias for 'run'. See also 'restart' for an exec-like restart.""" if not self._program_sys_argv: self.errmsg("No Python program registered.") self.errmsg("Perhaps you want to use the 'file' command?") return if arg_str: argv_start = self._program_sys_argv[0:1] self._program_sys_argv = arg_split(arg_str) self._program_sys_argv[:0] = argv_start raise Restart do_R = do_run def do_save(self, arg): """save [all|break|settings] [filename] Save specified settings to a file as a script Use the 'source' command in another debug session to restore them.""" args = arg.split() actions = ['all', 'break', 'settings'] filename = os.path.expanduser("~/pydb-restart.txt") if 0 == len(args): what = 'all' elif 1 == len(args): if args[0] in actions: what = args[0] else: filename = os.path.expanduser(args[0]) what = 'all' elif 2 == len(args): what = args[0] if args[0] not in actions: self.errmsg("Action has to be 'all', 'break' or 'settings; " "got '%s'." % args[0]) return False filename = os.path.expanduser(args[1]) else: # len(args) > 2: self.errmsg("Expecting 0-2 arguments, got %d." % len(args)) return False restart_file = open(filename, 'w') what_str = '' if what in ('all', 'break'): lines = self.output_break_commands() restart_file.write("\n".join(lines) + "\n") what_str = 'Breakpoints' if what in ('all', 'settings'): if '' == what_str: what_str = 'Settings' else: what_str = 'Settings and breakpoints' for subcommand in self.setcmds.list(): if subcommand in ['args', 'debug-pydb', 'history', 'logging', 'prompt', 'trace-commands', 'warnoptions']: continue # commands that have lots of output we can't handle right now. if not self.showcmds.subcmds[subcommand]['in_list']: continue val = eval('self.get_%s()' % subcommand) restart_file.write('set %s %s\n' % (subcommand, val)) if what_str != '': restart_file.close() self.msg('%s saved to file %s' % (what_str, restart_file.name)) return False return False def do_set(self, arg): """See help_set""" args = arg.split() if len(args) == 1 and 'warnoptions'.startswith(args[0]): self.setcmds.do(self, args[0], args) return if len(args) < 2: self.errmsg("Expecting at least 2 arguments, got %d." % len(args)) return False self.setcmds.do(self, args[0], args) return False def do_shell(self, arg): """Execute the rest of the line as a shell command.""" os.system(arg) return False def do_show(self, arg): """Generic command for showing things about the debugger. You can give unique prefix of the name of a subcommand to get info about just that subcommand.""" if not arg: for subcommand in self.showcmds.list(): # Some commands have lots of output. # they are excluded here because 'in_list' is false. if self.showcmds.subcmds[subcommand]['in_list']: self.msg_nocr("%s: " % subcommand) self.do_show(subcommand) return False if self._re_linetrace_delay.match(arg): self.msg("line trace delay is %s. (In seconds)" % self.linetrace_delay) else: args = arg.split() self.showcmds.do(self, args[0], args) return False def do_signal(self, arg): """signal [signum|signame] Send a signal to the debugged process. """ if arg =='': signum = 0 else: try: signum = int(eval(arg)) if sighandler.lookup_signame(signum) == None: self.msg("Signal number %d not a known signal number." % signum) return except ValueError: signum = sighandler.lookup_signum(arg) if signum == None: self.msg("Signal name %s not a known signal name." % arg) return os.kill(os.getpid(), signum) return False def do_skip(self, arg): """skip [count] Set the next line that will be executed. The line must be within the stopped or bottom-most execution frame frame.""" if not self.is_running(): return None if self.curindex + 1 != len(self.stack): self.errmsg("You can only skip within the bottom frame.") return None if self.curframe.f_trace is None: self.errmsg("Sigh - operation can't be done here.") return None try: count = self.get_pos_int(arg, default=1, cmdname='skip') except ValueError: return None co = self.curframe.f_code offset = self.curframe.f_lasti if count is None: return False lineno = bytecode.next_linestart(co, offset, count) if lineno < 0: self.errmsg('No next line found') return False try: # Set to change position, update our copy of the stack, # and display the new position self.curframe.f_lineno = lineno self.stack[self.curindex] = self.stack[self.curindex][0], lineno self.print_location() except ValueError, e: self.errmsg('skip failed: %s' % e) return None def do_source(self, arg): """source [-v] FILE Read debugger commands from a file named FILE. Optional -v switch (before the filename) causes each command in FILE to be echoed as it is executed. Note that the file '.pydbrc' is read automatically in this way when pydb is started. An error in any command terminates execution of the command file and control is returned to the console.""" args = arg.split() verbose=False if len(args) == 2 and args[0] == '-v': arg=args[1] verbose=True self.setup_source(os.path.expanduser(arg), True); rc = self.execRcLines(verbose) if rc == 1: return True return False def do_step(self, arg): """s(tep) [count] Execute the current line, stop at the first possible occasion (either in a function that is called or in the current function). With an integer argument, step that many times.""" if not self.is_running(): return None try: # 0 means stop now or step 1, so we subtract 1. self.step_ignore = self.get_pos_int(arg, default=1, cmdname='step') - 1 except ValueError: return self.stepping = True # Used in thread debugging self.set_step() # Tell cmdloop to break out of its loop. return True do_s = do_step def do_tbreak(self, arg, thread_name=None): """tbreak [ ([filename:]lineno | function) [, condition] ] Set a temporary breakpoint. Arguments are like the "break" command. Like "break" except the breakoint is only temporary, so it will be deleted when hit.""" self.do_break(arg, 1, thread_name) def do_unalias(self, arg): """unalias name Deletes the specified alias.""" args = arg.split() if len(args) == 0: return if args[0] in self.aliases: del self.aliases[args[0]] return False # Print a traceback starting at the top stack frame. # The most recently entered frame is printed last; # this is different from dbx and gdb, but consistent with # the Python interpreter's stack trace. # It is also consistent with the up/down commands (which are # compatible with dbx and gdb: up moves towards 'main()' # and down moves towards the most recent stack frame). def do_undisplay(self, arg): """Cancel some expressions to be displayed when program stops. Arguments are the code numbers of the expressions to stop displaying. No argument means cancel all automatic-display expressions. "delete display" has the same effect as this command. Do "info display" to see current list of code numbers.""" if arg: args = arg.split() if len(args) == 1: self.display.clear() return for i in args: i = self.get_an_int(i, 'index %r is not a number' % i) if i is not None: if not self.display.delete_index(i): self.errmsg("No display number %d." % i) return pass pass return False def do_up(self, arg): """up [count] Move the current frame one level up in the stack trace (to an older frame). If using gdb dialect up matches the gdb: 0 is the most recent frame. Otherwise we match Python's stack: 0 is the oldest frame. """ try: count = self.get_int(arg, cmdname="up") except ValueError: return if self.gdb_dialect: count = -count self.__adjust_frame(pos=count, absolute_pos=False) return False def do_whatis(self, arg): """whatis arg Prints the type of the argument which can be a Python expression.""" try: if not self.curframe: # ?? Should we have set up a dummy globals # to have persistence? value = eval(arg, None, None) else: value = eval(arg, self.curframe.f_globals, self.curframe.f_locals) except: t, v = sys.exc_info()[:2] if type(t) == types.StringType: exc_type_name = t else: exc_type_name = t.__name__ if exc_type_name == 'NameError': self.errmsg("Name Error: %s" % arg) else: self.errmsg("%s: %s" % (exc_type_name, self._saferepr(v))) return False if inspect.ismethod(value): self.msg('method %s%s' % (value.func_code.co_name, inspect.formatargspec(inspect.getargspec(value)))) if inspect.getdoc(value): self.msg('%s:\n%s' % (value, inspect.getdoc(value))) return False elif inspect.isfunction(value): self.msg('function %s%s' % (value.func_code.co_name, inspect.formatargspec(inspect.getargspec(value)))) if inspect.getdoc(value): self.msg('%s:\n%s' % (value, inspect.getdoc(value))) return False # None of the above... self.msg(type(value)) return False def do_where(self, arg): """where [count] Print a stack trace, with the most recent frame at the top. With a positive number, print at most many entries. An arrow indicates the 'current frame', which determines the context of most commands. 'bt' and 'T' are short command names for this.""" try: count = self.get_pos_int(arg, default=None, cmdname="where") except ValueError: return False if not self.curframe: self.msg("No stack.") return False print_stack_trace(self, count) return False do_T = do_bt = do_where def do_EOF(self, arg): """EOF Handles the receipt of EOF as a command.""" self.msg("") self._user_requested_quit = True self.set_quit() # Tell cmdloop to break out of its loop. return True ######################################################### # Help methods (derived from pydb.doc or vice versa) ######################################################### for fn in ('EOF', 'alias', 'break', 'cd', 'clear', 'condition', 'continue', 'debug', 'disable', 'delete' , 'disassemble', 'display', 'down', 'enable', 'examine', 'finish', 'frame', 'help', 'ignore', 'info', 'jump', 'list', 'next', 'p', 'pp', 'pwd', 'quit', 'restart', 'retval', 'run', 'set', 'show', 'shell', 'source', 'step', 'tbreak', 'unalias', 'undisplay', 'up', 'whatis', 'where'): exec 'def help_%s(self, *arg): self.msg(self.do_%s.__doc__)' \ % (fn, fn) # Is this the right way to do this? ## Remove duplicate short names ## help_h = help_help ## help_R = help_run ## help_bt = help_T = help_where def help_commands(self, *arg): print """commands [bpnumber] >... >end (Pydb) Set commands to be executed when a breakpoint is hit. Give breakpoint number as the argument after "commands". With no bpnumber argument, commands refers to the last one set. The commands themselves follow starting on the next line. Type a line containing "end" to terminate the commands. To remove all commands from a breakpoint, type commands and follow it immediately with end; that is, give no commands. You can use breakpoint commands to start your program up again. Simply use the continue command, or step, or any other command that resumes execution. Specifying any command resuming execution (currently continue, step, next, return, jump, and quit) terminates the command list as if that command was immediately followed by 'end'. This is because any time you resume execution (even with a simple next or step), you may encounter another breakpoint--which could have its own command list, leading to ambiguities about which list to execute. If you use the 'silent' command in the command list, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If none of the other commands print anything, you see no sign that the breakpoint was reached. """ def help_exec(self, *arg): self.msg("""(!) statement Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To assign to a global variable you must always prefix the command with a 'global' command, e.g.: %sglobal list_options; list_options = ['-l'] %s""" % (self.prompt, self.prompt)) return # Note: format of help is compatible with ddd. def help_info(self, args): """Generic command for showing things about the program being debugged.""" if len(args) == 0: self.infocmds.help(self, '') else: self.infocmds.help(self, args[0]) return return # Note: format of help is compatible with ddd. def help_set(self, args): """This command modifies parts of the debugger environment. You can see these environment settings with the 'show' command.""" if len(args) == 0: self.setcmds.help(self, '') else: self.setcmds.help(self, args[0]) return return # Note: format of help is compatible with ddd. def help_show(self, args): """Generic command for showing things about the debugger.""" if len(args) == 0: self.showcmds.help(self, '') else: self.showcmds.help(self, args[0]) return return def help_unalias(self): print """unalias name Deletes the specified alias.""" return ####### End of help section ######## # # Local variables: # mode: Python # End: pydb-1.26/pydb/pydb.doc0000664000175000017500000004124310447121732011713 00000000000000The Extended Python Debugger Pydb ======================= To use the debugger in its simplest form: >>> import pydb >>> pydb.run('') The debugger's prompt is '(Pydb) '. This will stop in the first function call in . Alternatively, if a statement terminated with an unhandled exception, you can use pydb's post-mortem facility to inspect the contents of the traceback: >>> >>> import pydb >>> pydb.pm() The commands recognized by the debugger are listed in the next section. Most can be abbreviated as indicated; e.g., h(elp) means that 'help' can be typed as 'h' or 'help' (but not as 'he' or 'hel', nor as 'H' or 'Help' or 'HELP'). Optional arguments are enclosed in square brackets. A blank line repeats the previous command literally, except for 'list', where it lists the next 11 lines. Commands that the debugger doesn't recognize are assumed to be Python statements and are executed in the context of the program being debugged. Python statements can also be prefixed with an exclamation point ('!'). This is a powerful way to inspect the program being debugged; it is even possible to change variables. When an exception occurs in such a statement, the exception name is printed but the debugger's state is not changed. The debugger supports aliases, which can save typing. And aliases can have parameters (see the alias help entry) which allows one a certain level of adaptability to the context under examination. Multiple commands may be entered on a single line, separated by the pair ';;'. No intelligence is applied to separating the commands; the input is split at the first ';;', even if it is in the middle of a quoted string. If a file ".pydbrc" exists in your home directory or in the current directory, it is read in and executed as if it had been typed at the debugger prompt. This is particularly useful for aliases. If both files exist, the one in the home directory is read first and aliases defined there can be overriden by the local file. Aside from aliases, the debugger is not directly programmable; but it is implemented as a class from which you can derive your own debugger class, which you can make as fancy as you like. Debugger commands ================= ($) statement Execute the (one-line) statement in the context of the current stack frame. The exclamation point can be omitted unless the first word of the statement resembles a debugger command. To assign to a global variable you must always prefix the command with a 'global' command, e.g.: (Pydb) global list_options; list_options = ['-l'] (Pydb) alias [name [command]] Creates an alias called 'name' that executes 'command'. The command must *not* be enclosed in quotes. Replaceable parameters can be indicated by %1, %2, and so on, while %* is replaced by all the parameters. If no command is given, the current alias for name is shown. If no name is given, all aliases are listed. Aliases may be nested and can contain anything that can be legally typed at the pydb prompt. Note! You *can* override internal pydb commands with aliases! Those internal commands are then hidden until the alias is removed. Aliasing is recursively applied to the first word of the command line; all other words in the line are left alone. As an example, here are two useful aliases (especially when placed in the .pydbrc file): #Print instance variables (usage "pi classInst") alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] #Print instance variables in self alias ps pi self b(reak) [ ([filename:]lineno | function) [, condition] ] Without an argument, use the current point stopped in the program. With a filename:line number argument, set a break there. If filename is omitted, use the current file. With a function name, set a break at the first executable line of that function. Each breakpoint is assigned a number to which all the other breakpoint commands refer. Multiple breakpoints at one place are permitted, and useful with conditional arguments. The condition argument, if present, is a string which must evaluate to true in order for the breakpoint to be honored. cd DIRECTORY Set working directory to DIRECTORY for debugger and program being debugged. cl(ear) {[file:]linenumber | function} Clear breakpoint at specified line or function. Argument may be line number, function name, or "*" and an address. If line number is specified, all breakpoints in that line are cleared. If function is specified, breakpoints at beginning of function are cleared. If an address is specified, breakpoints at what address are cleared. With no argument, clears all breakpoints in the line that the selected frame is executing in. See also the 'delete' command which clears breakpoints by number. complete cmd-prefix Print a list of commands names that start with cmd-prefix. This is command is only availaible if readline supports it. condition bpnumber condition condition is an expression which must evaluate to true before the breakpoint is honored. If condition is absent, any existing condition is removed; i.e., the breakpoint is made unconditional. c(ontinue) Continue execution, only stop when a breakpoint is encountered. commands [bpnumber] >... >end (Pydb) Set commands to be executed when a breakpoint is hit. Give breakpoint number as the argument after "commands". With no bpnumber argument, commands refers to the last one set. The commands themselves follow starting on the next line. Type a line containing "end" to terminate the commands. To remove all commands from a breakpoint, type commands and follow it immediately with end; that is, give no commands. You can use breakpoint commands to start your program up again. Simply use the continue command, or step, or any other command that resumes execution. Specifying any command resuming execution (currently continue, step, next, return, jump, and quit) terminates the command list as if that command was immediately followed by 'end'. This is because any time you resume execution (even with a simple next or step), you may encounter another breakpoint--which could have its own command list, leading to ambiguities about which list to execute. If you use the 'silent' command in the command list, the usual message about stopping at a breakpoint is not printed. This may be desirable for breakpoints that are to print a specific message and then continue. If none of the other commands print anything, you see no sign that the breakpoint was reached. delete [bpnumber [bpnumber...]] Delete some breakpoints. Arguments are breakpoint numbers with spaces in between. To delete all breakpoints, give no argument. those breakpoints. Without argument, clear all breaks (but first ask confirmation). See also the 'clear' command which clears breakpoints by line/file number.. disable bpnumber [bpnumber ...] Disables the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled. disassemble [arg] With no argument disassemble at the current frame location. With a numeric argument, disassemble at the frame location at that line number. With a class, method, function or code argument disassemble that. display [format] EXP Print value of expression EXP each time the program stops. FMT may be used before EXP and may be one of 'c' for char, 'x' for hex, 'o' for ocatl, 'f' for float or 's' for string. With no argument, display all currently requested auto-display expressions. Use "undisplay" to cancel display requests previously made. down [count] Move the current frame one level down in the stack trace (to a newer frame). With a count, which can be a positive or a negative value, move that many positions. enable bpnumber [bpnumber ...] Enables the breakpoints specified. examine expression Print the type of the expression and prettyprint its value. Alias is x (same as in Perl). finish Continue execution until the current function returns. At that point the retval command can be used to show the return value. frame position Move the current frame to the specified frame number. A negative number indicates position from the end, so "frame -1" moves to the newest frame, and "frame 0" moves to the oldest frame. h(elp) Without an argument, print the list of available commands. With a command name as argument, print help about that command (this is currently not implemented). ignore bpnumber count Sets the ignore count for the given breakpoint number. If count is omitted, the ignore count is set to 0. A breakpoint becomes active when the ignore count is zero. When non-zero, the count is decremented each time the breakpoint is reached and the breakpoint is not disabled and any associated condition evaluates to true. i(nfo) [suboption] In general, shows information about the program being debugged. Without argument, print the list of available info commands. With an argument, print info about that command. Suboptions follow: Without argument, print the list of available info commands. With an argument, print info about that command. Suboptions follow: info args -- Argument variables of current stack frame info break -- Status of user-settable breakpoints info display -- Expressions to display when program stops, with code numbers. info globals -- Global variables of current stack frame info line -- Current line number in source file. If a function name is given the starting line of the function is reported. info locals -- Local variables of current stack frame info program -- Execution status of the program info source -- Information about the current Python file jump lineno Set the next line that will be executed. l(ist) [- | first [last or count]] List source code. Without arguments, list LISTSIZE lines centered around the current line or continue the previous listing. "list -" lists LISTSIZE lines before a previous listing. With one argument other than "-", list LISTSIZE lines centered around the specified position. With two arguments, list the given range; if the second argument is less than the first, it is a count. First and last can be either a function name, a line number or file:line n(ext) [count] Continue execution until the next line in the current function is reached or it returns. The difference between next and step is that step stops inside a called function, while next executes called functions at (nearly) full speed, only stopping at the next line in the current function. p expression Print the value of the expression. pp expression Prettyprint the value of the expression. pwd Print working directory. q(uit) Quit the debugger. The program being executed is aborted. For now, kill is a synonym for quit. restart Restart debugger and program via an exec call. All state is lost, and new copy of the debugger is used. Sometimes in debugging it is necessary to modify module code when one finds a bugs in them. Python will not notice dynamically that a module has changed and thus not reimport , so in such a situation one must use "restart" rather than "run". return Make selected stack frame return to its caller. Control remains in the debugger, but when you continue execution will resume at the return statement found inside the subroutine or method. At present we are only able to perform this if we are in a subroutine that has a 'return' statement in it. See also retval and finish. retval Show the value that is to be returned from a function. This command is useful after a "finish" command or stepping just after a "return" statement. To change the value, make an assignment to the variable __return__. The short command name is rv. See also finish and return. run [args...] Run (or restart the debugged python program. If a string is supplied that becomes the new command arguments. History, breakpoints, actions nd debugger options are preserved. ' R' is a short command alias for run. Note that there may be situations where "run" doesn't have the effect you want and you may have to use "restart" instead. See restart for more info. set *subcommand* In general sets the debugger environment. With a subcommand, this command modifies parts of the debugger environment. You can see these environment settings with the "show" command. set args *arg*... Set argument list to give program being debugged when it is started. Follow this command with any number of args, to be passed to the program. Set number of source lines debugger will list by default. set history filename Set the filename in which to record the command history set history save Set saving of the history record on exit set history size Set the size of the command history set linetrace {on|off} Set line execution tracing. If 'on', lines will be shown before they are run. set linetrace delay *float* Set delay after listing a line. This only has an effect if linetrace is in effect. This is useful if tracing inside a GUI that is displaying the position in the source text. A value like 0.5 is probably sufficient. set listsize *int* Set number of source lines debugger will list by default. set logging on set logging off set logging file FILENAME set logging overwrite [on|off] set logging redirect [on|off] set prompt *string* Set debugger's prompt show *subcommand* Generic command for showing things about the debugger. show args -- Show argument list to give program being debugged when it is started show cmdtrace -- Show if we are to show debugger commands before running show commands -- Show the history of commands you typed. This command Is available only if the readline module available and supports the history saving. show history -- Generic command for showing command history parameters show interactive -- Show if we are interactive or not show linetrace -- Show the line tracing status show listsize -- Show number of source lines gdb will list by default show prompt -- Show the current debugger prompt show version -- Show what version of this is source FILE Read commands from a file named FILE. Note that the file '.pydbrc' is read automatically in this way when pydb is started. An error in any command terminates execution of the command file and control is returned to the console. For tracking down problems with command files, see the "set cmdtrace on" debugger command. s(tep) [count] Execute the current line, stop at the first possible occasion (either in a function that is called or in the current function). tbreak [ ([filename:]lineno | function) [, condition] ] Set a temporary breakpoint. Arguments are like the "break" command. Like "break" except the breakoint is only temporary, so it will be deleted when hit. unalias name Deletes the specified alias. undisplay Cancel some expressions to be displayed when program stops. Arguments are the code numbers of the expressions to stop displaying. No argument means cancel all automatic-display expressions. "delete display" has the same effect as this command. Do "info display" to see current list of code numbers. up [count] Move the current frame one level up in the stack trace (to an older frame). With a count, which can be a positive or a negative value, move that many positions. whatis arg Prints the type of the argument. where [count] Print a stack trace, with the most recent frame at the bottom. With a positive number, print at most many entries. An arrow indicates the "current frame", which determines the context of most commands. bt and T are short command names for this. pydb-1.26/pydb/subcmd.py0000644000175000017500000001434110561354334012115 00000000000000"""Handles gdb-like subcommand processing.""" __revision="$Id: subcmd.py,v 1.9 2007/02/04 13:00:12 rockyb Exp $" # -*- coding: utf-8 -*- # Copyright (C) 2006, 2007 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. class Subcmd: """Gdb-like subcommand handling """ def __init__(self, name, doc): self.name = name self.doc = doc self.subcmds = {} self.cmdlist = [] def lookup(self, subcmd_prefix): """Find subcmd in self.subcmds""" for subcmd_name in self.subcmds.keys(): if subcmd_name.startswith(subcmd_prefix) \ and len(subcmd_prefix) >= self.subcmds[subcmd_name]['min']: return self.subcmds[subcmd_name] return None def _subcmd_helper(self, subcmd_name, obj, label=False, strip=False): """Show help for a single subcommand""" if label: obj.msg_nocr("%s %s --" % (self.name, subcmd_name)) entry = self.lookup(subcmd_name) if entry: d = entry['doc'] if strip: # Limit the help message to one line (delimited by '\n') if '\n' in d: d = d[:d.find('\n')] # If the last character is a period, remove it. if d[-1] == '.': d = d[:d.find('.')] obj.msg(d) return obj.undefined_cmd("help", subcmd_name) def add(self, subcmd_name, subcmd_cb, min_len=0, in_list=True): """Add subcmd to the available subcommands for this object. It will have the supplied docstring, and subcmd_cb will be called when we want to run the command. min_len is the minimum length allowed to abbreviate the command. in_list indicates with the show command will be run when giving a list of all sub commands of this object. Some commands have long output like "show commands" so we might not want to show that. """ self.subcmds[subcmd_name] = { "callback": subcmd_cb, "name" : subcmd_name, "doc" : subcmd_cb.__doc__, "in_list" : in_list, "min" : min_len} # We keep a list of subcommands to assist command completion self.cmdlist.append(subcmd_name) def do(self, obj, subcmd_name, arg): """Run subcmd_name with args using obj for the environent""" entry=self.lookup(subcmd_name) if entry: entry['callback'](arg) else: obj.undefined_cmd(self.name, subcmd_name) # Note: format of help is compatible with ddd. def help(self, obj, *args): """help for subcommands.""" subcmd_prefix = args[0] if not subcmd_prefix or len(subcmd_prefix) == 0: obj.msg(self.doc) obj.msg(""" List of %s subcommands: """ % (self.name)) for subcmd_name in self.list(): self._subcmd_helper(subcmd_name, obj, True, True) return entry = self.lookup(subcmd_prefix) if entry: self._subcmd_helper(entry['name'], obj) else: obj.errmsg("Unknown 'help %s' subcommand %s" % (self.name, subcmd_prefix)) def list(self): l = self.subcmds.keys() l.sort() return l # When invoked as main program, invoke the debugger on a script if __name__ == '__main__': class FakeGdb: "A Mock Gdb class" def msg_nocr(self, msg): print msg, def msg(self, msg): print msg def errmsg(self, msg): print msg def info_args(self, arg): "Print the arguments of the current function." print "a=1, b=2" def info_break(self, arg): "Without argument, list info about all breakpoints" print "no breakpoints" def set_args(self, arg): """Set argument list to give program being debugged when it is started""" print "Not done yet" def set_basename(self, arg): "Set short filenames (the basename) in debug output" print "basename changed to %s" % arg def show_args(self, arg): """Show argument list to give debugged program on start""" print "Argument list to give program is ''" def show_basename(self, arg): "Show if we are to show short of long filenames" print "basename is off." def show_cmdtrace(self, arg): "Show if we are to show debugger commands" print "cmdtraces is on." gdb = FakeGdb() infocmd = Subcmd('info', """Generic command for showing things about the program being debugged. """) infocmd.add('args', gdb.info_args) infocmd.add('break', gdb.info_break) showcmd = Subcmd('show', """Generic command for showing things about the debugger.""") showcmd.add('args', gdb.show_args) showcmd.add('basename', gdb.show_basename,) showcmd.add('cmdtrace', gdb.show_cmdtrace) showcmd.help(gdb, '') print "-" * 20 showcmd.help(gdb, "args") print "-" * 20 showcmd.do(gdb, "args", "") print "-" * 20 infocmd.help(gdb, '') print "-" * 20 infocmd.help(gdb, 'basename') setcmd = Subcmd('set', """This command modifies parts of the debugger environment. You can see these environment settings with the 'show' command.""") setcmd.add('args', gdb.set_args) setcmd.add('basename', gdb.set_basename) print "-" * 20 setcmd.help(gdb, '') print "-" * 20 setcmd.help(gdb, 'basename') print "-" * 20 setcmd.do(gdb, 'basename', 'off') print showcmd.list() pydb-1.26/pydb/complete.py0000644000175000017500000001261510562755002012450 00000000000000"""Command Completion routines""" # -*- coding: utf-8 -*- # Copyright (C) 2007 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. import pydbcmd def all_completions(obj, arg, add_left_context=True): """Return a list of command names that can start with the supplied command prefix.""" if not arg: args=[] cmd_prefix='' else: args = arg.split() cmd_prefix=args[0] if len(args) > 1: # Subcommand completion complete_cmds = pydbcmd.Cmd.complete(obj, cmd_prefix, 0) if complete_cmds is not None and args[0] in complete_cmds: return complete_subcommand(obj, args, args[1], add_left_context) return None # command completion for initial word l=[] i=0 while True: text=pydbcmd.Cmd.complete(obj, cmd_prefix, i) if text is None: break l.append(text) i += 1 seen = {} completions=[] completions = list_completions(l, cmd_prefix, seen, completions) # Add in command completion of global and local variables fr=obj.curframe if fr: list_completions(fr.f_globals.keys() + fr.f_globals.keys(), cmd_prefix, seen, completions) completions.sort() return completions def complete_subcommand(obj, subcmd, prefix, add_left_context=True): """Print a list of completions for subcmd that start with text. We get the list of completions from obj._*subcmd*_cmds. If no completion we return the empty list. """ completions = [] subcmd_name = "%scmds" % subcmd[0] if add_left_context: left_context="%s " % subcmd[0] else: left_context="" seen={} if hasattr(obj, subcmd_name): subcmd_obj = getattr(obj, subcmd_name) if hasattr(subcmd_obj, "cmdlist"): completions = list_completions(l=subcmd_obj.cmdlist, prefix=prefix, seen=seen, completions=completions, left_context=left_context) if subcmd[0] in obj.first_can_be_obj: fr=obj.curframe if fr: l = fr.f_globals.keys() + fr.f_globals.keys() completions=list_completions(l=l, prefix=prefix, seen=seen, completions=completions, left_context=left_context) # help command should include all debugger commands. # FIXME: generalize if subcmd[0] == 'help': help_completions = all_completions(obj, prefix, False) if add_left_context: obj.do_where("") help_completions = map(lambda cmd: "help " + cmd, help_completions) completions += help_completions return completions def list_completions(l, prefix, seen, completions, left_context=''): """Given a list l, add to completions those which start with prefix. We omit any that are in the dictionary of boolean values, 'seen'. To that we add those values in l that we've added. completions is returned. left_context is the prepended to each completion string. """ for name in l: if name.startswith(prefix): if name not in seen.keys(): completions.append("%s%s" % (left_context, name)) seen[name]=True return completions # When invoked as main program, some little tests if __name__=='__main__': c=[]; seen={} l=["a", "an", "another", "also", "boy"] assert list_completions(l, "a", seen, c) == ['a', 'an', 'another', 'also'] assert list_completions(l, "b", seen, c) == [ 'a', 'an', 'another', 'also', 'boy'] c=[]; seen={} assert list_completions(l, "a", seen, c, "foo ") == [ 'foo a', 'foo an', 'foo another', 'foo also'] c=[]; seen={} assert list_completions(l, "an", seen, c) == ['an', 'another'] c=[]; seen={} assert list_completions(l, "b", seen, c) == ['boy'] c=[]; seen={} assert list_completions(l, "be", seen, c) == [] c=[]; seen={} assert list_completions(l, "o", seen, c, "foo") == [] import pydb dbg = pydb.Pdb() dbg.curframe = None assert all_completions(dbg, "s") == [ 's', 'set', 'shell', 'show', 'signal', 'source', 'step'] assert all_completions(dbg, "set l") == [ 'set linetrace', 'set listsize', 'set logging'] assert all_completions(dbg, "set l", False) == [ 'linetrace', 'listsize', 'logging'] assert all_completions(dbg, "help s") == [ 's', 'set', 'shell', 'show', 'signal', 'source', 'step'] pydb-1.26/pydb/bytecode.py0000644000175000017500000000532211143717527012441 00000000000000from opcode import * import dis import re def op_at_code_loc(code, loc): try: op = ord(code[loc]) except IndexError: return 'got IndexError' return opname[op] def op_at_frame(frame, loc=None): code = frame.f_code.co_code if loc is None: loc = frame.f_lasti return op_at_code_loc(code, loc) def next_opcode(code, offset): '''Return the next opcode and offset as a tuple. Tuple (-100, -1000) is returned when reaching the end.''' n = len(code) while offset < n: c = code[offset] op = ord(c) offset += 1 if op >= HAVE_ARGUMENT: offset += 2 pass yield op, offset pass yield -100, -1000 pass def next_linestart(co, offset, count=1): linestarts = dict(dis.findlinestarts(co)) code = co.co_code n = len(code) contains_cond_jump = False for op, offset in next_opcode(code, offset): if offset in linestarts: count -= 1 if 0 == count: return linestarts[offset] pass pass return -1000 # FIXME: break out into a code iterator. def stmt_contains_make_function(co, lineno): linestarts = dict(dis.findlinestarts(co)) code = co.co_code found_start = False for offset, start_line in linestarts.items(): if start_line == lineno: found_start = True break pass if not found_start: return False for op, offset in next_opcode(code, offset): if -1000 == offset or linestarts.get(offset): return False opcode = opname[op] # print opcode if 'MAKE_FUNCTION' == opcode: return True pass return False # A pattern for a def header seems to be used a couple of times. _re_def_str = r'^\s*def\s' _re_def = re.compile(_re_def_str) def is_def_stmt(line, frame): """Return True if we are looking at a def statement""" # Should really also check that operand is a code object return _re_def.match(line) and op_at_frame(frame)=='LOAD_CONST' \ and stmt_contains_make_function(frame.f_code, frame.f_lineno) # Demo stuff above if __name__=='__main__': import inspect def sqr(x): return x * x frame = inspect.currentframe() co = frame.f_code lineno = frame.f_lineno print 'contains MAKE_FUNCTION', stmt_contains_make_function(co, lineno-4) print 'contains MAKE_FUNCTION', stmt_contains_make_function(co, lineno) print "op at frame: ", op_at_frame(frame) print "op at frame, position 2", op_at_frame(frame, 2) print "def statement: x=5?: ", is_def_stmt('x=5', frame) # Not a "def" statement because frame is wrong spot print is_def_stmt('def foo():', frame) pass pydb-1.26/pydb/display.py0000644000175000017500000000761711167745261012323 00000000000000# -*- coding: utf-8 -*- """Classes to support gdb-like display/undisplay. $Id: display.py,v 1.5 2009/03/06 09:41:37 rockyb Exp $""" import fns def signature(frame): '''return suitable frame signature to key display expressions off of.''' if not frame: return None code = frame.f_code return (code.co_name, code.co_filename, code.co_firstlineno) class Display: '''Manage a list of display expressions.''' def __init__(self): self.next = 0 self.list = [] return def all(self): """List all display items; return 0 if none""" any = 0 for dp in self.list: if not any: print """Auto-display expressions now in effect: Num Enb Expression""" any = 1 dp.params() return any def clear(self): """Delete all display expressions""" self.list = [] return def delete_index(self, i): """Delete display expression i""" for dp in self.list: if i == dp.number: dp.deleteMe() return pass return def display(self, frame): '''display any items that are active''' if not frame: return sig = signature(frame) for display in self.list: if display.code == sig and display.enabled: print display.displayMe(frame) pass pass return def enable_disable(self, i, b_enable_dispable): for display in self.list: if i == display.number: if b_enable_disable: dp.enableMe() else: dp.disableMe() return pass return pass class DisplayNode(Display): def __init__(self, frame, arg, fmt): Display.__init(self) self.code = signature(frame) self.fmt = fmt self.arg = arg self.enabled = True super.next += 1 self.number = super.next super.list.append(self) def displayMe(self, frame): if not frame: return 'No symbol "' + self.arg + '" in current context.' try: eval(self.arg, frame.f_globals, frame.f_locals) except: return 'No symbol "' + self.arg + '" in current context.' s = "%d: %s" % (self.number, fns.print_obj(self.arg, frame, self.fmt, True)) return s def checkValid(self, frame): # Check if valid for this frame, and if not, delete display # To be used by code that creates a displayNode and only then. res = self.displayMe(frame) if res.split()[0] == 'No': self.deleteMe() # reset counter super.next -= 1 pass return res def params(self): #print format and item to display pad = ' ' * (3 - len(`self.number`)) if self.enabled: what = ' y ' else: what = ' n ' pass if self.fmt: what = what + self.fmt + ' ' what = pad + what + self.arg print '%d:%s' % (self.number, what) return def deleteMe(self): self.list.remove(self) return def disableMe(self): self.enabled = False return def enableMe(self): self.enabled = True return pass if __name__=='__main__': mgr = Display() import inspect x = 1 frame = inspect.currentframe() # mgr.add(frame, 'x > 1') # for line in mgr.all(): print line # mgr.enable_disable(1, False) # for line in mgr.all(): print line # print mgr.display(frame) # mgr.enable_disable(1, False) # for line in mgr.display(frame): print line # mgr.enable_disable(1, True) # for line in mgr.display(frame): print line # mgr.clear() # print '-' * 10 # for line in mgr.all(): print line # pass pydb-1.26/pydb/pydb.py.in0000644000175000017500000007364311167745261012223 00000000000000#!@PYTHON@ -t """A Python debugger. Contains user-callable routines, e.g. exception_hook, run, runl, runv, debugger (AKA set_trace), post_mortem, or runevel. (See also @PACKAGE_NAME@.doc for documentation.) $Id: pydb.py.in,v 1.163 2009/01/19 18:12:43 rockyb Exp $""" # This part contains user entry subroutines. __title__ = '@PACKAGE_NAME@' # The name of the debugger we are currently going by. __version__ = '@PACKAGE_VERSION@' import inspect, os, re, sys, traceback, types import fns from optparse import OptionParser from bdb import BdbQuit from gdb import Gdb from gdb import Restart __all__ = ["Pdb", "debugger", "exception_hook", "help", "pm", "post_mortem", "run", "runcall", "runeval", "runl", "runv", "set_trace"] old_handler = None def process_options(p, debugger_name, pkg_version, option_list=None): """Handle debugger options. Use option_list if you want are writing another main program and want to extend the existing set of debugger options. The options dicionary from opt_parser is return. Global sys.argv is also updated.""" usage_str="""%prog [debugger-options] [python-script [script-options...]] Runs the extended python debugger""" optparser = OptionParser(usage=usage_str, option_list=option_list, version="%%prog version %s" % pkg_version) optparser.add_option("-X", "--trace", dest="linetrace", action="store_true", default=False, help="Show lines before executing them. " + "This option also sets --batch") optparser.add_option("-F", "--fntrace", dest="fntrace", action="store_true", default=False, help="Show functions before executing them. " + "This option also sets --batch") optparser.add_option("--batch", dest="noninteractive", action="store_true", default=False, help="Don't run interactive commands shell on "+ "stops.") optparser.add_option("--basename", dest="basename", action="store_true", default=False, help="Filenames strip off basename, (e.g. for regression tests)" ) optparser.add_option("-x", "--command", dest="command", action="store", type='string', metavar='FILE', help="Execute commands from FILE.") optparser.add_option("--cd", dest="cd", action="store", type='string', metavar='DIR', help="Change current directory to DIR.") optparser.add_option("--error", dest="errors", metavar='FILE', action="store", type='string', help="Write debugger's error output " + "(stderr) to FILE") optparser.add_option("-e", "--exec", dest="execute", type="string", help="list of debugger commands to " + "execute. Separate the commands with ;;") optparser.add_option("-n", "--nx", dest="noexecute", action="store_true", default=False, help="Don't execute commands found in any " + "initialization files") ## optparser.add_option("--pdbserver", dest="pdbserver", ## help="Start the debugger and execute the pdbserver " \ ## + "command. The arguments should be of the form," \ ## + " 'protocol address scriptname'."), optparser.add_option("-o", "--output", dest="output", metavar='FILE', action="store", type='string', help="Write debugger's output (stdout) " + "to FILE") ## optparser.add_option("--pid", dest="pid", ## help="Attach to running process PID.") optparser.add_option("--sigcheck", dest="sigcheck", action="store_true", default=False, help="Set to watch for signal handler changes") optparser.add_option("-t", "--target", dest="target", help="Specify a target to connect to. Arguments" \ + " should be of form, 'protocol address'."), optparser.add_option("-T", "--threading", dest="threading", action="store_true", default=False, help="Start off with threading debug support") # annotate option produces annotations, used in pydb.el for a better emacs # integration. Annotations are similar in purpose to those of GDB (see # that manual for a description), although the syntax is different. # they have the following format: # # ^Z^Zannotname # # ^Z^Z # # where ^Z is the ctrl-Z character, and "annotname" is the name of the # annotation. A line with only two ^Z ends the annotation (no nesting # allowed). See pydb.el for the usage optparser.add_option("--annotate", default=0, type="int", help="Use annotations (to work inside emacs)") # Set up to stop on the first non-option because that's the name # of the script to be debugged on arguments following that are # that scripts options that should be left untouched. We would # not want to interpret and option for the script, e.g. --help, as # one one of our own, e.g. --help. optparser.disable_interspersed_args() # execfile() runs out of Bdb.py and uses sys.argv, so we have to # clobber it and make it what the debugged script expects. Also # the debugged script probably wants to look at sys.argv. # So we'll change sys.argv to look like the program were invoked # directly # Save the original just for use in restart (via exec) p._sys_argv = list(sys.argv) (opts, sys.argv) = optparser.parse_args() ## if opts.target: ## target(opts.target, opts, p) ## sys.exit() ## elif opts.pdbserver: ## pdbserver(opts.pdbserver, p) ## sys.exit() if opts.threading: import threaddbg tpdb = threaddbg.threadDbg() tpdb._sys_argv = p._sys_argv p = tpdb # Get us out of () called from file '' at line 1 p.step_ignore = 1 ## elif opts.pid: ## target(opts.pid, opts, p) ## sys.exit() if opts.linetrace or opts.fntrace: opts.noninteractive = True p.fntrace = opts.fntrace p.linetrace = opts.linetrace p.noninteractive = opts.noninteractive # --nx or -n ? if not opts.noexecute: # Read debugger startup file(s), e.g. $HOME/.pydbrc and ./.pydbrc debugger_startup = ".%src" % debugger_name if 'HOME' in os.environ: debug_startup_home = os.path.join(os.environ['HOME'], debugger_startup) p.setup_source(debug_startup_home) p.setup_source(debugger_startup) if opts.cd: os.chdir(opts.cd) if opts.basename: p.basename = True # As per gdb, first we execute user initialization files and then # we execute any file specified via --command. if opts.command: p.setup_source(os.path.expanduser(opts.command), True); if opts.execute: p.cmdqueue = list(opts.execute.split(';;')) if opts.sigcheck: p.cmdqueue.insert(0, "set sigcheck on") else: p.cmdqueue.insert(0, "set sigcheck off") if opts.output: try: p.stdout = open(opts.output, 'w') except IOError, (errno, strerror): print "I/O in opening debugger output file %s" % opts.output print "error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error in opening debugger output file %s" % \ opts.output print sys.exc_info()[0] sys.exit(2) if opts.errors: try: p.stderr = open(opts.errors, 'w') except IOError, (errno, strerror): print "I/O in opening debugger output file %s" % opts.errors print "error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error in opening debugger output file %s" % \ opts.errors print sys.exc_info()[0] sys.exit(2) p.annotate = opts.annotate return (opts, p) class Pdb(Gdb): """Right now this is basically the same thing as the Gdb class. In the future though we may break out more stand-alone aspects and put them here versues an embedded debugger which is what Gdb would be used for. See the Gdb class documentation for more information and information on the meanings of the parameters. If there is something you want to run before/after on each stopping point, set precmd_hook and/or postcmd_hook """ def __init__(self, completekey='tab', stdin=None, stdout=None, siglist=None): Gdb.__init__(self, completekey, stdin, stdout, siglist) self.annotate = 0 # if > 0, print annotations (for better emacs # integration) self.__show_breakpoints_postcmd = set(["break", "b", "tbreak", "disable", "enable", "condition", "cl", "clear", "delete"]) self.__show_annotations_preloop = set(["s", "step", "c", "continue", "n", "next", "return", "jump"]) self.__show_annotations_postcmd = set(["down", "frame", "up"]) self.__show_annotations = True self.precmd_hooks = [] self.preloop_hooks = [] self.postcmd_hooks = [] self.postloop_hooks = [] return def __annotation(self, label, cmd, *args): self.msg(chr(26) + chr(26) + label) # chr(26) is Ctrl-Z cmd(*args) self.msg(chr(26) + chr(26)) def precmd(self, line): fns.runhooks(self, self.precmd_hooks, line) return line def preloop(self): fns.runhooks(self, self.preloop_hooks) if self.annotate > 0: if self.__show_annotations: # if we are here, the stack frames have changed outside the # command loop (e.g. after a "continue" command), so we show # the annotations again self.__annotation('breakpoints', self.do_info, 'breakpoints') self.__annotation('stack', self.do_where, 0) self.__annotation('locals', self.do_info, 'locals') def postcmd(self, stop, line): if self.annotate > 0: cmd = "" if line: cmd = line.split()[0].strip() if not cmd: cmd = self.lastcmd if cmd in self.__show_breakpoints_postcmd: self.__annotation('breakpoints', self.do_info, 'breakpoints') self.__show_annotations = cmd in self.__show_annotations_preloop if cmd in self.__show_annotations_postcmd: self.__annotation('stack', self.do_where, 0) self.__annotation('locals', self.do_info, 'locals') fns.runhooks(self, self.postcmd_hooks, stop, line) return stop def postloop(self): fns.runhooks(self, self.postloop_hooks) return # -- end class Pdb ######################################################### # Other top-level routines ######################################################### # Start here: note status is new and params have changed... def debugger(dbg_cmds=None, add_exception_hook=True, add_threaddbg=False, status='start', stdout=None): """Enter the debugger at the calling stack frame. This can be used as a way to hard-code a breakpoint in a program, even if the code is not otherwise being debugged (e.g., when an assertion fails). Leaving the debugger, i.e. issuing a "quit" command, terminates the program. dbg_cmds, a list of strings, is an optional list of debugger commands you want to run. If add_exception is True (the default), we will install an exception hook to call the post-mortem debugger on an unhandled exception. If the debugger was called previously, normally we use that. This way any previous debugger state that was set gets used. Setting the parameter `status' to the string 'new' will cause a new instance to be created which might wiping out other instances which might contain information like breakpoints or debugger settings. If instead `status' is set to 'continue', an existing instance will resume. Omitting status or setting it to 'start' will start the debugger which might be a 'new' depending on whether or not an instance has been created. In all cases a string indicating what was done is returned. Since debugging slows down a program, one may want to stop and continue it at various points in your program. """ global _pydb_trace if types.BooleanType == type(status): if status: status = 'new' else: status = 'start' print "debugger() interface has changed see docstring." try: if not isinstance(_pydb_trace, Pdb): print "Your program should not use _pydb_trace" return '_pydb_trace conflict' except NameError: status = 'new' except: print "Unknown error" return 'Unknown error' back_frame = inspect.currentframe().f_back if 'new' == status: if add_threaddbg: import threaddbg _pydb_trace = threaddbg.threadDbg() else: _pydb_trace = Pdb(stdout=stdout) _pydb_trace._program_sys_argv = list(sys.argv) _pydb_trace._sys_argv = list(_pydb_trace._program_sys_argv) _pydb_trace._sys_argv[:0] = [__title__] _pydb_trace.main_dirname = os.path.dirname(sys.argv[0]) _pydb_trace.curframe = back_frame _pydb_trace.stopframe = back_frame if 'continue' == status: pass elif _pydb_trace.running: return 'running' _pydb_trace.running = True # We don't support "run" so we'll make "run" and "R" be "restart" _pydb_trace.do_R = _pydb_trace.do_run = _pydb_trace.do_restart _pydb_trace.curframe = back_frame _pydb_trace.stopframe = back_frame # Dispatcher needs to field BdbQuit exception _pydb_trace.field_BdbQuit = True if dbg_cmds != None: _pydb_trace.cmdqueue = list(dbg_cmds) if add_exception_hook: sys.excepthook = exception_hook _pydb_trace.set_trace(_pydb_trace.curframe) return status def exception_hook(type, value, tb, dbg_cmds=None, cmdfile=None): """An exception hook to call @PACKAGE_NAME@'s post-mortem debugger. cmdfile is an optional debugger command file you want to run "source" on. dbg_cmds is a list of debugger commands you want to run. To use add this to your Python program import sys sys.excepthook = @PACKAGE_NAME@.exception_hook """ traceback.print_exception(type, value, tb) post_mortem(tb, dbg_cmds, cmdfile, 0) return # print help def help(): doc_file='%s.doc' % __title__ for dirname in sys.path: fullname = os.path.join(dirname, __title__, doc_file) if os.path.isfile(fullname): sts = os.system('${PAGER-more} '+fullname) if sts: print 'Pager exit status: %s' % str(sts) break else: print ("Sorry, can't find the help file '%s' along the " + "Python search path") % doc_file return ## def pdbserver(addr, p): ## """Set up to allow a program to be debugged from outside of the ## processes. To take control a debugger front end connects to ## 'addr', which a protocol-specific address, i.e. tcp = 'tcp ## mydomainname.com:9876' serial = 'serial /dev/ttyC0'. ## The name is reminiscent of gdbserver. ## """ ## p.do_pdbserver(addr) ## while True: ## try: ## p._runscript(p.mainpyfile) ## if p._user_requested_quit: break ## except Restart: ## sys.argv = list(p._program_sys_argv) ## p.msg('Restarting') # Post-Mortem interface def pm(dbg_cmds=None, frameno=1, p=None): """Set up post-mortem debugging using the last traceback. But if there is no traceback, we'll assume that sys.exc_info() contains what we want and frameno is the index location of where we want to start. 'dbg_cmds' is an optional list of debugger commands you want to run. 'p', is an optional pydb.Pdb object. """ tb = fns.get_last_tb_or_frame_tb() post_mortem(tb, dbg_cmds=dbg_cmds, p=p) return def post_mortem(t=None, dbg_cmds=None, cmdfile=None, frameno=1, p=None, stdout=None): """Enter debugger read loop after your program has crashed. If no traceback parameter, t, is supplied, the last traceback and if that doesn't exist either we'll assume that sys.exc_info() contains what we want and frameno is the index location of where we want to start. 'dbg_cmds' is an optional list of debugger commands you want to run. 'cmdfile' is an optional debugger command file you want to run "source" on. 'frameno' specifies how many frames to ignore in the traceback. The default is 1 - we don't need the call to post_mortem. If you have wrapper functions that call this one, you may want to increase frameno. """ if p == None: p = Pdb(stdout=stdout) pass p.reset() p.running = False re_bogus_file = re.compile("^<.+>$") if t is None: # frameno+1 because we are about to add one more level of call # in get_last_tb_or_frame_tb t = fns.get_last_tb_or_frame_tb() if t is None: print "Can't find traceback for post_mortem " + \ "in sys.last_traceback or sys.exec_info()" return # t has least-recent traceback entry first. We want the most-recent # entry. Also we'll pick out a mainpyfile name if it hasn't previously # been set. while t.tb_next is not None: filename = t.tb_frame.f_code.co_filename if 0 == len(p.mainpyfile) and not re_bogus_file.match(filename): p.mainpyfile = filename t = t.tb_next p.curframe = t.tb_frame if dbg_cmds != None: p.cmdqueue = list(dbg_cmds) if 0 == len(p._program_sys_argv): # Fake program (run command) args since we weren't called with any p._program_sys_argv = list(sys.argv[1:]) p._program_sys_argv[:0] = [p.mainpyfile] if 0 == len(p._sys_argv): # Fake script invocation (restart) args since we don't have any p._sys_argv = list(p._program_sys_argv) p._sys_argv[:0] = [__title__] if cmdfile is not None: p.do_source(cmdfile) try: # FIXME: This can be called from except hook in which case we # need this. Dunno why though. try: _pydb_trace.set_trace(t.tb_frame) except: pass # Possibly a bug in Python 2.5. Why f.f_lineno is # not always equal to t.tb_lineno, I don't know. f = t.tb_frame if f and f.f_lineno != t.tb_lineno : f = f.f_back p.interaction(f, t) except Restart: while True: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(p.mainpyfile), " ".join(p._program_sys_argv[1:]))) try: p._runscript(p.mainpyfile) if p._user_requested_quit: break if p.noninteractive: break except Restart: pass except BdbQuit: pass return def uncaught_exception(p): traceback.print_exc() print "Uncaught exception. Entering post mortem debugging" t = sys.exc_info()[2] p.interaction(t.tb_frame,t) print "Post mortem debugger finished." return None def run(statement, globals=None, locals=None, stdout=None): """Execute the statement (given as a string) under debugger control starting with the statement subsequent to the place that this call appears in your program. The debugger prompt appears before any code is executed; you can set breakpoints and type 'continue', or you can step through the statement using 'step' or 'next' The optional globals and locals arguments specify the environment in which the code is executed; by default the dictionary of the module __main__ is used.""" p = Pdb(stdout=stdout) p.running=True p.run(statement, globals, locals) return def runeval(expression, globals=None, locals=None, stdout=None): """Evaluate the expression (given as a string) under debugger control starting with the statement subsequent to the place that this appears in your program. When runeval() returns, it returns the value of the expression. Otherwise this function is similar to run().""" p = Pdb(stdout=stdout) p.running=True try: return p.runeval(expression, globals, locals) except: uncaught_exception(p) def runcall(*args, **kwds): """Call the function (a function or method object, not a string) with the given arguments starting with the statement subsequent to the place that this appears in your program. When runcall() returns, it returns whatever the function call returned. The debugger prompt appears as soon as the function is entered.""" p = Pdb() p.running=True try: return p.runcall(*args, **kwds) except: uncaught_exception(p) def runl(*args): """Run debugger as though you typed something like os.system("@PACKAGE_NAME@ " + " ".join(args)) It is also the same as runv((args)). For example, in: runl("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") --threading and --nx go to the debugger and "myscript" is the name of the program to run and gets the remaining parameters. This function may be useful inside Python shells. """ runv(args) return def runv(argv, p=None): """Run debugger as though you typed something like os.system("@PACKAGE_NAME@ " + " ".join(argv)) More precisely the debugger setting sys.argv from argv, which is in fact what's done. (sys.argv[0] is @PACKAGE_NAME@). Note that options to @PACKAGE_NAME@ can come before the Python script to be debugged. For example: args = ("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") runv(argv) --threading and --nx go to the debugger and "myscript" is the name of the program to run and gets the remaining parameters. This function may be useful inside Python shells. Parameter p allows you to pass in your own Pdb object. """ ## FIXME: redo so we don't call main and don't have to save/restore ### sys.argv sys_argv = list(sys.argv) sys.argv[0] = '@PACKAGE_NAME@' sys.argv[1:] = list(argv) main(p) sys.argv = sys_argv return # This is the older name for debugger and is compatible with pdb's name. set_trace=debugger ## def signal_handler(signum, frame): ## """ This signal handler replaces the program's signal handler ## for the 'signum' signal (by default SIGUSR1). When a program ## receives this signal, it creates a pdbserver. ## Debugger clients can then attach to this pdbserver via it's pid. ## """ ## p = Pydb() ## p._sys_argv = list(sys.argv) ## p.reset() ## p.running = True ## p.currentframe = frame ## # Clear up namespace ## del frame.f_globals['pydb'] ## p.do_pdbserver(pdbserver_addr) ## p.set_trace(frame) ## import signal ## global oldhandler ## if oldhandler is not None: ## # Pass along the signal ## signal.signal(signum, old_handler) ## # The value of 'opts' dictates whether we call do_target or do_attach, there ## # were two separate top-level routines for these options, but apart from ## # choosing which do_* to call, the code was the same so it made sense to merge. ## def target(addr, opts, p): ## """ Connect this debugger to a pdbserver at 'addr'. 'addr' is ## a protocol-specific address. i.e. ## tcp = 'tcp mydomainname.com:9876' ## serial = 'serial /dev/ttyC0' ## 'opts' an the OptionParser object. If opts.target is True, call do_target. ## If opts.pid is true, call do_attach. ## """ ## p.reset() ## if opts.target: ## p.do_target(addr) ## elif opts.pid: ## pid = addr[:addr.find(' ')] ## addr = addr[addr.find(' ')+1:] ## p.do_set('target ' + addr) ## p.do_attach(pid) ## while True: ## try: ## p.cmdloop() ## if p._user_requested_quit: break ## except: ## break ######################################################### # Main program ######################################################### def main(p=None): """Routine which gets run if we were invoked directly""" if p is None: p = Pdb() (opts, p) = process_options(p, __title__, __version__) # process_options has munged sys.argv to remove any options that # options that belong to this debugger. The original options to # invoke the debugger and script are in global sys_argv if len(sys.argv) == 0: # No program given to debug. Set to go into a command loop # anyway mainpyfile = None p._program_sys_argv = [] else: # Save the DEBUGGED programs arguments. This is in case # the debugged script munges these, we have a good copy to use # for restart p._program_sys_argv = list(sys.argv) mainpyfile = p._program_sys_argv[0] # Get script filename. if not os.path.isfile(mainpyfile): mainpyfile=fns.whence_file(mainpyfile) if not os.path.exists(mainpyfile): print "@PACKAGE_NAME@: Python script file '%s' does not exist" \ % mainpyfile sys.exit(1) return # If mainpyfile is an optimized Python script try to find and # use non-optimized alternative. mainpyfile_noopt = fns.file_pyc2py(mainpyfile) if mainpyfile != mainpyfile_noopt \ and os.path.exists(mainpyfile_noopt): print "@PACKAGE_NAME@: Compiled Python script given and we can't use that." print "@PACKAGE_NAME@: Substituting non-compiled name: %s" % mainpyfile_noopt mainpyfile = mainpyfile_noopt # Replace @PACKAGE_NAME@'s dir with script's dir in front of # module search path. sys.path[0] = p.main_dirname = os.path.dirname(mainpyfile) # XXX If a signal has been received we continue in the loop, otherwise # the loop exits for some reason. p.sig_received = False while True: # Run the debugged script over and over again until we get it # right. try: if p._program_sys_argv and mainpyfile: p._runscript(mainpyfile) if p.sig_received: p.sig_received = False continue else: p._wait_for_mainpyfile = True p.interaction(None, None) if p._user_requested_quit: break if p.noninteractive: break if p.fntrace: # fn tracing does something to not put a stop at the beginning. p.msg("The program finished") p.interaction(None, None) else: p.msg("The program finished and will be restarted") except Restart: if p._program_sys_argv: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(mainpyfile), " ".join(p._program_sys_argv[1:]))) else: break except SystemExit: # In most cases SystemExit does not warrant a post-mortem session. p.msg("The program exited via sys.exit(). Exit status: %s" % str(sys.exc_info()[1])) p.running = False; if p.noninteractive or hasattr(p,'desired_thread'): break except: traceback.print_exc(file=p.stdout) if p.noninteractive: p.errmsg("Uncaught exception.") break p.errmsg("Uncaught exception. Entering post mortem debugging") if mainpyfile: p.errmsg( "Running 'c' or 'step' will restart the program") p.running = False; t = sys.exc_info()[2] # I believe the commented code below discards information # about where the exception was originally raised and just # keeps us at the point where the exception was handled. I # think though we want to this information. # while t.tb_next is not None: # t = t.tb_next try: p.interaction(t.tb_frame,t) except Restart: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(mainpyfile), " ".join(p._program_sys_argv[1:]))) else: p.msg("Post mortem debugger finished.") if mainpyfile: p.msg(mainpyfile + " will be restarted") p.step_ignore = 0 if p.stdout != sys.stdout: p.stdout.close() # In case someone is waiting on this. # Restore old sys.argv sys.argv = p._program_sys_argv return # When invoked as main program, invoke the debugger on a script if __name__=='__main__': main() # # Local variables: # mode: Python # End: pydb-1.26/pydb/pydb.py0000755000175000017500000007343311167754545011623 00000000000000#!/usr/bin/python -t """A Python debugger. Contains user-callable routines, e.g. exception_hook, run, runl, runv, debugger (AKA set_trace), post_mortem, or runevel. (See also pydb.doc for documentation.) $Id: pydb.py.in,v 1.163 2009/01/19 18:12:43 rockyb Exp $""" # This part contains user entry subroutines. __title__ = 'pydb' # The name of the debugger we are currently going by. __version__ = '1.26' import inspect, os, re, sys, traceback, types import fns from optparse import OptionParser from bdb import BdbQuit from gdb import Gdb from gdb import Restart __all__ = ["Pdb", "debugger", "exception_hook", "help", "pm", "post_mortem", "run", "runcall", "runeval", "runl", "runv", "set_trace"] old_handler = None def process_options(p, debugger_name, pkg_version, option_list=None): """Handle debugger options. Use option_list if you want are writing another main program and want to extend the existing set of debugger options. The options dicionary from opt_parser is return. Global sys.argv is also updated.""" usage_str="""%prog [debugger-options] [python-script [script-options...]] Runs the extended python debugger""" optparser = OptionParser(usage=usage_str, option_list=option_list, version="%%prog version %s" % pkg_version) optparser.add_option("-X", "--trace", dest="linetrace", action="store_true", default=False, help="Show lines before executing them. " + "This option also sets --batch") optparser.add_option("-F", "--fntrace", dest="fntrace", action="store_true", default=False, help="Show functions before executing them. " + "This option also sets --batch") optparser.add_option("--batch", dest="noninteractive", action="store_true", default=False, help="Don't run interactive commands shell on "+ "stops.") optparser.add_option("--basename", dest="basename", action="store_true", default=False, help="Filenames strip off basename, (e.g. for regression tests)" ) optparser.add_option("-x", "--command", dest="command", action="store", type='string', metavar='FILE', help="Execute commands from FILE.") optparser.add_option("--cd", dest="cd", action="store", type='string', metavar='DIR', help="Change current directory to DIR.") optparser.add_option("--error", dest="errors", metavar='FILE', action="store", type='string', help="Write debugger's error output " + "(stderr) to FILE") optparser.add_option("-e", "--exec", dest="execute", type="string", help="list of debugger commands to " + "execute. Separate the commands with ;;") optparser.add_option("-n", "--nx", dest="noexecute", action="store_true", default=False, help="Don't execute commands found in any " + "initialization files") ## optparser.add_option("--pdbserver", dest="pdbserver", ## help="Start the debugger and execute the pdbserver " \ ## + "command. The arguments should be of the form," \ ## + " 'protocol address scriptname'."), optparser.add_option("-o", "--output", dest="output", metavar='FILE', action="store", type='string', help="Write debugger's output (stdout) " + "to FILE") ## optparser.add_option("--pid", dest="pid", ## help="Attach to running process PID.") optparser.add_option("--sigcheck", dest="sigcheck", action="store_true", default=False, help="Set to watch for signal handler changes") optparser.add_option("-t", "--target", dest="target", help="Specify a target to connect to. Arguments" \ + " should be of form, 'protocol address'."), optparser.add_option("-T", "--threading", dest="threading", action="store_true", default=False, help="Start off with threading debug support") # annotate option produces annotations, used in pydb.el for a better emacs # integration. Annotations are similar in purpose to those of GDB (see # that manual for a description), although the syntax is different. # they have the following format: # # ^Z^Zannotname # # ^Z^Z # # where ^Z is the ctrl-Z character, and "annotname" is the name of the # annotation. A line with only two ^Z ends the annotation (no nesting # allowed). See pydb.el for the usage optparser.add_option("--annotate", default=0, type="int", help="Use annotations (to work inside emacs)") # Set up to stop on the first non-option because that's the name # of the script to be debugged on arguments following that are # that scripts options that should be left untouched. We would # not want to interpret and option for the script, e.g. --help, as # one one of our own, e.g. --help. optparser.disable_interspersed_args() # execfile() runs out of Bdb.py and uses sys.argv, so we have to # clobber it and make it what the debugged script expects. Also # the debugged script probably wants to look at sys.argv. # So we'll change sys.argv to look like the program were invoked # directly # Save the original just for use in restart (via exec) p._sys_argv = list(sys.argv) (opts, sys.argv) = optparser.parse_args() ## if opts.target: ## target(opts.target, opts, p) ## sys.exit() ## elif opts.pdbserver: ## pdbserver(opts.pdbserver, p) ## sys.exit() if opts.threading: import threaddbg tpdb = threaddbg.threadDbg() tpdb._sys_argv = p._sys_argv p = tpdb # Get us out of () called from file '' at line 1 p.step_ignore = 1 ## elif opts.pid: ## target(opts.pid, opts, p) ## sys.exit() if opts.linetrace or opts.fntrace: opts.noninteractive = True p.fntrace = opts.fntrace p.linetrace = opts.linetrace p.noninteractive = opts.noninteractive # --nx or -n ? if not opts.noexecute: # Read debugger startup file(s), e.g. $HOME/.pydbrc and ./.pydbrc debugger_startup = ".%src" % debugger_name if 'HOME' in os.environ: debug_startup_home = os.path.join(os.environ['HOME'], debugger_startup) p.setup_source(debug_startup_home) p.setup_source(debugger_startup) if opts.cd: os.chdir(opts.cd) if opts.basename: p.basename = True # As per gdb, first we execute user initialization files and then # we execute any file specified via --command. if opts.command: p.setup_source(os.path.expanduser(opts.command), True); if opts.execute: p.cmdqueue = list(opts.execute.split(';;')) if opts.sigcheck: p.cmdqueue.insert(0, "set sigcheck on") else: p.cmdqueue.insert(0, "set sigcheck off") if opts.output: try: p.stdout = open(opts.output, 'w') except IOError, (errno, strerror): print "I/O in opening debugger output file %s" % opts.output print "error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error in opening debugger output file %s" % \ opts.output print sys.exc_info()[0] sys.exit(2) if opts.errors: try: p.stderr = open(opts.errors, 'w') except IOError, (errno, strerror): print "I/O in opening debugger output file %s" % opts.errors print "error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error in opening debugger output file %s" % \ opts.errors print sys.exc_info()[0] sys.exit(2) p.annotate = opts.annotate return (opts, p) class Pdb(Gdb): """Right now this is basically the same thing as the Gdb class. In the future though we may break out more stand-alone aspects and put them here versues an embedded debugger which is what Gdb would be used for. See the Gdb class documentation for more information and information on the meanings of the parameters. If there is something you want to run before/after on each stopping point, set precmd_hook and/or postcmd_hook """ def __init__(self, completekey='tab', stdin=None, stdout=None, siglist=None): Gdb.__init__(self, completekey, stdin, stdout, siglist) self.annotate = 0 # if > 0, print annotations (for better emacs # integration) self.__show_breakpoints_postcmd = set(["break", "b", "tbreak", "disable", "enable", "condition", "cl", "clear", "delete"]) self.__show_annotations_preloop = set(["s", "step", "c", "continue", "n", "next", "return", "jump"]) self.__show_annotations_postcmd = set(["down", "frame", "up"]) self.__show_annotations = True self.precmd_hooks = [] self.preloop_hooks = [] self.postcmd_hooks = [] self.postloop_hooks = [] return def __annotation(self, label, cmd, *args): self.msg(chr(26) + chr(26) + label) # chr(26) is Ctrl-Z cmd(*args) self.msg(chr(26) + chr(26)) def precmd(self, line): fns.runhooks(self, self.precmd_hooks, line) return line def preloop(self): fns.runhooks(self, self.preloop_hooks) if self.annotate > 0: if self.__show_annotations: # if we are here, the stack frames have changed outside the # command loop (e.g. after a "continue" command), so we show # the annotations again self.__annotation('breakpoints', self.do_info, 'breakpoints') self.__annotation('stack', self.do_where, 0) self.__annotation('locals', self.do_info, 'locals') def postcmd(self, stop, line): if self.annotate > 0: cmd = "" if line: cmd = line.split()[0].strip() if not cmd: cmd = self.lastcmd if cmd in self.__show_breakpoints_postcmd: self.__annotation('breakpoints', self.do_info, 'breakpoints') self.__show_annotations = cmd in self.__show_annotations_preloop if cmd in self.__show_annotations_postcmd: self.__annotation('stack', self.do_where, 0) self.__annotation('locals', self.do_info, 'locals') fns.runhooks(self, self.postcmd_hooks, stop, line) return stop def postloop(self): fns.runhooks(self, self.postloop_hooks) return # -- end class Pdb ######################################################### # Other top-level routines ######################################################### # Start here: note status is new and params have changed... def debugger(dbg_cmds=None, add_exception_hook=True, add_threaddbg=False, status='start', stdout=None): """Enter the debugger at the calling stack frame. This can be used as a way to hard-code a breakpoint in a program, even if the code is not otherwise being debugged (e.g., when an assertion fails). Leaving the debugger, i.e. issuing a "quit" command, terminates the program. dbg_cmds, a list of strings, is an optional list of debugger commands you want to run. If add_exception is True (the default), we will install an exception hook to call the post-mortem debugger on an unhandled exception. If the debugger was called previously, normally we use that. This way any previous debugger state that was set gets used. Setting the parameter `status' to the string 'new' will cause a new instance to be created which might wiping out other instances which might contain information like breakpoints or debugger settings. If instead `status' is set to 'continue', an existing instance will resume. Omitting status or setting it to 'start' will start the debugger which might be a 'new' depending on whether or not an instance has been created. In all cases a string indicating what was done is returned. Since debugging slows down a program, one may want to stop and continue it at various points in your program. """ global _pydb_trace if types.BooleanType == type(status): if status: status = 'new' else: status = 'start' print "debugger() interface has changed see docstring." try: if not isinstance(_pydb_trace, Pdb): print "Your program should not use _pydb_trace" return '_pydb_trace conflict' except NameError: status = 'new' except: print "Unknown error" return 'Unknown error' back_frame = inspect.currentframe().f_back if 'new' == status: if add_threaddbg: import threaddbg _pydb_trace = threaddbg.threadDbg() else: _pydb_trace = Pdb(stdout=stdout) _pydb_trace._program_sys_argv = list(sys.argv) _pydb_trace._sys_argv = list(_pydb_trace._program_sys_argv) _pydb_trace._sys_argv[:0] = [__title__] _pydb_trace.main_dirname = os.path.dirname(sys.argv[0]) _pydb_trace.curframe = back_frame _pydb_trace.stopframe = back_frame if 'continue' == status: pass elif _pydb_trace.running: return 'running' _pydb_trace.running = True # We don't support "run" so we'll make "run" and "R" be "restart" _pydb_trace.do_R = _pydb_trace.do_run = _pydb_trace.do_restart _pydb_trace.curframe = back_frame _pydb_trace.stopframe = back_frame # Dispatcher needs to field BdbQuit exception _pydb_trace.field_BdbQuit = True if dbg_cmds != None: _pydb_trace.cmdqueue = list(dbg_cmds) if add_exception_hook: sys.excepthook = exception_hook _pydb_trace.set_trace(_pydb_trace.curframe) return status def exception_hook(type, value, tb, dbg_cmds=None, cmdfile=None): """An exception hook to call pydb's post-mortem debugger. cmdfile is an optional debugger command file you want to run "source" on. dbg_cmds is a list of debugger commands you want to run. To use add this to your Python program import sys sys.excepthook = pydb.exception_hook """ traceback.print_exception(type, value, tb) post_mortem(tb, dbg_cmds, cmdfile, 0) return # print help def help(): doc_file='%s.doc' % __title__ for dirname in sys.path: fullname = os.path.join(dirname, __title__, doc_file) if os.path.isfile(fullname): sts = os.system('${PAGER-more} '+fullname) if sts: print 'Pager exit status: %s' % str(sts) break else: print ("Sorry, can't find the help file '%s' along the " + "Python search path") % doc_file return ## def pdbserver(addr, p): ## """Set up to allow a program to be debugged from outside of the ## processes. To take control a debugger front end connects to ## 'addr', which a protocol-specific address, i.e. tcp = 'tcp ## mydomainname.com:9876' serial = 'serial /dev/ttyC0'. ## The name is reminiscent of gdbserver. ## """ ## p.do_pdbserver(addr) ## while True: ## try: ## p._runscript(p.mainpyfile) ## if p._user_requested_quit: break ## except Restart: ## sys.argv = list(p._program_sys_argv) ## p.msg('Restarting') # Post-Mortem interface def pm(dbg_cmds=None, frameno=1, p=None): """Set up post-mortem debugging using the last traceback. But if there is no traceback, we'll assume that sys.exc_info() contains what we want and frameno is the index location of where we want to start. 'dbg_cmds' is an optional list of debugger commands you want to run. 'p', is an optional pydb.Pdb object. """ tb = fns.get_last_tb_or_frame_tb() post_mortem(tb, dbg_cmds=dbg_cmds, p=p) return def post_mortem(t=None, dbg_cmds=None, cmdfile=None, frameno=1, p=None, stdout=None): """Enter debugger read loop after your program has crashed. If no traceback parameter, t, is supplied, the last traceback and if that doesn't exist either we'll assume that sys.exc_info() contains what we want and frameno is the index location of where we want to start. 'dbg_cmds' is an optional list of debugger commands you want to run. 'cmdfile' is an optional debugger command file you want to run "source" on. 'frameno' specifies how many frames to ignore in the traceback. The default is 1 - we don't need the call to post_mortem. If you have wrapper functions that call this one, you may want to increase frameno. """ if p == None: p = Pdb(stdout=stdout) pass p.reset() p.running = False re_bogus_file = re.compile("^<.+>$") if t is None: # frameno+1 because we are about to add one more level of call # in get_last_tb_or_frame_tb t = fns.get_last_tb_or_frame_tb() if t is None: print "Can't find traceback for post_mortem " + \ "in sys.last_traceback or sys.exec_info()" return # t has least-recent traceback entry first. We want the most-recent # entry. Also we'll pick out a mainpyfile name if it hasn't previously # been set. while t.tb_next is not None: filename = t.tb_frame.f_code.co_filename if 0 == len(p.mainpyfile) and not re_bogus_file.match(filename): p.mainpyfile = filename t = t.tb_next p.curframe = t.tb_frame if dbg_cmds != None: p.cmdqueue = list(dbg_cmds) if 0 == len(p._program_sys_argv): # Fake program (run command) args since we weren't called with any p._program_sys_argv = list(sys.argv[1:]) p._program_sys_argv[:0] = [p.mainpyfile] if 0 == len(p._sys_argv): # Fake script invocation (restart) args since we don't have any p._sys_argv = list(p._program_sys_argv) p._sys_argv[:0] = [__title__] if cmdfile is not None: p.do_source(cmdfile) try: # FIXME: This can be called from except hook in which case we # need this. Dunno why though. try: _pydb_trace.set_trace(t.tb_frame) except: pass # Possibly a bug in Python 2.5. Why f.f_lineno is # not always equal to t.tb_lineno, I don't know. f = t.tb_frame if f and f.f_lineno != t.tb_lineno : f = f.f_back p.interaction(f, t) except Restart: while True: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(p.mainpyfile), " ".join(p._program_sys_argv[1:]))) try: p._runscript(p.mainpyfile) if p._user_requested_quit: break if p.noninteractive: break except Restart: pass except BdbQuit: pass return def uncaught_exception(p): traceback.print_exc() print "Uncaught exception. Entering post mortem debugging" t = sys.exc_info()[2] p.interaction(t.tb_frame,t) print "Post mortem debugger finished." return None def run(statement, globals=None, locals=None, stdout=None): """Execute the statement (given as a string) under debugger control starting with the statement subsequent to the place that this call appears in your program. The debugger prompt appears before any code is executed; you can set breakpoints and type 'continue', or you can step through the statement using 'step' or 'next' The optional globals and locals arguments specify the environment in which the code is executed; by default the dictionary of the module __main__ is used.""" p = Pdb(stdout=stdout) p.running=True p.run(statement, globals, locals) return def runeval(expression, globals=None, locals=None, stdout=None): """Evaluate the expression (given as a string) under debugger control starting with the statement subsequent to the place that this appears in your program. When runeval() returns, it returns the value of the expression. Otherwise this function is similar to run().""" p = Pdb(stdout=stdout) p.running=True try: return p.runeval(expression, globals, locals) except: uncaught_exception(p) def runcall(*args, **kwds): """Call the function (a function or method object, not a string) with the given arguments starting with the statement subsequent to the place that this appears in your program. When runcall() returns, it returns whatever the function call returned. The debugger prompt appears as soon as the function is entered.""" p = Pdb() p.running=True try: return p.runcall(*args, **kwds) except: uncaught_exception(p) def runl(*args): """Run debugger as though you typed something like os.system("pydb " + " ".join(args)) It is also the same as runv((args)). For example, in: runl("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") --threading and --nx go to the debugger and "myscript" is the name of the program to run and gets the remaining parameters. This function may be useful inside Python shells. """ runv(args) return def runv(argv, p=None): """Run debugger as though you typed something like os.system("pydb " + " ".join(argv)) More precisely the debugger setting sys.argv from argv, which is in fact what's done. (sys.argv[0] is pydb). Note that options to pydb can come before the Python script to be debugged. For example: args = ("--threading", "--nx", "myscript", "--my-first-option" "myfirstarg") runv(argv) --threading and --nx go to the debugger and "myscript" is the name of the program to run and gets the remaining parameters. This function may be useful inside Python shells. Parameter p allows you to pass in your own Pdb object. """ ## FIXME: redo so we don't call main and don't have to save/restore ### sys.argv sys_argv = list(sys.argv) sys.argv[0] = 'pydb' sys.argv[1:] = list(argv) main(p) sys.argv = sys_argv return # This is the older name for debugger and is compatible with pdb's name. set_trace=debugger ## def signal_handler(signum, frame): ## """ This signal handler replaces the program's signal handler ## for the 'signum' signal (by default SIGUSR1). When a program ## receives this signal, it creates a pdbserver. ## Debugger clients can then attach to this pdbserver via it's pid. ## """ ## p = Pydb() ## p._sys_argv = list(sys.argv) ## p.reset() ## p.running = True ## p.currentframe = frame ## # Clear up namespace ## del frame.f_globals['pydb'] ## p.do_pdbserver(pdbserver_addr) ## p.set_trace(frame) ## import signal ## global oldhandler ## if oldhandler is not None: ## # Pass along the signal ## signal.signal(signum, old_handler) ## # The value of 'opts' dictates whether we call do_target or do_attach, there ## # were two separate top-level routines for these options, but apart from ## # choosing which do_* to call, the code was the same so it made sense to merge. ## def target(addr, opts, p): ## """ Connect this debugger to a pdbserver at 'addr'. 'addr' is ## a protocol-specific address. i.e. ## tcp = 'tcp mydomainname.com:9876' ## serial = 'serial /dev/ttyC0' ## 'opts' an the OptionParser object. If opts.target is True, call do_target. ## If opts.pid is true, call do_attach. ## """ ## p.reset() ## if opts.target: ## p.do_target(addr) ## elif opts.pid: ## pid = addr[:addr.find(' ')] ## addr = addr[addr.find(' ')+1:] ## p.do_set('target ' + addr) ## p.do_attach(pid) ## while True: ## try: ## p.cmdloop() ## if p._user_requested_quit: break ## except: ## break ######################################################### # Main program ######################################################### def main(p=None): """Routine which gets run if we were invoked directly""" if p is None: p = Pdb() (opts, p) = process_options(p, __title__, __version__) # process_options has munged sys.argv to remove any options that # options that belong to this debugger. The original options to # invoke the debugger and script are in global sys_argv if len(sys.argv) == 0: # No program given to debug. Set to go into a command loop # anyway mainpyfile = None p._program_sys_argv = [] else: # Save the DEBUGGED programs arguments. This is in case # the debugged script munges these, we have a good copy to use # for restart p._program_sys_argv = list(sys.argv) mainpyfile = p._program_sys_argv[0] # Get script filename. if not os.path.isfile(mainpyfile): mainpyfile=fns.whence_file(mainpyfile) if not os.path.exists(mainpyfile): print "pydb: Python script file '%s' does not exist" \ % mainpyfile sys.exit(1) return # If mainpyfile is an optimized Python script try to find and # use non-optimized alternative. mainpyfile_noopt = fns.file_pyc2py(mainpyfile) if mainpyfile != mainpyfile_noopt \ and os.path.exists(mainpyfile_noopt): print "pydb: Compiled Python script given and we can't use that." print "pydb: Substituting non-compiled name: %s" % mainpyfile_noopt mainpyfile = mainpyfile_noopt # Replace pydb's dir with script's dir in front of # module search path. sys.path[0] = p.main_dirname = os.path.dirname(mainpyfile) # XXX If a signal has been received we continue in the loop, otherwise # the loop exits for some reason. p.sig_received = False while True: # Run the debugged script over and over again until we get it # right. try: if p._program_sys_argv and mainpyfile: p._runscript(mainpyfile) if p.sig_received: p.sig_received = False continue else: p._wait_for_mainpyfile = True p.interaction(None, None) if p._user_requested_quit: break if p.noninteractive: break if p.fntrace: # fn tracing does something to not put a stop at the beginning. p.msg("The program finished") p.interaction(None, None) else: p.msg("The program finished and will be restarted") except Restart: if p._program_sys_argv: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(mainpyfile), " ".join(p._program_sys_argv[1:]))) else: break except SystemExit: # In most cases SystemExit does not warrant a post-mortem session. p.msg("The program exited via sys.exit(). Exit status: %s" % str(sys.exc_info()[1])) p.running = False; if p.noninteractive or hasattr(p,'desired_thread'): break except: traceback.print_exc(file=p.stdout) if p.noninteractive: p.errmsg("Uncaught exception.") break p.errmsg("Uncaught exception. Entering post mortem debugging") if mainpyfile: p.errmsg( "Running 'c' or 'step' will restart the program") p.running = False; t = sys.exc_info()[2] # I believe the commented code below discards information # about where the exception was originally raised and just # keeps us at the point where the exception was handled. I # think though we want to this information. # while t.tb_next is not None: # t = t.tb_next try: p.interaction(t.tb_frame,t) except Restart: sys.argv = list(p._program_sys_argv) p.msg("Restarting %s with arguments:\n\t%s" % (p.filename(mainpyfile), " ".join(p._program_sys_argv[1:]))) else: p.msg("Post mortem debugger finished.") if mainpyfile: p.msg(mainpyfile + " will be restarted") p.step_ignore = 0 if p.stdout != sys.stdout: p.stdout.close() # In case someone is waiting on this. # Restore old sys.argv sys.argv = p._program_sys_argv return # When invoked as main program, invoke the debugger on a script if __name__=='__main__': main() # # Local variables: # mode: Python # End: pydb-1.26/pydb/Makefile0000644000175000017500000000064010477504536011732 00000000000000#============================================================= # $Id: Makefile,v 1.2 2006/02/27 01:02:47 rockyb Exp $ #============================================================= # Whatever it is you want to do, it should be handled by the # by the main (parent) Makefile. So reissue make from there. .PHONY: all all: pydb.py $(MAKE) -C .. $@ pydb.py: pydb.py.in $(MAKE) -C .. pydb/$@ %: $(MAKE) -C .. $@ pydb-1.26/pydb/connection.py0000644000175000017500000003060711124020552012766 00000000000000# -*- coding: utf-8 -*- """Lower-level classes to support communication between separate processes which might reside be on separate computers. Can be used remote debugging via a socket or via a serial communication line, or via a FIFO. Modified from Matt Fleming's 2006 Google Summer of Code project. $Id: connection.py,v 1.10 2008/12/22 15:17:25 rockyb Exp $""" NotImplementedMessage = "This method must be overriden in a subclass" ### Exceptions class ConnectionFailed(Exception): pass class DroppedConnection(Exception): pass class ReadError(Exception): pass class WriteError(Exception): pass class ConnectionInterface(object): """ This is an abstract class that specifies the interface a server connection class must implement. If a target is given, we'll set up a connection on that target """ def connect(self, target): """Use this to set the target. It can also be specified on the initialization.""" raise NotImplementedError, NotImplementedMessage def disconnect(self): """ This method is called to disconnect connections.""" raise NotImplementedError, NotImplementedMessage def readline(self): """ This method reads a line of data of maximum length 'bufsize' from the connected debugger. """ raise NotImplementedError, NotImplementedMessage def write(self, msg): """ This method is used to write to a debugger that is connected to this server. """ raise NotImplementedError, NotImplementedMessage # end ConnectionInterface ### This might go in a different file # Note: serial protocol does not require the distinction between server and # client. class ConnectionSerial(ConnectionInterface): """ This connection class that allows a connection to a target via a serial line. """ def __init__(self): ConnectionInterface.__init__(self) self.input = None self.output = None def connect(self, device): """ Create our fileobject by opening the serial device for this connection. A serial device must be specified, (e.g. /dev/ttyS0, /dev/ttya, COM1, etc.). """ self._dev = device try: self.input = open(self._dev, 'r') self.output = open(self._dev, 'w') except IOError,e: # Use e[1] for more detail about why the connection failed raise ConnectionFailed, e[1] def disconnect(self): """ Close the serial device. """ if self.output is None and self.input is None: return self.output.close() self.input.close() def readline(self, bufsize=2048): try: line = self.input.readline(bufsize) except IOError, e: raise ReadError, e[1] return line def write(self, msg): if msg[-1] is not '\n': msg += '\n' try: self.output.write(msg) self.output.flush() except IOError, e: raise WriteError, e[1] # end class ConnectionSerial ### This might go in a different file import socket class ConnectionServerTCP(ConnectionInterface): """This is an implementation of a server class that uses the TCP protocol as its means of communication. """ def __init__(self): self.listening = False self._sock = self.output = self.input = None ConnectionInterface.__init__(self) def connect(self, addr, reuseaddr=True): """Set to allow a connection from a client. 'addr' specifies the hostname and port combination of the server. """ try: h,p = addr.split(':') except ValueError: raise ConnectionFailed, 'Invalid address' self.host = h self.port = int(p) if not self.listening: self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if reuseaddr: self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: self._sock.bind((self.host, self.port)) except socket.error, e: # Use e[1] as a more detailed error message raise ConnectionFailed, e[1] self._sock.listen(1) self.listening = True self.output, addr = self._sock.accept() self.input = self.output def disconnect(self): if self.output is None or self._sock is None: return self.output.close() self._sock.close() self._sock = None self.listening = False def readline(self, bufsize=2048): try: line = self.input.recv(bufsize) except socket.error, e: raise ReadError, e[1] if not line: raise ReadError, 'Connection closed' if line[-1] != '\n': line += '\n' return line def write(self, msg): try: self.output.sendall(msg) except socket.error, e: raise WriteError, e[1] # end ConnectionServerTCP class ConnectionClientTCP(ConnectionInterface): """ A class that allows a connection to be made from a debugger to a server via TCP. """ def __init__(self): """ Specify the address to connection to. """ ConnectionInterface.__init__(self) self._sock = self.output = self.input = None self.connected = True def connect(self, addr): """Connect to the server. 'input' reads data from the server. 'output' writes data to the server. Specify the address of the server (e.g. host:2020). """ try: h, p = addr.split(':') except ValueError: raise ConnectionFailed, 'Invalid address' self.host = h self.port = int(p) self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self._sock.connect((self.host, self.port)) except socket.error, e: raise ConnectionFailed, e[1] self.connected = True def write(self, msg): try: self._sock.sendall(msg) except socket.error, e: raise WriteError, e[1] def readline(self, bufsize=2048): try: line = self._sock.recv(bufsize) except socket.error, e: raise ReadError, e[1] if not line: raise ReadError, 'Connection closed' return line def disconnect(self): """ Close the socket to the server. """ # We shouldn't bail if we haven't been connected yet if self._sock is None: return else: self._sock.close() self._sock = None self.connected = False #end ConnectionClientTCP ### This might go in a different file import os class ConnectionFIFO(ConnectionInterface): """A class for communicating akin to a named pipe. Since I haven't been able to figure out how to make os.mkfifo work, we'll use two files instead. Each process reads on one and writes on the other. The read of one is attached to the write of the other and vice versa. """ def __init__(self, is_server): """is_server is a boolean which is used to ensure that the read FIFO of one process is attachd tothe write FIFO of the other. We arbitrarily call one the 'server' and one the 'client'. """ ConnectionInterface.__init__(self) ## FIXME check to see if is_server is boolean? self.is_server = is_server self.inp = self.mode = self.filename = None def connect(self, filename, mode=0644): """Set up FIFOs for read and write connections based on the filename parameter passed. If no filename parameter is given, use the filename specified on instance creation. If there is a problem creating the FIFO we will return a ConnectionFailed exception.""" self.filename = filename self.fname_in = self.infile() self.fname_out = self.outfile() self.open_outfile() self.mode = mode if self.is_server: # Wait for a connection from a client import time while not os.path.exists(self.fname_in): time.sleep(0.5) try: self.inp = open(self.fname_in, 'r') except IOError, e: raise ConnectionFailed, "%s: %s:" % (self.fname_out, e[1]) def disconnect(self): """Close input and output files and remove from the filesystem the output file.""" if not self.inp or not self.outp: return self.outp.close() outfile = self.outfile() if outfile is not None and os.path.isfile(outfile): os.unlink(outfile) self.inp.close() self.inp = self.outp = None def infile(self): """Return the input FIFO name for the object""" if self.is_server: return self.filename + ".in" else: return self.filename + ".out" def open_outfile(self): """Return the output FIFO name for the object""" try: self.outp = open(self.fname_out, 'w') except IOError, e: raise ConnectionFailed, e[1] def outfile(self): """Return the output FIFO name for the object""" if self.is_server: return self.filename + ".out" else: return self.filename + ".in" def readline(self): try: line = self.inp.readline() except IOError, e: raise ReadError, e[1] if not line: raise ReadError, 'Connection closed' return line def write(self, msg): if msg[-1] != '\n': msg += '\n' try: self.outp.write(msg) self.outp.flush() except IOError, e: raise WriteError, e[1] # end ConnectionFIFO def import_hook(target): cls = target[target.rfind('.')+1:] target = target[:target.rfind('.')] try: pkg = __import__(target, globals(), locals(), []) except ImportError: return None return getattr(pkg, cls) class ConnectionClientFactory: """A factory class that provides a connection for use with a client for example, with a target function. """ # @staticmethod # Works only on Python 2.4 and up def create(target): if target.lower() == 'tcp': return ConnectionClientTCP() elif target.lower() == 'serial': return ConnectionSerial() elif target.lower() == 'fifo': return ConnectionFIFO(is_server=True) else: return import_hook(target) create = staticmethod(create) # Works on all Python versions class ConnectionServerFactory: """A factory class that provides a connection to be used with a pdbserver. """ # @staticmethod # Works only on Python 2.4 and up def create(target): if target.lower() == 'tcp': return ConnectionServerTCP() elif target.lower() == 'serial': return ConnectionSerial() elif target.lower() == 'fifo': return ConnectionFIFO(is_server=True) else: return import_hook(target) create = staticmethod(create) # Works on all Python versions # When invoked as main program, do some basic tests if __name__=='__main__': # FIFO test import thread fname='test_file' server = ConnectionFIFO(is_server=True) client = ConnectionFIFO(is_server=False) thread.start_new_thread(server.connect, (fname,)) client.connect(filename=fname) line = 'this is a test\n' client.write(line) ### FIXME import time time.sleep(0.05) l2 = server.readline() assert l2 == line line = 'Another test\n' server.write(line) l2 = client.readline() assert l2 == line client.disconnect() server.disconnect() # TCP test port = 8000 while True: addr = '127.0.0.1:%d' % port server = ConnectionServerTCP() try: thread.start_new_thread(server.connect, (addr,)) print "port: %d" % port break except IOError, e: if e[0] == 'Address already in use': if port < 8010: port += 1 print "port: %d" % port continue import sys sys.exit(0) client = ConnectionClientTCP() client.disconnect() server.disconnect() pydb-1.26/pydb/pydbcmd.py0000644000175000017500000005657111167745261012303 00000000000000"""A Python debugger command class. Routines here have to do with parsing or processing commands, but are not the commands themselves which are in gdb.py.in. Generally (but not always) they are not specific to pydb. They are sort of more oriented towards any gdb-like debugger. Also routines that need to be changed from cmd are here. $Id: pydbcmd.py,v 1.57 2009/03/18 10:12:54 rockyb Exp $""" import cmd, linecache, sys, types from fns import * # Interaction prompt line will separate file and call info from code # text using value of line_prefix string. A newline and arrow may # be to your liking. You can set it once pydb is imported using the # command "pydb.line_prefix = '\n% '". # line_prefix = ': ' # Use this to get the old situation back line_prefix = '\n-> ' # Probably a better default class Cmd(cmd.Cmd): def __init__(self, completekey='tab', stdin=None, stdout=None): cmd.Cmd.__init__(self, completekey, stdin, stdout) self._user_requested_quit = False self.aliases = {} self.cmdtrace = False self.flush = False # flush after each write self.logging = False self.logging_file = "pydb.txt" self.logging_fileobj = None # file object from open() self.logging_overwrite = False self.logging_redirect = False self.nohelp = 'Undefined command or invalid expression \"%s\".\nType \"help\" for a list of debugger commands.' self.prompt = '(Pydb) ' self.rcLines = [] return def get_cmds(self): '''Return a list of command names. These are the methods that start do_''' names = self.get_names() # A list of all methods names.sort() # There can be duplicates if routines overridden. Weed these out. prevname = ''; cmds = [] for name in names: if name[:3] == 'do_': if name == prevname: continue prevname = name cmds.append(name[3:]) pass pass return cmds def print_source_line(self, lineno, line): """Print out a source line of text , e.g. the second line in: (/tmp.py:2): 2 import sys,os (Pydb) We define this method specifically so it can be customized for such applications like ipython.""" # We don't use the filename normally. ipython and other applications # however might. self.msg_nocr('%d %s' % (lineno, line)) return def _runscript(self, filename): # When bdb sets tracing, a number of call and line events happens # BEFORE debugger even reaches user's code (and the exact sequence of # events depends on python version). So we take special measures to # avoid stopping before we reach the main script (see user_line and # user_call for details). self._wait_for_mainpyfile = True self.mainpyfile = self.canonic(filename) # Start with fresh empty copy of globals and locals and tell the script # that it's being run as __main__ to avoid scripts being able to access # the pydb.py namespace. globals_ = {"__name__" : "__main__", "__file__" : self.mainpyfile, "__builtins__" : __builtins__ } locals_ = globals_ statement = 'execfile( "%s")' % filename self.running = True self.run(statement) return def default(self, line): """Method called on an input line when the command prefix is not recognized. In particular we ignore # comments and execute Python commands which might optionally start with $""" if line[:1] == '#': return if line[:1] == '$': line = line[1:] if not self.autoeval: self.errmsg("""Undefined command: "%s". Try "help".""" % line) return if self.curframe: local_vars = self.curframe.f_locals global_vars = self.curframe.f_globals else: local_vars = None # FIXME: should probably have place where the # user can store variables inside the debug session. # The setup for this should be elsewhere. Possibly # in interaction. global_vars = None try: code = compile(line + '\n', '"%s"' % line, 'single') save_stdout = sys.stdout save_stdin = sys.stdin try: sys.stdin = self.stdin sys.stdout = self.stdout exec code in global_vars, local_vars finally: sys.stdout = save_stdout sys.stdin = save_stdin pass except: t, v = sys.exc_info()[:2] if type(t) == types.StringType: exc_type_name = t else: exc_type_name = t.__name__ self.errmsg('%s: %s' % (str(exc_type_name), str(v))) ### This comes from cmd.py with self.stdout.write replaced by self.msg. ### Also we extend to given help on an object name. The ### Docstring has been updated to reflect all of this. def do_help(self, arg): """help [command [subcommand]|expression] Without argument, print the list of available debugger commands. When an argument is given, it is first checked to see if it is command name. 'help exec' gives help on the ! command. With the argument is an expression or object name, you get the same help that you would get inside a Python shell running the built-in help() command. If the environment variable $PAGER is defined, the file is piped through that command. You'll notice this only for long help output. Some commands like 'info', 'set', and 'show' can accept an additional subcommand to give help just about that particular subcommand. For example 'help info line' give help about the 'info line' command. See also 'examine' an 'whatis'. """ # It does not make much sense to repeat the last help # command. Also, given that 'help' uses PAGER, the you may # enter an extra CR which would rerun the (long) help command. self.lastcmd='' if arg: first_arg = arg.split()[0] try: func = getattr(self, 'help_' + first_arg) func(arg.split()[1:]) except AttributeError: try: doc=getattr(self, 'do_' + first_arg).__doc__ self.msg("%s\n" % str(doc)) return except AttributeError: # If we have an object run site helper on that try: if not self.curframe: # ?? Should we have set up a dummy globals # to have persistence? value = eval(arg, None, None) else: value = eval(arg, self.curframe.f_globals, self.curframe.f_locals) from site import _Helper h=_Helper() h.__call__(value) except: self.msg("%s\n" % str(self.nohelp % (first_arg,))) return return else: names = self.get_names() cmds_doc = [] cmds_undoc = [] help_dict = {} for name in names: if name[:5] == 'help_': help_dict[name[5:]]=1 names.sort() # There can be duplicates if routines overridden prevname = '' for name in names: if name[:3] == 'do_': if name == prevname: continue prevname = name cmd=name[3:] if cmd in help_dict: cmds_doc.append(cmd) del help_dict[cmd] elif getattr(self, name).__doc__: cmds_doc.append(cmd) else: cmds_undoc.append(cmd) self.msg("%s\n" % str(self.doc_leader)) self.print_topics(self.doc_header, cmds_doc, 15, self.width) self.print_topics(self.misc_header, help_dict.keys(),15, self.width) self.print_topics(self.undoc_header, cmds_undoc, 15, self.width) do_h = do_help # Can be executed earlier than 'setup' if desired def execRcLines(self, verbose=False): """Some commands were batched in self.rcLines. Run as many of them as we can now. To be compatible with onecmd will return 1 if we are to continue execution and None if not -- continue debugger commmand loop reading. The remaining lines will still be in self.rcLines.""" if self.rcLines: # Make local copy because of recursion rcLines = self.rcLines # executed only once for line in rcLines: self.rcLines = self.rcLines[1:] line = line[:-1] if verbose: self.msg('+' + line) if len(line) > 0: # Some commands like step, continue, # return return 1 to indicate execution # should be continued. The return code # value is kind of sucky but at present # it's too much work to fix all of the # places needed. So live with it. if self.onecmd(line) == 1: return 1 def get_an_int(self, arg, errmsg=None, min_value=None, max_value=None): """Another get_int() routine, this one simpler and less stylized than get_int(). We eval arg return it as an integer value or None if there was an error in parsing this. """ ret_value = None if arg: try: # eval() is used so we will allow arithmetic expressions, # variables etc. ret_value = int(eval(arg)) except (SyntaxError, NameError, ValueError): if errmsg: self.errmsg(errmsg) else: self.errmsg('Expecting an integer, got: %s.' % str(arg)) return None if min_value and ret_value < min_value: self.errmsg('Expecting integer value to be at least %d, got: %d.' % (min_value, ret_value)) return None elif max_value and ret_value > max_value: self.errmsg('Expecting integer value to be at most %d, got: %d.' % (max_value, ret_value)) return None return ret_value def get_int(self, arg, default=1, cmdname=None): """If arg is an int, use that otherwise take default.""" if arg: try: # eval() is used so we will allow arithmetic expressions, # variables etc. default = int(eval(arg)) except (SyntaxError, NameError, ValueError): if cmdname: self.errmsg('%s command: Expecting an integer, got: %s.' % (cmdname, str(arg))) else: self.errmsg('Expecting an integer, got: %s.' % str(arg)) raise ValueError return default def get_onoff(self, arg, default=None, print_error=True): """Return True if arg is 'on' or 1 and False arg is 'off' or 0. Any other value is raises ValueError.""" if not arg: if default is None: if print_error: self.errmsg("Expecting 'on', 1, 'off', or 0. Got nothing.") raise ValueError return default if arg == '1' or arg == 'on': return True if arg == '0' or arg =='off': return False if print_error: self.errmsg("Expecting 'on', 1, 'off', or 0. Got: %s." % str(arg)) raise ValueError def get_pos_int(self, arg, min_value=0, default=1, cmdname=None): """If no argument use the default If arg is a positive int at least min_value, use that otherwise report an error.""" if arg: try: # eval() is used so we will allow arithmetic expressions, # variables etc. default = int(eval(arg)) if default < min_value: if cmdname: self.errmsg(('%s command: Expecting a positive ' + 'integer at least %d, got: %d.') % (cmdname, min_value, default)) else: self.errmsg(('Expecting a positive ' + 'integer at least %d, got: %d') % (min_value, default)) # Really should use something custom? raise ZeroDivisionError except (SyntaxError, NameError, ValueError): if cmdname: self.errmsg(('%s command: Expecting a positive integer, ' + "got: %s") % (cmdname, str(arg))) else: self.errmsg(('Expecting a positive integer, ' + "got: %s") % str(arg)) raise ValueError except ZeroDivisionError: # Turn this into a ValueError raise ValueError return default def getval(self, arg): try: return eval(arg, self.curframe.f_globals, self.curframe.f_locals) except: t, v = sys.exc_info()[:2] if isinstance(t, str): exc_type_name = t else: exc_type_name = t.__name__ self.errmsg(str("%s: %s" % (exc_type_name, arg))) raise def errmsg(self, msg, prefix="*** "): """Common routine for reporting debugger error messages. Derived classed may want to override this to capture output. """ self.msg_nocr("%s%s\n" %(prefix, msg)) def handle_command_def(self,line): """ Handles one command line during command list definition. """ cmd, arg, line = self.parseline(line) if cmd == 'silent': self.commands_silent[self.commands_bnum] = True return # continue to handle other cmd def in the cmd list elif cmd == 'end': self.cmdqueue = [] return 1 # end of cmd list cmdlist = self.commands[self.commands_bnum] if (arg): cmdlist.append(cmd+' '+arg) else: cmdlist.append(cmd) # Determine if we must stop try: func = getattr(self, 'do_' + cmd) except AttributeError: func = self.default if func.func_name in self.commands_resuming : # one of the resuming commands. self.commands_doprompt[self.commands_bnum] = False self.cmdqueue = [] return 1 return def msg(self, msg, out=None): """Common routine for reporting messages. Derived classed may want to override this to capture output. """ self.msg_nocr("%s\n" % msg, out) def msg_nocr(self, msg, out=None): """Common routine for reporting messages (no carriage return). Derived classed may want to override this to capture output. """ do_print = True if self.logging: if self.logging_fileobj is not None: print >> self.logging_fileobj, msg, if self.flush: self.logging_fileobj.flush() do_print = not self.logging_redirect if do_print: if out is None: out = self.stdout print >> out, msg, if self.flush: out.flush() def precmd(self, line): """Method executed just before the command line line is interpreted, but after the input prompt is generated and issued. Handle alias expansion and ';;' separator.""" if not line.strip(): return line args = line.split() while args[0] in self.aliases: line = self.aliases[args[0]] ii = 1 for tmpArg in args[1:]: line = line.replace("%" + str(ii), tmpArg) ii = ii + 1 line = line.replace("%*", ' '.join(args[1:])) args = line.split() # split into ';;' separated commands # unless it's an alias command if args[0] != 'alias': marker = line.find(';;') if marker >= 0: # queue up everything after marker next = line[marker+2:].lstrip() self.cmdqueue.append(next) line = line[:marker].rstrip() return line def print_location(self, print_line=False): """Show where we are. GUI's and front-end interfaces often use this to update displays. So it is helpful to make sure we give at least some place that's located in a file. """ i_stack = self.curindex # Evaluation routines like "exec" don't show useful location # info. In these cases, we will use the position before that in # the stack. Hence the looping below which in practices loops # once and sometimes twice. while i_stack >= 0: frame_lineno = self.stack[i_stack] i_stack -= 1 frame, lineno = frame_lineno # Next check to see that local variable breadcrumb exists and # has the magic dynamic value. # If so, it's us and we don't normally show this.a if 'breadcrumb' in frame.f_locals: if self.run == frame.f_locals['breadcrumb']: break filename = self.filename(self.canonic_filename(frame)) self.msg_nocr('(%s:%s):' % (filename, lineno)) fn_name = frame.f_code.co_name if fn_name and fn_name != '?': self.msg(" %s" % frame.f_code.co_name) else: self.msg("") if print_line: self.msg_nocr('+ ') pass if '__loader__' in self.curframe.f_globals: l = self.curframe.f_globals['__loader__'] print l pass if 2 == linecache.getline.func_code.co_argcount: line = linecache.getline(filename, lineno) else: line = linecache.getline(filename, lineno, self.curframe.f_globals) pass if line and len(line.strip()) != 0: self.print_source_line(lineno, line) pass if '' != filename: break pass return def onecmd(self, line): """Interpret the argument as though it had been typed in response to the prompt. Checks whether this line is typed in the normal prompt or in a breakpoint command list definition """ if not self.commands_defining: if self.cmdtrace: self.msg("+%s" % line) return cmd.Cmd.onecmd(self, line) else: return self.handle_command_def(line) def undefined_cmd(self, cmd, subcmd): """Error message when subcommand asked for but doesn't exist""" self.errmsg("Undefined %s command \"%s\"." % (cmd, subcmd)) #### From SoC project. Look over. def _disconnect(self): """ Disconnect a connection. """ if self.connection: self.connection.disconnect() self._rebind_output(self.orig_stdout) self._rebind_input(self.orig_stdin) self.connection = None if hasattr(self, 'local_prompt') and self.local_prompt is not None: self.prompt = self.local_prompt self.local_prompt = None self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) self.target = 'local' def _rebind_input(self, new_input): self.stdin = new_input def _rebind_output(self, new_output): self.stdout.flush() self.stdout = new_output if not hasattr(self.stdout, 'flush'): self.stdout.flush = lambda: None def remote_onecmd(self, line): """ All commands in 'line' are sent across this object's connection instance variable. """ if not line: # Execute the previous command line = self.lastcmd # This is the simplest way I could think of to do this without # breaking any of the inherited code from pydb/pdb. If we're a # remote client, always call 'rquit' (remote quit) when connected to # a pdbserver. This executes extra code to allow the client and server # to quit cleanly. if 'quit'.startswith(line): line = 'rquit' self.connection.write(line) # Reset the onecmd method self.onecmd = pydb.Pdb.onecmd self.do_rquit(None) return if 'detach'.startswith(line): self.connection.write('rdetach') self.do_detach(None) self.connection.write(line) ret = self.connection.readline() if ret == '': self.errmsg('Connection closed unexpectedly') self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) self.do_rquit(None) # The output from the command that we've just sent to the server # is returned along with the prompt of that server. So we keep reading # until we find our prompt. i = 1 while ret.find('(Pydb)') != -1: if i == 100: # We're probably _never_ going to get that data and that # connection is probably dead. self.errmsg('Connection died unexpectedly') self.onecmd = pydb.Pdb.onecmd self.do_rquit(None) else: ret += self.connection.readline() i += 1 # Some 'special' actions must be taken depending on the data returned if 'restart_now' in ret: self.connection.write('ACK:restart_now') self.errmsg('Pdbserver restarting..') # We've acknowledged a restart, which means that a new pdbserver # process is started, so we have to connect all over again. self._disconnect() import time time.sleep(3.0) if not self.do_target(self.target_addr): # We cannot trust these variables below to be in a # stable state. i.e. if the pdbserver doesn't come back up. self.onecmd = lambda x: pydb.Pdb.onecmd(self, x) return self.msg_nocr(ret) self.lastcmd = line return pass if __name__ == '__main__': class TestCmd(Cmd): def do_a(self): return def do_b(self): return def do_a(self): return pass testcmd = TestCmd() print testcmd.get_cmds() pass pydb-1.26/pydb/__init__.py0000644000175000017500000000053611167754544012412 00000000000000"""Python Debugger with a gdb-like command interface.""" # -*- coding: UTF-8 -*- app_name = 'Python Extended Debugger' version = '1.26' URL = 'http://bashdb.sourceforge.net/pydb/' HELP_URL = URL + 'pydb/index.html' import sys assert sys.version_info>= map(int, '2.4.0'.split('.')), \ _("Python %s or newer required") % '2.4.0' from pydb import * pydb-1.26/pydb/__init__.py.in0000644000175000017500000000057310561352312013000 00000000000000"""Python Debugger with a gdb-like command interface.""" # -*- coding: UTF-8 -*- app_name = 'Python Extended Debugger' version = '@PACKAGE_VERSION@' URL = 'http://bashdb.sourceforge.net/pydb/' HELP_URL = URL + 'pydb/index.html' import sys assert sys.version_info>= map(int, '@MIN_VERSION@'.split('.')), \ _("Python %s or newer required") % '@MIN_VERSION@' from pydb import * pydb-1.26/README0000644000175000017500000000465210376701131010207 00000000000000This is an expanded version of the Python debugger, pdb.py Largely we're trying to follow gdb's command set unless there's good reason. So new or modified command names generally refer to the function they have in gdb. Changes from pdb.py: - non-interactive POSIX-shell like line tracing. - Restart program saving settings (gdb's "run") or a pure "exec" restart (reloads the entire debugger) - Add "display" expressions - Some gdb "set"/"show" commands: args, listsize, version (no set here), and some new ones basename, cmdtrace, interactive, linetrace, - Some gdb "info" commands: args break, display, globals, line, locals, program, and source - Other gdb commands: cd, display, disassemble, frame, pwd, return (immediate return, not finish), run, shell, source, undisplay - debugger is installed in binary directory; i.e. one runs "pydb script..." rather than "python pdb script..." - debugger accepts debugger options; e.g. redirecting output or setting line tracing - Add Perl's "examine" to show info about a symbol. For functions, methods, classes and modules the documentation string if any is printed. For functions, we also show the argument list. More work is needed here to recurse fields of an arbitrary object and show that. - add gdb's "frame" command and stack order. Cleaner display of call stack; for example "exec" calls are marked as such. - gdb-like help with subcomamnd-specific help available on info, set, or show subcommands; e.g. "help info line" works - More extensive and complete documentation. See http://bashdb.sourceforge.net/pydb/pydb/lib/index.html - up/down can take a number of frames to move. - Stepping skips over "def" statements. - Comes with regression tests. Can also be subclassed to capture debugger output. - Works with GUI frontend ddd. (For now a testing version of ddd is required. See http://sourceforge.net/project/showfiles.php?group_id=61395&package_id=65341 version 3.3.12-test3 or greater. - Miscellaneous pdb bugs fixed. (See ChangeLog for details) Coexistence: For now, we try not to conflict with pdb.py. After all, Python developers made provision of multiple debuggers so we'll make use of that! So whereever there was a pdb, use pydb. The class name is still Pdb. So the debugger initialization script is .pydbrc for this debugger rather than .pdbrc for the one that comes with Python. $Id: README,v 1.6 2006/02/21 21:12:57 rockyb Exp $pydb-1.26/Makefile.in0000644000175000017500000007031211167754542011405 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #$Id: Makefile.am,v 1.56 2009/02/09 03:13:26 rockyb Exp $ # Copyright (C) 2006, 2007, 2008 Rocky Bernstein # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. VPATH = @srcdir@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : @MAINTAINER_MODE_TRUE@am__append_1 = Doc @MAINTAINER_MODE_TRUE@am__append_2 = \ @MAINTAINER_MODE_TRUE@ Doc/Makefile.deps \ @MAINTAINER_MODE_TRUE@ Doc/Makefile.in \ @MAINTAINER_MODE_TRUE@ Doc/lib/Makefile \ @MAINTAINER_MODE_TRUE@ Doc/lib/lib.tex \ @MAINTAINER_MODE_TRUE@ Doc/lib/libpydb.tex \ @MAINTAINER_MODE_TRUE@ Doc/paper-letter/lib.pdf \ @MAINTAINER_MODE_TRUE@ Doc/paper-letter/lib.ps \ @MAINTAINER_MODE_TRUE@ Doc/perl/SynopsisTable.pm \ @MAINTAINER_MODE_TRUE@ Doc/perl/l2hinit.perl \ @MAINTAINER_MODE_TRUE@ Doc/perl/manual.perl \ @MAINTAINER_MODE_TRUE@ Doc/perl/python.perl \ @MAINTAINER_MODE_TRUE@ Doc/texinputs/fncychap.sty \ @MAINTAINER_MODE_TRUE@ Doc/texinputs/manual.cls \ @MAINTAINER_MODE_TRUE@ Doc/texinputs/pypaper.sty \ @MAINTAINER_MODE_TRUE@ Doc/texinputs/python.ist \ @MAINTAINER_MODE_TRUE@ Doc/texinputs/underscore.sty \ @MAINTAINER_MODE_TRUE@ Doc/tools/getversioninfo \ @MAINTAINER_MODE_TRUE@ Doc/tools/indfix.py \ @MAINTAINER_MODE_TRUE@ Doc/tools/mkhowto \ @MAINTAINER_MODE_TRUE@ Doc/tools/node2label.pl \ @MAINTAINER_MODE_TRUE@ Doc/tools/patchlevel.h \ @MAINTAINER_MODE_TRUE@ Doc/tools/toc2bkm.py @MAINTAINER_MODE_TRUE@am__append_3 = ChangeLog subdir = . DIST_COMMON = README $(am__configure_deps) $(pkgpython_PYTHON) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/setup.py.in $(top_srcdir)/Doc/Makefile.in \ $(top_srcdir)/Doc/pydb.1.in $(top_srcdir)/configure \ $(top_srcdir)/pydb/__init__.py.in $(top_srcdir)/pydb/gdb.py.in \ $(top_srcdir)/pydb/pydb.py.in AUTHORS COPYING ChangeLog \ INSTALL NEWS THANKS TODO elisp-comp install-sh missing \ py-compile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = Doc/Makefile Doc/pydb.1 pydb/__init__.py \ pydb/gdb.py pydb/pydb.py setup.py am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgpythondir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)" binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS) SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; pkgpythonPYTHON_INSTALL = $(INSTALL_DATA) py_compile = $(top_srcdir)/py-compile man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man1_MANS) pkgdataDATA_INSTALL = $(INSTALL_DATA) DATA = $(pkgdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = test emacs Doc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print pkgdatadir = $(pkgpythondir) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CVS2CL = @CVS2CL@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EMACS = @EMACS@ EMACSLOADPATH = @EMACSLOADPATH@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MIN_VERSION = @MIN_VERSION@ MKDIR_P = @MKDIR_P@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ READLINE = @READLINE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ lispdir = @lispdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = dist-bzip2 @INSTALL_EMACS_LISP_FALSE@emacs = @INSTALL_EMACS_LISP_TRUE@emacs = emacs SUBDIRS = test $(emacs) $(am__append_1) # Basename of debugger, used to form help doc, python script and script # installed in an executable directory. DEBUGGER = pydb # The Python debugger script python_debugger_script = $(DEBUGGER).py pkgpython_PYTHON = \ $(DEBUGGER)/__init__.py \ $(DEBUGGER)/$(python_debugger_script) \ $(DEBUGGER)/bytecode.py \ $(DEBUGGER)/complete.py \ $(DEBUGGER)/connection.py \ $(DEBUGGER)/disassemble.py \ $(DEBUGGER)/display.py \ $(DEBUGGER)/fns.py \ $(DEBUGGER)/gdb.py \ $(DEBUGGER)/info.py \ $(DEBUGGER)/pydb.py \ $(DEBUGGER)/pydbbdb.py \ $(DEBUGGER)/pydbcmd.py \ $(DEBUGGER)/set.py \ $(DEBUGGER)/show.py \ $(DEBUGGER)/sighandler.py \ $(DEBUGGER)/subcmd.py \ $(DEBUGGER)/threaddbg.py \ $(DEBUGGER)/threadinfo.py pkgdata_DATA = $(DEBUGGER)/$(DEBUGGER).doc # Section 1 are general commands EXT = 1 man1_MANS = Doc/$(DEBUGGER).$(EXT) # We in fact do install python_PYTHON, just not in the executable directory. # Instead it's installed with other python programs. The noinst however # forces a changed pydb.py to get created whenever pydb.py.in changes. noinst_SCRIPTS = $(python_PYTHON) bin_SCRIPTS = $(DEBUGGER) PHONY = $(DEBUGGER) test $(am__append_3) EXTRA_DIST = ChangeLog TODO THANKS Doc/Makefile.deps Doc/info/Makefile \ pydb/pydb.doc pydb/Makefile setup.py setup.py.in \ site-packages-path.py $(am__append_2) MOSTLYCLEANFILES = $(man1_MANS) # cvs2cl MAINTAINERCLEANFILES = ChangeLog @MAINTAINER_MODE_TRUE@ACLOCAL_AMFLAGS = -I . all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) Doc/Makefile: $(top_builddir)/config.status $(top_srcdir)/Doc/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ Doc/pydb.1: $(top_builddir)/config.status $(top_srcdir)/Doc/pydb.1.in cd $(top_builddir) && $(SHELL) ./config.status $@ pydb/__init__.py: $(top_builddir)/config.status $(top_srcdir)/pydb/__init__.py.in cd $(top_builddir) && $(SHELL) ./config.status $@ pydb/gdb.py: $(top_builddir)/config.status $(top_srcdir)/pydb/gdb.py.in cd $(top_builddir) && $(SHELL) ./config.status $@ pydb/pydb.py: $(top_builddir)/config.status $(top_srcdir)/pydb/pydb.py.in cd $(top_builddir) && $(SHELL) ./config.status $@ setup.py: $(top_builddir)/config.status $(srcdir)/setup.py.in cd $(top_builddir) && $(SHELL) ./config.status $@ uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; for p in $$list; do \ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done install-pkgpythonPYTHON: $(pkgpython_PYTHON) @$(NORMAL_INSTALL) test -z "$(pkgpythondir)" || $(MKDIR_P) "$(DESTDIR)$(pkgpythondir)" @list='$(pkgpython_PYTHON)'; dlist=''; for p in $$list; do\ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ f=$(am__strip_dir) \ dlist="$$dlist $$f"; \ echo " $(pkgpythonPYTHON_INSTALL) '$$b$$p' '$(DESTDIR)$(pkgpythondir)/$$f'"; \ $(pkgpythonPYTHON_INSTALL) "$$b$$p" "$(DESTDIR)$(pkgpythondir)/$$f"; \ else :; fi; \ done; \ if test -n "$$dlist"; then \ if test -z "$(DESTDIR)"; then \ PYTHON=$(PYTHON) $(py_compile) --basedir "$(pkgpythondir)" $$dlist; \ else \ PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(pkgpythondir)" $$dlist; \ fi; \ else :; fi uninstall-pkgpythonPYTHON: @$(NORMAL_UNINSTALL) @list='$(pkgpython_PYTHON)'; dlist=''; for p in $$list; do\ f=$(am__strip_dir) \ rm -f "$(DESTDIR)$(pkgpythondir)/$$f"; \ rm -f "$(DESTDIR)$(pkgpythondir)/$${f}c"; \ rm -f "$(DESTDIR)$(pkgpythondir)/$${f}o"; \ done install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" @list='$(pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \ $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d $(distdir) || mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgpythondir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-man install-pkgdataDATA \ install-pkgpythonPYTHON install-dvi: install-dvi-recursive install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-info: install-info-recursive install-man: install-man1 install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-man uninstall-pkgdataDATA \ uninstall-pkgpythonPYTHON uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-pkgdataDATA install-pkgpythonPYTHON \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-binSCRIPTS uninstall-man uninstall-man1 \ uninstall-pkgdataDATA uninstall-pkgpythonPYTHON clean-generic: -rm $(top_builddir)/pydb/*.pyc # # For the executable, we make a symbolic link to the python program, # and make sure it is executable. Configuration should have put the # proper name to the python interpreter into the beginning. # install-binSCRIPTS: $(bin_SCRIPTS) install-data-am if ! test -d "$(DESTDIR)$(bindir)"; then \ test -z "$(DESTDIR)$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"; \ fi rm -f "$(DESTDIR)$(bindir)/$(bin_SCRIPTS)" || true; chmod +x "$(DESTDIR)$(pkgpythondir)/$(python_debugger_script)" $(LN_S) "$(DESTDIR)$(pkgpythondir)/$(python_debugger_script)" "$(DESTDIR)$(bindir)/$(bin_SCRIPTS)" test: check @MAINTAINER_MODE_TRUE@ChangeLog: @MAINTAINER_MODE_TRUE@ $(CVS2CL) -W 450 --header $(srcdir)/cvs2cl_header --utc -w -I ChangeLog --usermap $(srcdir)/cvs2cl_usermap -P .PHONY: $(PHONY) .OPTIONAL: $(DEBUGGER) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: