Commit 739c01d4 authored by Georg Brandl's avatar Georg Brandl

Delete the LaTeX doc tree.

parent 2d164909
Contributors to the Python Documentation
----------------------------------------
This file lists people who have contributed in some way to the Python
documentation. It is probably not complete -- if you feel that you or
anyone else should be on this list, please let us know (send email to
docs@python.org), and we'll be glad to correct the problem.
It is only with the input and contributions of the Python community
that Python has such wonderful documentation -- Thank You!
In the official sources, this file is encoded in ISO-8859-1 (Latin-1).
-Fred
Aahz
Michael Abbott
Steve Alexander
Jim Ahlstrom
Fred Allen
A. Amoroso
Pehr Anderson
Oliver Andrich
Jesús Cea Avión
Daniel Barclay
Chris Barker
Don Bashford
Anthony Baxter
Bennett Benson
Jonathan Black
Robin Boerdijk
Michal Bozon
Aaron Brancotti
Keith Briggs
Lee Busby
Lorenzo M. Catucci
Mauro Cicognini
Gilles Civario
Mike Clarkson
Steve Clift
Dave Cole
Matthew Cowles
Jeremy Craven
Andrew Dalke
Ben Darnell
L. Peter Deutsch
Robert Donohue
Fred L. Drake, Jr.
Jeff Epler
Michael Ernst
Blame Andy Eskilsson
Carey Evans
Martijn Faassen
Carl Feynman
Hernán Martínez Foffani
Stefan Franke
Jim Fulton
Peter Funk
Lele Gaifax
Matthew Gallagher
Ben Gertzfield
Nadim Ghaznavi
Jonathan Giddy
Shelley Gooch
Nathaniel Gray
Grant Griffin
Thomas Guettler
Anders Hammarquist
Mark Hammond
Harald Hanche-Olsen
Manus Hand
Gerhard Häring
Travis B. Hartwell
Janko Hauser
Bernhard Herzog
Magnus L. Hetland
Konrad Hinsen
Stefan Hoffmeister
Albert Hofkamp
Gregor Hoffleit
Steve Holden
Thomas Holenstein
Gerrit Holl
Rob Hooft
Brian Hooper
Randall Hopper
Michael Hudson
Eric Huss
Jeremy Hylton
Roger Irwin
Jack Jansen
Philip H. Jensen
Pedro Diaz Jimenez
Kent Johnson
Lucas de Jonge
Andreas Jung
Robert Kern
Jim Kerr
Jan Kim
Greg Kochanski
Guido Kollerie
Peter A. Koren
Daniel Kozan
Andrew M. Kuchling
Dave Kuhlman
Erno Kuusela
Detlef Lannert
Piers Lauder
Glyph Lefkowitz
Marc-André Lemburg
Ulf A. Lindgren
Everett Lipman
Mirko Liss
Martin von Löwis
Fredrik Lundh
Jeff MacDonald
John Machin
Andrew MacIntyre
Vladimir Marangozov
Vincent Marchetti
Laura Matson
Daniel May
Doug Mennella
Paolo Milani
Skip Montanaro
Paul Moore
Ross Moore
Sjoerd Mullender
Dale Nagata
Ng Pheng Siong
Koray Oner
Tomas Oppelstrup
Denis S. Otkidach
Zooko O'Whielacronx
William Park
Joonas Paalasmaa
Harri Pasanen
Bo Peng
Tim Peters
Christopher Petrilli
Justin D. Pettit
Chris Phoenix
François Pinard
Paul Prescod
Eric S. Raymond
Edward K. Ream
Sean Reifschneider
Bernhard Reiter
Armin Rigo
Wes Rishel
Jim Roskind
Guido van Rossum
Donald Wallace Rouse II
Nick Russo
Chris Ryland
Constantina S.
Hugh Sasse
Bob Savage
Scott Schram
Neil Schemenauer
Barry Scott
Joakim Sernbrant
Justin Sheehy
Michael Simcich
Ionel Simionescu
Gregory P. Smith
Roy Smith
Clay Spence
Nicholas Spies
Tage Stabell-Kulo
Frank Stajano
Anthony Starks
Greg Stein
Peter Stoehr
Mark Summerfield
Reuben Sumner
Kalle Svensson
Jim Tittsler
Ville Vainio
Martijn Vries
Charles G. Waldman
Greg Ward
Barry Warsaw
Corran Webster
Glyn Webster
Bob Weiner
Eddy Welbourne
Mats Wichmann
Gerry Wiener
Timothy Wild
Collin Winter
Blake Winton
Dan Wolfe
Steven Work
Thomas Wouters
Ka-Ping Yee
Rory Yorke
Moshe Zadka
Milan Zamazal
Cheng Zhang
This diff is collapsed.
# LaTeX source dependencies.
COMMONSTYLES= texinputs/python.sty \
texinputs/pypaper.sty
INDEXSTYLES=texinputs/python.ist
COMMONTEX=commontex/copyright.tex \
commontex/license.tex \
commontex/patchlevel.tex \
commontex/boilerplate.tex
MANSTYLES= texinputs/fncychap.sty \
texinputs/manual.cls \
$(COMMONSTYLES)
HOWTOSTYLES= texinputs/howto.cls \
$(COMMONSTYLES)
APIFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
api/api.tex \
api/abstract.tex \
api/concrete.tex \
api/exceptions.tex \
api/init.tex \
api/intro.tex \
api/memory.tex \
api/newtypes.tex \
api/refcounting.tex \
api/utilities.tex \
api/veryhigh.tex \
commontex/typestruct.h \
commontex/reportingbugs.tex
# 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) api/refcounts.dat \
paper-$(PAPER)/api.tex \
paper-$(PAPER)/abstract.tex \
paper-$(PAPER)/concrete.tex \
paper-$(PAPER)/exceptions.tex \
paper-$(PAPER)/init.tex \
paper-$(PAPER)/intro.tex \
paper-$(PAPER)/memory.tex \
paper-$(PAPER)/newtypes.tex \
paper-$(PAPER)/refcounting.tex \
paper-$(PAPER)/utilities.tex \
paper-$(PAPER)/veryhigh.tex \
commontex/reportingbugs.tex
DOCFILES= $(HOWTOSTYLES) \
commontex/boilerplate.tex \
texinputs/ltxmarkup.sty \
doc/doc.tex
EXTFILES= ext/ext.tex $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
ext/extending.tex \
ext/newtypes.tex \
ext/building.tex \
ext/windows.tex \
ext/embedding.tex \
ext/noddy.c \
ext/noddy2.c \
ext/noddy3.c \
ext/noddy4.c \
ext/run-func.c \
commontex/typestruct.h \
commontex/reportingbugs.tex
TUTFILES= tut/tut.tex tut/glossary.tex $(MANSTYLES) $(COMMONTEX)
# LaTeX source files for the Python Reference Manual
REFFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
ref/ref.tex \
ref/ref1.tex \
ref/ref2.tex \
ref/ref3.tex \
ref/ref4.tex \
ref/ref5.tex \
ref/ref6.tex \
ref/ref7.tex \
ref/ref8.tex
# LaTeX source files for the Python Library Reference
LIBFILES= $(MANSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
commontex/reportingbugs.tex \
lib/lib.tex \
lib/asttable.tex \
lib/distutils.tex \
lib/email.tex \
lib/emailencoders.tex \
lib/emailexc.tex \
lib/emailgenerator.tex \
lib/emailiter.tex \
lib/emailmessage.tex \
lib/emailparser.tex \
lib/emailutil.tex \
lib/libintro.tex \
lib/libobjs.tex \
lib/libstdtypes.tex \
lib/libexcs.tex \
lib/libconsts.tex \
lib/libfuncs.tex \
lib/libpython.tex \
lib/libsys.tex \
lib/libplatform.tex \
lib/libfpectl.tex \
lib/libgc.tex \
lib/libweakref.tex \
lib/libinspect.tex \
lib/libpydoc.tex \
lib/libdifflib.tex \
lib/libdoctest.tex \
lib/libunittest.tex \
lib/libtest.tex \
lib/libtypes.tex \
lib/libtraceback.tex \
lib/libpickle.tex \
lib/libshelve.tex \
lib/libcopy.tex \
lib/libmarshal.tex \
lib/libwarnings.tex \
lib/libimp.tex \
lib/libzipimport.tex \
lib/librunpy.tex \
lib/libpkgutil.tex \
lib/libparser.tex \
lib/libbltin.tex \
lib/libmain.tex \
lib/libfuture.tex \
lib/libstrings.tex \
lib/libstring.tex \
lib/libtextwrap.tex \
lib/libcodecs.tex \
lib/libunicodedata.tex \
lib/libstringprep.tex \
lib/libstruct.tex \
lib/libmisc.tex \
lib/libmath.tex \
lib/libdecimal.tex \
lib/libarray.tex \
lib/liballos.tex \
lib/libos.tex \
lib/libdatetime.tex \
lib/tzinfo-examples.py \
lib/libtime.tex \
lib/libgetopt.tex \
lib/liboptparse.tex \
lib/caseless.py \
lib/required_1.py \
lib/required_2.py \
lib/libtempfile.tex \
lib/liberrno.tex \
lib/libctypes.tex \
lib/libsomeos.tex \
lib/libsignal.tex \
lib/libsocket.tex \
lib/libselect.tex \
lib/libthread.tex \
lib/libdummythread.tex \
lib/libunix.tex \
lib/libposix.tex \
lib/libposixpath.tex \
lib/libpwd.tex \
lib/libspwd.tex \
lib/libgrp.tex \
lib/libcrypt.tex \
lib/libdbm.tex \
lib/libgdbm.tex \
lib/libtermios.tex \
lib/libfcntl.tex \
lib/libsyslog.tex \
lib/liblogging.tex \
lib/libpdb.tex \
lib/libprofile.tex \
lib/libhotshot.tex \
lib/libtimeit.tex \
lib/libtrace.tex \
lib/libcgi.tex \
lib/libcgitb.tex \
lib/liburllib.tex \
lib/liburllib2.tex \
lib/libhttplib.tex \
lib/libftplib.tex \
lib/libnntplib.tex \
lib/liburlparse.tex \
lib/libhtmlparser.tex \
lib/libhtmllib.tex \
lib/libsgmllib.tex \
lib/librfc822.tex \
lib/libmimetools.tex \
lib/libbinascii.tex \
lib/libmm.tex \
lib/libaudioop.tex \
lib/libaifc.tex \
lib/libossaudiodev.tex \
lib/libcrypto.tex \
lib/libhashlib.tex \
lib/libhmac.tex \
lib/libxdrlib.tex \
lib/libimghdr.tex \
lib/libformatter.tex \
lib/liboperator.tex \
lib/libresource.tex \
lib/libstat.tex \
lib/libstringio.tex \
lib/libtoken.tex \
lib/libkeyword.tex \
lib/libundoc.tex \
lib/libmailcap.tex \
lib/libglob.tex \
lib/libuser.tex \
lib/libanydbm.tex \
lib/libbsddb.tex \
lib/libdumbdbm.tex \
lib/libdbhash.tex \
lib/librandom.tex \
lib/libsite.tex \
lib/libwhichdb.tex \
lib/libbase64.tex \
lib/libfnmatch.tex \
lib/libquopri.tex \
lib/libzlib.tex \
lib/libsocksvr.tex \
lib/libmailbox.tex \
lib/libcommands.tex \
lib/libcmath.tex \
lib/libgzip.tex \
lib/libbz2.tex \
lib/libzipfile.tex \
lib/libpprint.tex \
lib/libcode.tex \
lib/libre.tex \
lib/libuserdict.tex \
lib/libdis.tex \
lib/libxmlrpclib.tex \
lib/libsimplexmlrpc.tex \
lib/libdocxmlrpc.tex \
lib/libpyexpat.tex \
lib/libfunctools.tex \
lib/xmldom.tex \
lib/xmldomminidom.tex \
lib/xmldompulldom.tex \
lib/xmlsax.tex \
lib/xmlsaxhandler.tex \
lib/xmlsaxutils.tex \
lib/xmlsaxreader.tex \
lib/libetree.tex \
lib/libqueue.tex \
lib/liblocale.tex \
lib/libgettext.tex \
lib/libbasehttp.tex \
lib/libcookie.tex \
lib/libcookielib.tex \
lib/libcopyreg.tex \
lib/libsymbol.tex \
lib/libbinhex.tex \
lib/libuu.tex \
lib/libfileinput.tex \
lib/libimaplib.tex \
lib/libpoplib.tex \
lib/libcalendar.tex \
lib/libbisect.tex \
lib/libcollections.tex \
lib/libheapq.tex \
lib/libmimetypes.tex \
lib/libsmtplib.tex \
lib/libsmtpd.tex \
lib/libcmd.tex \
lib/libmultifile.tex \
lib/libthreading.tex \
lib/libdummythreading.tex \
lib/libwebbrowser.tex \
lib/internet.tex \
lib/netdata.tex \
lib/markup.tex \
lib/language.tex \
lib/libpycompile.tex \
lib/libcompileall.tex \
lib/libshlex.tex \
lib/libnetrc.tex \
lib/librobotparser.tex \
lib/libgetpass.tex \
lib/libshutil.tex \
lib/librepr.tex \
lib/libmsilib.tex \
lib/libmsvcrt.tex \
lib/libwinreg.tex \
lib/libwinsound.tex \
lib/windows.tex \
lib/libpyclbr.tex \
lib/libtokenize.tex \
lib/libtabnanny.tex \
lib/libmhlib.tex \
lib/libtelnetlib.tex \
lib/libcolorsys.tex \
lib/libfpformat.tex \
lib/libcgihttp.tex \
lib/libsimplehttp.tex \
lib/liblinecache.tex \
lib/libnew.tex \
lib/libdircache.tex \
lib/libfilecmp.tex \
lib/libsunau.tex \
lib/libwave.tex \
lib/libchunk.tex \
lib/libcodeop.tex \
lib/libcurses.tex \
lib/libcursespanel.tex \
lib/libascii.tex \
lib/libdl.tex \
lib/libmutex.tex \
lib/libnis.tex \
lib/libpipes.tex \
lib/libpty.tex \
lib/libreadline.tex \
lib/librlcompleter.tex \
lib/libsched.tex \
lib/libstatvfs.tex \
lib/libtty.tex \
lib/libasyncore.tex \
lib/libasynchat.tex \
lib/libatexit.tex \
lib/libmmap.tex \
lib/tkinter.tex \
lib/libturtle.tex \
lib/libtarfile.tex \
lib/libcsv.tex \
lib/libcfgparser.tex \
lib/libsqlite3.tex
# LaTeX source files for Macintosh Library Modules.
MACFILES= $(HOWTOSTYLES) $(INDEXSTYLES) $(COMMONTEX) \
mac/mac.tex \
mac/using.tex \
mac/scripting.tex \
mac/toolbox.tex \
mac/undoc.tex \
mac/libcolorpicker.tex \
mac/libmac.tex \
mac/libgensuitemodule.tex \
mac/libaetools.tex \
mac/libaepack.tex \
mac/libaetypes.tex \
mac/libmacos.tex \
mac/libmacostools.tex \
mac/libmacui.tex \
mac/libmacic.tex \
mac/libframework.tex \
mac/libautogil.tex \
mac/libminiae.tex \
mac/libscrap.tex
INSTFILES = $(HOWTOSTYLES) inst/inst.tex
DISTFILES = $(HOWTOSTYLES) \
dist/dist.tex \
dist/sysconfig.tex
Python standard documentation -- in LaTeX
-----------------------------------------
This directory contains the LaTeX sources to the Python documentation
and tools required to support the formatting process. The documents
now require LaTeX2e; LaTeX 2.09 compatibility has been dropped.
If you don't have LaTeX, or if you'd rather not format the
documentation yourself, you can ftp a tar file containing HTML, PDF,
or PostScript versions of all documents. Additional formats may be
available. These should be in the same place where you fetched the
main Python distribution (try <http://www.python.org/> or
<ftp://ftp.python.org/pub/python/>).
The following are the LaTeX source files:
api/*.tex Python/C API Reference Manual
doc/*.tex Documenting Python
ext/*.tex Extending and Embedding the Python Interpreter
lib/*.tex Python Library Reference
mac/*.tex Macintosh Library Modules
ref/*.tex Python Reference Manual
tut/*.tex Python Tutorial
inst/*.tex Installing Python Modules
dist/*.tex Distributing Python Modules
Most use the "manual" document class and "python" package, derived from
the old "myformat.sty" style file. The Macintosh Library Modules
document uses the "howto" document class instead. These contains many
macro definitions useful in documenting Python, and set some style
parameters.
There's a Makefile to call LaTeX and the other utilities in the right
order and the right number of times. By default, it will build the
HTML version of the documentation, but DVI, PDF, and PostScript can
also be made. To view the generated HTML, point your favorite browser
at the top-level index (html/index.html) after running "make".
The Makefile can also produce DVI files for each document made; to
preview them, use xdvi. PostScript is produced by the same Makefile
target that produces the DVI files. This uses the dvips tool.
Printing depends on local conventions; at our site, we use lpr. For
example:
make paper-letter/lib.ps # create lib.dvi and lib.ps
xdvi paper-letter/lib.dvi # preview lib.dvi
lpr paper-letter/lib.ps # print on default printer
What if I find a bug?
---------------------
First, check that the bug is present in the development version of the
documentation at <http://www.python.org/dev/doc/devel/>; we may
have already fixed it.
If we haven't, tell us about it. We'd like the documentation to be
complete and accurate, but have limited time. If you discover any
inconsistencies between the documentation and implementation, or just
have suggestions as to how to improve the documentation, let is know!
Specific bugs and patches should be reported using our bug & patch
databases at:
http://sourceforge.net/projects/python
Other suggestions or questions should be sent to the Python
Documentation Team:
docs@python.org
Thanks!
What tools do I need?
---------------------
You need to install Python; some of the scripts used to produce the
documentation are written in Python. You don't need this
documentation to install Python; instructions are included in the
README file in the Python distribution.
The simplest way to get the rest of the tools in the configuration we
used is to install the teTeX TeX distribution, versions 0.9 or newer.
More information is available on teTeX at <http://www.tug.org/tetex/>.
This is a Unix-only TeX distribution at this time. This documentation
release was tested with the 1.0.7 release, but there have been no
substantial changes since late in the 0.9 series, which we used
extensively for previous versions without any difficulty.
If you don't want to get teTeX, here is what you'll need:
To create DVI, PDF, or PostScript files:
- LaTeX2e, 1995/12/01 or newer. Older versions are likely to
choke.
- makeindex. This is used to produce the indexes for the
library reference and Python/C API reference.
To create PDF files:
- pdflatex. We used the one in the teTeX distribution (pdfTeX
version 3.14159-13d (Web2C 7.3.1) at the time of this
writing). Versions even a couple of patchlevels earlier are
highly likely to fail due to syntax changes for some of the
pdftex primitives.
To create PostScript files:
- dvips. Most TeX installations include this. If you don't
have one, check CTAN (<ftp://ctan.tug.org/tex-archive/>).
To create info files:
Note that info support is currently being revised using new
conversion tools by Michael Ernst <mernst@cs.washington.edu>.
- makeinfo. This is available from any GNU mirror.
- emacs or xemacs. Emacs is available from the same place as
makeinfo, and xemacs is available from ftp.xemacs.org.
- Perl. Find the software at
<http://language.perl.com/info/software.html>.
- HTML::Element. If you don't have this installed, you can get
this from CPAN. Use the command:
perl -e 'use CPAN; CPAN::install("HTML::Element");'
You may need to be root to do this.
To create HTML files:
- Perl 5.6.0 or newer. Find the software at
<http://language.perl.com/info/software.html>.
- LaTeX2HTML 99.2b8 or newer. Older versions are not
supported; each version changes enough that supporting
multiple versions is not likely to work. Many older
versions don't work with Perl 5.6 as well. This also screws
up code fragments. ;-( Releases are available at:
<http://www.latex2html.org/>.
I got a make error: "make: don't know how to make commontex/patchlevel.tex."
----------------------------------------------------------------------------
Your version of make doesn't support the 'shell' function. You will need to
use a version which does, e.g. GNU make.
LaTeX (or pdfLaTeX) ran out of memory; how can I fix it?
--------------------------------------------------------
This is known to be a problem at least on Mac OS X, but it has been
observed on other systems in the past.
On some systems, the default sizes of some of the memory pools
allocated by TeX needs to be changed; this is a configuration setting
for installations based on web2c (most if not all installations).
This is usually set in a file named texmf/web2c/texmf.cnf (where the
top-level texmf/ directory is part of the TeX installation). If you
get a "buffer overflow" warning from LaTeX, open that configuration
file and look for the "main_memory.pdflatex" setting. If there is not
one, you can add a line with the setting. The value 1500000 seems to
be sufficient for formatting the Python documetantion.
What if Times fonts are not available?
--------------------------------------
As distributed, the LaTeX documents use PostScript Times fonts. This
is done since they are much better looking and produce smaller
PostScript files. If, however, your TeX installation does not support
them, they may be easily disabled. Edit the file
texinputs/pypaper.sty and comment out the line that starts
"\RequirePackage{times}" by inserting a "%" character at the beginning
of the line. If you're formatting the docs for A4 paper instead of
US-Letter paper, change paper-a4/pypaper.sty instead. An alternative
is to install the right fonts and LaTeX style file.
What if I want to use A4 paper?
-------------------------------
Instead of building the PostScript by giving the command "make ps",
give the command "make PAPER=a4 ps"; the output will be produced in
the paper-a4/ subdirectory. (You can use "make PAPER=a4 pdf" if you'd
rather have PDF output.)
Making HTML files
-----------------
The LaTeX documents can be converted to HTML using Nikos Drakos'
LaTeX2HTML converter. See the Makefile; after some twiddling, "make"
should do the trick.
What else is in here?
---------------------
There is a new LaTeX document class called "howto". This is used for
the new series of Python HOWTO documents which is being coordinated by
Andrew Kuchling <akuchlin@mems-exchange.org>. The file
templates/howto.tex is a commented example which may be used as a
template. A Python script to "do the right thing" to format a howto
document is included as tools/mkhowto. These documents can be
formatted as HTML, PDF, PostScript, or ASCII files. Use "mkhowto
--help" for information on using the formatting tool.
For authors of module documentation, there is a file
templates/module.tex which may be used as a template for a module
section. This may be used in conjunction with either the howto or
manual document class. Create the documentation for a new module by
copying the template to lib<mymodule>.tex and editing according to the
instructions in the comments.
Documentation on the authoring Python documentation, including
information about both style and markup, is available in the
"Documenting Python" manual.
Copyright notice
================
The Python source is copyrighted, but you can freely use and copy it
as long as you don't change or remove the copyright notice:
----------------------------------------------------------------------
Copyright (c) 2000-2007 Python Software Foundation.
All rights reserved.
Copyright (c) 2000 BeOpen.com.
All rights reserved.
Copyright (c) 1995-2000 Corporation for National Research Initiatives.
All rights reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum.
All rights reserved.
See the file "commontex/license.tex" for information on usage and
redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
----------------------------------------------------------------------
PYTHON DOCUMENTATION TO-DO LIST -*- indented-text -*-
===============================
General
-------
* Figure out HTMLHelp generation for the Windows world.
Python/C API
------------
* The "Very High Level Interface" in the API document has been
requested; I guess it wouldn't hurt to fill in a bit there. Request
by Albert Hofkamp <a.hofkamp@wtb.tue.nl>. (Partly done.)
* Describe implementing types in C, including use of the 'self'
parameter to the method implementation function. (Missing material
mentioned in the Extending & Embedding manual, section 1.1; problem
reported by Clay Spence <cspence@sarnoff.com>.) Heavily impacts one
chapter of the Python/C API manual.
* Missing PyArg_ParseTuple(), PyArg_ParseTupleAndKeywords(),
Py_BuildValue(). Information requested by Greg Kochanski
<gpk@bell-labs.com>. PyEval_EvalCode() has also been requested.
Extending & Embedding
---------------------
* More information is needed about building dynamically linked
extensions in C++. Specifically, the extensions must be linked
against the C++ libraries (and possibly runtime). Also noted by
Albert Hofkamp <a.hofkamp@wtb.tue.nl>.
Reference Manual
----------------
* Document the Extended Call Syntax in the language reference.
[Jeremy Hylton]
* Document new comparison support for recursive objects (lang. ref.?
library ref.? (cmp() function). [Jeremy Hylton]
Library Reference
-----------------
* Update the pickle documentation to describe all of the current
behavior; only a subset is described. __reduce__, etc. Partial
update submitted by Jim Kerr <jbkerr@sr.hp.com>.
* Update the httplib documentation to match Greg Stein's HTTP/1.1
support and new classes. (Greg, this is yours!)
Tutorial
--------
* Update tutorial to use string methods and talk about backward
compatibility of same.
NOT WORTH THE TROUBLE
---------------------
* In the indexes, some subitem entries are separated from the item
entries by column- or page-breaks. Reported by Lorenzo M. Catucci
<lorenzo@argon.roma2.infn.it>. This one will be hard; probably not
really worth the pain. (Only an issue at all when a header-letter
and the first index entry get separated -- can change as soon as we
change the index entries in the text.) Also only a problem in the
print version.
* Fix problem with howto documents getting the last module synopsis
twice (in \localmoduletable) so we can get rid of the ugly 'uniq'
hack in tools/mkhowto. (Probably not worth the trouble of fixing.)
This diff is collapsed.
\documentclass{manual}
\title{Python/C API Reference Manual}
\input{boilerplate}
\makeindex % tell \index to actually write the .idx file
\begin{document}
\maketitle
\ifhtml
\chapter*{Front Matter\label{front}}
\fi
\input{copyright}
\begin{abstract}
\noindent
This manual documents the API used by C and \Cpp{} programmers who
want to write extension modules or embed Python. It is a companion to
\citetitle[../ext/ext.html]{Extending and Embedding the Python
Interpreter}, which describes the general principles of extension
writing but does not document the API functions in detail.
\warning{The current version of this document is incomplete. I hope
that it is nevertheless useful. I will continue to work on it, and
release new versions from time to time, independent from Python source
code releases.}
\end{abstract}
\tableofcontents
\input{intro}
\input{veryhigh}
\input{refcounting}
\input{exceptions}
\input{utilities}
\input{abstract}
\input{concrete}
\input{init}
\input{memory}
\input{newtypes}
\appendix
\chapter{Reporting Bugs}
\input{reportingbugs}
\chapter{History and License}
\input{license}
\input{api.ind} % Index -- must be last
\end{document}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
\chapter{Memory Management \label{memory}}
\sectionauthor{Vladimir Marangozov}{Vladimir.Marangozov@inrialpes.fr}
\section{Overview \label{memoryOverview}}
Memory management in Python involves a private heap containing all
Python objects and data structures. The management of this private
heap is ensured internally by the \emph{Python memory manager}. The
Python memory manager has different components which deal with various
dynamic storage management aspects, like sharing, segmentation,
preallocation or caching.
At the lowest level, a raw memory allocator ensures that there is
enough room in the private heap for storing all Python-related data
by interacting with the memory manager of the operating system. On top
of the raw memory allocator, several object-specific allocators
operate on the same heap and implement distinct memory management
policies adapted to the peculiarities of every object type. For
example, integer objects are managed differently within the heap than
strings, tuples or dictionaries because integers imply different
storage requirements and speed/space tradeoffs. The Python memory
manager thus delegates some of the work to the object-specific
allocators, but ensures that the latter operate within the bounds of
the private heap.
It is important to understand that the management of the Python heap
is performed by the interpreter itself and that the user has no
control over it, even if she regularly manipulates object pointers to
memory blocks inside that heap. The allocation of heap space for
Python objects and other internal buffers is performed on demand by
the Python memory manager through the Python/C API functions listed in
this document.
To avoid memory corruption, extension writers should never try to
operate on Python objects with the functions exported by the C
library: \cfunction{malloc()}\ttindex{malloc()},
\cfunction{calloc()}\ttindex{calloc()},
\cfunction{realloc()}\ttindex{realloc()} and
\cfunction{free()}\ttindex{free()}. This will result in
mixed calls between the C allocator and the Python memory manager
with fatal consequences, because they implement different algorithms
and operate on different heaps. However, one may safely allocate and
release memory blocks with the C library allocator for individual
purposes, as shown in the following example:
\begin{verbatim}
PyObject *res;
char *buf = (char *) malloc(BUFSIZ); /* for I/O */
if (buf == NULL)
return PyErr_NoMemory();
...Do some I/O operation involving buf...
res = PyString_FromString(buf);
free(buf); /* malloc'ed */
return res;
\end{verbatim}
In this example, the memory request for the I/O buffer is handled by
the C library allocator. The Python memory manager is involved only
in the allocation of the string object returned as a result.
In most situations, however, it is recommended to allocate memory from
the Python heap specifically because the latter is under control of
the Python memory manager. For example, this is required when the
interpreter is extended with new object types written in C. Another
reason for using the Python heap is the desire to \emph{inform} the
Python memory manager about the memory needs of the extension module.
Even when the requested memory is used exclusively for internal,
highly-specific purposes, delegating all memory requests to the Python
memory manager causes the interpreter to have a more accurate image of
its memory footprint as a whole. Consequently, under certain
circumstances, the Python memory manager may or may not trigger
appropriate actions, like garbage collection, memory compaction or
other preventive procedures. Note that by using the C library
allocator as shown in the previous example, the allocated memory for
the I/O buffer escapes completely the Python memory manager.
\section{Memory Interface \label{memoryInterface}}
The following function sets, modeled after the ANSI C standard,
but specifying behavior when requesting zero bytes,
are available for allocating and releasing memory from the Python heap:
\begin{cfuncdesc}{void*}{PyMem_Malloc}{size_t n}
Allocates \var{n} bytes and returns a pointer of type \ctype{void*}
to the allocated memory, or \NULL{} if the request fails.
Requesting zero bytes returns a distinct non-\NULL{} pointer if
possible, as if \cfunction{PyMem_Malloc(1)} had been called instead.
The memory will not have been initialized in any way.
\end{cfuncdesc}
\begin{cfuncdesc}{void*}{PyMem_Realloc}{void *p, size_t n}
Resizes the memory block pointed to by \var{p} to \var{n} bytes.
The contents will be unchanged to the minimum of the old and the new
sizes. If \var{p} is \NULL, the call is equivalent to
\cfunction{PyMem_Malloc(\var{n})}; else if \var{n} is equal to zero, the
memory block is resized but is not freed, and the returned pointer
is non-\NULL. Unless \var{p} is \NULL, it must have been
returned by a previous call to \cfunction{PyMem_Malloc()} or
\cfunction{PyMem_Realloc()}. If the request fails,
\cfunction{PyMem_Realloc()} returns \NULL{} and \var{p} remains a
valid pointer to the previous memory area.
\end{cfuncdesc}
\begin{cfuncdesc}{void}{PyMem_Free}{void *p}
Frees the memory block pointed to by \var{p}, which must have been
returned by a previous call to \cfunction{PyMem_Malloc()} or
\cfunction{PyMem_Realloc()}. Otherwise, or if
\cfunction{PyMem_Free(p)} has been called before, undefined
behavior occurs. If \var{p} is \NULL, no operation is performed.
\end{cfuncdesc}
The following type-oriented macros are provided for convenience. Note
that \var{TYPE} refers to any C type.
\begin{cfuncdesc}{\var{TYPE}*}{PyMem_New}{TYPE, size_t n}
Same as \cfunction{PyMem_Malloc()}, but allocates \code{(\var{n} *
sizeof(\var{TYPE}))} bytes of memory. Returns a pointer cast to
\ctype{\var{TYPE}*}. The memory will not have been initialized in
any way.
\end{cfuncdesc}
\begin{cfuncdesc}{\var{TYPE}*}{PyMem_Resize}{void *p, TYPE, size_t n}
Same as \cfunction{PyMem_Realloc()}, but the memory block is resized
to \code{(\var{n} * sizeof(\var{TYPE}))} bytes. Returns a pointer
cast to \ctype{\var{TYPE}*}. On return, \var{p} will be a pointer to
the new memory area, or \NULL{} in the event of failure.
\end{cfuncdesc}
\begin{cfuncdesc}{void}{PyMem_Del}{void *p}
Same as \cfunction{PyMem_Free()}.
\end{cfuncdesc}
In addition, the following macro sets are provided for calling the
Python memory allocator directly, without involving the C API functions
listed above. However, note that their use does not preserve binary
compatibility across Python versions and is therefore deprecated in
extension modules.
\cfunction{PyMem_MALLOC()}, \cfunction{PyMem_REALLOC()}, \cfunction{PyMem_FREE()}.
\cfunction{PyMem_NEW()}, \cfunction{PyMem_RESIZE()}, \cfunction{PyMem_DEL()}.
\section{Examples \label{memoryExamples}}
Here is the example from section \ref{memoryOverview}, rewritten so
that the I/O buffer is allocated from the Python heap by using the
first function set:
\begin{verbatim}
PyObject *res;
char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */
if (buf == NULL)
return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyString_FromString(buf);
PyMem_Free(buf); /* allocated with PyMem_Malloc */
return res;
\end{verbatim}
The same code using the type-oriented function set:
\begin{verbatim}
PyObject *res;
char *buf = PyMem_New(char, BUFSIZ); /* for I/O */
if (buf == NULL)
return PyErr_NoMemory();
/* ...Do some I/O operation involving buf... */
res = PyString_FromString(buf);
PyMem_Del(buf); /* allocated with PyMem_New */
return res;
\end{verbatim}
Note that in the two examples above, the buffer is always
manipulated via functions belonging to the same set. Indeed, it
is required to use the same memory API family for a given
memory block, so that the risk of mixing different allocators is
reduced to a minimum. The following code sequence contains two errors,
one of which is labeled as \emph{fatal} because it mixes two different
allocators operating on different heaps.
\begin{verbatim}
char *buf1 = PyMem_New(char, BUFSIZ);
char *buf2 = (char *) malloc(BUFSIZ);
char *buf3 = (char *) PyMem_Malloc(BUFSIZ);
...
PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */
free(buf2); /* Right -- allocated via malloc() */
free(buf1); /* Fatal -- should be PyMem_Del() */
\end{verbatim}
In addition to the functions aimed at handling raw memory blocks from
the Python heap, objects in Python are allocated and released with
\cfunction{PyObject_New()}, \cfunction{PyObject_NewVar()} and
\cfunction{PyObject_Del()}.
These will be explained in the next chapter on defining and
implementing new object types in C.
This diff is collapsed.
\chapter{Reference Counting \label{countingRefs}}
The macros in this section are used for managing reference counts
of Python objects.
\begin{cfuncdesc}{void}{Py_INCREF}{PyObject *o}
Increment the reference count for object \var{o}. The object must
not be \NULL; if you aren't sure that it isn't \NULL, use
\cfunction{Py_XINCREF()}.
\end{cfuncdesc}
\begin{cfuncdesc}{void}{Py_XINCREF}{PyObject *o}
Increment the reference count for object \var{o}. The object may be
\NULL, in which case the macro has no effect.
\end{cfuncdesc}
\begin{cfuncdesc}{void}{Py_DECREF}{PyObject *o}
Decrement the reference count for object \var{o}. The object must
not be \NULL; if you aren't sure that it isn't \NULL, use
\cfunction{Py_XDECREF()}. If the reference count reaches zero, the
object's type's deallocation function (which must not be \NULL) is
invoked.
\warning{The deallocation function can cause arbitrary Python code
to be invoked (e.g. when a class instance with a \method{__del__()}
method is deallocated). While exceptions in such code are not
propagated, the executed code has free access to all Python global
variables. This means that any object that is reachable from a
global variable should be in a consistent state before
\cfunction{Py_DECREF()} is invoked. For example, code to delete an
object from a list should copy a reference to the deleted object in
a temporary variable, update the list data structure, and then call
\cfunction{Py_DECREF()} for the temporary variable.}
\end{cfuncdesc}
\begin{cfuncdesc}{void}{Py_XDECREF}{PyObject *o}
Decrement the reference count for object \var{o}. The object may be
\NULL, in which case the macro has no effect; otherwise the effect
is the same as for \cfunction{Py_DECREF()}, and the same warning
applies.
\end{cfuncdesc}
\begin{cfuncdesc}{void}{Py_CLEAR}{PyObject *o}
Decrement the reference count for object \var{o}. The object may be
\NULL, in which case the macro has no effect; otherwise the effect
is the same as for \cfunction{Py_DECREF()}, except that the argument
is also set to \NULL. The warning for \cfunction{Py_DECREF()} does
not apply with respect to the object passed because the macro
carefully uses a temporary variable and sets the argument to \NULL
before decrementing its reference count.
It is a good idea to use this macro whenever decrementing the value
of a variable that might be traversed during garbage collection.
\versionadded{2.4}
\end{cfuncdesc}
The following functions are for runtime dynamic embedding of Python:
\cfunction{Py_IncRef(PyObject *o)}, \cfunction{Py_DecRef(PyObject *o)}.
They are simply exported function versions of \cfunction{Py_XINCREF()} and
\cfunction{Py_XDECREF()}, respectively.
The following functions or macros are only for use within the
interpreter core: \cfunction{_Py_Dealloc()},
\cfunction{_Py_ForgetReference()}, \cfunction{_Py_NewReference()}, as
well as the global variable \cdata{_Py_RefTotal}.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
\author{Guido van Rossum\\
Fred L. Drake, Jr., editor}
\authoraddress{
\strong{Python Software Foundation}\\
Email: \email{docs@python.org}
}
\date{\today} % XXX update before final release!
\input{patchlevel} % include Python version information
Copyright \copyright{} 2001-2007 Python Software Foundation.
All rights reserved.
Copyright \copyright{} 2000 BeOpen.com.
All rights reserved.
Copyright \copyright{} 1995-2000 Corporation for National Research Initiatives.
All rights reserved.
Copyright \copyright{} 1991-1995 Stichting Mathematisch Centrum.
All rights reserved.
See the end of this document for complete license and permissions
information.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
from distutils.core import setup, Extension
setup(name="noddy", version="1.0",
ext_modules=[
Extension("noddy", ["noddy.c"]),
Extension("noddy2", ["noddy2.c"]),
Extension("noddy3", ["noddy3.c"]),
Extension("noddy4", ["noddy4.c"]),
])
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Short-term tasks:
Quick revision pass to make HOWTOs match the current state of Python
doanddont regex sockets
Medium-term tasks:
Revisit the regex howto.
* Add exercises with answers for each section
* More examples?
Long-term tasks:
Integrate with other Python docs?
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<p> This document was generated using the <a
href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/">
<strong>LaTeX</strong>2<tt>HTML</tt></a> translator.
</p>
<p> <a
href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/">
<strong>LaTeX</strong>2<tt>HTML</tt></a> is Copyright &copy;
1993, 1994, 1995, 1996, 1997, <a
href="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos
Drakos</a>, Computer Based Learning Unit, University of
Leeds, and Copyright &copy; 1997, 1998, <a
href="http://www.maths.mq.edu.au/;SPMtilde;ross/">Ross
Moore</a>, Mathematics Department, Macquarie University,
Sydney.
</p>
<p> The application of <a
href="http://saftsack.fs.uni-bayreuth.de/;SPMtilde;latex2ht/">
<strong>LaTeX</strong>2<tt>HTML</tt></a> to the Python
documentation has been heavily tailored by Fred L. Drake,
Jr. Original navigation icons were contributed by Christopher
Petrilli.
</p>
This diff is collapsed.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment