ia64/xen-unstable

changeset 6807:8ca0f98ba8e2

merge?
author cl349@firebug.cl.cam.ac.uk
date Tue Sep 13 15:33:37 2005 +0000 (2005-09-13)
parents 4ad19fe76d50 4d899a738d59
children 72e4e2aab342
files .hgignore Makefile buildconfigs/mk.linux-2.6-xen buildconfigs/mk.linux-2.6-xen0 buildconfigs/mk.linux-2.6-xenU docs/Doxyfile docs/Doxyfilter docs/Makefile docs/pythfilter.py extras/mini-os/include/hypervisor.h linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c linux-2.6-xen-sparse/drivers/xen/blktap/xenbus.c linux-2.6-xen-sparse/drivers/xen/console/console.c linux-2.6-xen-sparse/drivers/xen/evtchn/evtchn.c linux-2.6-xen-sparse/drivers/xen/netback/loopback.c linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c linux-2.6-xen-sparse/drivers/xen/usbback/usbback.c linux-2.6-xen-sparse/drivers/xen/usbfront/usbfront.c linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypercall.h linux-2.6-xen-sparse/include/asm-xen/asm-i386/system.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/system.h linux-2.6-xen-sparse/include/asm-xen/evtchn.h linux-2.6-xen-sparse/mkbuildtree tools/console/daemon/io.c tools/console/daemon/main.c tools/console/daemon/utils.c tools/examples/Makefile tools/examples/block-enbd tools/examples/block-file tools/examples/xen-backend.agent tools/examples/xmexample.vmx.in tools/ioemu/hw/pcnet.c tools/ioemu/target-i386-dm/Makefile tools/libxc/xc_linux_restore.c tools/libxc/xc_private.c tools/libxc/xc_vmx_build.c tools/python/Makefile tools/python/pylintrc tools/python/xen/lowlevel/xs/xs.c tools/python/xen/sv/DomInfo.py tools/python/xen/xend/XendCheckpoint.py tools/python/xen/xend/XendDomain.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xend/XendVnet.py tools/python/xen/xend/image.py tools/python/xen/xend/scheduler.py tools/python/xen/xend/server/controller.py tools/python/xen/xend/xenstore/xstransact.py tools/python/xen/xm/create.py tools/xenstore/Makefile tools/xenstore/fake_libxc.c tools/xenstore/testsuite/07watch.test tools/xenstore/testsuite/14complexperms.test tools/xenstore/xenstore_client.c tools/xenstore/xenstored_core.c tools/xenstore/xenstored_domain.c tools/xenstore/xenstored_domain.h tools/xenstore/xenstored_watch.c tools/xenstore/xs.c tools/xenstore/xs_lib.c tools/xenstore/xs_test.c xen/Makefile xen/arch/x86/domain.c xen/arch/x86/shadow.c xen/arch/x86/shadow32.c xen/arch/x86/shadow_public.c xen/arch/x86/traps.c xen/arch/x86/vmx.c xen/arch/x86/vmx_intercept.c xen/arch/x86/vmx_io.c xen/arch/x86/vmx_platform.c xen/arch/x86/vmx_vmcs.c xen/arch/x86/x86_32/entry.S xen/arch/x86/x86_64/entry.S xen/arch/x86/x86_64/traps.c xen/common/memory.c xen/include/asm-x86/shadow_64.h xen/include/asm-x86/shadow_ops.h xen/include/asm-x86/vmx.h xen/include/asm-x86/vmx_platform.h xen/include/asm-x86/vmx_virpit.h
line diff
     1.1 --- a/.hgignore	Tue Sep 13 15:32:38 2005 +0000
     1.2 +++ b/.hgignore	Tue Sep 13 15:33:37 2005 +0000
     1.3 @@ -19,6 +19,7 @@
     1.4  ^docs/.*\.toc$
     1.5  ^docs/figs/xenserver\.eps$
     1.6  ^docs/html/.*$
     1.7 +^docs/api/.*$
     1.8  ^docs/interface/WARNINGS$
     1.9  ^docs/interface/images\.pl$
    1.10  ^docs/interface/images\.tex$
    1.11 @@ -60,8 +61,6 @@
    1.12  ^pristine-.*$
    1.13  ^ref-.*$
    1.14  ^tools/.*/build/lib.*/.*\.py$
    1.15 -^tools/Makefile\.smh$
    1.16 -^tools/balloon/balloon$
    1.17  ^tools/blktap/Makefile\.smh$
    1.18  ^tools/blktap/blkcow$
    1.19  ^tools/blktap/blkcowgnbd$
    1.20 @@ -85,8 +84,7 @@
    1.21  ^tools/blktap/ublkback/ublkback$
    1.22  ^tools/blktap/xen/.*$
    1.23  ^tools/check/\..*$
    1.24 -^tools/cmdline/.*$
    1.25 -^tools/cmdline/xen/.*$
    1.26 +^tools/examples/xmexample\.vmx$
    1.27  ^tools/console/xenconsoled$
    1.28  ^tools/console/xenconsole$
    1.29  ^tools/debugger/pdb/pdb$
    1.30 @@ -109,8 +107,6 @@
    1.31  ^tools/firmware/vmxassist/roms\.h$
    1.32  ^tools/firmware/vmxassist/vmxassist$
    1.33  ^tools/firmware/vmxassist/vmxloader$
    1.34 -^tools/gdb/gdb-6\.2\.1-linux-i386-xen/.*$
    1.35 -^tools/gdb/gdb-6\.2\.1/.*$
    1.36  ^tools/ioemu/config-host\..*$
    1.37  ^tools/ioemu/keysym_adapter_sdl\.h$
    1.38  ^tools/ioemu/keysym_adapter_vnc\.h$
    1.39 @@ -141,12 +137,9 @@
    1.40  ^tools/vnet/vnet-module/\..*\.cmd$
    1.41  ^tools/vnet/vnet-module/\.tmp_versions/.*$
    1.42  ^tools/vnet/vnet-module/vnet_module\.mod\..*$
    1.43 -^tools/vnetd/vnetd$
    1.44  ^tools/vtpm/vtpm*
    1.45  ^tools/vtpm/tpm_emulator-*
    1.46  ^tools/vtpm_manager/manager/vtpm_managerd
    1.47 -^tools/web-shutdown\.tap$
    1.48 -^tools/x2d2/minixend$
    1.49  ^tools/xcutils/xc_restore$
    1.50  ^tools/xcutils/xc_save$
    1.51  ^tools/xenstat/xentop/xentop$
     2.1 --- a/Makefile	Tue Sep 13 15:32:38 2005 +0000
     2.2 +++ b/Makefile	Tue Sep 13 15:33:37 2005 +0000
     2.3 @@ -35,8 +35,8 @@ ifeq ($(XEN_TARGET_X86_PAE),y)
     2.4  export pae=y
     2.5  endif
     2.6  
     2.7 -.PHONY:	all dist install xen kernels tools docs world clean mkpatches mrproper
     2.8 -.PHONY:	kbuild kdelete kclean
     2.9 +.PHONY:	all dist install xen kernels tools dev-docs docs world clean
    2.10 +.PHONY:	mkpatches mrproper kbuild kdelete kclean
    2.11  
    2.12  # build and install everything into the standard system directories
    2.13  install: install-xen install-kernels install-tools install-docs
    2.14 @@ -66,6 +66,9 @@ kernels:
    2.15  docs:
    2.16  	sh ./docs/check_pkgs && $(MAKE) -C docs install || true
    2.17  
    2.18 +dev-docs:
    2.19 +	$(MAKE) -C docs dev-docs
    2.20 +
    2.21  # Build all the various kernels and modules
    2.22  kbuild: kernels
    2.23  
    2.24 @@ -123,7 +126,7 @@ help:
    2.25  	@echo '  install-xen      - build and install the Xen hypervisor'
    2.26  	@echo '  install-tools    - build and install the control tools'
    2.27  	@echo '  install-kernels  - build and install guest kernels'
    2.28 -	@echo '  install-docs     - build and install documentation'
    2.29 +	@echo '  install-docs     - build and install user documentation'
    2.30  	@echo ''
    2.31  	@echo 'Building targets:'
    2.32  	@echo '  dist             - build and install everything into local dist directory'
    2.33 @@ -133,7 +136,8 @@ help:
    2.34  	@echo '  tools            - build and install tools'
    2.35  	@echo '  kernels          - build and install guest kernels'
    2.36  	@echo '  kbuild           - synonym for make kernels'
    2.37 -	@echo '  docs             - build and install docs'
    2.38 +	@echo '  docs             - build and install user documentation'
    2.39 +	@echo '  dev-docs         - build developer-only documentation'
    2.40  	@echo ''
    2.41  	@echo 'Cleaning targets:'
    2.42  	@echo '  clean            - clean the Xen, tools and docs (but not'
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/docs/Doxyfile	Tue Sep 13 15:33:37 2005 +0000
     3.3 @@ -0,0 +1,1218 @@
     3.4 +# Doxyfile 1.4.2
     3.5 +
     3.6 +# This file describes the settings to be used by the documentation system
     3.7 +# doxygen (www.doxygen.org) for a project
     3.8 +#
     3.9 +# All text after a hash (#) is considered a comment and will be ignored
    3.10 +# The format is:
    3.11 +#       TAG = value [value, ...]
    3.12 +# For lists items can also be appended using:
    3.13 +#       TAG += value [value, ...]
    3.14 +# Values that contain spaces should be placed between quotes (" ")
    3.15 +
    3.16 +#---------------------------------------------------------------------------
    3.17 +# Project related configuration options
    3.18 +#---------------------------------------------------------------------------
    3.19 +
    3.20 +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
    3.21 +# by quotes) that should identify the project.
    3.22 +
    3.23 +PROJECT_NAME           = Xen Python Tools
    3.24 +
    3.25 +# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
    3.26 +# This could be handy for archiving the generated documentation or 
    3.27 +# if some version control system is used.
    3.28 +
    3.29 +PROJECT_NUMBER         = 
    3.30 +
    3.31 +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
    3.32 +# base path where the generated documentation will be put. 
    3.33 +# If a relative path is entered, it will be relative to the location 
    3.34 +# where doxygen was started. If left blank the current directory will be used.
    3.35 +
    3.36 +OUTPUT_DIRECTORY       = api/tools/python
    3.37 +
    3.38 +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
    3.39 +# 4096 sub-directories (in 2 levels) under the output directory of each output 
    3.40 +# format and will distribute the generated files over these directories. 
    3.41 +# Enabling this option can be useful when feeding doxygen a huge amount of 
    3.42 +# source files, where putting all generated files in the same directory would 
    3.43 +# otherwise cause performance problems for the file system.
    3.44 +
    3.45 +CREATE_SUBDIRS         = NO
    3.46 +
    3.47 +# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
    3.48 +# documentation generated by doxygen is written. Doxygen will use this 
    3.49 +# information to generate all constant output in the proper language. 
    3.50 +# The default language is English, other supported languages are: 
    3.51 +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
    3.52 +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
    3.53 +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
    3.54 +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
    3.55 +# Swedish, and Ukrainian.
    3.56 +
    3.57 +OUTPUT_LANGUAGE        = English
    3.58 +
    3.59 +# This tag can be used to specify the encoding used in the generated output. 
    3.60 +# The encoding is not always determined by the language that is chosen, 
    3.61 +# but also whether or not the output is meant for Windows or non-Windows users. 
    3.62 +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
    3.63 +# forces the Windows encoding (this is the default for the Windows binary), 
    3.64 +# whereas setting the tag to NO uses a Unix-style encoding (the default for 
    3.65 +# all platforms other than Windows).
    3.66 +
    3.67 +USE_WINDOWS_ENCODING   = NO
    3.68 +
    3.69 +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
    3.70 +# include brief member descriptions after the members that are listed in 
    3.71 +# the file and class documentation (similar to JavaDoc). 
    3.72 +# Set to NO to disable this.
    3.73 +
    3.74 +BRIEF_MEMBER_DESC      = YES
    3.75 +
    3.76 +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
    3.77 +# the brief description of a member or function before the detailed description. 
    3.78 +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
    3.79 +# brief descriptions will be completely suppressed.
    3.80 +
    3.81 +REPEAT_BRIEF           = YES
    3.82 +
    3.83 +# This tag implements a quasi-intelligent brief description abbreviator 
    3.84 +# that is used to form the text in various listings. Each string 
    3.85 +# in this list, if found as the leading text of the brief description, will be 
    3.86 +# stripped from the text and the result after processing the whole list, is 
    3.87 +# used as the annotated text. Otherwise, the brief description is used as-is. 
    3.88 +# If left blank, the following values are used ("$name" is automatically 
    3.89 +# replaced with the name of the entity): "The $name class" "The $name widget" 
    3.90 +# "The $name file" "is" "provides" "specifies" "contains" 
    3.91 +# "represents" "a" "an" "the"
    3.92 +
    3.93 +ABBREVIATE_BRIEF       = 
    3.94 +
    3.95 +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
    3.96 +# Doxygen will generate a detailed section even if there is only a brief 
    3.97 +# description.
    3.98 +
    3.99 +ALWAYS_DETAILED_SEC    = NO
   3.100 +
   3.101 +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
   3.102 +# inherited members of a class in the documentation of that class as if those 
   3.103 +# members were ordinary class members. Constructors, destructors and assignment 
   3.104 +# operators of the base classes will not be shown.
   3.105 +
   3.106 +INLINE_INHERITED_MEMB  = NO
   3.107 +
   3.108 +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
   3.109 +# path before files name in the file list and in the header files. If set 
   3.110 +# to NO the shortest path that makes the file name unique will be used.
   3.111 +
   3.112 +FULL_PATH_NAMES        = YES
   3.113 +
   3.114 +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
   3.115 +# can be used to strip a user-defined part of the path. Stripping is 
   3.116 +# only done if one of the specified strings matches the left-hand part of 
   3.117 +# the path. The tag can be used to show relative paths in the file list. 
   3.118 +# If left blank the directory from which doxygen is run is used as the 
   3.119 +# path to strip.
   3.120 +
   3.121 +STRIP_FROM_PATH        = 
   3.122 +
   3.123 +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
   3.124 +# the path mentioned in the documentation of a class, which tells 
   3.125 +# the reader which header file to include in order to use a class. 
   3.126 +# If left blank only the name of the header file containing the class 
   3.127 +# definition is used. Otherwise one should specify the include paths that 
   3.128 +# are normally passed to the compiler using the -I flag.
   3.129 +
   3.130 +STRIP_FROM_INC_PATH    = 
   3.131 +
   3.132 +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
   3.133 +# (but less readable) file names. This can be useful is your file systems 
   3.134 +# doesn't support long names like on DOS, Mac, or CD-ROM.
   3.135 +
   3.136 +SHORT_NAMES            = NO
   3.137 +
   3.138 +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
   3.139 +# will interpret the first line (until the first dot) of a JavaDoc-style 
   3.140 +# comment as the brief description. If set to NO, the JavaDoc 
   3.141 +# comments will behave just like the Qt-style comments (thus requiring an 
   3.142 +# explicit @brief command for a brief description.
   3.143 +
   3.144 +JAVADOC_AUTOBRIEF      = YES
   3.145 +
   3.146 +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
   3.147 +# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
   3.148 +# comments) as a brief description. This used to be the default behaviour. 
   3.149 +# The new default is to treat a multi-line C++ comment block as a detailed 
   3.150 +# description. Set this tag to YES if you prefer the old behaviour instead.
   3.151 +
   3.152 +MULTILINE_CPP_IS_BRIEF = NO
   3.153 +
   3.154 +# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
   3.155 +# will output the detailed description near the top, like JavaDoc.
   3.156 +# If set to NO, the detailed description appears after the member 
   3.157 +# documentation.
   3.158 +
   3.159 +DETAILS_AT_TOP         = YES
   3.160 +
   3.161 +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
   3.162 +# member inherits the documentation from any documented member that it 
   3.163 +# re-implements.
   3.164 +
   3.165 +INHERIT_DOCS           = YES
   3.166 +
   3.167 +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
   3.168 +# tag is set to YES, then doxygen will reuse the documentation of the first 
   3.169 +# member in the group (if any) for the other members of the group. By default 
   3.170 +# all members of a group must be documented explicitly.
   3.171 +
   3.172 +DISTRIBUTE_GROUP_DOC   = NO
   3.173 +
   3.174 +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
   3.175 +# a new page for each member. If set to NO, the documentation of a member will 
   3.176 +# be part of the file/class/namespace that contains it.
   3.177 +
   3.178 +SEPARATE_MEMBER_PAGES  = NO
   3.179 +
   3.180 +# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
   3.181 +# Doxygen uses this value to replace tabs by spaces in code fragments.
   3.182 +
   3.183 +TAB_SIZE               = 8
   3.184 +
   3.185 +# This tag can be used to specify a number of aliases that acts 
   3.186 +# as commands in the documentation. An alias has the form "name=value". 
   3.187 +# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
   3.188 +# put the command \sideeffect (or @sideeffect) in the documentation, which 
   3.189 +# will result in a user-defined paragraph with heading "Side Effects:". 
   3.190 +# You can put \n's in the value part of an alias to insert newlines.
   3.191 +
   3.192 +ALIASES                = 
   3.193 +
   3.194 +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
   3.195 +# sources only. Doxygen will then generate output that is more tailored for C. 
   3.196 +# For instance, some of the names that are used will be different. The list 
   3.197 +# of all members will be omitted, etc.
   3.198 +
   3.199 +OPTIMIZE_OUTPUT_FOR_C  = NO
   3.200 +
   3.201 +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
   3.202 +# only. Doxygen will then generate output that is more tailored for Java. 
   3.203 +# For instance, namespaces will be presented as packages, qualified scopes 
   3.204 +# will look different, etc.
   3.205 +
   3.206 +OPTIMIZE_OUTPUT_JAVA   = YES
   3.207 +
   3.208 +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
   3.209 +# the same type (for instance a group of public functions) to be put as a 
   3.210 +# subgroup of that type (e.g. under the Public Functions section). Set it to 
   3.211 +# NO to prevent subgrouping. Alternatively, this can be done per class using 
   3.212 +# the \nosubgrouping command.
   3.213 +
   3.214 +SUBGROUPING            = YES
   3.215 +
   3.216 +#---------------------------------------------------------------------------
   3.217 +# Build related configuration options
   3.218 +#---------------------------------------------------------------------------
   3.219 +
   3.220 +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
   3.221 +# documentation are documented, even if no documentation was available. 
   3.222 +# Private class members and static file members will be hidden unless 
   3.223 +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
   3.224 +
   3.225 +EXTRACT_ALL            = YES
   3.226 +
   3.227 +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
   3.228 +# will be included in the documentation.
   3.229 +
   3.230 +EXTRACT_PRIVATE        = YES
   3.231 +
   3.232 +# If the EXTRACT_STATIC tag is set to YES all static members of a file 
   3.233 +# will be included in the documentation.
   3.234 +
   3.235 +EXTRACT_STATIC         = YES
   3.236 +
   3.237 +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
   3.238 +# defined locally in source files will be included in the documentation. 
   3.239 +# If set to NO only classes defined in header files are included.
   3.240 +
   3.241 +EXTRACT_LOCAL_CLASSES  = YES
   3.242 +
   3.243 +# This flag is only useful for Objective-C code. When set to YES local 
   3.244 +# methods, which are defined in the implementation section but not in 
   3.245 +# the interface are included in the documentation. 
   3.246 +# If set to NO (the default) only methods in the interface are included.
   3.247 +
   3.248 +EXTRACT_LOCAL_METHODS  = NO
   3.249 +
   3.250 +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
   3.251 +# undocumented members of documented classes, files or namespaces. 
   3.252 +# If set to NO (the default) these members will be included in the 
   3.253 +# various overviews, but no documentation section is generated. 
   3.254 +# This option has no effect if EXTRACT_ALL is enabled.
   3.255 +
   3.256 +HIDE_UNDOC_MEMBERS     = NO
   3.257 +
   3.258 +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
   3.259 +# undocumented classes that are normally visible in the class hierarchy. 
   3.260 +# If set to NO (the default) these classes will be included in the various 
   3.261 +# overviews. This option has no effect if EXTRACT_ALL is enabled.
   3.262 +
   3.263 +HIDE_UNDOC_CLASSES     = NO
   3.264 +
   3.265 +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
   3.266 +# friend (class|struct|union) declarations. 
   3.267 +# If set to NO (the default) these declarations will be included in the 
   3.268 +# documentation.
   3.269 +
   3.270 +HIDE_FRIEND_COMPOUNDS  = NO
   3.271 +
   3.272 +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
   3.273 +# documentation blocks found inside the body of a function. 
   3.274 +# If set to NO (the default) these blocks will be appended to the 
   3.275 +# function's detailed documentation block.
   3.276 +
   3.277 +HIDE_IN_BODY_DOCS      = NO
   3.278 +
   3.279 +# The INTERNAL_DOCS tag determines if documentation 
   3.280 +# that is typed after a \internal command is included. If the tag is set 
   3.281 +# to NO (the default) then the documentation will be excluded. 
   3.282 +# Set it to YES to include the internal documentation.
   3.283 +
   3.284 +INTERNAL_DOCS          = NO
   3.285 +
   3.286 +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
   3.287 +# file names in lower-case letters. If set to YES upper-case letters are also 
   3.288 +# allowed. This is useful if you have classes or files whose names only differ 
   3.289 +# in case and if your file system supports case sensitive file names. Windows 
   3.290 +# and Mac users are advised to set this option to NO.
   3.291 +
   3.292 +CASE_SENSE_NAMES       = YES
   3.293 +
   3.294 +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
   3.295 +# will show members with their full class and namespace scopes in the 
   3.296 +# documentation. If set to YES the scope will be hidden.
   3.297 +
   3.298 +HIDE_SCOPE_NAMES       = NO
   3.299 +
   3.300 +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
   3.301 +# will put a list of the files that are included by a file in the documentation 
   3.302 +# of that file.
   3.303 +
   3.304 +SHOW_INCLUDE_FILES     = YES
   3.305 +
   3.306 +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
   3.307 +# is inserted in the documentation for inline members.
   3.308 +
   3.309 +INLINE_INFO            = YES
   3.310 +
   3.311 +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
   3.312 +# will sort the (detailed) documentation of file and class members 
   3.313 +# alphabetically by member name. If set to NO the members will appear in 
   3.314 +# declaration order.
   3.315 +
   3.316 +SORT_MEMBER_DOCS       = YES
   3.317 +
   3.318 +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
   3.319 +# brief documentation of file, namespace and class members alphabetically 
   3.320 +# by member name. If set to NO (the default) the members will appear in 
   3.321 +# declaration order.
   3.322 +
   3.323 +SORT_BRIEF_DOCS        = NO
   3.324 +
   3.325 +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
   3.326 +# sorted by fully-qualified names, including namespaces. If set to 
   3.327 +# NO (the default), the class list will be sorted only by class name, 
   3.328 +# not including the namespace part. 
   3.329 +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
   3.330 +# Note: This option applies only to the class list, not to the 
   3.331 +# alphabetical list.
   3.332 +
   3.333 +SORT_BY_SCOPE_NAME     = NO
   3.334 +
   3.335 +# The GENERATE_TODOLIST tag can be used to enable (YES) or 
   3.336 +# disable (NO) the todo list. This list is created by putting \todo 
   3.337 +# commands in the documentation.
   3.338 +
   3.339 +GENERATE_TODOLIST      = YES
   3.340 +
   3.341 +# The GENERATE_TESTLIST tag can be used to enable (YES) or 
   3.342 +# disable (NO) the test list. This list is created by putting \test 
   3.343 +# commands in the documentation.
   3.344 +
   3.345 +GENERATE_TESTLIST      = YES
   3.346 +
   3.347 +# The GENERATE_BUGLIST tag can be used to enable (YES) or 
   3.348 +# disable (NO) the bug list. This list is created by putting \bug 
   3.349 +# commands in the documentation.
   3.350 +
   3.351 +GENERATE_BUGLIST       = YES
   3.352 +
   3.353 +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
   3.354 +# disable (NO) the deprecated list. This list is created by putting 
   3.355 +# \deprecated commands in the documentation.
   3.356 +
   3.357 +GENERATE_DEPRECATEDLIST= YES
   3.358 +
   3.359 +# The ENABLED_SECTIONS tag can be used to enable conditional 
   3.360 +# documentation sections, marked by \if sectionname ... \endif.
   3.361 +
   3.362 +ENABLED_SECTIONS       = 
   3.363 +
   3.364 +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
   3.365 +# the initial value of a variable or define consists of for it to appear in 
   3.366 +# the documentation. If the initializer consists of more lines than specified 
   3.367 +# here it will be hidden. Use a value of 0 to hide initializers completely. 
   3.368 +# The appearance of the initializer of individual variables and defines in the 
   3.369 +# documentation can be controlled using \showinitializer or \hideinitializer 
   3.370 +# command in the documentation regardless of this setting.
   3.371 +
   3.372 +MAX_INITIALIZER_LINES  = 30
   3.373 +
   3.374 +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
   3.375 +# at the bottom of the documentation of classes and structs. If set to YES the 
   3.376 +# list will mention the files that were used to generate the documentation.
   3.377 +
   3.378 +SHOW_USED_FILES        = YES
   3.379 +
   3.380 +# If the sources in your project are distributed over multiple directories 
   3.381 +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
   3.382 +# in the documentation.
   3.383 +
   3.384 +SHOW_DIRECTORIES       = YES
   3.385 +
   3.386 +# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
   3.387 +# doxygen should invoke to get the current version for each file (typically from the 
   3.388 +# version control system). Doxygen will invoke the program by executing (via 
   3.389 +# popen()) the command <command> <input-file>, where <command> is the value of 
   3.390 +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
   3.391 +# provided by doxygen. Whatever the progam writes to standard output 
   3.392 +# is used as the file version. See the manual for examples.
   3.393 +
   3.394 +FILE_VERSION_FILTER    = 
   3.395 +
   3.396 +#---------------------------------------------------------------------------
   3.397 +# configuration options related to warning and progress messages
   3.398 +#---------------------------------------------------------------------------
   3.399 +
   3.400 +# The QUIET tag can be used to turn on/off the messages that are generated 
   3.401 +# by doxygen. Possible values are YES and NO. If left blank NO is used.
   3.402 +
   3.403 +QUIET                  = YES
   3.404 +
   3.405 +# The WARNINGS tag can be used to turn on/off the warning messages that are 
   3.406 +# generated by doxygen. Possible values are YES and NO. If left blank 
   3.407 +# NO is used.
   3.408 +
   3.409 +WARNINGS               = YES
   3.410 +
   3.411 +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
   3.412 +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
   3.413 +# automatically be disabled.
   3.414 +
   3.415 +WARN_IF_UNDOCUMENTED   = YES
   3.416 +
   3.417 +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
   3.418 +# potential errors in the documentation, such as not documenting some 
   3.419 +# parameters in a documented function, or documenting parameters that 
   3.420 +# don't exist or using markup commands wrongly.
   3.421 +
   3.422 +WARN_IF_DOC_ERROR      = YES
   3.423 +
   3.424 +# This WARN_NO_PARAMDOC option can be abled to get warnings for 
   3.425 +# functions that are documented, but have no documentation for their parameters 
   3.426 +# or return value. If set to NO (the default) doxygen will only warn about 
   3.427 +# wrong or incomplete parameter documentation, but not about the absence of 
   3.428 +# documentation.
   3.429 +
   3.430 +WARN_NO_PARAMDOC       = NO
   3.431 +
   3.432 +# The WARN_FORMAT tag determines the format of the warning messages that 
   3.433 +# doxygen can produce. The string should contain the $file, $line, and $text 
   3.434 +# tags, which will be replaced by the file and line number from which the 
   3.435 +# warning originated and the warning text. Optionally the format may contain 
   3.436 +# $version, which will be replaced by the version of the file (if it could 
   3.437 +# be obtained via FILE_VERSION_FILTER)
   3.438 +
   3.439 +WARN_FORMAT            = "$file:$line: $text"
   3.440 +
   3.441 +# The WARN_LOGFILE tag can be used to specify a file to which warning 
   3.442 +# and error messages should be written. If left blank the output is written 
   3.443 +# to stderr.
   3.444 +
   3.445 +WARN_LOGFILE           = 
   3.446 +
   3.447 +#---------------------------------------------------------------------------
   3.448 +# configuration options related to the input files
   3.449 +#---------------------------------------------------------------------------
   3.450 +
   3.451 +# The INPUT tag can be used to specify the files and/or directories that contain 
   3.452 +# documented source files. You may enter file names like "myfile.cpp" or 
   3.453 +# directories like "/usr/src/myproject". Separate the files or directories 
   3.454 +# with spaces.
   3.455 +
   3.456 +INPUT                  = ../tools/python/xen/
   3.457 +
   3.458 +# If the value of the INPUT tag contains directories, you can use the 
   3.459 +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
   3.460 +# and *.h) to filter out the source-files in the directories. If left 
   3.461 +# blank the following patterns are tested: 
   3.462 +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
   3.463 +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
   3.464 +
   3.465 +FILE_PATTERNS          = *.py *.c
   3.466 +
   3.467 +# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
   3.468 +# should be searched for input files as well. Possible values are YES and NO. 
   3.469 +# If left blank NO is used.
   3.470 +
   3.471 +RECURSIVE              = YES
   3.472 +
   3.473 +# The EXCLUDE tag can be used to specify files and/or directories that should 
   3.474 +# excluded from the INPUT source files. This way you can easily exclude a 
   3.475 +# subdirectory from a directory tree whose root is specified with the INPUT tag.
   3.476 +
   3.477 +EXCLUDE                = 
   3.478 +
   3.479 +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
   3.480 +# directories that are symbolic links (a Unix filesystem feature) are excluded 
   3.481 +# from the input.
   3.482 +
   3.483 +EXCLUDE_SYMLINKS       = NO
   3.484 +
   3.485 +# If the value of the INPUT tag contains directories, you can use the 
   3.486 +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
   3.487 +# certain files from those directories.
   3.488 +
   3.489 +EXCLUDE_PATTERNS       = 
   3.490 +
   3.491 +# The EXAMPLE_PATH tag can be used to specify one or more files or 
   3.492 +# directories that contain example code fragments that are included (see 
   3.493 +# the \include command).
   3.494 +
   3.495 +EXAMPLE_PATH           = 
   3.496 +
   3.497 +# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
   3.498 +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
   3.499 +# and *.h) to filter out the source-files in the directories. If left 
   3.500 +# blank all files are included.
   3.501 +
   3.502 +EXAMPLE_PATTERNS       = 
   3.503 +
   3.504 +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
   3.505 +# searched for input files to be used with the \include or \dontinclude 
   3.506 +# commands irrespective of the value of the RECURSIVE tag. 
   3.507 +# Possible values are YES and NO. If left blank NO is used.
   3.508 +
   3.509 +EXAMPLE_RECURSIVE      = NO
   3.510 +
   3.511 +# The IMAGE_PATH tag can be used to specify one or more files or 
   3.512 +# directories that contain image that are included in the documentation (see 
   3.513 +# the \image command).
   3.514 +
   3.515 +IMAGE_PATH             = 
   3.516 +
   3.517 +# The INPUT_FILTER tag can be used to specify a program that doxygen should 
   3.518 +# invoke to filter for each input file. Doxygen will invoke the filter program 
   3.519 +# by executing (via popen()) the command <filter> <input-file>, where <filter> 
   3.520 +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
   3.521 +# input file. Doxygen will then use the output that the filter program writes 
   3.522 +# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
   3.523 +# ignored.
   3.524 +
   3.525 +INPUT_FILTER           = "sh ./Doxyfilter ../tools/python"
   3.526 +
   3.527 +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
   3.528 +# basis.  Doxygen will compare the file name with each pattern and apply the 
   3.529 +# filter if there is a match.  The filters are a list of the form: 
   3.530 +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
   3.531 +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
   3.532 +# is applied to all files.
   3.533 +
   3.534 +FILTER_PATTERNS        = 
   3.535 +
   3.536 +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
   3.537 +# INPUT_FILTER) will be used to filter the input files when producing source 
   3.538 +# files to browse (i.e. when SOURCE_BROWSER is set to YES).
   3.539 +
   3.540 +FILTER_SOURCE_FILES    = YES
   3.541 +
   3.542 +#---------------------------------------------------------------------------
   3.543 +# configuration options related to source browsing
   3.544 +#---------------------------------------------------------------------------
   3.545 +
   3.546 +# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
   3.547 +# be generated. Documented entities will be cross-referenced with these sources. 
   3.548 +# Note: To get rid of all source code in the generated output, make sure also 
   3.549 +# VERBATIM_HEADERS is set to NO.
   3.550 +
   3.551 +SOURCE_BROWSER         = NO
   3.552 +
   3.553 +# Setting the INLINE_SOURCES tag to YES will include the body 
   3.554 +# of functions and classes directly in the documentation.
   3.555 +
   3.556 +INLINE_SOURCES         = NO
   3.557 +
   3.558 +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
   3.559 +# doxygen to hide any special comment blocks from generated source code 
   3.560 +# fragments. Normal C and C++ comments will always remain visible.
   3.561 +
   3.562 +STRIP_CODE_COMMENTS    = YES
   3.563 +
   3.564 +# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
   3.565 +# then for each documented function all documented 
   3.566 +# functions referencing it will be listed.
   3.567 +
   3.568 +REFERENCED_BY_RELATION = YES
   3.569 +
   3.570 +# If the REFERENCES_RELATION tag is set to YES (the default) 
   3.571 +# then for each documented function all documented entities 
   3.572 +# called/used by that function will be listed.
   3.573 +
   3.574 +REFERENCES_RELATION    = YES
   3.575 +
   3.576 +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
   3.577 +# will generate a verbatim copy of the header file for each class for 
   3.578 +# which an include is specified. Set to NO to disable this.
   3.579 +
   3.580 +VERBATIM_HEADERS       = YES
   3.581 +
   3.582 +#---------------------------------------------------------------------------
   3.583 +# configuration options related to the alphabetical class index
   3.584 +#---------------------------------------------------------------------------
   3.585 +
   3.586 +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
   3.587 +# of all compounds will be generated. Enable this if the project 
   3.588 +# contains a lot of classes, structs, unions or interfaces.
   3.589 +
   3.590 +ALPHABETICAL_INDEX     = NO
   3.591 +
   3.592 +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
   3.593 +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
   3.594 +# in which this list will be split (can be a number in the range [1..20])
   3.595 +
   3.596 +COLS_IN_ALPHA_INDEX    = 5
   3.597 +
   3.598 +# In case all classes in a project start with a common prefix, all 
   3.599 +# classes will be put under the same header in the alphabetical index. 
   3.600 +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
   3.601 +# should be ignored while generating the index headers.
   3.602 +
   3.603 +IGNORE_PREFIX          = 
   3.604 +
   3.605 +#---------------------------------------------------------------------------
   3.606 +# configuration options related to the HTML output
   3.607 +#---------------------------------------------------------------------------
   3.608 +
   3.609 +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
   3.610 +# generate HTML output.
   3.611 +
   3.612 +GENERATE_HTML          = YES
   3.613 +
   3.614 +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
   3.615 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
   3.616 +# put in front of it. If left blank `html' will be used as the default path.
   3.617 +
   3.618 +HTML_OUTPUT            = html
   3.619 +
   3.620 +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
   3.621 +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
   3.622 +# doxygen will generate files with .html extension.
   3.623 +
   3.624 +HTML_FILE_EXTENSION    = .html
   3.625 +
   3.626 +# The HTML_HEADER tag can be used to specify a personal HTML header for 
   3.627 +# each generated HTML page. If it is left blank doxygen will generate a 
   3.628 +# standard header.
   3.629 +
   3.630 +HTML_HEADER            = 
   3.631 +
   3.632 +# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
   3.633 +# each generated HTML page. If it is left blank doxygen will generate a 
   3.634 +# standard footer.
   3.635 +
   3.636 +HTML_FOOTER            = 
   3.637 +
   3.638 +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
   3.639 +# style sheet that is used by each HTML page. It can be used to 
   3.640 +# fine-tune the look of the HTML output. If the tag is left blank doxygen 
   3.641 +# will generate a default style sheet. Note that doxygen will try to copy 
   3.642 +# the style sheet file to the HTML output directory, so don't put your own 
   3.643 +# stylesheet in the HTML output directory as well, or it will be erased!
   3.644 +
   3.645 +HTML_STYLESHEET        = 
   3.646 +
   3.647 +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
   3.648 +# files or namespaces will be aligned in HTML using tables. If set to 
   3.649 +# NO a bullet list will be used.
   3.650 +
   3.651 +HTML_ALIGN_MEMBERS     = YES
   3.652 +
   3.653 +# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
   3.654 +# will be generated that can be used as input for tools like the 
   3.655 +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
   3.656 +# of the generated HTML documentation.
   3.657 +
   3.658 +GENERATE_HTMLHELP      = NO
   3.659 +
   3.660 +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
   3.661 +# be used to specify the file name of the resulting .chm file. You 
   3.662 +# can add a path in front of the file if the result should not be 
   3.663 +# written to the html output directory.
   3.664 +
   3.665 +CHM_FILE               = 
   3.666 +
   3.667 +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
   3.668 +# be used to specify the location (absolute path including file name) of 
   3.669 +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
   3.670 +# the HTML help compiler on the generated index.hhp.
   3.671 +
   3.672 +HHC_LOCATION           = 
   3.673 +
   3.674 +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
   3.675 +# controls if a separate .chi index file is generated (YES) or that 
   3.676 +# it should be included in the master .chm file (NO).
   3.677 +
   3.678 +GENERATE_CHI           = NO
   3.679 +
   3.680 +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
   3.681 +# controls whether a binary table of contents is generated (YES) or a 
   3.682 +# normal table of contents (NO) in the .chm file.
   3.683 +
   3.684 +BINARY_TOC             = NO
   3.685 +
   3.686 +# The TOC_EXPAND flag can be set to YES to add extra items for group members 
   3.687 +# to the contents of the HTML help documentation and to the tree view.
   3.688 +
   3.689 +TOC_EXPAND             = NO
   3.690 +
   3.691 +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
   3.692 +# top of each HTML page. The value NO (the default) enables the index and 
   3.693 +# the value YES disables it.
   3.694 +
   3.695 +DISABLE_INDEX          = NO
   3.696 +
   3.697 +# This tag can be used to set the number of enum values (range [1..20]) 
   3.698 +# that doxygen will group on one line in the generated HTML documentation.
   3.699 +
   3.700 +ENUM_VALUES_PER_LINE   = 4
   3.701 +
   3.702 +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
   3.703 +# generated containing a tree-like index structure (just like the one that 
   3.704 +# is generated for HTML Help). For this to work a browser that supports 
   3.705 +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
   3.706 +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
   3.707 +# probably better off using the HTML help feature.
   3.708 +
   3.709 +GENERATE_TREEVIEW      = NO
   3.710 +
   3.711 +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
   3.712 +# used to set the initial width (in pixels) of the frame in which the tree 
   3.713 +# is shown.
   3.714 +
   3.715 +TREEVIEW_WIDTH         = 250
   3.716 +
   3.717 +#---------------------------------------------------------------------------
   3.718 +# configuration options related to the LaTeX output
   3.719 +#---------------------------------------------------------------------------
   3.720 +
   3.721 +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
   3.722 +# generate Latex output.
   3.723 +
   3.724 +GENERATE_LATEX         = YES
   3.725 +
   3.726 +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
   3.727 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
   3.728 +# put in front of it. If left blank `latex' will be used as the default path.
   3.729 +
   3.730 +LATEX_OUTPUT           = latex
   3.731 +
   3.732 +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
   3.733 +# invoked. If left blank `latex' will be used as the default command name.
   3.734 +
   3.735 +LATEX_CMD_NAME         = latex
   3.736 +
   3.737 +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
   3.738 +# generate index for LaTeX. If left blank `makeindex' will be used as the 
   3.739 +# default command name.
   3.740 +
   3.741 +MAKEINDEX_CMD_NAME     = makeindex
   3.742 +
   3.743 +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
   3.744 +# LaTeX documents. This may be useful for small projects and may help to 
   3.745 +# save some trees in general.
   3.746 +
   3.747 +COMPACT_LATEX          = NO
   3.748 +
   3.749 +# The PAPER_TYPE tag can be used to set the paper type that is used 
   3.750 +# by the printer. Possible values are: a4, a4wide, letter, legal and 
   3.751 +# executive. If left blank a4wide will be used.
   3.752 +
   3.753 +PAPER_TYPE             = a4wide
   3.754 +
   3.755 +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
   3.756 +# packages that should be included in the LaTeX output.
   3.757 +
   3.758 +EXTRA_PACKAGES         = 
   3.759 +
   3.760 +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
   3.761 +# the generated latex document. The header should contain everything until 
   3.762 +# the first chapter. If it is left blank doxygen will generate a 
   3.763 +# standard header. Notice: only use this tag if you know what you are doing!
   3.764 +
   3.765 +LATEX_HEADER           = 
   3.766 +
   3.767 +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
   3.768 +# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
   3.769 +# contain links (just like the HTML output) instead of page references 
   3.770 +# This makes the output suitable for online browsing using a pdf viewer.
   3.771 +
   3.772 +PDF_HYPERLINKS         = YES
   3.773 +
   3.774 +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
   3.775 +# plain latex in the generated Makefile. Set this option to YES to get a 
   3.776 +# higher quality PDF documentation.
   3.777 +
   3.778 +USE_PDFLATEX           = YES
   3.779 +
   3.780 +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
   3.781 +# command to the generated LaTeX files. This will instruct LaTeX to keep 
   3.782 +# running if errors occur, instead of asking the user for help. 
   3.783 +# This option is also used when generating formulas in HTML.
   3.784 +
   3.785 +LATEX_BATCHMODE        = NO
   3.786 +
   3.787 +# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
   3.788 +# include the index chapters (such as File Index, Compound Index, etc.) 
   3.789 +# in the output.
   3.790 +
   3.791 +LATEX_HIDE_INDICES     = NO
   3.792 +
   3.793 +#---------------------------------------------------------------------------
   3.794 +# configuration options related to the RTF output
   3.795 +#---------------------------------------------------------------------------
   3.796 +
   3.797 +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
   3.798 +# The RTF output is optimized for Word 97 and may not look very pretty with 
   3.799 +# other RTF readers or editors.
   3.800 +
   3.801 +GENERATE_RTF           = NO
   3.802 +
   3.803 +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
   3.804 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
   3.805 +# put in front of it. If left blank `rtf' will be used as the default path.
   3.806 +
   3.807 +RTF_OUTPUT             = rtf
   3.808 +
   3.809 +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
   3.810 +# RTF documents. This may be useful for small projects and may help to 
   3.811 +# save some trees in general.
   3.812 +
   3.813 +COMPACT_RTF            = NO
   3.814 +
   3.815 +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
   3.816 +# will contain hyperlink fields. The RTF file will 
   3.817 +# contain links (just like the HTML output) instead of page references. 
   3.818 +# This makes the output suitable for online browsing using WORD or other 
   3.819 +# programs which support those fields. 
   3.820 +# Note: wordpad (write) and others do not support links.
   3.821 +
   3.822 +RTF_HYPERLINKS         = NO
   3.823 +
   3.824 +# Load stylesheet definitions from file. Syntax is similar to doxygen's 
   3.825 +# config file, i.e. a series of assignments. You only have to provide 
   3.826 +# replacements, missing definitions are set to their default value.
   3.827 +
   3.828 +RTF_STYLESHEET_FILE    = 
   3.829 +
   3.830 +# Set optional variables used in the generation of an rtf document. 
   3.831 +# Syntax is similar to doxygen's config file.
   3.832 +
   3.833 +RTF_EXTENSIONS_FILE    = 
   3.834 +
   3.835 +#---------------------------------------------------------------------------
   3.836 +# configuration options related to the man page output
   3.837 +#---------------------------------------------------------------------------
   3.838 +
   3.839 +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
   3.840 +# generate man pages
   3.841 +
   3.842 +GENERATE_MAN           = NO
   3.843 +
   3.844 +# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
   3.845 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
   3.846 +# put in front of it. If left blank `man' will be used as the default path.
   3.847 +
   3.848 +MAN_OUTPUT             = man
   3.849 +
   3.850 +# The MAN_EXTENSION tag determines the extension that is added to 
   3.851 +# the generated man pages (default is the subroutine's section .3)
   3.852 +
   3.853 +MAN_EXTENSION          = .3
   3.854 +
   3.855 +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
   3.856 +# then it will generate one additional man file for each entity 
   3.857 +# documented in the real man page(s). These additional files 
   3.858 +# only source the real man page, but without them the man command 
   3.859 +# would be unable to find the correct page. The default is NO.
   3.860 +
   3.861 +MAN_LINKS              = NO
   3.862 +
   3.863 +#---------------------------------------------------------------------------
   3.864 +# configuration options related to the XML output
   3.865 +#---------------------------------------------------------------------------
   3.866 +
   3.867 +# If the GENERATE_XML tag is set to YES Doxygen will 
   3.868 +# generate an XML file that captures the structure of 
   3.869 +# the code including all documentation.
   3.870 +
   3.871 +GENERATE_XML           = NO
   3.872 +
   3.873 +# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
   3.874 +# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
   3.875 +# put in front of it. If left blank `xml' will be used as the default path.
   3.876 +
   3.877 +XML_OUTPUT             = xml
   3.878 +
   3.879 +# The XML_SCHEMA tag can be used to specify an XML schema, 
   3.880 +# which can be used by a validating XML parser to check the 
   3.881 +# syntax of the XML files.
   3.882 +
   3.883 +XML_SCHEMA             = 
   3.884 +
   3.885 +# The XML_DTD tag can be used to specify an XML DTD, 
   3.886 +# which can be used by a validating XML parser to check the 
   3.887 +# syntax of the XML files.
   3.888 +
   3.889 +XML_DTD                = 
   3.890 +
   3.891 +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
   3.892 +# dump the program listings (including syntax highlighting 
   3.893 +# and cross-referencing information) to the XML output. Note that 
   3.894 +# enabling this will significantly increase the size of the XML output.
   3.895 +
   3.896 +XML_PROGRAMLISTING     = YES
   3.897 +
   3.898 +#---------------------------------------------------------------------------
   3.899 +# configuration options for the AutoGen Definitions output
   3.900 +#---------------------------------------------------------------------------
   3.901 +
   3.902 +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
   3.903 +# generate an AutoGen Definitions (see autogen.sf.net) file 
   3.904 +# that captures the structure of the code including all 
   3.905 +# documentation. Note that this feature is still experimental 
   3.906 +# and incomplete at the moment.
   3.907 +
   3.908 +GENERATE_AUTOGEN_DEF   = NO
   3.909 +
   3.910 +#---------------------------------------------------------------------------
   3.911 +# configuration options related to the Perl module output
   3.912 +#---------------------------------------------------------------------------
   3.913 +
   3.914 +# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
   3.915 +# generate a Perl module file that captures the structure of 
   3.916 +# the code including all documentation. Note that this 
   3.917 +# feature is still experimental and incomplete at the 
   3.918 +# moment.
   3.919 +
   3.920 +GENERATE_PERLMOD       = NO
   3.921 +
   3.922 +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
   3.923 +# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
   3.924 +# to generate PDF and DVI output from the Perl module output.
   3.925 +
   3.926 +PERLMOD_LATEX          = NO
   3.927 +
   3.928 +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
   3.929 +# nicely formatted so it can be parsed by a human reader.  This is useful 
   3.930 +# if you want to understand what is going on.  On the other hand, if this 
   3.931 +# tag is set to NO the size of the Perl module output will be much smaller 
   3.932 +# and Perl will parse it just the same.
   3.933 +
   3.934 +PERLMOD_PRETTY         = YES
   3.935 +
   3.936 +# The names of the make variables in the generated doxyrules.make file 
   3.937 +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
   3.938 +# This is useful so different doxyrules.make files included by the same 
   3.939 +# Makefile don't overwrite each other's variables.
   3.940 +
   3.941 +PERLMOD_MAKEVAR_PREFIX = 
   3.942 +
   3.943 +#---------------------------------------------------------------------------
   3.944 +# Configuration options related to the preprocessor   
   3.945 +#---------------------------------------------------------------------------
   3.946 +
   3.947 +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
   3.948 +# evaluate all C-preprocessor directives found in the sources and include 
   3.949 +# files.
   3.950 +
   3.951 +ENABLE_PREPROCESSING   = YES
   3.952 +
   3.953 +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
   3.954 +# names in the source code. If set to NO (the default) only conditional 
   3.955 +# compilation will be performed. Macro expansion can be done in a controlled 
   3.956 +# way by setting EXPAND_ONLY_PREDEF to YES.
   3.957 +
   3.958 +MACRO_EXPANSION        = NO
   3.959 +
   3.960 +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
   3.961 +# then the macro expansion is limited to the macros specified with the 
   3.962 +# PREDEFINED and EXPAND_AS_PREDEFINED tags.
   3.963 +
   3.964 +EXPAND_ONLY_PREDEF     = NO
   3.965 +
   3.966 +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
   3.967 +# in the INCLUDE_PATH (see below) will be search if a #include is found.
   3.968 +
   3.969 +SEARCH_INCLUDES        = YES
   3.970 +
   3.971 +# The INCLUDE_PATH tag can be used to specify one or more directories that 
   3.972 +# contain include files that are not input files but should be processed by 
   3.973 +# the preprocessor.
   3.974 +
   3.975 +INCLUDE_PATH           = 
   3.976 +
   3.977 +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
   3.978 +# patterns (like *.h and *.hpp) to filter out the header-files in the 
   3.979 +# directories. If left blank, the patterns specified with FILE_PATTERNS will 
   3.980 +# be used.
   3.981 +
   3.982 +INCLUDE_FILE_PATTERNS  = 
   3.983 +
   3.984 +# The PREDEFINED tag can be used to specify one or more macro names that 
   3.985 +# are defined before the preprocessor is started (similar to the -D option of 
   3.986 +# gcc). The argument of the tag is a list of macros of the form: name 
   3.987 +# or name=definition (no spaces). If the definition and the = are 
   3.988 +# omitted =1 is assumed. To prevent a macro definition from being 
   3.989 +# undefined via #undef or recursively expanded use the := operator 
   3.990 +# instead of the = operator.
   3.991 +
   3.992 +PREDEFINED             = 
   3.993 +
   3.994 +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
   3.995 +# this tag can be used to specify a list of macro names that should be expanded. 
   3.996 +# The macro definition that is found in the sources will be used. 
   3.997 +# Use the PREDEFINED tag if you want to use a different macro definition.
   3.998 +
   3.999 +EXPAND_AS_DEFINED      = 
  3.1000 +
  3.1001 +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
  3.1002 +# doxygen's preprocessor will remove all function-like macros that are alone 
  3.1003 +# on a line, have an all uppercase name, and do not end with a semicolon. Such 
  3.1004 +# function macros are typically used for boiler-plate code, and will confuse 
  3.1005 +# the parser if not removed.
  3.1006 +
  3.1007 +SKIP_FUNCTION_MACROS   = YES
  3.1008 +
  3.1009 +#---------------------------------------------------------------------------
  3.1010 +# Configuration::additions related to external references   
  3.1011 +#---------------------------------------------------------------------------
  3.1012 +
  3.1013 +# The TAGFILES option can be used to specify one or more tagfiles. 
  3.1014 +# Optionally an initial location of the external documentation 
  3.1015 +# can be added for each tagfile. The format of a tag file without 
  3.1016 +# this location is as follows: 
  3.1017 +#   TAGFILES = file1 file2 ... 
  3.1018 +# Adding location for the tag files is done as follows: 
  3.1019 +#   TAGFILES = file1=loc1 "file2 = loc2" ... 
  3.1020 +# where "loc1" and "loc2" can be relative or absolute paths or 
  3.1021 +# URLs. If a location is present for each tag, the installdox tool 
  3.1022 +# does not have to be run to correct the links.
  3.1023 +# Note that each tag file must have a unique name
  3.1024 +# (where the name does NOT include the path)
  3.1025 +# If a tag file is not located in the directory in which doxygen 
  3.1026 +# is run, you must also specify the path to the tagfile here.
  3.1027 +
  3.1028 +TAGFILES               = 
  3.1029 +
  3.1030 +# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
  3.1031 +# a tag file that is based on the input files it reads.
  3.1032 +
  3.1033 +GENERATE_TAGFILE       = 
  3.1034 +
  3.1035 +# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
  3.1036 +# in the class index. If set to NO only the inherited external classes 
  3.1037 +# will be listed.
  3.1038 +
  3.1039 +ALLEXTERNALS           = NO
  3.1040 +
  3.1041 +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
  3.1042 +# in the modules index. If set to NO, only the current project's groups will 
  3.1043 +# be listed.
  3.1044 +
  3.1045 +EXTERNAL_GROUPS        = YES
  3.1046 +
  3.1047 +# The PERL_PATH should be the absolute path and name of the perl script 
  3.1048 +# interpreter (i.e. the result of `which perl').
  3.1049 +
  3.1050 +PERL_PATH              = /usr/bin/perl
  3.1051 +
  3.1052 +#---------------------------------------------------------------------------
  3.1053 +# Configuration options related to the dot tool   
  3.1054 +#---------------------------------------------------------------------------
  3.1055 +
  3.1056 +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
  3.1057 +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
  3.1058 +# or super classes. Setting the tag to NO turns the diagrams off. Note that 
  3.1059 +# this option is superseded by the HAVE_DOT option below. This is only a 
  3.1060 +# fallback. It is recommended to install and use dot, since it yields more 
  3.1061 +# powerful graphs.
  3.1062 +
  3.1063 +CLASS_DIAGRAMS         = YES
  3.1064 +
  3.1065 +# If set to YES, the inheritance and collaboration graphs will hide 
  3.1066 +# inheritance and usage relations if the target is undocumented 
  3.1067 +# or is not a class.
  3.1068 +
  3.1069 +HIDE_UNDOC_RELATIONS   = YES
  3.1070 +
  3.1071 +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
  3.1072 +# available from the path. This tool is part of Graphviz, a graph visualization 
  3.1073 +# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
  3.1074 +# have no effect if this option is set to NO (the default)
  3.1075 +
  3.1076 +HAVE_DOT               = NO
  3.1077 +
  3.1078 +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
  3.1079 +# will generate a graph for each documented class showing the direct and 
  3.1080 +# indirect inheritance relations. Setting this tag to YES will force the 
  3.1081 +# the CLASS_DIAGRAMS tag to NO.
  3.1082 +
  3.1083 +CLASS_GRAPH            = YES
  3.1084 +
  3.1085 +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
  3.1086 +# will generate a graph for each documented class showing the direct and 
  3.1087 +# indirect implementation dependencies (inheritance, containment, and 
  3.1088 +# class references variables) of the class with other documented classes.
  3.1089 +
  3.1090 +COLLABORATION_GRAPH    = YES
  3.1091 +
  3.1092 +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
  3.1093 +# will generate a graph for groups, showing the direct groups dependencies
  3.1094 +
  3.1095 +GROUP_GRAPHS           = YES
  3.1096 +
  3.1097 +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
  3.1098 +# collaboration diagrams in a style similar to the OMG's Unified Modeling 
  3.1099 +# Language.
  3.1100 +
  3.1101 +UML_LOOK               = NO
  3.1102 +
  3.1103 +# If set to YES, the inheritance and collaboration graphs will show the 
  3.1104 +# relations between templates and their instances.
  3.1105 +
  3.1106 +TEMPLATE_RELATIONS     = NO
  3.1107 +
  3.1108 +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
  3.1109 +# tags are set to YES then doxygen will generate a graph for each documented 
  3.1110 +# file showing the direct and indirect include dependencies of the file with 
  3.1111 +# other documented files.
  3.1112 +
  3.1113 +INCLUDE_GRAPH          = YES
  3.1114 +
  3.1115 +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
  3.1116 +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
  3.1117 +# documented header file showing the documented files that directly or 
  3.1118 +# indirectly include this file.
  3.1119 +
  3.1120 +INCLUDED_BY_GRAPH      = YES
  3.1121 +
  3.1122 +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
  3.1123 +# generate a call dependency graph for every global function or class method. 
  3.1124 +# Note that enabling this option will significantly increase the time of a run. 
  3.1125 +# So in most cases it will be better to enable call graphs for selected 
  3.1126 +# functions only using the \callgraph command.
  3.1127 +
  3.1128 +CALL_GRAPH             = NO
  3.1129 +
  3.1130 +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
  3.1131 +# will graphical hierarchy of all classes instead of a textual one.
  3.1132 +
  3.1133 +GRAPHICAL_HIERARCHY    = YES
  3.1134 +
  3.1135 +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
  3.1136 +# then doxygen will show the dependencies a directory has on other directories 
  3.1137 +# in a graphical way. The dependency relations are determined by the #include
  3.1138 +# relations between the files in the directories.
  3.1139 +
  3.1140 +DIRECTORY_GRAPH        = YES
  3.1141 +
  3.1142 +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
  3.1143 +# generated by dot. Possible values are png, jpg, or gif
  3.1144 +# If left blank png will be used.
  3.1145 +
  3.1146 +DOT_IMAGE_FORMAT       = png
  3.1147 +
  3.1148 +# The tag DOT_PATH can be used to specify the path where the dot tool can be 
  3.1149 +# found. If left blank, it is assumed the dot tool can be found in the path.
  3.1150 +
  3.1151 +DOT_PATH               = 
  3.1152 +
  3.1153 +# The DOTFILE_DIRS tag can be used to specify one or more directories that 
  3.1154 +# contain dot files that are included in the documentation (see the 
  3.1155 +# \dotfile command).
  3.1156 +
  3.1157 +DOTFILE_DIRS           = 
  3.1158 +
  3.1159 +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
  3.1160 +# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
  3.1161 +# this value, doxygen will try to truncate the graph, so that it fits within 
  3.1162 +# the specified constraint. Beware that most browsers cannot cope with very 
  3.1163 +# large images.
  3.1164 +
  3.1165 +MAX_DOT_GRAPH_WIDTH    = 1024
  3.1166 +
  3.1167 +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
  3.1168 +# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
  3.1169 +# this value, doxygen will try to truncate the graph, so that it fits within 
  3.1170 +# the specified constraint. Beware that most browsers cannot cope with very 
  3.1171 +# large images.
  3.1172 +
  3.1173 +MAX_DOT_GRAPH_HEIGHT   = 1024
  3.1174 +
  3.1175 +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
  3.1176 +# graphs generated by dot. A depth value of 3 means that only nodes reachable 
  3.1177 +# from the root by following a path via at most 3 edges will be shown. Nodes 
  3.1178 +# that lay further from the root node will be omitted. Note that setting this 
  3.1179 +# option to 1 or 2 may greatly reduce the computation time needed for large 
  3.1180 +# code bases. Also note that a graph may be further truncated if the graph's 
  3.1181 +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
  3.1182 +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
  3.1183 +# the graph is not depth-constrained.
  3.1184 +
  3.1185 +MAX_DOT_GRAPH_DEPTH    = 0
  3.1186 +
  3.1187 +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
  3.1188 +# background. This is disabled by default, which results in a white background. 
  3.1189 +# Warning: Depending on the platform used, enabling this option may lead to 
  3.1190 +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
  3.1191 +# read).
  3.1192 +
  3.1193 +DOT_TRANSPARENT        = NO
  3.1194 +
  3.1195 +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
  3.1196 +# files in one run (i.e. multiple -o and -T options on the command line). This 
  3.1197 +# makes dot run faster, but since only newer versions of dot (>1.8.10) 
  3.1198 +# support this, this feature is disabled by default.
  3.1199 +
  3.1200 +DOT_MULTI_TARGETS      = NO
  3.1201 +
  3.1202 +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
  3.1203 +# generate a legend page explaining the meaning of the various boxes and 
  3.1204 +# arrows in the dot generated graphs.
  3.1205 +
  3.1206 +GENERATE_LEGEND        = YES
  3.1207 +
  3.1208 +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
  3.1209 +# remove the intermediate dot files that are used to generate 
  3.1210 +# the various graphs.
  3.1211 +
  3.1212 +DOT_CLEANUP            = YES
  3.1213 +
  3.1214 +#---------------------------------------------------------------------------
  3.1215 +# Configuration::additions related to the search engine   
  3.1216 +#---------------------------------------------------------------------------
  3.1217 +
  3.1218 +# The SEARCHENGINE tag specifies whether or not a search engine should be 
  3.1219 +# used. If set to NO the values of all tags below this one will be ignored.
  3.1220 +
  3.1221 +SEARCHENGINE           = NO
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/docs/Doxyfilter	Tue Sep 13 15:33:37 2005 +0000
     4.3 @@ -0,0 +1,16 @@
     4.4 +#!/bin/sh
     4.5 +
     4.6 +#
     4.7 +# Doxyfilter <source-root> <filename>
     4.8 +#
     4.9 +
    4.10 +dir=$(dirname "$0")
    4.11 +
    4.12 +PYFILTER="$dir/pythfilter.py"
    4.13 +
    4.14 +if [ "${2/.py/}" != "$2" ]
    4.15 +then
    4.16 +    python "$PYFILTER" -r "$1" -f "$2"
    4.17 +else
    4.18 +    cat "$2"
    4.19 +fi
     5.1 --- a/docs/Makefile	Tue Sep 13 15:32:38 2005 +0000
     5.2 +++ b/docs/Makefile	Tue Sep 13 15:33:37 2005 +0000
     5.3 @@ -8,6 +8,7 @@ DVIPS		:= dvips
     5.4  LATEX		:= latex
     5.5  FIG2DEV		:= fig2dev
     5.6  LATEX2HTML	:= latex2html
     5.7 +DOXYGEN		:= doxygen
     5.8  
     5.9  pkgdocdir	:= /usr/share/doc/xen
    5.10  
    5.11 @@ -18,10 +19,14 @@ DOC_HTML	:= $(patsubst src/%.tex,html/%/
    5.12  
    5.13  GFX = $(patsubst %.fig, %.eps, $(wildcard figs/*.fig))
    5.14  
    5.15 +.PHONY:	all build dev-docs python-dev-docs ps pdf html clean install
    5.16 +
    5.17  all: build
    5.18  build: ps pdf html
    5.19  	rm -f *.aux *.dvi *.bbl *.blg *.glo *.idx *.ilg *.log *.ind *.toc
    5.20  
    5.21 +dev-docs: python-dev-docs
    5.22 +
    5.23  ps: $(DOC_PS)
    5.24  
    5.25  pdf: $(DOC_PDF)
    5.26 @@ -30,10 +35,18 @@ html:
    5.27  	@if which $(LATEX2HTML) 1>/dev/null 2>/dev/null; then \
    5.28  	$(MAKE) $(DOC_HTML); fi
    5.29  
    5.30 +python-dev-docs:
    5.31 +	mkdir -p api/tools/python
    5.32 +	@if which $(DOXYGEN) 1>/dev/null 2>/dev/null; then         \
    5.33 +        echo "Running doxygen to generate Python tools APIs ... "; \
    5.34 +	$(DOXYGEN) Doxyfile;                                       \
    5.35 +	$(MAKE) -C api/tools/python/latex ; fi
    5.36 +
    5.37  clean:
    5.38  	rm -rf .word_count *.aux *.dvi *.bbl *.blg *.glo *.idx *~ 
    5.39  	rm -rf *.ilg *.log *.ind *.toc *.bak core
    5.40  	rm -rf $(GFX) ps pdf html
    5.41 +	rm -rf api
    5.42  
    5.43  install: all
    5.44  	rm -rf $(DESTDIR)$(pkgdocdir)
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/docs/pythfilter.py	Tue Sep 13 15:33:37 2005 +0000
     6.3 @@ -0,0 +1,658 @@
     6.4 +#!/usr/bin/env python
     6.5 +
     6.6 +# pythfilter.py v1.5.5, written by Matthias Baas (baas@ira.uka.de)
     6.7 +
     6.8 +# Doxygen filter which can be used to document Python source code.
     6.9 +# Classes (incl. methods) and functions can be documented.
    6.10 +# Every comment that begins with ## is literally turned into an
    6.11 +# Doxygen comment. Consecutive comment lines are turned into
    6.12 +# comment blocks (-> /** ... */).
    6.13 +# All the stuff is put inside a namespace with the same name as
    6.14 +# the source file.
    6.15 +
    6.16 +# Conversions:
    6.17 +# ============
    6.18 +# ##-blocks                  ->  /** ... */
    6.19 +# "class name(base): ..."    ->  "class name : public base {...}"
    6.20 +# "def name(params): ..."    ->  "name(params) {...}"
    6.21 +
    6.22 +# Changelog:
    6.23 +# 21.01.2003: Raw (r"") or unicode (u"") doc string will now be properly
    6.24 +#             handled. (thanks to Richard Laager for the patch)
    6.25 +# 22.12.2003: Fixed a bug where no function names would be output for "def"
    6.26 +#             blocks that were not in a class.
    6.27 +#             (thanks to Richard Laager for the patch)
    6.28 +# 12.12.2003: Implemented code to handle static and class methods with
    6.29 +#             this logic: Methods with "self" as the first argument are
    6.30 +#             non-static. Methods with "cls" are Python class methods,
    6.31 +#             which translate into static methods for Doxygen. Other
    6.32 +#             methods are assumed to be static methods. As should be
    6.33 +#             obvious, this logic doesn't take into account if the method
    6.34 +#             is actually setup as a classmethod() or a staticmethod(),
    6.35 +#             just if it follows the normal conventions.
    6.36 +#             (thanks to Richard Laager for the patch)
    6.37 +# 11.12.2003: Corrected #includes to use os.path.sep instead of ".". Corrected
    6.38 +#             namespace code to use "::" instead of ".".
    6.39 +#             (thanks to Richard Laager for the patch)
    6.40 +# 11.12.2003: Methods beginning with two underscores that end with
    6.41 +#             something other than two underscores are considered private
    6.42 +#             and are handled accordingly.
    6.43 +#             (thanks to Richard Laager for the patch)
    6.44 +# 03.12.2003: The first parameter of class methods (self) is removed from
    6.45 +#             the documentation.
    6.46 +# 03.11.2003: The module docstring will be used as namespace documentation
    6.47 +#             (thanks to Joe Bronkema for the patch)
    6.48 +# 08.07.2003: Namespaces get a default documentation so that the namespace
    6.49 +#             and its contents will show up in the generated documentation.
    6.50 +# 05.02.2003: Directories will be delted during synchronization.
    6.51 +# 31.01.2003: -f option & filtering entire directory trees.
    6.52 +# 10.08.2002: In base classes the '.' will be replaced by '::'
    6.53 +# 18.07.2002: * and ** will be translated into arguments
    6.54 +# 18.07.2002: Argument lists may contain default values using constructors.
    6.55 +# 18.06.2002: Support for ## public:
    6.56 +# 21.01.2002: from ... import will be translated to "using namespace ...;"
    6.57 +#             TODO: "from ... import *" vs "from ... import names"
    6.58 +#             TODO: Using normal imports: name.name -> name::name
    6.59 +# 20.01.2002: #includes will be placed in front of the namespace
    6.60 +
    6.61 +######################################################################
    6.62 +
    6.63 +# The program is written as a state machine with the following states:
    6.64 +#
    6.65 +# - OUTSIDE               The current position is outside any comment,
    6.66 +#                         class definition or function.
    6.67 +#
    6.68 +# - BUILD_COMMENT         Begins with first "##".
    6.69 +#                         Ends with the first token that is no "##"
    6.70 +#                         at the same column as before.
    6.71 +#
    6.72 +# - BUILD_CLASS_DECL      Begins with "class".
    6.73 +#                         Ends with ":"
    6.74 +# - BUILD_CLASS_BODY      Begins just after BUILD_CLASS_DECL.
    6.75 +#                         The first following token (which is no comment)
    6.76 +#                         determines indentation depth.
    6.77 +#                         Ends with a token that has a smaller indendation.
    6.78 +#
    6.79 +# - BUILD_DEF_DECL        Begins with "def".
    6.80 +#                         Ends with ":".
    6.81 +# - BUILD_DEF_BODY        Begins just after BUILD_DEF_DECL.
    6.82 +#                         The first following token (which is no comment)
    6.83 +#                         determines indentation depth.
    6.84 +#                         Ends with a token that has a smaller indendation.
    6.85 +
    6.86 +import getopt
    6.87 +import glob
    6.88 +import os.path
    6.89 +import re
    6.90 +import shutil
    6.91 +import string
    6.92 +import sys
    6.93 +import token
    6.94 +import tokenize
    6.95 +
    6.96 +from stat import *
    6.97 +
    6.98 +OUTSIDE          = 0
    6.99 +BUILD_COMMENT    = 1
   6.100 +BUILD_CLASS_DECL = 2
   6.101 +BUILD_CLASS_BODY = 3
   6.102 +BUILD_DEF_DECL   = 4
   6.103 +BUILD_DEF_BODY   = 5
   6.104 +IMPORT           = 6
   6.105 +IMPORT_OP        = 7
   6.106 +IMPORT_APPEND    = 8
   6.107 +
   6.108 +# Output file stream
   6.109 +outfile = sys.stdout
   6.110 +
   6.111 +# Output buffer
   6.112 +outbuffer = []
   6.113 +
   6.114 +out_row = 1
   6.115 +out_col = 0
   6.116 +
   6.117 +# Variables used by rec_name_n_param()
   6.118 +name         = ""
   6.119 +param        = ""
   6.120 +doc_string   = ""
   6.121 +record_state = 0
   6.122 +bracket_counter = 0
   6.123 +
   6.124 +# Tuple: (row,column)
   6.125 +class_spos  = (0,0)
   6.126 +def_spos    = (0,0)
   6.127 +import_spos = (0,0)
   6.128 +
   6.129 +# Which import was used? ("import" or "from")
   6.130 +import_token = ""
   6.131 +
   6.132 +# Comment block buffer
   6.133 +comment_block = []
   6.134 +comment_finished = 0
   6.135 +
   6.136 +# Imported modules
   6.137 +modules = []
   6.138 +
   6.139 +# Program state
   6.140 +stateStack = [OUTSIDE]
   6.141 +
   6.142 +# Keep track of whether module has a docstring
   6.143 +module_has_docstring = False
   6.144 +
   6.145 +# Keep track of member protection
   6.146 +protection_level = "public"
   6.147 +private_member = False
   6.148 +
   6.149 +# Keep track of the module namespace
   6.150 +namespace = ""
   6.151 +
   6.152 +######################################################################
   6.153 +# Output string s. '\n' may only be at the end of the string (not
   6.154 +# somewhere in the middle).
   6.155 +#
   6.156 +# In: s    - String
   6.157 +#     spos - Startpos
   6.158 +######################################################################
   6.159 +def output(s,spos, immediate=0):
   6.160 +    global outbuffer, out_row, out_col, outfile
   6.161 +
   6.162 +    os = string.rjust(s,spos[1]-out_col+len(s))
   6.163 +
   6.164 +    if immediate:
   6.165 +        outfile.write(os)
   6.166 +    else:
   6.167 +        outbuffer.append(os)
   6.168 +
   6.169 +    assert -1 == string.find(s[0:-2], "\n"), s
   6.170 +
   6.171 +    if (s[-1:]=="\n"):
   6.172 +        out_row = out_row+1
   6.173 +        out_col = 0
   6.174 +    else:
   6.175 +        out_col = spos[1]+len(s)
   6.176 +
   6.177 +
   6.178 +######################################################################
   6.179 +# Records a name and parameters. The name is either a class name or
   6.180 +# a function name. Then the parameter is either the base class or
   6.181 +# the function parameters.
   6.182 +# The name is stored in the global variable "name", the parameters
   6.183 +# in "param".
   6.184 +# The variable "record_state" holds the current state of this internal
   6.185 +# state machine.
   6.186 +# The recording is started by calling start_recording().
   6.187 +#
   6.188 +# In: type, tok
   6.189 +######################################################################
   6.190 +def rec_name_n_param(type, tok):
   6.191 +    global record_state,name,param,doc_string,bracket_counter
   6.192 +    s = record_state
   6.193 +    # State 0: Do nothing.
   6.194 +    if   (s==0):
   6.195 +         return
   6.196 +    # State 1: Remember name.
   6.197 +    elif (s==1):
   6.198 +        name = tok
   6.199 +        record_state = 2
   6.200 +    # State 2: Wait for opening bracket or colon
   6.201 +    elif (s==2):
   6.202 +        if (tok=='('):
   6.203 +            bracket_counter = 1
   6.204 +            record_state=3
   6.205 +        if (tok==':'): record_state=4
   6.206 +    # State 3: Store parameter (or base class) and wait for an ending bracket
   6.207 +    elif (s==3):
   6.208 +        if (tok=='*' or tok=='**'):
   6.209 +            tok=''
   6.210 +        if (tok=='('):
   6.211 +            bracket_counter = bracket_counter+1
   6.212 +        if (tok==')'):
   6.213 +            bracket_counter = bracket_counter-1
   6.214 +        if bracket_counter==0:
   6.215 +            record_state=4
   6.216 +        else:
   6.217 +            param=param+tok
   6.218 +    # State 4: Look for doc string
   6.219 +    elif (s==4):
   6.220 +        if (type==token.NEWLINE or type==token.INDENT or type==token.SLASHEQUAL):
   6.221 +            return
   6.222 +        elif (tok==":"):
   6.223 +            return
   6.224 +        elif (type==token.STRING):
   6.225 +            while tok[:1]=='r' or tok[:1]=='u':
   6.226 +                tok=tok[1:]
   6.227 +            while tok[:1]=='"':
   6.228 +                tok=tok[1:]
   6.229 +            while tok[-1:]=='"':
   6.230 +                tok=tok[:-1]
   6.231 +            doc_string=tok
   6.232 +        record_state=0
   6.233 +
   6.234 +######################################################################
   6.235 +# Starts the recording of a name & param part.
   6.236 +# The function rec_name_n_param() has to be fed with tokens. After
   6.237 +# the necessary tokens are fed the name and parameters can be found
   6.238 +# in the global variables "name" und "param".
   6.239 +######################################################################
   6.240 +def start_recording():
   6.241 +    global record_state,param,name, doc_string
   6.242 +    record_state=1
   6.243 +    name=""
   6.244 +    param=""
   6.245 +    doc_string=""
   6.246 +
   6.247 +######################################################################
   6.248 +# Test if recording is finished
   6.249 +######################################################################
   6.250 +def is_recording_finished():
   6.251 +    global record_state
   6.252 +    return record_state==0
   6.253 +
   6.254 +######################################################################
   6.255 +## Gather comment block
   6.256 +######################################################################
   6.257 +def gather_comment(type,tok,spos):
   6.258 +    global comment_block,comment_finished
   6.259 +    if (type!=tokenize.COMMENT):
   6.260 +        comment_finished = 1
   6.261 +    else:
   6.262 +        # Output old comment block if a new one is started.
   6.263 +        if (comment_finished):
   6.264 +            print_comment(spos)
   6.265 +            comment_finished=0
   6.266 +        if (tok[0:2]=="##" and tok[0:3]!="###"):
   6.267 +            append_comment_lines(tok[2:])
   6.268 +
   6.269 +######################################################################
   6.270 +## Output comment block and empty buffer.
   6.271 +######################################################################
   6.272 +def print_comment(spos):
   6.273 +    global comment_block,comment_finished
   6.274 +    if (comment_block!=[]):
   6.275 +        output("/** ",spos)
   6.276 +        for c in comment_block:
   6.277 +            output(c,spos)
   6.278 +        output("*/\n",spos)
   6.279 +    comment_block    = []
   6.280 +    comment_finished = 0
   6.281 +
   6.282 +######################################################################
   6.283 +def set_state(s):
   6.284 +    global stateStack
   6.285 +    stateStack[len(stateStack)-1]=s
   6.286 +
   6.287 +######################################################################
   6.288 +def get_state():
   6.289 +    global stateStack
   6.290 +    return stateStack[len(stateStack)-1]
   6.291 +
   6.292 +######################################################################
   6.293 +def push_state(s):
   6.294 +    global stateStack
   6.295 +    stateStack.append(s)
   6.296 +
   6.297 +######################################################################
   6.298 +def pop_state():
   6.299 +    global stateStack
   6.300 +    stateStack.pop()
   6.301 +
   6.302 +
   6.303 +######################################################################
   6.304 +def tok_eater(type, tok, spos, epos, line):
   6.305 +    global stateStack,name,param,class_spos,def_spos,import_spos
   6.306 +    global doc_string, modules, import_token, module_has_docstring
   6.307 +    global protection_level, private_member
   6.308 +    global out_row
   6.309 +
   6.310 +    while out_row + 1 < spos[0]:
   6.311 +        output("\n", (0, 0))
   6.312 +
   6.313 +    rec_name_n_param(type,tok)
   6.314 +    if (string.replace(string.strip(tok)," ","")=="##private:"):
   6.315 +         protection_level = "private"
   6.316 +         output("private:\n",spos)
   6.317 +    elif (string.replace(string.strip(tok)," ","")=="##protected:"):
   6.318 +         protection_level = "protected"
   6.319 +         output("protected:\n",spos)
   6.320 +    elif (string.replace(string.strip(tok)," ","")=="##public:"):
   6.321 +         protection_level = "public"
   6.322 +         output("public:\n",spos)
   6.323 +    else:
   6.324 +         gather_comment(type,tok,spos)
   6.325 +
   6.326 +    state = get_state()
   6.327 +
   6.328 +#    sys.stderr.write("%d: %s\n"%(state, tok))
   6.329 +
   6.330 +    # OUTSIDE
   6.331 +    if   (state==OUTSIDE):
   6.332 +        if  (tok=="class"):
   6.333 +            start_recording()
   6.334 +            class_spos = spos
   6.335 +            push_state(BUILD_CLASS_DECL)
   6.336 +        elif (tok=="def"):
   6.337 +            start_recording()
   6.338 +            def_spos = spos
   6.339 +            push_state(BUILD_DEF_DECL)
   6.340 +        elif (tok=="import") or (tok=="from"):
   6.341 +            import_token = tok
   6.342 +            import_spos = spos
   6.343 +            modules     = []
   6.344 +            push_state(IMPORT)
   6.345 +        elif (spos[1] == 0 and tok[:3] == '"""'):
   6.346 +            # Capture module docstring as namespace documentation
   6.347 +            module_has_docstring = True
   6.348 +            append_comment_lines("\\namespace %s\n" % namespace)
   6.349 +            append_comment_lines(tok[3:-3])
   6.350 +            print_comment(spos)
   6.351 +
   6.352 +    # IMPORT
   6.353 +    elif (state==IMPORT):
   6.354 +        if (type==token.NAME):
   6.355 +            modules.append(tok)
   6.356 +            set_state(IMPORT_OP)
   6.357 +    # IMPORT_OP
   6.358 +    elif (state==IMPORT_OP):
   6.359 +        if (tok=="."):
   6.360 +            set_state(IMPORT_APPEND)
   6.361 +        elif (tok==","):
   6.362 +            set_state(IMPORT)
   6.363 +        else:
   6.364 +            for m in modules:
   6.365 +                output('#include "'+m.replace('.',os.path.sep)+'.py"\n', import_spos, immediate=1)
   6.366 +                if import_token=="from":
   6.367 +                    output('using namespace '+m.replace('.', '::')+';\n', import_spos)
   6.368 +            pop_state()
   6.369 +    # IMPORT_APPEND
   6.370 +    elif (state==IMPORT_APPEND):
   6.371 +        if (type==token.NAME):
   6.372 +            modules[len(modules)-1]+="."+tok
   6.373 +            set_state(IMPORT_OP)
   6.374 +    # BUILD_CLASS_DECL
   6.375 +    elif (state==BUILD_CLASS_DECL):
   6.376 +        if (is_recording_finished()):
   6.377 +            s = "class "+name
   6.378 +            if (param!=""): s = s+" : public "+param.replace('.','::')
   6.379 +            if (doc_string!=""):
   6.380 +                append_comment_lines(doc_string)
   6.381 +            print_comment(class_spos)
   6.382 +            output(s+"\n",class_spos)
   6.383 +            output("{\n",(class_spos[0]+1,class_spos[1]))
   6.384 +            protection_level = "public"
   6.385 +            output("  public:\n",(class_spos[0]+2,class_spos[1]))
   6.386 +            set_state(BUILD_CLASS_BODY)
   6.387 +    # BUILD_CLASS_BODY
   6.388 +    elif (state==BUILD_CLASS_BODY):
   6.389 +        if (type!=token.INDENT and type!=token.NEWLINE and type!=40 and
   6.390 +            type!=tokenize.NL and type!=tokenize.COMMENT and
   6.391 +            (spos[1]<=class_spos[1])):
   6.392 +            output("}; // end of class\n",(out_row+1,class_spos[1]))
   6.393 +            pop_state()
   6.394 +        elif (tok=="def"):
   6.395 +            start_recording()
   6.396 +            def_spos = spos
   6.397 +            push_state(BUILD_DEF_DECL)
   6.398 +    # BUILD_DEF_DECL
   6.399 +    elif (state==BUILD_DEF_DECL):
   6.400 +        if (is_recording_finished()):
   6.401 +            param = param.replace("\n", " ")
   6.402 +            param = param.replace("=", " = ")
   6.403 +            params = param.split(",")
   6.404 +            if BUILD_CLASS_BODY in stateStack:
   6.405 +                if len(name) > 1 \
   6.406 +                   and name[0:2] == '__' \
   6.407 +                   and name[len(name)-2:len(name)] != '__' \
   6.408 +                   and protection_level != 'private':
   6.409 +                       private_member = True
   6.410 +                       output("  private:\n",(def_spos[0]+2,def_spos[1]))
   6.411 +
   6.412 +            if (doc_string != ""):
   6.413 +                append_comment_lines(doc_string)
   6.414 +
   6.415 +            print_comment(def_spos)
   6.416 +
   6.417 +            output_function_decl(name, params)
   6.418 +#       output("{\n",(def_spos[0]+1,def_spos[1]))
   6.419 +            set_state(BUILD_DEF_BODY)
   6.420 +    # BUILD_DEF_BODY
   6.421 +    elif (state==BUILD_DEF_BODY):
   6.422 +        if (type!=token.INDENT and type!=token.NEWLINE \
   6.423 +            and type!=40 and type!=tokenize.NL \
   6.424 +            and (spos[1]<=def_spos[1])):
   6.425 +#            output("} // end of method/function\n",(out_row+1,def_spos[1]))
   6.426 +            if private_member and protection_level != 'private':
   6.427 +                private_member = False
   6.428 +                output("  " + protection_level + ":\n",(def_spos[0]+2,def_spos[1]))
   6.429 +            pop_state()
   6.430 +#       else:
   6.431 +#            output(tok,spos)
   6.432 +
   6.433 +
   6.434 +def output_function_decl(name, params):
   6.435 +    global def_spos
   6.436 +
   6.437 +    # Do we document a class method? then remove the 'self' parameter
   6.438 +    if params[0] == 'self':
   6.439 +        preamble = ''
   6.440 +        params = params[1:]
   6.441 +    else:
   6.442 +        preamble = 'static '
   6.443 +        if params[0] == 'cls':
   6.444 +            params = params[1:]
   6.445 +
   6.446 +    param_string = string.join(params, ", Type ")
   6.447 +
   6.448 +    if param_string == '':
   6.449 +        param_string = '(' + param_string + ');\n'
   6.450 +    else:
   6.451 +        param_string = '(Type ' + param_string + ');\n'
   6.452 +
   6.453 +    output(preamble, def_spos)
   6.454 +    output(name, def_spos)
   6.455 +    output(param_string, def_spos)
   6.456 +
   6.457 +
   6.458 +def append_comment_lines(lines):
   6.459 +    map(append_comment_line, doc_string.split('\n'))
   6.460 +
   6.461 +paramRE = re.compile(r'(@param \w+):')
   6.462 +
   6.463 +def append_comment_line(line):
   6.464 +    global paramRE
   6.465 +    
   6.466 +    comment_block.append(paramRE.sub(r'\1', line) + '\n')
   6.467 +
   6.468 +def dump(filename):
   6.469 +    f = open(filename)
   6.470 +    r = f.readlines()
   6.471 +    for s in r:
   6.472 +        sys.stdout.write(s)
   6.473 +
   6.474 +def filter(filename):
   6.475 +    global name, module_has_docstring, source_root
   6.476 +
   6.477 +    path,name = os.path.split(filename)
   6.478 +    root,ext  = os.path.splitext(name)
   6.479 +
   6.480 +    if source_root and path.find(source_root) == 0:
   6.481 +        path = path[len(source_root):]
   6.482 +
   6.483 +        if path[0] == os.sep:
   6.484 +            path = path[1:]
   6.485 +
   6.486 +        ns = path.split(os.sep)
   6.487 +    else:
   6.488 +        ns = []
   6.489 +
   6.490 +    ns.append(root)
   6.491 +
   6.492 +    for n in ns:
   6.493 +        output("namespace " + n + " {\n",(0,0))
   6.494 +
   6.495 +    # set module name for tok_eater to use if there's a module doc string
   6.496 +    name = root
   6.497 +
   6.498 +#    sys.stderr.write('Filtering "'+filename+'"...')
   6.499 +    f = open(filename)
   6.500 +    tokenize.tokenize(f.readline, tok_eater)
   6.501 +    f.close()
   6.502 +    print_comment((0,0))
   6.503 +
   6.504 +    output("\n",(0,0))
   6.505 +    
   6.506 +    for n in ns:
   6.507 +        output("}  // end of namespace\n",(0,0))
   6.508 +
   6.509 +    if not module_has_docstring:
   6.510 +        # Put in default namespace documentation
   6.511 +        output('/** \\namespace '+root+' \n',(0,0))
   6.512 +        output('    \\brief Module "%s" */\n'%(root),(0,0))
   6.513 +
   6.514 +    for s in outbuffer:
   6.515 +        outfile.write(s)
   6.516 +
   6.517 +
   6.518 +def filterFile(filename, out=sys.stdout):
   6.519 +    global outfile
   6.520 +
   6.521 +    outfile = out
   6.522 +
   6.523 +    try:
   6.524 +        root,ext  = os.path.splitext(filename)
   6.525 +
   6.526 +        if ext==".py":
   6.527 +            filter(filename)
   6.528 +        else:
   6.529 +            dump(filename)
   6.530 +
   6.531 +#        sys.stderr.write("OK\n")
   6.532 +    except IOError,e:
   6.533 +        sys.stderr.write(e[1]+"\n")
   6.534 +
   6.535 +
   6.536 +######################################################################
   6.537 +
   6.538 +# preparePath
   6.539 +def preparePath(path):
   6.540 +    """Prepare a path.
   6.541 +
   6.542 +    Checks if the path exists and creates it if it does not exist.
   6.543 +    """
   6.544 +    if not os.path.exists(path):
   6.545 +        parent = os.path.dirname(path)
   6.546 +        if parent!="":
   6.547 +            preparePath(parent)
   6.548 +        os.mkdir(path)
   6.549 +
   6.550 +# isNewer
   6.551 +def isNewer(file1,file2):
   6.552 +    """Check if file1 is newer than file2.
   6.553 +
   6.554 +    file1 must be an existing file.
   6.555 +    """
   6.556 +    if not os.path.exists(file2):
   6.557 +        return True
   6.558 +    return os.stat(file1)[ST_MTIME]>os.stat(file2)[ST_MTIME]
   6.559 +
   6.560 +# convert
   6.561 +def convert(srcpath, destpath):
   6.562 +    """Convert a Python source tree into a C+ stub tree.
   6.563 +
   6.564 +    All *.py files in srcpath (including sub-directories) are filtered
   6.565 +    and written to destpath. If destpath exists, only the files
   6.566 +    that have been modified are filtered again. Files that were deleted
   6.567 +    from srcpath are also deleted in destpath if they are still present.
   6.568 +    The function returns the number of processed *.py files.
   6.569 +    """
   6.570 +    count=0
   6.571 +    sp = os.path.join(srcpath,"*")
   6.572 +    sfiles = glob.glob(sp)
   6.573 +    dp = os.path.join(destpath,"*")
   6.574 +    dfiles = glob.glob(dp)
   6.575 +    leftovers={}
   6.576 +    for df in dfiles:
   6.577 +        leftovers[os.path.basename(df)]=1
   6.578 +
   6.579 +    for srcfile in sfiles:
   6.580 +        basename = os.path.basename(srcfile)
   6.581 +        if basename in leftovers:
   6.582 +            del leftovers[basename]
   6.583 +
   6.584 +        # Is it a subdirectory?
   6.585 +        if os.path.isdir(srcfile):
   6.586 +            sdir = os.path.join(srcpath,basename)
   6.587 +            ddir = os.path.join(destpath,basename)
   6.588 +            count+=convert(sdir, ddir)
   6.589 +            continue
   6.590 +        # Check the extension (only *.py will be converted)
   6.591 +        root, ext = os.path.splitext(srcfile)
   6.592 +        if ext.lower()!=".py":
   6.593 +            continue
   6.594 +
   6.595 +        destfile = os.path.join(destpath,basename)
   6.596 +        if destfile==srcfile:
   6.597 +            print "WARNING: Input and output names are identical!"
   6.598 +            sys.exit(1)
   6.599 +
   6.600 +        count+=1
   6.601 +#        sys.stdout.write("%s\015"%(srcfile))
   6.602 +
   6.603 +        if isNewer(srcfile, destfile):
   6.604 +            preparePath(os.path.dirname(destfile))
   6.605 +#            out=open(destfile,"w")
   6.606 +#            filterFile(srcfile, out)
   6.607 +#            out.close()
   6.608 +            os.system("python %s -f %s>%s"%(sys.argv[0],srcfile,destfile))
   6.609 +
   6.610 +    # Delete obsolete files in destpath
   6.611 +    for df in leftovers:
   6.612 +        dname=os.path.join(destpath,df)
   6.613 +        if os.path.isdir(dname):
   6.614 +            try:
   6.615 +                shutil.rmtree(dname)
   6.616 +            except:
   6.617 +                print "Can't remove obsolete directory '%s'"%dname
   6.618 +        else:
   6.619 +            try:
   6.620 +                os.remove(dname)
   6.621 +            except:
   6.622 +                print "Can't remove obsolete file '%s'"%dname
   6.623 +
   6.624 +    return count
   6.625 +
   6.626 +
   6.627 +######################################################################
   6.628 +######################################################################
   6.629 +######################################################################
   6.630 +
   6.631 +filter_file = False
   6.632 +source_root = None
   6.633 +
   6.634 +try:
   6.635 +    opts, args = getopt.getopt(sys.argv[1:], "hfr:", ["help"])
   6.636 +except getopt.GetoptError,e:
   6.637 +    print e
   6.638 +    sys.exit(1)
   6.639 +
   6.640 +for o,a in opts:
   6.641 +    if o=="-f":
   6.642 +        filter_file = True
   6.643 +
   6.644 +    if o=="-r":
   6.645 +        source_root = os.path.abspath(a)
   6.646 +
   6.647 +if filter_file:
   6.648 +    # Filter the specified file and print the result to stdout
   6.649 +    filename = string.join(args)
   6.650 +    filterFile(os.path.abspath(filename))
   6.651 +else:
   6.652 +
   6.653 +    if len(args)!=2:
   6.654 +        sys.stderr.write("%s options input output\n"%(os.path.basename(sys.argv[0])))
   6.655 +        sys.exit(1)
   6.656 +
   6.657 +    # Filter an entire Python source tree
   6.658 +    print '"%s" -> "%s"\n'%(args[0],args[1])
   6.659 +    c=convert(args[0],args[1])
   6.660 +    print "%d files"%(c)
   6.661 +
     7.1 --- a/tools/examples/Makefile	Tue Sep 13 15:32:38 2005 +0000
     7.2 +++ b/tools/examples/Makefile	Tue Sep 13 15:33:37 2005 +0000
     7.3 @@ -25,7 +25,7 @@ XEN_SCRIPTS += block-phy
     7.4  XEN_SCRIPTS += block-file
     7.5  XEN_SCRIPTS += block-enbd
     7.6  
     7.7 -XEN_BOOT_DIR = /usr/lib/xen/boot
     7.8 +XEN_BOOT_DIR = /usr/$(LIBDIR)/xen/boot
     7.9  XEN_BOOT = mem-map.sxp
    7.10  
    7.11  XEN_HOTPLUG_DIR = /etc/hotplug
    7.12 @@ -37,12 +37,15 @@ build:
    7.13  install: all install-initd install-configs install-scripts install-boot \
    7.14  	 install-hotplug
    7.15  
    7.16 +xmexample.vmx: xmexample.vmx.in
    7.17 +	sed -e 's/@@LIBDIR@@/$(LIBDIR)/' < $< > $@
    7.18 +
    7.19  install-initd:
    7.20  	[ -d $(DESTDIR)/etc/init.d ] || $(INSTALL_DIR) $(DESTDIR)/etc/init.d
    7.21  	$(INSTALL_PROG) $(XEND_INITD) $(DESTDIR)/etc/init.d
    7.22  	$(INSTALL_PROG) $(XENDOMAINS_INITD) $(DESTDIR)/etc/init.d
    7.23  
    7.24 -install-configs:
    7.25 +install-configs: $(XEN_CONFIGS)
    7.26  	[ -d $(DESTDIR)$(XEN_CONFIG_DIR) ] || \
    7.27  		$(INSTALL_DIR) $(DESTDIR)$(XEN_CONFIG_DIR)
    7.28  	[ -d $(DESTDIR)$(XEN_CONFIG_DIR)/auto ] || \
    7.29 @@ -77,3 +80,4 @@ install-hotplug:
    7.30  	done
    7.31  
    7.32  clean:
    7.33 +	$(RM) xmexample.vmx
     8.1 --- a/tools/examples/xmexample.vmx	Tue Sep 13 15:32:38 2005 +0000
     8.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.3 @@ -1,96 +0,0 @@
     8.4 -#  -*- mode: python; -*-
     8.5 -#============================================================================
     8.6 -# Python configuration setup for 'xm create'.
     8.7 -# This script sets the parameters used when a domain is created using 'xm create'.
     8.8 -# You use a separate script for each domain you want to create, or 
     8.9 -# you can set the parameters for the domain on the xm command line.
    8.10 -#============================================================================
    8.11 -
    8.12 -#----------------------------------------------------------------------------
    8.13 -# Kernel image file.
    8.14 -kernel = "/usr/lib/xen/boot/vmxloader"
    8.15 -
    8.16 -# The domain build function. VMX domain uses 'vmx'.
    8.17 -builder='vmx'
    8.18 -
    8.19 -# Initial memory allocation (in megabytes) for the new domain.
    8.20 -memory = 128
    8.21 -
    8.22 -# A name for your domain. All domains must have different names.
    8.23 -name = "ExampleVMXDomain"
    8.24 -
    8.25 -# Which CPU to start domain on? 
    8.26 -#cpu = -1   # leave to Xen to pick
    8.27 -
    8.28 -# Optionally define mac and/or bridge for the network interfaces.
    8.29 -# Random MACs are assigned if not given.
    8.30 -#vif = [ 'mac=aa:00:00:00:00:11, bridge=xen-br0' ]
    8.31 -
    8.32 -#----------------------------------------------------------------------------
    8.33 -# Define the disk devices you want the domain to have access to, and
    8.34 -# what you want them accessible as.
    8.35 -# Each disk entry is of the form phy:UNAME,DEV,MODE
    8.36 -# where UNAME is the device, DEV is the device name the domain will see,
    8.37 -# and MODE is r for read-only, w for read-write.
    8.38 -
    8.39 -#disk = [ 'phy:hda1,hda1,r' ]
    8.40 -disk = [ 'file:/var/images/min-el3-i386.img,ioemu:hda,w' ]
    8.41 -
    8.42 -#----------------------------------------------------------------------------
    8.43 -# Set according to whether you want the domain restarted when it exits.
    8.44 -# The default is 'onreboot', which restarts the domain when it shuts down
    8.45 -# with exit code reboot.
    8.46 -# Other values are 'always', and 'never'.
    8.47 -
    8.48 -#restart = 'onreboot'
    8.49 -
    8.50 -#============================================================================
    8.51 -
    8.52 -
    8.53 -# New stuff
    8.54 -device_model = '/usr/lib/xen/bin/qemu-dm'
    8.55 -
    8.56 -# Advanced users only. Don't touch if you don't know what you're doing
    8.57 -memmap = '/usr/lib/xen/boot/mem-map.sxp'
    8.58 -
    8.59 -#-----------------------------------------------------------------------------
    8.60 -# Disk image for 
    8.61 -#cdrom=
    8.62 -
    8.63 -#-----------------------------------------------------------------------------
    8.64 -# boot on floppy (a), hard disk (c) or CD-ROM (d) 
    8.65 -#boot=[a|c|d]
    8.66 -#-----------------------------------------------------------------------------
    8.67 -#  write to temporary files instead of disk image files
    8.68 -#snapshot=1
    8.69 -
    8.70 -#----------------------------------------------------------------------------
    8.71 -# enable SDL library for graphics, default = 0
    8.72 -sdl=0
    8.73 -
    8.74 -#----------------------------------------------------------------------------
    8.75 -# enable VNC library for graphics, default = 1
    8.76 -vnc=1
    8.77 -
    8.78 -#----------------------------------------------------------------------------
    8.79 -# enable spawning vncviewer(only valid when vnc=1), default = 1
    8.80 -vncviewer=1
    8.81 -
    8.82 -#----------------------------------------------------------------------------
    8.83 -# no graphics, use serial port
    8.84 -#nographic=0
    8.85 -
    8.86 -
    8.87 -#-----------------------------------------------------------------------------
    8.88 -#   enable audio support
    8.89 -#enable-audio=1
    8.90 -
    8.91 -
    8.92 -#-----------------------------------------------------------------------------
    8.93 -#    set the real time clock to local time [default=0 i.e. set to utc]
    8.94 -#localtime=1
    8.95 -
    8.96 -
    8.97 -#-----------------------------------------------------------------------------
    8.98 -#    start in full screen
    8.99 -#full-screen=1   
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/tools/examples/xmexample.vmx.in	Tue Sep 13 15:33:37 2005 +0000
     9.3 @@ -0,0 +1,96 @@
     9.4 +#  -*- mode: python; -*-
     9.5 +#============================================================================
     9.6 +# Python configuration setup for 'xm create'.
     9.7 +# This script sets the parameters used when a domain is created using 'xm create'.
     9.8 +# You use a separate script for each domain you want to create, or 
     9.9 +# you can set the parameters for the domain on the xm command line.
    9.10 +#============================================================================
    9.11 +
    9.12 +#----------------------------------------------------------------------------
    9.13 +# Kernel image file.
    9.14 +kernel = "/usr/@@LIBDIR@@/xen/boot/vmxloader"
    9.15 +
    9.16 +# The domain build function. VMX domain uses 'vmx'.
    9.17 +builder='vmx'
    9.18 +
    9.19 +# Initial memory allocation (in megabytes) for the new domain.
    9.20 +memory = 128
    9.21 +
    9.22 +# A name for your domain. All domains must have different names.
    9.23 +name = "ExampleVMXDomain"
    9.24 +
    9.25 +# Which CPU to start domain on? 
    9.26 +#cpu = -1   # leave to Xen to pick
    9.27 +
    9.28 +# Optionally define mac and/or bridge for the network interfaces.
    9.29 +# Random MACs are assigned if not given.
    9.30 +#vif = [ 'mac=aa:00:00:00:00:11, bridge=xen-br0' ]
    9.31 +
    9.32 +#----------------------------------------------------------------------------
    9.33 +# Define the disk devices you want the domain to have access to, and
    9.34 +# what you want them accessible as.
    9.35 +# Each disk entry is of the form phy:UNAME,DEV,MODE
    9.36 +# where UNAME is the device, DEV is the device name the domain will see,
    9.37 +# and MODE is r for read-only, w for read-write.
    9.38 +
    9.39 +#disk = [ 'phy:hda1,hda1,r' ]
    9.40 +disk = [ 'file:/var/images/min-el3-i386.img,ioemu:hda,w' ]
    9.41 +
    9.42 +#----------------------------------------------------------------------------
    9.43 +# Set according to whether you want the domain restarted when it exits.
    9.44 +# The default is 'onreboot', which restarts the domain when it shuts down
    9.45 +# with exit code reboot.
    9.46 +# Other values are 'always', and 'never'.
    9.47 +
    9.48 +#restart = 'onreboot'
    9.49 +
    9.50 +#============================================================================
    9.51 +
    9.52 +
    9.53 +# New stuff
    9.54 +device_model = '/usr/@@LIBDIR@@/xen/bin/qemu-dm'
    9.55 +
    9.56 +# Advanced users only. Don't touch if you don't know what you're doing
    9.57 +memmap = '/usr/@@LIBDIR@@/xen/boot/mem-map.sxp'
    9.58 +
    9.59 +#-----------------------------------------------------------------------------
    9.60 +# Disk image for 
    9.61 +#cdrom=
    9.62 +
    9.63 +#-----------------------------------------------------------------------------
    9.64 +# boot on floppy (a), hard disk (c) or CD-ROM (d) 
    9.65 +#boot=[a|c|d]
    9.66 +#-----------------------------------------------------------------------------
    9.67 +#  write to temporary files instead of disk image files
    9.68 +#snapshot=1
    9.69 +
    9.70 +#----------------------------------------------------------------------------
    9.71 +# enable SDL library for graphics, default = 0
    9.72 +sdl=0
    9.73 +
    9.74 +#----------------------------------------------------------------------------
    9.75 +# enable VNC library for graphics, default = 1
    9.76 +vnc=1
    9.77 +
    9.78 +#----------------------------------------------------------------------------
    9.79 +# enable spawning vncviewer(only valid when vnc=1), default = 1
    9.80 +vncviewer=1
    9.81 +
    9.82 +#----------------------------------------------------------------------------
    9.83 +# no graphics, use serial port
    9.84 +#nographic=0
    9.85 +
    9.86 +
    9.87 +#-----------------------------------------------------------------------------
    9.88 +#   enable audio support
    9.89 +#enable-audio=1
    9.90 +
    9.91 +
    9.92 +#-----------------------------------------------------------------------------
    9.93 +#    set the real time clock to local time [default=0 i.e. set to utc]
    9.94 +#localtime=1
    9.95 +
    9.96 +
    9.97 +#-----------------------------------------------------------------------------
    9.98 +#    start in full screen
    9.99 +#full-screen=1   
    10.1 --- a/tools/ioemu/target-i386-dm/Makefile	Tue Sep 13 15:32:38 2005 +0000
    10.2 +++ b/tools/ioemu/target-i386-dm/Makefile	Tue Sep 13 15:33:37 2005 +0000
    10.3 @@ -3,7 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
    10.4  include config.mak
    10.5  override TARGET_ARCH=i386
    10.6  
    10.7 -INSTALL_DIR := $(DESTDIR)/usr/lib/xen/bin
    10.8 +INSTALL_DIR := $(DESTDIR)/usr/$(LIBDIR)/xen/bin
    10.9  TARGET_PATH=$(SRC_PATH)/target-$(TARGET_ARCH)
   10.10  VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw:$(SRC_PATH)/audio
   10.11  DEFINES=-I. -I$(TARGET_PATH) -I$(SRC_PATH) -I$(XEN_ROOT)/xen/include/public
    11.1 --- a/tools/python/Makefile	Tue Sep 13 15:32:38 2005 +0000
    11.2 +++ b/tools/python/Makefile	Tue Sep 13 15:33:37 2005 +0000
    11.3 @@ -1,7 +1,8 @@
    11.4 -
    11.5  XEN_ROOT = ../..
    11.6  include $(XEN_ROOT)/tools/Rules.mk
    11.7  
    11.8 +.PHONY: all build install clean
    11.9 +
   11.10  all: build
   11.11  build:
   11.12  	CFLAGS="$(CFLAGS)" python setup.py build
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/tools/python/pylintrc	Tue Sep 13 15:33:37 2005 +0000
    12.3 @@ -0,0 +1,307 @@
    12.4 +# lint Python modules using external checkers.                            
    12.5 +#                                                                                
    12.6 +#     This is the main checker controling the other ones and the reports         
    12.7 +#     generation. It is itself both a raw checker and an astng checker in order  
    12.8 +#     to:                                                                        
    12.9 +#     * handle message activation / deactivation at the module level             
   12.10 +#     * handle some basic but necessary stats'data (number of classes, methods...)
   12.11 +#                                                                                 
   12.12 +# This checker also defines the following reports:                                    
   12.13 +#   * R0001: Total errors / warnings                                              
   12.14 +#   * R0002: % errors / warnings by module                                        
   12.15 +#   * R0003: Messages                                                             
   12.16 +#   * R0004: Global evaluation                                                    
   12.17 +# 
   12.18 +[MASTER]
   12.19 +# Add <file or directory> to the black list. It should be a base name, not a
   12.20 +# path. You may set this option multiple times.
   12.21 +ignore=CVS
   12.22 +
   12.23 +# Pickle collected data for later comparisons.
   12.24 +persistent=yes
   12.25 +
   12.26 +# Set the cache size for astng objects.
   12.27 +cache-size=500
   12.28 +
   12.29 +
   12.30 +
   12.31 +[REPORTS]
   12.32 +# Tells wether to display a full report or only the messages
   12.33 +reports=yes
   12.34 +
   12.35 +# Use HTML as output format instead of text
   12.36 +html=no
   12.37 +
   12.38 +# Use a parseable text output format, so your favorite text editor will be able
   12.39 +# to jump to the line corresponding to a message.
   12.40 +parseable=no
   12.41 +
   12.42 +# Colorizes text output using ansi escape codes
   12.43 +color=no
   12.44 +
   12.45 +# Put messages in a separate file for each module / package specified on the
   12.46 +# command line instead of printing them on stdout. Reports (if any) will be
   12.47 +# written in a file name "pylint_global.[txt|html]".
   12.48 +files-output=no
   12.49 +
   12.50 +# Python expression which should return a note less than 10 (10 is the highest
   12.51 +# note).You have access to the variables errors warning, statement which
   12.52 +# respectivly contain the number of errors / warnings messages and the total
   12.53 +# number of statements analyzed. This is used by the global evaluation report
   12.54 +# (R0004).
   12.55 +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
   12.56 +
   12.57 +# Add a comment according to your evaluation note. This is used by the global
   12.58 +# evaluation report (R0004).
   12.59 +comment=no
   12.60 +
   12.61 +# Include message's id in output
   12.62 +include-ids=yes
   12.63 +
   12.64 +
   12.65 +
   12.66 +# checks for                                                              
   12.67 +#     * unused variables / imports                                               
   12.68 +#     * undefined variables                                                      
   12.69 +#     * redefinition of variable from builtins or from an outer scope            
   12.70 +#     * use of variable before assigment                                         
   12.71 +#     
   12.72 +[VARIABLES]
   12.73 +# Enable / disable this checker
   12.74 +enable-variables=yes
   12.75 +
   12.76 +# Tells wether we should check for unused import in __init__ files.
   12.77 +init-import=no
   12.78 +
   12.79 +# List of variable names used for dummy variables (i.e. not used).
   12.80 +dummy-variables=_,dummy
   12.81 +
   12.82 +
   12.83 +
   12.84 +# checks for :                                                            
   12.85 +#     * doc strings                                                              
   12.86 +#     * modules / classes / functions / methods / arguments / variables name     
   12.87 +#     * number of arguments, local variables, branchs, returns and statements in
   12.88 +# functions, methods                                                       
   12.89 +#     * required module attributes                                             
   12.90 +#     * dangerous default values as arguments                                    
   12.91 +#     * redefinition of function / method / class                                
   12.92 +#     * uses of the global statement                                             
   12.93 +#                                                                                 
   12.94 +# This checker also defines the following reports:                                    
   12.95 +#   * R0101: Statistics by type                                                   
   12.96 +# 
   12.97 +[BASIC]
   12.98 +# Enable / disable this checker
   12.99 +enable-basic=yes
  12.100 +
  12.101 +# Required attributes for module, separated by a comma
  12.102 +required-attributes=
  12.103 +
  12.104 +# Regular expression which should only match functions or classes name which do
  12.105 +# not require a docstring
  12.106 +no-docstring-rgx=.*
  12.107 +
  12.108 +# Minimal length for module / class / function / method / argument / variable
  12.109 +# names
  12.110 +min-name-length=1
  12.111 +
  12.112 +# Regular expression which should only match correct module names
  12.113 +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
  12.114 +
  12.115 +# Regular expression which should only match correct class names
  12.116 +class-rgx=[A-Z_][a-zA-Z0-9]+$
  12.117 +
  12.118 +# Regular expression which should only match correct function names
  12.119 +function-rgx=[a-z_][A-Za-z0-9_]*$
  12.120 +
  12.121 +# Regular expression which should only match correct method names
  12.122 +method-rgx=[a-z_][A-Za-z0-9_]*$
  12.123 +
  12.124 +# Regular expression which should only match correct argument names
  12.125 +argument-rgx=[a-z_][A-Za-z0-9_]*$
  12.126 +
  12.127 +# Regular expression which should only match correct variable names
  12.128 +variable-rgx=[a-z_][A-Za-z0-9_]*$
  12.129 +
  12.130 +# Good variable names which should always be accepted, separated by a comma
  12.131 +good-names=i,j,k,ex,Run,_
  12.132 +
  12.133 +# Bad variable names which should always be refused, separated by a comma
  12.134 +bad-names=foo,bar,baz,toto,tutu,tata
  12.135 +
  12.136 +# List of builtins function names that should not be used, separated by a comma
  12.137 +bad-functions=map,filter,apply,input
  12.138 +
  12.139 +
  12.140 +
  12.141 +# checks for sign of poor/misdesign:                                      
  12.142 +#     * number of methods, attributes, local variables...                        
  12.143 +#     * size, complexity of functions, methods                                   
  12.144 +#     
  12.145 +[DESIGN]
  12.146 +# Enable / disable this checker
  12.147 +enable-design=yes
  12.148 +
  12.149 +# Maximum number of arguments for function / method
  12.150 +max-args=15
  12.151 +
  12.152 +# Maximum number of locals for function / method body
  12.153 +max-locals=15
  12.154 +
  12.155 +# Maximum number of return / yield for function / method body
  12.156 +max-returns=6
  12.157 +
  12.158 +# Maximum number of branch for function / method body
  12.159 +max-branchs=12
  12.160 +
  12.161 +# Maximum number of statements in function / method body
  12.162 +max-statements=50
  12.163 +
  12.164 +# Maximum number of parents for a class (see R0901).
  12.165 +max-parents=7
  12.166 +
  12.167 +# Maximum number of attributes for a class (see R0902).
  12.168 +max-attributes=7
  12.169 +
  12.170 +# Minimum number of public methods for a class (see R0903).
  12.171 +min-public-methods=2
  12.172 +
  12.173 +# Maximum number of public methods for a class (see R0904).
  12.174 +max-public-methods=20
  12.175 +
  12.176 +
  12.177 +
  12.178 +# checks for :                                                            
  12.179 +#     * methods without self as first argument                                   
  12.180 +#     * overriden methods signature                                              
  12.181 +#     * access only to existant members via self                                 
  12.182 +#     * attributes not defined in the __init__ method                            
  12.183 +#     * supported interfaces implementation                                      
  12.184 +#     * unreachable code                                                         
  12.185 +#     
  12.186 +[CLASSES]
  12.187 +# Enable / disable this checker
  12.188 +enable-classes=yes
  12.189 +
  12.190 +# List of interface methods to ignore, separated by a comma. This is used for
  12.191 +# instance to not check methods defines in Zope's Interface base class.
  12.192 +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
  12.193 +
  12.194 +# Tells wether missing members accessed in mixin class should be ignored. A
  12.195 +# mixin class is detected if its name ends with "mixin" (case insensitive).
  12.196 +ignore-mixin-members=yes
  12.197 +
  12.198 +
  12.199 +
  12.200 +# checks for                                                              
  12.201 +#     * external modules dependencies                                            
  12.202 +#     * relative / wildcard imports                                                         
  12.203 +#     * cyclic imports                                                           
  12.204 +#     * uses of deprecated modules
  12.205 +#                                                                                 
  12.206 +# This checker also defines the following reports:                                    
  12.207 +#   * R0401: External dependencies                                                
  12.208 +#   * R0402: Modules dependencies graph                                           
  12.209 +# 
  12.210 +[IMPORTS]
  12.211 +# Enable / disable this checker
  12.212 +enable-imports=no
  12.213 +
  12.214 +# Deprecated modules which should not be used, separated by a comma
  12.215 +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
  12.216 +
  12.217 +# Create a graph of every (i.e. internal and external) dependencies in the given
  12.218 +# file (report R0402 must not be disabled)
  12.219 +import-graph=
  12.220 +
  12.221 +# Create a graph of external dependencies in the given file (report R0402 must
  12.222 +# not be disabled)
  12.223 +ext-import-graph=
  12.224 +
  12.225 +# Create a graph of internal dependencies in the given file (report R0402 must
  12.226 +# not be disabled)
  12.227 +int-import-graph=
  12.228 +
  12.229 +
  12.230 +
  12.231 +# checks for                                                              
  12.232 +#     * excepts without exception filter                                         
  12.233 +#     * string exceptions                                                        
  12.234 +#     
  12.235 +[EXCEPTIONS]
  12.236 +# Enable / disable this checker
  12.237 +enable-exceptions=yes
  12.238 +
  12.239 +
  12.240 +
  12.241 +# checks for :                                                            
  12.242 +#     * unauthorized constructions                                               
  12.243 +#     * strict indentation                                                       
  12.244 +#     * line length                                                              
  12.245 +#     * use of <> instead of !=
  12.246 +#     
  12.247 +[FORMAT]
  12.248 +# Enable / disable this checker
  12.249 +enable-format=no
  12.250 +
  12.251 +# Maximum number of characters on a single line.
  12.252 +max-line-length=80
  12.253 +
  12.254 +# Maximum number of lines in a module
  12.255 +max-module-lines=1000
  12.256 +
  12.257 +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 tab).
  12.258 +indent-string='    '
  12.259 +
  12.260 +
  12.261 +
  12.262 +# does not check anything but gives some raw metrics :                    
  12.263 +#     * total number of lines                                                    
  12.264 +#     * total number of code lines                                               
  12.265 +#     * total number of docstring lines                                          
  12.266 +#     * total number of comments lines                                           
  12.267 +#     * total number of empty lines                                              
  12.268 +#                                                                                 
  12.269 +# This checker also defines the following reports:                                    
  12.270 +#   * R0701: Raw metrics                                                          
  12.271 +# 
  12.272 +[METRICS]
  12.273 +# Enable / disable this checker
  12.274 +enable-metrics=yes
  12.275 +
  12.276 +
  12.277 +
  12.278 +# checks for:                                                             
  12.279 +#     * warning notes in the code like FIXME, XXX                                
  12.280 +#     * PEP 263: source code with non ascii character but no encoding declaration
  12.281 +#     
  12.282 +[MISCELLANEOUS]
  12.283 +# Enable / disable this checker
  12.284 +enable-miscellaneous=yes
  12.285 +
  12.286 +# List of note tags to take in consideration, separated by a comma. Default to
  12.287 +# FIXME, XXX, TODO
  12.288 +notes=FIXME,XXX,TODO
  12.289 +
  12.290 +
  12.291 +
  12.292 +# checks for similarities and duplicated code. This computation may be
  12.293 +#     memory / CPU intensive, so you should disable it if you experiments some
  12.294 +#     problems.
  12.295 +#                                                                                 
  12.296 +# This checker also defines the following reports:                                    
  12.297 +#   * R0801: Duplication                                                          
  12.298 +# 
  12.299 +[SIMILARITIES]
  12.300 +# Enable / disable this checker
  12.301 +enable-similarities=yes
  12.302 +
  12.303 +# Minimum lines number of a similarity.
  12.304 +min-similarity-lines=4
  12.305 +
  12.306 +# Ignore comments when computing similarities.
  12.307 +ignore-comments=yes
  12.308 +
  12.309 +
  12.310 +
    13.1 --- a/tools/python/xen/sv/DomInfo.py	Tue Sep 13 15:32:38 2005 +0000
    13.2 +++ b/tools/python/xen/sv/DomInfo.py	Tue Sep 13 15:33:37 2005 +0000
    13.3 @@ -75,7 +75,7 @@ class DomGeneralTab( CompositeTab ):
    13.4         
    13.5  class DomGenTab( GeneralTab ):
    13.6  
    13.7 -    def __init__( self, urlWriter ):
    13.8 +    def __init__( self, _ ):
    13.9      
   13.10          titles = {}
   13.11      
   13.12 @@ -103,7 +103,7 @@ class DomGenTab( GeneralTab ):
   13.13              
   13.14  class DomSXPTab( PreTab ):
   13.15  
   13.16 -    def __init__( self, urlWriter ):
   13.17 +    def __init__( self, _ ):
   13.18          self.dom = 0
   13.19          PreTab.__init__( self, "" )
   13.20  
   13.21 @@ -126,7 +126,7 @@ class DomSXPTab( PreTab ):
   13.22         
   13.23  class DomActionTab( ActionTab ):
   13.24  
   13.25 -    def __init__( self, urlWriter ):
   13.26 +    def __init__( self, _ ):
   13.27      	actions = { "shutdown" : "Shutdown",
   13.28          	    "reboot" : "Reboot",
   13.29                      "pause" : "Pause",
   13.30 @@ -188,19 +188,19 @@ class DomDeviceListTab( NullTab ):
   13.31  
   13.32      title = "Device List"
   13.33  
   13.34 -    def __init__( self, urlWriter ):
   13.35 +    def __init__( self, _ ):
   13.36          pass
   13.37  
   13.38  class DomDeviceOptionsTab( NullTab ):
   13.39  
   13.40      title = "Device Options"
   13.41  
   13.42 -    def __init__( self, urlWriter ):
   13.43 +    def __init__( self, _ ):
   13.44          pass
   13.45  
   13.46  class DomDeviceActionTab( ActionTab ):
   13.47  
   13.48 -    def __init__( self, urlWriter ):
   13.49 +    def __init__( self, _ ):
   13.50          ActionTab.__init__( self, { "addvcpu" : "Add VCPU", "addvbd" : "Add VBD", "addvif" : "Add VIF" } )
   13.51  
   13.52  class DomMigrateTab( CompositeTab ):
   13.53 @@ -218,7 +218,7 @@ class DomMigrateExtraTab( Sheet ):
   13.54                                                                                                              
   13.55  class DomMigrateActionTab( ActionTab ):
   13.56  
   13.57 -    def __init__( self, urlWriter ):
   13.58 +    def __init__( self, _ ):
   13.59          actions = { "migrate" : "Migrate" }
   13.60          ActionTab.__init__( self, actions )
   13.61                  
   13.62 @@ -249,7 +249,7 @@ class DomSaveExtraTab( Sheet ):
   13.63                 
   13.64  class DomSaveActionTab( ActionTab ):
   13.65  
   13.66 -    def __init__( self, urlWriter ):
   13.67 +    def __init__( self, _ ):
   13.68          actions = { "save" : "Save" }
   13.69          ActionTab.__init__( self, actions )
   13.70  
    14.1 --- a/tools/python/xen/xend/XendDomainInfo.py	Tue Sep 13 15:32:38 2005 +0000
    14.2 +++ b/tools/python/xen/xend/XendDomainInfo.py	Tue Sep 13 15:33:37 2005 +0000
    14.3 @@ -103,34 +103,6 @@ def shutdown_reason(code):
    14.4      """
    14.5      return shutdown_reasons.get(code, "?")
    14.6  
    14.7 -config_handlers = {}
    14.8 -
    14.9 -def add_config_handler(name, h):
   14.10 -    """Add a handler for a config field.
   14.11 -
   14.12 -    @param name:     field name
   14.13 -    @param h:        handler: fn(vm, config, field, index)
   14.14 -    """
   14.15 -    config_handlers[name] = h
   14.16 -
   14.17 -def get_config_handler(name):
   14.18 -    """Get a handler for a config field.
   14.19 -
   14.20 -    returns handler or None
   14.21 -    """
   14.22 -    return config_handlers.get(name)
   14.23 -
   14.24 -"""Table of handlers for devices.
   14.25 -Indexed by device type.
   14.26 -"""
   14.27 -device_handlers = {}
   14.28 -
   14.29 -def add_device_handler(name, type):
   14.30 -    device_handlers[name] = type
   14.31 -
   14.32 -def get_device_handler(name):
   14.33 -    return device_handlers[name]
   14.34 -
   14.35  def dom_get(dom):
   14.36      """Get info from xen for an existing domain.
   14.37  
   14.38 @@ -382,12 +354,6 @@ class XendDomainInfo:
   14.39  
   14.40      __repr__ = __str__
   14.41  
   14.42 -    def getDeviceTypes(self):
   14.43 -        return self.controllers.keys()
   14.44 -
   14.45 -    def getDeviceControllers(self):
   14.46 -        return self.controllers.values()
   14.47 -
   14.48      def getDeviceController(self, type, error=True):
   14.49          ctrl = self.controllers.get(type)
   14.50          if not ctrl and error:
   14.51 @@ -596,7 +562,7 @@ class XendDomainInfo:
   14.52  
   14.53      def sxpr_devices(self):
   14.54          sxpr = []
   14.55 -        for ty in self.getDeviceTypes():
   14.56 +        for ty in self.controllers.keys():
   14.57              devs = self.getDeviceSxprs(ty)
   14.58              sxpr += devs
   14.59          if sxpr:
   14.60 @@ -787,7 +753,7 @@ class XendDomainInfo:
   14.61          """Release all vm devices.
   14.62          """
   14.63          reboot = self.restart_pending()
   14.64 -        for ctrl in self.getDeviceControllers():
   14.65 +        for ctrl in self.controllers.values():
   14.66              if ctrl.isDestroyed(): continue
   14.67              ctrl.destroyController(reboot=reboot)
   14.68          t = xstransact("%s/device" % self.path)
   14.69 @@ -845,6 +811,7 @@ class XendDomainInfo:
   14.70          self.store_channel = self.eventChannel("store/port")
   14.71          self.console_channel = self.eventChannel("console/port")
   14.72  
   14.73 +
   14.74      def create_configured_devices(self):
   14.75          devices = sxp.children(self.config, 'device')
   14.76          for d in devices:
   14.77 @@ -852,18 +819,20 @@ class XendDomainInfo:
   14.78              if dev_config is None:
   14.79                  raise VmError('invalid device')
   14.80              dev_type = sxp.name(dev_config)
   14.81 -            ctrl_type = get_device_handler(dev_type)
   14.82 -            if ctrl_type is None:
   14.83 +
   14.84 +            if not controller.isDevControllerClass(dev_type):
   14.85                  raise VmError('unknown device type: ' + dev_type)
   14.86 -            self.createDevice(ctrl_type, dev_config)
   14.87 -        
   14.88 +            
   14.89 +            self.createDevice(dev_type, dev_config)
   14.90 +
   14.91 +
   14.92      def create_devices(self):
   14.93          """Create the devices for a vm.
   14.94  
   14.95          @raise: VmError for invalid devices
   14.96          """
   14.97          if self.rebooting():
   14.98 -            for ctrl in self.getDeviceControllers():
   14.99 +            for ctrl in self.controllers.values():
  14.100                  ctrl.initController(reboot=True)
  14.101          else:
  14.102              self.create_configured_devices()
  14.103 @@ -1014,7 +983,7 @@ class XendDomainInfo:
  14.104              msg = "Had a bootloader specified, but can't find disk"
  14.105              log.error(msg)
  14.106              raise VmError(msg)
  14.107 -        config = sxp.merge(['vm', blconfig ], self.config)
  14.108 +        config = sxp.merge(['vm', blcfg ], self.config)
  14.109          return config
  14.110  
  14.111      def configure_backends(self):
  14.112 @@ -1063,7 +1032,7 @@ class XendDomainInfo:
  14.113          for field in sxp.children(self.config):
  14.114              field_name = sxp.name(field)
  14.115              field_index = index.get(field_name, 0)
  14.116 -            field_handler = get_config_handler(field_name)
  14.117 +            field_handler = config_handlers.get(field_name)
  14.118              # Ignore unknown fields. Warn?
  14.119              if field_handler:
  14.120                  v = field_handler(self, self.config, field, field_index)
  14.121 @@ -1133,23 +1102,17 @@ class XendDomainInfo:
  14.122              # get run-time value of vcpus and update store
  14.123              self.exportVCPUSToDB(dom_get(self.id)['vcpus'])
  14.124  
  14.125 -def vm_field_ignore(vm, config, val, index):
  14.126 -    """Dummy config field handler used for fields with built-in handling.
  14.127  
  14.128 -    @param vm:        virtual machine
  14.129 -    @param config:    vm config
  14.130 -    @param val:       config field
  14.131 -    @param index:     field index
  14.132 +def vm_field_ignore(_, _1, _2, _3):
  14.133 +    """Dummy config field handler used for fields with built-in handling.
  14.134 +    Matches the signature required by config_handlers.
  14.135      """
  14.136      pass
  14.137  
  14.138 -def vm_field_maxmem(vm, config, val, index):
  14.139 -    """Configure vm memory limit.
  14.140  
  14.141 -    @param vm:        virtual machine
  14.142 -    @param config:    vm config
  14.143 -    @param val:       config field
  14.144 -    @param index:     field index
  14.145 +def vm_field_maxmem(vm, _1, val, _2):
  14.146 +    """Config field handler to configure vm memory limit.  Matches the
  14.147 +    signature required by config_handlers.
  14.148      """
  14.149      maxmem = sxp.child0(val)
  14.150      if maxmem is None:
  14.151 @@ -1160,8 +1123,10 @@ def vm_field_maxmem(vm, config, val, ind
  14.152          raise VmError("invalid maxmem: " + str(maxmem))
  14.153      xc.domain_setmaxmem(vm.id, maxmem_kb = maxmem * 1024)
  14.154  
  14.155 +
  14.156  #============================================================================
  14.157  # Register image handlers.
  14.158 +
  14.159  from image import          \
  14.160       addImageHandlerClass, \
  14.161       ImageHandler,         \
  14.162 @@ -1171,43 +1136,37 @@ from image import          \
  14.163  addImageHandlerClass(LinuxImageHandler)
  14.164  addImageHandlerClass(VmxImageHandler)
  14.165  
  14.166 -# Ignore the fields we already handle.
  14.167 -add_config_handler('name',       vm_field_ignore)
  14.168 -add_config_handler('memory',     vm_field_ignore)
  14.169 -add_config_handler('ssidref',    vm_field_ignore)
  14.170 -add_config_handler('cpu',        vm_field_ignore)
  14.171 -add_config_handler('cpu_weight', vm_field_ignore)
  14.172 -add_config_handler('restart',    vm_field_ignore)
  14.173 -add_config_handler('image',      vm_field_ignore)
  14.174 -add_config_handler('device',     vm_field_ignore)
  14.175 -add_config_handler('backend',    vm_field_ignore)
  14.176 -add_config_handler('vcpus',      vm_field_ignore)
  14.177 -add_config_handler('bootloader', vm_field_ignore)
  14.178  
  14.179 -# Register other config handlers.
  14.180 -add_config_handler('maxmem',     vm_field_maxmem)
  14.181 +"""Table of handlers for field configuration.
  14.182 +
  14.183 +field_name[String]: fn(vm, config, field, index) -> value(ignored)
  14.184 +"""
  14.185 +config_handlers = {
  14.186 +    
  14.187 +    # Ignore the fields we already handle.
  14.188 +    
  14.189 +    'name':       vm_field_ignore,
  14.190 +    'memory':     vm_field_ignore,
  14.191 +    'ssidref':    vm_field_ignore,
  14.192 +    'cpu':        vm_field_ignore,
  14.193 +    'cpu_weight': vm_field_ignore,
  14.194 +    'restart':    vm_field_ignore,
  14.195 +    'image':      vm_field_ignore,
  14.196 +    'device':     vm_field_ignore,
  14.197 +    'backend':    vm_field_ignore,
  14.198 +    'vcpus':      vm_field_ignore,
  14.199 +    'bootloader': vm_field_ignore,
  14.200 +    
  14.201 +    # Register other config handlers.
  14.202 +    'maxmem':     vm_field_maxmem
  14.203 +    }
  14.204 +
  14.205  
  14.206  #============================================================================
  14.207  # Register device controllers and their device config types.
  14.208  
  14.209 -from server import blkif
  14.210 -controller.addDevControllerClass("vbd", blkif.BlkifController)
  14.211 -add_device_handler("vbd", "vbd")
  14.212 -
  14.213 -from server import netif
  14.214 -controller.addDevControllerClass("vif", netif.NetifController)
  14.215 -add_device_handler("vif", "vif")
  14.216 -
  14.217 -from server import tpmif
  14.218 -controller.addDevControllerClass("vtpm", tpmif.TPMifController)
  14.219 -add_device_handler("vtpm", "vtpm")
  14.220 -
  14.221 -from server import pciif
  14.222 -controller.addDevControllerClass("pci", pciif.PciController)
  14.223 -add_device_handler("pci", "pci")
  14.224 -
  14.225 -from xen.xend.server import usbif
  14.226 -controller.addDevControllerClass("usb", usbif.UsbifController)
  14.227 -add_device_handler("usb", "usb")
  14.228 -
  14.229 -#============================================================================
  14.230 +controller.addDevControllerClass("vbd",  server.blkif.BlkifController)
  14.231 +controller.addDevControllerClass("vif",  server.netif.NetifController)
  14.232 +controller.addDevControllerClass("vtpm", server.tpmif.TPMifController)
  14.233 +controller.addDevControllerClass("pci",  server.pciif.PciController)
  14.234 +controller.addDevControllerClass("usb",  server.usbif.UsbifController)
    15.1 --- a/tools/python/xen/xend/XendVnet.py	Tue Sep 13 15:32:38 2005 +0000
    15.2 +++ b/tools/python/xen/xend/XendVnet.py	Tue Sep 13 15:33:37 2005 +0000
    15.3 @@ -145,7 +145,7 @@ class XendVnet:
    15.4      def vnet_get(self, id):
    15.5          """Get a vnet.
    15.6  
    15.7 -        @param id: vnet id
    15.8 +        @param id vnet id
    15.9          """
   15.10          id = str(id)
   15.11          return self.vnet.get(id)
    16.1 --- a/tools/python/xen/xend/scheduler.py	Tue Sep 13 15:32:38 2005 +0000
    16.2 +++ b/tools/python/xen/xend/scheduler.py	Tue Sep 13 15:33:37 2005 +0000
    16.3 @@ -20,8 +20,8 @@ import threading
    16.4  def later(delay, fn, args=(), kwargs={}):
    16.5      """Schedule a function to be called later.
    16.6  
    16.7 -    @param _delay: delay in seconds
    16.8 -    @param _fn:    function
    16.9 +    @param delay:  delay in seconds
   16.10 +    @param fn:     function
   16.11      @param args:   arguments (list)
   16.12      @param kwargs  keyword arguments (map)
   16.13      """
   16.14 @@ -32,7 +32,7 @@ def later(delay, fn, args=(), kwargs={})
   16.15  def now(fn, args=(), kwargs={}):
   16.16      """Schedule a function to be called now.
   16.17  
   16.18 -    @param _fn:    function
   16.19 +    @param fn:     function
   16.20      @param args:   arguments (list)
   16.21      @param kwargs  keyword arguments (map)
   16.22      """
    17.1 --- a/tools/python/xen/xend/server/controller.py	Tue Sep 13 15:32:38 2005 +0000
    17.2 +++ b/tools/python/xen/xend/server/controller.py	Tue Sep 13 15:33:37 2005 +0000
    17.3 @@ -63,6 +63,13 @@ def addDevControllerClass(name, cls):
    17.4      cls.type = name
    17.5      getDevControllerTable().addDevControllerClass(cls)
    17.6  
    17.7 +
    17.8 +def isDevControllerClass(name):
    17.9 +    """@return True if a device controller class has been registered with
   17.10 +    the controller table under the given name."""
   17.11 +    return name in getDevControllerTable().controllerClasses
   17.12 +
   17.13 +
   17.14  def createDevController(name, vm, recreate=False):
   17.15      return getDevControllerTable().createDevController(name, vm, recreate=recreate)
   17.16  
    18.1 --- a/tools/xenstore/xenstore_client.c	Tue Sep 13 15:32:38 2005 +0000
    18.2 +++ b/tools/xenstore/xenstore_client.c	Tue Sep 13 15:33:37 2005 +0000
    18.3 @@ -76,7 +76,7 @@ main(int argc, char **argv)
    18.4  	/* NOTREACHED */
    18.5      }
    18.6  #if defined(CLIENT_write)
    18.7 -    if ((argc - optind) % 1) {
    18.8 +    if ((argc - optind) % 2 == 1) {
    18.9  	usage(argv[0]);
   18.10  	/* NOTREACHED */
   18.11      }