summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorR. Bernstein <rocky@gnu.org>2008-11-29 00:56:26 -0500
committerR. Bernstein <rocky@gnu.org>2008-11-29 00:56:26 -0500
commit95f087cdc3e849ce033806441c249c3960f2790b (patch)
tree4fc58ff44337ca4a2eaa000c1c5074f0f7d63ee7 /doc
parent4ea407f7461bbc1c15bcf9ff4c6188dc1d7882a7 (diff)
First commit after CVS conversion. Should be just administrative changes.
Diffstat (limited to 'doc')
-rw-r--r--doc/.gitignore7
-rw-r--r--doc/Makefile.am46
-rw-r--r--doc/doxygen/.gitignore1
-rw-r--r--doc/doxygen/Doxyfile.in1302
-rwxr-xr-xdoc/doxygen/run_doxygen107
-rw-r--r--doc/fdl.texi451
-rw-r--r--doc/glossary.texi360
-rw-r--r--doc/libcdio.texi2421
8 files changed, 4695 insertions, 0 deletions
diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644
index 00000000..a07183bf
--- /dev/null
+++ b/doc/.gitignore
@@ -0,0 +1,7 @@
+/Makefile
+/Makefile.in
+/libcdio.info
+/mdate-sh
+/stamp-vti
+/texinfo.tex
+/version.texi
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 00000000..f8e72e86
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,46 @@
+# $Id: Makefile.am,v 1.9 2008/04/17 17:39:47 karl Exp $
+#
+# Copyright (C) 2003, 2004, 2008 Rocky Bernstein <rocky@gnu.org>
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+EXTRA_DIST = doxygen/Doxyfile.in doxygen/run_doxygen
+info_TEXINFOS = libcdio.texi
+libcdio_TEXINFOS = fdl.texi glossary.texi
+
+reference:
+ -( cd ${top_srcdir} && $(MAKE) doxygen )
+
+pdf: libcdio.pdf
+
+txt: libcdio.txt
+
+ps: libcdio.ps
+
+html: libcdio.html
+
+%.ps.gz: %.ps
+ gzip -9c $< > $@
+
+.texi.pdf:
+ texi2pdf $<
+
+.texi.html:
+ texi2html $<
+
+.texi.txt:
+ makeinfo --no-headers $< > $@
+
+all-formats: pdf dvi txt ps html
+
+MOSTLYCLEANFILES = libcdio.html libcdio.pdf libcdio.ps.gz
diff --git a/doc/doxygen/.gitignore b/doc/doxygen/.gitignore
new file mode 100644
index 00000000..eeb3b95d
--- /dev/null
+++ b/doc/doxygen/.gitignore
@@ -0,0 +1 @@
+/Doxyfile
diff --git a/doc/doxygen/Doxyfile.in b/doc/doxygen/Doxyfile.in
new file mode 100644
index 00000000..868137ee
--- /dev/null
+++ b/doc/doxygen/Doxyfile.in
@@ -0,0 +1,1302 @@
+# Doxyfile 1.5.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that
+# follow. The default is UTF-8 which is also the encoding used for all text before
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
+# possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = @PACKAGE@
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY =
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian,
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean,
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF = "The $name class " \
+ "The $name widget " \
+ "The $name file " \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH = @LIBCDIO_SOURCE_PATH@
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}',
+# where file will be replaced with the base name of the file that contains the anonymous
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ../../include/cdio/
+
+# This tag can be used to specify the character encoding of the source files that
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding.
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the output.
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used,
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = ../../example
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH
+# then you must also enable this option. If you don't then doxygen will produce
+# a warning and turn it on anyway
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code. Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = letter
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE = libcdio.xml
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to
+# be found in the default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will
+# generate a caller dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the number
+# of direct children of the root node in a graph is already larger than
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/doxygen/run_doxygen b/doc/doxygen/run_doxygen
new file mode 100755
index 00000000..1765ed59
--- /dev/null
+++ b/doc/doxygen/run_doxygen
@@ -0,0 +1,107 @@
+#!/bin/sh
+# $Id: run_doxygen,v 1.1 2003/11/09 14:11:02 rocky Exp $
+
+# Runs doxygen and massages the output files.
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+#
+# Synopsis: run_doxygen --mode=[user|maint|man] v3srcdir v3builddir
+#
+# Originally hacked together by Phil Edwards <pme@gcc.gnu.org>
+
+
+# We can check now that the version of doxygen is >= this variable.
+DOXYVER=1.2.15
+doxygen=
+
+find_doxygen() {
+ v_required=`echo $DOXYVER | \
+ awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'`
+ testing_version=
+ # thank you goat book
+ set `IFS=:; X="$PATH:/usr/local/bin:/bin:/usr/bin"; echo $X`
+ for dir
+ do
+ # AC_EXEEXT could come in useful here
+ maybedoxy="$dir/doxygen"
+ test -f "$maybedoxy" && testing_version=`$maybedoxy --version`
+ if test -n "$testing_version"; then
+ v_found=`echo $testing_version | \
+ awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'`
+ if test $v_found -ge $v_required; then
+ doxygen="$maybedoxy"
+ break
+ fi
+ fi
+ done
+ if test -z "$doxygen"; then
+ echo run_doxygen error: Could not find Doxygen $DOXYVER in path. 1>&2
+ print_usage
+ fi
+}
+
+print_usage() {
+ cat 1>&2 <<EOF
+Usage: run_doxygen --mode=MODE [<options>] <v3-src-dir> <v3-build-dir>
+ MODE is one of:
+ user Generate user-level HTML library documentation.
+ maint Generate maintainers' HTML documentation (lots more;
+ exposes non-public members, etc).
+ man Generate user-level man pages.
+
+ more options when i think of them
+
+Note: Requires Doxygen ${DOXYVER} or later; get it at
+ ftp://ftp.stack.nl/pub/users/dimitri/doxygen-${DOXYVER}.src.tar.gz
+
+EOF
+ exit 1
+}
+
+parse_options() {
+ for o
+ do
+ # Blatantly ripped from autoconf, er, I mean, "gratefully standing
+ # on the shoulders of those giants who have gone before us."
+ case "$o" in
+ -*=*) arg=`echo "$o" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) arg= ;;
+ esac
+
+ case "$o" in
+ --mode=*)
+ mode=$arg ;;
+ --mode | --help | -h)
+ print_usage ;;
+ *)
+ # this turned out to be a mess, maybe change to --srcdir=, etc
+ if test $srcdir = unset; then
+ srcdir=$o
+ elif test $outdir = unset; then
+ builddir=${o}
+ outdir=${o}/doc/doxygen
+ else
+ echo run_doxygen error: Too many arguments 1>&2
+ exit 1
+ fi
+ ;;
+ esac
+ done
+}
+
+
+# script begins here
+mode=unset
+srcdir=unset
+outdir=unset
+do_html=no
+do_man=no
+enabled_sections=
+DATEtext=`date '+%Y-%m-%d'`
+
+parse_options $*
+find_doxygen
+$doxygen ./Doxyfile
+
+exit 0
+
+# vim:ts=4:et:
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 00000000..96ce74ea
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,451 @@
+@c The GNU Free Documentation License.
+@center Version 1.2, November 2002
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification. Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/doc/glossary.texi b/doc/glossary.texi
new file mode 100644
index 00000000..c7d2c2f5
--- /dev/null
+++ b/doc/glossary.texi
@@ -0,0 +1,360 @@
+See also @uref{http://www.dvdrhelp.com/glossary}.
+
+@table @dfn
+
+@item ASPI
+@cindex ASPI
+See @acronym{Win32 ASPI}
+
+@item ATA
+
+Advanced Technology Attachment (ATA). The same things as IDE.
+
+@item ATAPI
+
+Advanced Technology Attachment (ATA) Packet Interface. The interface
+provides a mechanism for transferring and executing SCSI CDBs on IDE
+CD Drives and DVD Drives.
+
+IDE (also called ATA) was originally designed for hard drives only,
+but with help of ATAPI it is possible to connect other devices, in
+particular CD-ROMS to the IDE/EIDE connections.
+
+The ATAPI CD-ROM drives understand a subset of MMC commands. In
+particular multi-initiator commands are neither needed nor deviced for
+ATAPI devices.
+
+@item BIN/CUE
+
+A CD-image format developed by Jeff Arnold for CDRWIN software on
+Microsoft Windows. Many other programs subsequently support using this
+format. The @code{.CUE} file is a text file which contains CD format
+and track layout information, while the @code{.BIN} file holds the
+actual data of each track.
+
+@item CD
+Compact Disc
+
+@item CD-DA
+@cindex CD-DA
+Compact Disc Digital Audio, described in the ``Red Book'' or IEC 60908
+(formerly IEC 908). This commonly referred to as an audio @acronym{CD}
+and what most people think of when you play a @acronym{CD} as it was
+the first to use the @acronym{CD} medium.
+
+See @url{http://en.wikipedia.org/wiki/Red_Book_(audio_CD_standard)}
+
+@item CD+G
+@cindex CD+G
+
+Compact Disc + Graphics. An extension of the CD audio format contains
+a limited amount of graphics in subcode channels. This disc works in
+all audio players but the graphics portion is only available in a
+special CD+G or Karaoke player.
+
+@item CD-i
+@cindex CD-i
+
+Compact Disc Interactive. An extension of the CD format designed
+around a set-top computer that connects to a TV to provide interactive
+home entertainment, including digital audio and video, video games,
+and software applications. Defined by the ``Green Book'' standard.
+@uref{http://www.icdia.org/}. CD-i for video and video music has
+largely (if not totally) been superceded by VCDs.
+
+@item CD-i Bridge
+@cindex CD-i Bridge
+
+A standard allowing CD-ROM XA discs to play on CD-i. Kodak PhotoCDs
+are CD-XA Bridge discs.
+
+@item CD-ROM
+@cindex CD-ROM
+
+Compact Disc Read Only Memory or ``Yellow Book'' describe in Standards
+ISO/IEC 10149. The data stored on it can be either in the form of
+audio, computer or video files.
+
+@item CD-ROM Mode 1 and Mode2
+
+The Yellow Book specifies two types of tracks, Mode 1 and Mode 2. Mode
+1 is used for computer data and text and has an extra error correction
+layer. Mode 2 is for audio and video data and has no extra correction
+layer. CD-ROM/XA An expansion of the CD-ROM Mode 2 format that allows
+both computer and audio/video to be mixed in the same track.
+
+@item CD Text
+@cindex CD Text
+
+CD Text is a technology developed by Sony Corporation and Philips
+Electronics in 1996 that allows storing in an audio CD and its tracks
+information such as artist name, title, songwriter, composer, or
+arranger. Commercially available audio CDs sometimes contain CD Text
+information.
+
+@item CD XA
+@cindex CD XA
+
+CD-ROM EXtended Architecture. A modification to the CD-ROM
+specification that defines two new types of sectors. CD-ROM XA was
+developed jointly by Sony, Philips, and Microsoft, and announced in
+August 1988. Its specifications were published in an extension to the
+Yellow Book. CD-i, Photo CD, Video CD and CD-EXTRA have all
+subsequently been based on CD-ROM XA.
+
+CD-XA defines another way of formatting sectors on a CD-ROM, including
+headers in the sectors that describe the type (audio, video, data) and
+some additional info (markers, resolution in case of a video or audio
+sector, file numbers, etc).
+
+The data written on a CD-XA is consistent with and can be in ISO-9660
+file system format and therefore be readable by ISO-9660 file system
+translators. But also a CD-I player can also read CD-XA discs even if
+its own `Green Book' file system only resembles ISO 9660 and isn't
+fully compatible.
+
+@item Command Packet
+@cindex Command Packet
+
+The data structure that is used to issue an ATAPI command. The same
+thing as a SCSI Command Descriptor Block (CDB).
+
+@item FSF
+@cindex FSF
+
+Free Software Foundation, @uref{http://www.fsf.org/}
+
+@item GNU
+@cindex GNU
+
+@acronym{GNU} is not @acronym{UNIX}, @uref{http://www.gnu.org/}
+
+@item IDE
+
+Integrated Drive Electronics. This is a commonly used interface for
+hard disk drives and CD-ROM drives. It is less expensive than SCSI,
+but offers slightly less in terms of performance.
+
+@item ISO
+@cindex ISO
+
+International Standards Organization.
+
+@item ISO 9660
+@cindex ISO 9660
+
+The ISO 9660 is an operating-system independent filesystem format for
+CD-ROM media and DVD-ROMs. It was standardized in 1988 and replaced the
+High Sierra standard for the logical format on CD-ROM media (ISO 9660
+and High Sierra are identical in content, but the exact format is
+different).
+
+There are several specification levels. In Level 1, file names must be
+in the 8.3 format (no more than eight characters in the name, no more
+than three characters in the suffix) and in capital letters. Directory
+names can be no longer than eight characters. There can be no more
+than eight nested directory levels. Level 2 and 3 specifications allow
+file names up to 32 characters long.
+
+ECMA-119
+(@uref{http://www.ecma-international.org/publications/standards/Ecma-119.htm}
+is the European specification which is identical to ISO 9660.
+ISO 13490 is basically ISO 9660 with multisession support.
+
+@item Joliet extensions
+@cindex Joliet extensions
+
+This ISO-9660 upward-compatible standard was developed for Windows 95
+and Windows NT by Microsoft as an extension of ISO 9600 which allows
+the use of Unicode characters and supports file names up to 64
+characters.
+
+See @uref{http://bmrc.berkeley.edu/people/chaffee/jolspec.html} for
+the Joliet Specification.
+
+The name Joliet comes from the city in Illinois (U.S) that the
+standard was defined.
+
+@item LBA
+@cindex LBA
+
+Logical Block Addressing. Mapped integer numbers from CD Red Book
+Addressing MSF. The starting sector is -150 and ending sector is
+449849, which correlates directly to MSF: 00:00:00 to 99:59:74.
+Because an LBA is a single number it is often easier to work with in
+programming than an MSF.
+
+@item Lead in
+@cindex lead in
+
+The area of a CD where the Table Of Contents (TOC) and CD Text are
+stored. I think it is supposed to be around 4500 (1 min) or more
+sectors in length. On a CDR(W) the lead-in length is variable,
+because each manufacturer will have a different starting position
+indicated by the ATIP start of lead-in position that is recorded in
+the ATIP groove on the disk.
+
+@item LSN
+@cindex LSN
+
+Logical Sector Number. Mapped integer numbers from CD Red Book
+Addressing MSF. The starting sector is 0 and ending sector is 449699,
+which correlates to MSF: 00:00:00 to 99:59:74. Because an LSN is a
+single number it is often easier to work with in programming than an
+MSF. Because it starts at 0 rather than -150 as is the case of an LBA
+it can be represented as an unsigned value.
+
+@item MCN
+@cindex MCN
+
+Media Catalog Number. A identification number on an audio CD. Also
+called a UPC. Another identification number is ISRC.
+
+@item MMC
+@cindex MMC (Multimedia Commands)
+
+MMC (Multimedia Commands). A SCSI programming specification made by
+the SCSI committee T10 organization @url{http://www.t10.org/}. MMC
+are raw commands for communicating with CDROM drives, CD-Rewriters,
+DVD-Rewriters, etc.
+
+Many manufacturers have adopted this standard and it also applies to
+ATAPI versions of their drives.
+
+@item Mixed Mode CD
+@cindex Mixed Mode CD
+
+A Mixed Mode is a CD that contains tracks of differing CD-ROM Mode
+formats. In particular the first track may contain both computer data
+(Yellow Book) CD ROM data while the remaining tracks are audio or
+video data. Video CD's can be Mixed Mode CDs.
+
+@item Multisession
+@cindex Multisession
+
+A way of writing to a CD that allows more data to be
+added to readable discs at a later time.
+
+@item Nero NRG format file
+@cindex Nero NRG, CD-Image format
+
+A proprietary CD image file format use by a popular program for
+Microsoft Windows, Ahead Nero. The specification of this format is
+not to our knowlege published.
+
+@item Rock Ridge Extensions
+@cindex Rock Ridge extensions
+
+An extension to the ISO-9660 standard which adds POSIX information to files.
+
+@item SCSI
+@cindex SCSI
+
+Small Computer System Interface. A set of ANSI standard electronic
+interfaces (originally developed at Apple Computer) that allow
+personal computers to communicate with peripheral hardware such as
+CD-ROM drives, disk drives, printers, etc.
+
+@item SCSI CDB
+@cindex SCSI CDB
+
+SCSI Command Descriptor Block. The data structure that is used to
+issue a SCSI command.
+
+@item SCSI Pass Through Interface.
+@cindex SCSI Pass Through Interface.
+
+Yet another way of issuing MMC commands for accessing a CD-ROM. As
+with MMC or ASPI, the CD-ROM doesn't necessarily have to be a
+SCSI-attached drive. See also @acronym{MMC} and @acronym{ASPI}.
+
+@item Session
+
+A fully readable complete recording that contains one or more tracks
+of computer data or audio on a CD.
+
+@item SVCD
+@cindex Super VCD (SVCD)
+
+Super @acronym{VCD}
+
+An improvement of Video CD 2.0 specification which includes most
+notably a switch from @acronym{MPEG}-1 (constant bit rate encoding) to
+@acronym{MPEG}-2 (variable bit rate encoding) for the video stream.
+
+Also added was higher video-stream resolution, up to 4 overlay
+graphics and text (@dfn{OGT}) sub-channels for user switchable
+subtitle displaying, closed caption text, and command lists for
+controlling the @acronym{SVCD} virtual machine.
+
+See @uref{http://www.dvdrhelp.com/svcd}
+
+@item TOC
+@cindex TOC (CD Table of Contents)
+
+(Compact Disc) Table of Contents. The TOC contains the starting track
+number, last track number individual track starting time, and some
+track flags (copy protection, linear audio preemphasis, track format:
+CDDA or data). Every CD must have at least 1 TOC, the first TOC is
+always recorded at the start of the CD (lead-in area). A
+multi-session CD may have several TOCs.
+
+@item Track
+@cindex track
+
+A unit of data of a CD. The size of a track can vary; it can occupy
+the entire contents of the CD. Most CD standards however require that
+tracks have a 150 frame (or ``2 second'') lead-in gap.
+
+@item VCD
+@cindex Video CD (VCD)
+
+The Video Compact Disc (@dfn{Video CD} or @dfn{VCD}) is a standardized
+digital video storage format. It is based on the commonly available
+Compact Disc technology, which allows for low-cost video authoring.
+Video CD's can be played in most @acronym{DVD} standalone player,
+dedicated VCD players and finally, modern Personal Computers with
+multimedia support.
+
+A Video CD is made up of @acronym{CD-ROM XA} sectors,
+i.e. @acronym{CD-ROM} mode 2 form 1 & 2 sectors. Non-@acronym{MPEG} data
+is stored in mode 2 form 1 sectors with a user data area of 2048 byte,
+which have a similiar L2 error correction and detection
+(@acronym{ECC}/@acronym{EDC}) to @acronym{CD-ROM} mode 1 sectors. While
+realtime @acronym{MPEG} streams is stored in @acronym{CD-ROM} mode 2
+form 2 sectors, which by have no L2 @acronym{ECC}, yield a ~14% greater
+user data area consisting of 2324 bytes@footnote{actually raw mode 2
+sectors have a 2336 byte user data area, but parts of it are used for
+error codes and headers when using the mode 2 form 1 or form 2
+configurations.}
+
+@uref{http://www.dvdrhelp.com/vcd}
+
+@item Win32 ASPI
+@cindex ASPI
+
+The ASPI interface specification was developed by Adaptec for
+sending commands to a SCSI host adapter (such as those controlling CD
+and DVD drives) and used on Window 9x/NT and later. Emulation for
+ATAPI drives was added so that the same sets of commands worked those
+even though the drives might not be SCSI nor might there even be a
+SCSI controller attached.
+
+However in Windows NT/2K/XP, Microsoft provides their Win32 ioctl
+interface, and has take steps to make using ASPI more inaccessible
+(e.g. requiring adminstrative access to use ASPI).
+
+See also @acronym{MMC}
+
+@item Win32 ioctl driver
+
+Ioctl (Input Output ConTroLs). A Win32 function, implemented in all
+Microsoft Windows. It is used for sending commands to devices using
+defined codes and structures.
+
+@item XA
+@cindex XA
+
+See @acronym{CD-ROM XA}
+
+@end table
diff --git a/doc/libcdio.texi b/doc/libcdio.texi
new file mode 100644
index 00000000..8f83414f
--- /dev/null
+++ b/doc/libcdio.texi
@@ -0,0 +1,2421 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename libcdio.info
+@include version.texi
+@settitle GNU @code{libcdio}: Compact Disc Input and Control Library
+@c %**end of header
+
+@c Karl Berry informs me that this will add straight quotes in
+@c typewriter text.
+@c See the "Inserting Quote Characters" node in the Texinfo manual
+@set txicodequoteundirected
+@set txicodequotebacktick
+
+@copying
+This manual documents @code{libcdio}, the GNU CD Input and Control
+Library.
+
+Copyright @copyright{} 2003, 2004, 2005, 2006, 2007, 2008 Rocky
+Bernstein and Herbert Valerio Riedel.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end quotation
+@end copying
+
+@paragraphindent 0
+@exampleindent 0
+
+@set libcdio @code{libcdio}
+@set program @kbd{libcdio}
+
+@c A macro for defining terms variables.
+@macro term{varname}
+@c @cindex{\varname\}
+@emph{\varname\}
+@end macro
+
+@dircategory Software libraries
+@direntry
+* libcdio: (libcdio). GNU Compact Disc Input and Control Library.
+@end direntry
+
+@titlepage
+@title GNU @code{libcdio}
+@subtitle GNU Compact Disc Input and Control Library
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author Rocky Bernstein et al. (@email{bug-libcdio@@gnu.org})
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU @value{libcdio}
+
+This manual documents @value{libcdio}, the GNU CD Input and Control
+Library.
+
+@menu
+* History:: How this came about
+* Previous Work:: The problem and previous work
+* Purpose:: What is in this package (and what's not)
+* CD Formats:: A tour through the CD-specification spectrum
+* CD Image Formats:: A tour through various CD-image formats
+* CD Units:: The units that make up a CD
+* How to use:: Okay enough babble, lemme at the library!
+* Utility Programs:: Diagnostic programs that come with this library
+* CD-ROM Access and Drivers:: CD-ROM access and drivers
+* Internal Program Organization:: Looking under the hood
+
+Appendices
+* ISO-9660 Character Sets::
+* Glossary::
+* GNU Free Documentation License::
+
+Indices
+* General Index:: Overall index
+@end menu
+@end ifnottex
+
+@node History
+@chapter History
+
+As a result of the repressive Digital Millennium Copyright Act (DMCA)
+I became aware of Video CD's (VCD's). Video CD's are not subject to
+the DMCA and therefore enjoy the protection afforded by copyright but
+no more. But in order for VCD's to be competitive with DVD's, good
+tools (including GPL tools) are needed for authoring and playing
+them. And so through VCD's I became aware of the excellent Video CD
+tools by Herbert Valerio Riedel which form the @kbd{vcdimager} package.
+
+Although vcdimager is great for authoring, examining and extracting
+parts of a Video CD, it is not a VCD player. And when I looked at the
+state of Video CD handling in existing VCD players: @code{xine},
+@code{MPlayer}, and @code{vlc}, I was a bit disappointed. None handled
+playback control, menu selections, or playing still frames and
+segments from track 1.
+
+Version 0.7.12 of vcdimager was very impressive, however it lacked
+exportable libraries that could be used in other projects. So with the
+blessing and encouragement of Herbert Valerio Riedel, I took to
+extract and create libraries from this code base. The result was two
+libraries: one to extract information from a VCD which I called
+libvcdinfo, and another to do the reading and control of a VCD. Well,
+actually, at this point I should say that a Video CD is really just
+Video put on a existing well-established Compact Disc or CD format. So
+the library for this is called @value{libcdio} rather than
+@kbd{libvcdio}.
+
+While on the topic of the name @value{libcdio}, I should also explain that
+the library really doesn't handle writing or output (the final "o" in
+the name). However it was felt that if I put @code{libcdi} that might be
+confused with a particular CD format called CD-I.
+
+Later on, the ISO-9660 filesystem handling component from
+@kbd{vcdimager} was extracted, expanded and made a separate
+library. Next the ability to add MMC commands was added, and then
+CD paranoia support. And from there, the rest is history.
+
+@node Previous Work
+@chapter The problem and previous work
+
+If around the year 2002 you were to look at the code for a number of
+free software CD or media players that work on several platforms such as
+vlc, MPlayer, xine, or xmms to name but a few, you'd find the code to
+read a CD sprinkled with conditional compilation for this or that
+platform. That is there was @emph{no} OS-independent programmer
+library for CD reading and control even though the technology was over
+10 years old; yet there are media players which strive for OS
+independence.
+
+One early CD player, @kbd{xmcd} by Ti Kan, was I think a bit better
+than most in that it tried to @emph{encapsulate} the kinds of CD
+control mechanisms (SCSI, Linux ioctl, Toshiba, etc.) in a "CD Audio
+Device Interface Library" called @code{libdi}. However this library is for
+Audio CD's only and I don't believe this library has been used outside
+of xmcd.
+
+Another project, Simple DirectMedia Layer also encapsulates CD
+reading.
+
+@quotation
+SDL is a library that allows you portable low-level access to a video
+framebuffer, audio output, mouse, and keyboard. With SDL, it is easy
+to write portable games which run on ...
+@end quotation
+
+Many of the media players mentioned above do in fact can make use of
+the SDL library but for @emph{video} output only. Because the encapsulation
+is over @emph{many} kinds of I/O (video, joysticks, mice, as well as CD's),
+I believe that the level of control provided for CD a little bit
+limited. (However to be fair, it may have only been intended for games
+and may be suitable for that). Applications that just want the CD
+reading and control portion I think will find quite a bit overhead.
+
+Another related project is J@"org Schilling's SCSI library. You can
+use that to make a non-SCSI CD-ROM act like one that understands SCSI
+MMC commands which is a neat thing to do. However it is a little weird
+to have to install drivers just so you can run a particular user-level
+program. Installing drivers often requires special privileges and
+permissions and it is pervasive on a system. It is a little sad that
+along the way to creating such a SCSI library a library similar to
+@value{libcdio} wasn't created which could be used. Were that the
+case, this library certainly never would have been written.
+
+At the OS level there is the ``A Linux CD-ROM Standard'' by David van
+Leeuwen from around 1999. This defines a set of definitions and
+ioctl's that mask hardware differences of various Compact Disc
+hardware. It is a great idea, however this ``standard'' lacked
+adoption on OS's other than GNU/Linux. Or maybe it's the case that the
+standard on other OS's lacked adoption on GNU/Linux. For example on
+FreeBSD there is a ``Common Access Method'' (CAM) used for all SCSI
+access which seems not to be adopted in GNU/Linux.@footnote{And I'm
+thankful for that since, at least for MMC commands, it is
+inordinately complicated and in some places arcane.}
+
+Finally at the hardware level where a similar chaos exists, there has
+been an attempt to do something similar with the MMC (multimedia
+commands). This attempts to provide a uniform command set for CD
+devices like PostScript does for printer commands.@footnote{I wrote
+``attempts'' because over time the command set has changed and now
+there are several different commands to do a particular function like
+read a CD table of contents and some hardware understands some of the
+version of the commands set but might not others} In contrast to
+PostScript where there one in theory can write a PostScript program in
+a uniform ASCII representation and send that to a printer, for MMC
+although there are common internal structures defined, there is no
+common syntax for representing the structures or an OS-independent
+library or API for issuing MMC-commands which a programmer would need
+to use. Instead each Operating System has its own interface. For
+example Adaptec's ASPI or Microsoft's DeviceIoControl on Microsoft
+Windows, or IOKit for Apple's OS/X, or FreeBSD's CAM. I've been
+positively awed at how many different variations and differing levels
+of complexity there are for doing basically the same thing. How easy
+it is to issue an MMC command from a program varies from easy to very
+difficult. And mastering the boilerplate code to issue an MMC command
+on one OS really doesn't help much in figuring out how to do it on
+another OS. So in @value{libcdio} we provide a common (and hopefully
+simple) API to issue MMC commands.
+
+@node Purpose
+@chapter What is in this package (and what's not)
+
+The library, @command{libcdio}, encapsulates CD-ROM reading and
+control. Applications wishing to be oblivious of the OS- and
+device-dependent properties of a CD-ROM can use this library.
+
+Also included is a library, @command{libiso9660}, for working with
+ISO-9660 filesystems, @command{libcdio_paranoia}, and
+@command{libcdio_cdda} libraries for applications which want to use
+cdparanoia's error-correction and jitter detection.
+
+Some support for disk-image types like cdrdao's TOC, CDRWIN's BIN/CUE
+and Ahead Nero's NRG format is available, so applications that use this
+library also have the ability to read disc images as though they were
+CDs.
+
+@command{libcdio} also provides a way to issue SCSI ``MultiMedia
+Commands'' (MMC). MMC is supported by many hardware CD-ROM
+manufacturers; and in some cases where a CD-ROM doesn't understand MMC
+directly, some Operating Systems (such as GNU/Linux, Solaris, or
+FreeBSD or Microsoft Windows ASPI to name a few) provide the MMC
+emulation.@footnote{This concept of software emulation of a common
+hardware command language is common for printers such as using
+ghostscript to private postscript emulation for a non-postscript
+printer.}
+
+The first use of the library in this package are the Video CD
+authoring and ripping tools, VCDImager
+(@url{http://vcdimager.org}). See
+@url{http://www.gnu.org/software/libcdio/projects.html} for a list of
+projects using @command{libcdio}.
+
+A version of the CD-DA extraction tool cdparanoia
+(@url{http://www.xiph.org/paranoia} and its library which corrects
+for CD-ROM jitter are part of the distribution.
+
+Also included in the libcdio package is a utility program
+@command{cd-info} which displays CD information: number of tracks,
+CD-format and if possible basic information about the format. If
+libcddb (@url{http://libcddb.sourceforge.net}) is available, the
+@command{cd-info} program will display CDDB matches on CD-DA
+discs. And if a new enough version of libvcdinfo is available (from
+the vcdimager project), then @command{cd-info} shows basic VCD
+information.
+
+Other utility programs in the libcdio package are:
+
+@table @code
+
+@item @code{cdda-player}
+
+shows off @value{libcdio} audio and CD-ROM control commands. It can
+play a track, eject or load media and show the the status of a CD-DA
+that is might be currently played via the audio control commands. It
+can be run in batch mode or has a simple curses-based interface.
+
+If libcddb is available or a CD has CD-Text and your CD-ROM drive
+supports CD-Text, track/album information about the CD can be shown.
+
+@item @code{cd-drive}
+
+shows what drivers are available and some basic properties of
+cd-drives attached to the system. (But media may have to be inserted
+in order to get this info.) lists out drive capabilities
+
+@item cd-read
+performs low-level block reading of a CD or CD image,
+
+@item @code{iso-info}
+
+displays ISO-9660 information from an ISO-9660 image. Below is some
+sample output
+
+@smallexample
+iso-info version 0.72
+Copyright (c) 2003, 2004, 2005 R. Bernstein
+This is free software; see the source for copying conditions.
+There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE.
+__________________________________
+ISO 9660 image: ../test/joliet.iso
+Application: K3B THE CD KREATOR VERSION 0.11.12 (C) 2003 SEBASTIAN TRUEG AND THE K3B TEAM
+Preparer : K3b - Version 0.11.12
+Publisher : Rocky Bernstein
+System : LINUX
+Volume : K3b data project
+Volume Set : K3b data project
+__________________________________
+ISO-9660 Information
+/:
+ Oct 22 2004 19:44 .
+ Oct 22 2004 19:44 ..
+ Oct 22 2004 19:44 libcdio
+
+/libcdio/:
+ Oct 22 2004 19:44 .
+ Oct 22 2004 19:44 ..
+ Mar 12 2004 02:18 COPYING
+ Jun 26 2004 07:01 README
+ Aug 12 2004 06:22 README.libcdio
+ Oct 22 2004 19:44 test
+
+/libcdio/test/:
+ Oct 22 2004 19:44 .
+ Oct 22 2004 19:44 ..
+ Jul 25 2004 06:52 isofs-m1.cue
+@end smallexample
+
+@item @code{iso-read}
+
+extracts files from an ISO-9660 image.
+
+@end table
+
+At present, there is no support for writing CD's. Nor is there any
+support for reading or writing DVDs. For some of these, there are
+other libraries (e.g. @code{libdi}, @code{libscg}, or @code{libdvdread}) may be helpful.
+
+I'm not theoretically opposed to putting support like this into
+libcdio. However at present there are already many gaps in this
+package, so narrowing its scope in order to focus on these things I
+think is a good idea.
+
+@node CD Formats
+@chapter CD Formats
+
+Much of what I write in this section can be found elsewhere. See for
+example @url{http://www.pctechguide.com/08cd-rom.htm} or
+@url{http://www.pcguide.com/ref/cd/format.htm}
+
+We give just enough background here to cover Compact Discs and Compact
+Disc formats that are handled by this library.
+
+The Sony and Philips Corporations invented and Compact Disc (CD) in
+the early 1980s. The specifications for the layout is often referred
+to by the color of the cover on the specification.
+
+@menu
+* Red Book:: Red Book (CD-DA) CD Text, CDDB
+* Yellow Book:: Yellow Book (CD-ROM Digital Data)
+* Green Book:: Green Book (CD-i)
+* White Book:: White Book (DV, Video CD)
+@end menu
+
+@node Red Book
+@section Red Book (CD-DA)
+@cindex Red Book
+
+@menu
+* CD Text:: CD Text and CD+G
+* CDDB:: Internet CD Database (CDDB)
+@end menu
+
+The first type of CD that was produced was the Compact Disc Digital
+Audio (CD-DA) or just plain ``audio CD''. The specification, ICE 60908
+(formerly IEC 908) is commonly called the ``Red Book'',
+@cite{@url{http://en.wikipedia.org/wiki/Red_Book_(audio_CD_standard)}}. Music
+CD's are recorded in this format which basically allows for around 74
+minutes of audio per disc and for that information to be split up into
+tracks. Tracks are broken up into "sectors" and each sector contains
+up to 2,352 bytes. To play one 44.1 kHz CD-DA sampled audio second, 75
+sectors are used.
+
+The minute/second/frame numbering of sectors or MSF format is based on
+the fact that 75 sectors are used in a second of playing of
+sound. (And for almost every other CD format and application the MSF
+format doesn't make that much sense).
+
+In @value{libcdio} when you you want to read an audio sector, you call
+@code{cdio_read_audio_sector()} or @code{cdio_read_audio_sectors()}.
+
+@cindex subchannel
+In addition the the audio data ``channel'' a provision for other
+information or @term{subchannel} information) can be stored in a
+sector. Other subchannels include a Media Catalog Number (also
+abbreviated as MCN and sometimes a UPC), or album meta data (also
+called CD-Text). Karioke graphics can also be stored in a format
+called @term{CD+G}.
+
+@node CD Text
+@subsection CD Text, CD+G
+@cindex CD Text
+@cindex CD+G
+
+CD Text is an extension to the CD-DA standard that adds the ability to
+album and track meta data (titles, artist/performer names, song
+titles) and and graphical (e.g. Karaoke) information. For an
+alternative way to get album and track meta-data see @xref{CDDB}.
+
+Information is stored in such a way that it doesn't interfere with the
+normal operation of any CD players or CDROM drives. There are two
+different parts of the CD where the data can be stored.
+
+The first place the information can be recorded is in the R-W sub
+codes in the lead in area of the CD giving a data capacity of about
+5,000 ASCII characters (or 2,500 Kanji or Unicode characters). This
+information is stored as a single block of data and is the format used
+in virtually all of the CD Text CDs shipping today. The method for
+reading this data from a CDROM drive is covered under the Sony
+proposal to the MMC specification. The format of the data is partially
+covered in the MMC specification.
+
+The second place the information can be recorded is in the R-W sub
+codes in the program area of the CD giving a data capacity of roughly
+31MB. This information is stored in a format that follows the
+Interactive Text Transmission System (ITTS) which is the same data
+transmission standard used by such things as Digital Audio
+Broadcasting (DAB), and virtually the same as the data standard for
+the MiniDisc. Traditionally the R-W sub codes have been used for text
+and graphics in applications such as CD+G (CD w/graphics) or in the
+case of most audio CDs, not at all. The methods for reading this data
+from a CD-ROM drive is covered by the programming specs from the
+individual drive manufacturers. In the case of ATAPI drives, the
+SFF8020 spec covers the reading of the RW subcodes.
+
+Not all drives support reading the RW subcodes from the program
+area. However for those that do, @value{libcdio} provides a way to get
+at this information via @code{cdtext_get()} and its friends.
+
+@node CDDB
+@subsection Internet CD Database (CDDB)
+@cindex CDDB
+
+CDDB is an database on the Internet of of CD album/track, artist, and
+genre information similar to CD Text information. Using track
+information (number of tracks and length of the tracks), devices that
+have access to the Internet can query for meta information and
+contribute information for CD's where there is no existing
+information. When storage is available (such as you'd expect for any
+program using @value{libcdio}, the information is often saved for
+later use when the Internet is not available; people tend request the
+same information since they via programs play the same music.
+
+Obtaining CD meta information when none is encoded in an audio CD is
+useful in media players or making ones own compilations from audio
+CDs.
+
+There are currently two popular CDDB services on the Internet. The
+original database has been renamed Gracenote and is a profit making
+entity. FreeDB (@url{http://freedb.org} is an open source CD
+information resource that is free for developers and the public to
+use.
+
+As there already is an excellent library for handling CDDB libcddb
+(@url{http://libcddb.sourceforge.net} we suggest using that. Our
+utility program @command{cd-info} will make use it if it is available
+and it's what we use in our applications that need it.
+
+@node Yellow Book
+@section Yellow Book (CD-ROM Digital Data)
+The CD-ROM specification or the ``Yellow Book'' followed a few years
+later (Standards ISO/IEC 10149), and describes the extension of CD's
+to store computer data, i.e. CD-ROM (Compact Disk Read Only Memory).
+
+The specification in the Yellow Book defines two modes: Mode 1 and
+Mode 2.
+
+@menu
+* ISO 9660::
+* Mode 1:: Mode 1 Format
+* Mode 2:: Mode 2 Format
+@end menu
+
+@node ISO 9660
+@subsection ISO 9660
+@cindex ISO 9660
+
+@menu
+* ISO 9660 Level 1::
+* ISO 9660 Level 2::
+* ISO 9660 Level 3::
+* Joliet Extensions::
+* Rock Ridge Extensions::
+@end menu
+
+The Yellow Book doesn't specify how data is to be stored on a CD-ROM.
+It was feared that different companies would implement proprietary
+data storage formats using this specification, resulting in
+incompatible data CDs. To prevent this, representatives of major
+manufacturers met at the High Sierra Hotel and Casino in Lake Tahoe,
+NV, in 1985, to define a standard for storing data on CDs. This format
+was nicknamed High Sierra Format. In a slightly modified form it was
+later adopted as ISO the ISO 9660 standard. This standard is further
+broken down into 3 "levels", the higher the level, the more
+permissive.
+
+@node ISO 9660 Level 1
+@subsubsection ISO 9660 Level 1
+Level 1 ISO 9660 defines names in the 8+3 convention so familiar to
+MS-DOS: eight characters for the filename, a period, and then three
+characters for the file type, all in upper case. The allowed
+characters are A-Z, 0-9, ".", and "_".Level 1 ISO 9660 requires that
+files occupy a contiguous range of sectors. This allows a file to be
+specified with a start block and a count. The maximum directory depth
+is 8. For a table of the characters, see @xref{ISO-9660 Character
+Sets}.
+
+@node ISO 9660 Level 2
+@subsubsection ISO 9660 Level 2
+Level 2 ISO 9660 allows far more flexibility in filenames, but isn't
+usable on some systems, notably MS-DOS.
+
+@node ISO 9660 Level 3
+@subsubsection ISO 9660 Level 3
+Level 3 ISO-9660 allows non-contiguous files, useful if the file was
+written in multiple packets with packet-writing software.
+
+There have been a number of extensions to the ISO 9660 CD-ROM file
+format. One extension is Microsoft's Joliet specification, designed to
+resolve a number of deficiencies in the original ISO 9660 Level 1 file
+system, and in particular to support the long file names used in
+Windows 95 and subsequent versions of Windows.
+
+Another extension is the Rock Ridge Interchange Protocol (RRIP), which
+enables the recording of sufficient information to support POSIX File
+System semantics.
+
+@node Joliet Extensions
+@subsubsection Joliet Extensions
+@cindex Joliet extensions
+
+Joliet extensions were an upward-compatible extension to the ISO 9660
+specification that removes the limitation initially put in to deal
+with the limited filename conventions found in Microsoft DOS OS. In
+particular, the Joliet specification allows for long filenames and
+allows for UCS-BE (BigEndian Unicode) encoding of filenames which
+include mixed case letter, accented characters spaces and various
+symbols.
+
+The way all of this is encoded is by adding a second directory and
+filesystem structure in addition to or in parallels to original ISO
+9600 filesystem. The root node of the ISO 9660 filesystem is found via
+the @term{Primary Volume Descriptor} or @term{PVD}. The root of the
+Joliet-encode filesystem is found in a Supplementary Volume
+Descriptor or @term{SVD} defined in the ISO 9660 specification. The
+SVD structure is almost identical to a PVD with a couple of unused
+fields getting used and with the filename encoding changed to UCS-BE.
+
+@node Rock Ridge Extensions
+@subsubsection Rock Ridge Extensions
+@cindex Rock Ridge extensions
+
+Using the Joliet Extension one overcome the limitedness of the
+original ISO-9660 naming scheme. But another and probably better
+method is to use the Rock Ridge Extension. Not only can one store a
+filename as one does in a POSIX OS, but the other file attributes,
+such as the various timestamps (creation, modification, access), file
+attributes (user, group, file mode permissions, device type, symbolic
+links) can be stored. This is much as one would do in XA attributes;
+however the two are not completely interchangeable in the information
+they store: XA does @emph{not} address filename limitations, and the
+Rock Ridge extensions don't indicate if a sector is in Mode 1 or Mode
+2 format.
+
+The Rock Ridge extension makes use of a hook that was defined as part
+of the ISO 9660 standard.
+
+@node Mode 1
+@subsection Mode 1 (2048 data bytes per sector)
+@cindex Mode 1
+Mode 1 is the data storage mode used by to store computer data. There
+are 3 layers of error correction. A Compact Disc using only this format can
+hold at most 650 MB. The data is laid out in basically the same way as
+in and audio CD format, except that the 2,352 bytes of data in each
+block are broken down further. 2,048 of these bytes are for ``real''
+data. The other 304 bytes are used for an additional level of error
+detecting and correcting code. This is necessary because data CDs
+cannot tolerate the loss of a handful of bits now and then, the way
+audio CDs can.
+
+In @value{libcdio} when you you want to read a mode1
+sector you call the @code{cdio_read_mode1_sector()} or
+@code{cdio_read_mode1_sectors()}.
+
+@node Mode 2
+@subsection Mode 2 (2336 data bytes per sector)
+@cindex Mode 2
+Mode 2 data CDs are the same as mode 1 CDs except that the error
+detecting and correcting codes are omitted. So still there are 2
+layers of error correction. A Compact Disc using only this mode can
+thus hold at most 742 MB. Similar to audio CDs, the mode 2 format
+provides a more flexible vehicle for storing types of data that do not
+require high data integrity: for example, graphics and video can use
+this format. But in contrast to the Red Book standard, different modes
+can be mixed together; this is the basis for the extensions to the
+original data CD standards known as CD-ROM Extended Architecture, or
+CD-ROM XA. CD-ROM XA formats currently in use are CD-I Bridge
+formats, Photo CD and Video CD plus Sony's Playstation.
+
+In @value{libcdio} when you you want to read a mode1
+sector you call the @code{cdio_read_mode2_sector()} or
+@code{cdio_read_mode2_sectors()}.
+
+@node Green Book
+@section Green Book (CD-i)
+@cindex Green Book
+
+This was a CD-ROM format developed by Philips for CD-i (an obsolete
+embedded CD-ROM application allowing limited user user interaction
+with films, games and educational applications). The format is ISO
+9660 compliant and introduced mode 2 form 2 addressing. It also
+contains XA (Extended Architecture) attributes.
+
+Although some Green Book discs contain CD-i applications which can
+only be played on a CD-i player, others have films or music
+videos. Video CDs in Green-Book format are labeled "Digital Video on
+CD." The Green Book for video is largely superseded by White book
+CD-ROM which draws on this specification.
+
+
+@node White Book
+@section White Book (DV, Video CD)
+@cindex Green Book
+
+The White Book was released by Sony, Philips, Matsushita, and JVC in
+1993, defines the Video CD specification. The White Book is also known
+as Digital Video (DV).
+
+A Video CD contains one data track recorded in CD-ROM XA Mode 2 Form
+2. It is always the first track on the disc (Track 1). The ISO-9660
+file structure and a CD-i application program are recorded in this
+track, as well as the Video CD Information Area which gives general
+information about the Video Compact Disc. After the data track, video
+is written in one or more subsequent tracks within the same
+session. These tracks are also recorded in Mode 2 Form 2.
+
+In @value{libcdio} when you you want to read a mode2 format 2 audio
+sector you call the @code{cdio_read_mode2_sector()} or
+@code{cdio_read_mode2_sectors()} setting @code{b_form2} to @code{true}.
+
+@node CD Image Formats
+@chapter CD Image Formats
+
+@menu
+* CDRDAO TOC Format::
+* CDRWIN BIN/CUE Format::
+* NRG Format::
+@end menu
+
+In both the @command{cdrdao} and bin/cue formats there is one meta-file with
+extensions @code{.toc} or @code{.cue} respectively and one or more
+files (often with the extension @code{.bin}) which contains the
+content of tracks. The format of the track data is often
+interchangeable between the two formats. For example, in
+@value{libcdio}'s regression tests we make use of this to reduce the
+size of the test data and just provide alternate meta-data files
+(@code{.toc} or @code{.cue}).
+
+In contrast to the first two formats, the NRG format consists of a
+single file. This has the advantage of being a self-contained
+unit: in the other two formats it is possible for the meta file to
+refer to a file that can't be found. A disadvantage of the NRG format
+is that the meta data can't be easily viewed or modified say in a text
+file as it can be with the first two formats. In conjunction with this
+disadvantage is another disadvantage that the format is not
+documented, so how @value{libcdio} interprets an NRG image is based on
+inference. It is recommended that one of the other forms be used
+instead of NRG where possible.
+
+@node CDRDAO TOC Format
+@section CDRDAO TOC Format
+
+This is @command{cdrdao}'s CD-image description format. Since this
+program is GPL and everything about it is in the open, it is the
+preferred format to use. (Alas, at present it isn't as well supported
+in @value{libcdio} as the BIN/CUE format.)
+
+The @emph{toc}-file describes what data is written to the media in the
+@acronym{CD-ROM}; it allows control over track/index positions,
+pre-gaps and sub-channel information. It is a text file, so a text
+editor can be used to create, view or modify it.
+
+The @cite{cdrdao(1) manual page}, contains more information about this
+format.
+
+@subsection CDRDAO Grammar
+
+Below are the lexical tokens and grammar for a cdrdao TOC. It was
+taken from the cdrdao's pacct grammar; the token and nonterminal names
+are the same.
+
+@example
+#lexclass START
+#token Eof "@@"
+#token "[\t\r\ ]+"
+#token Comment "//~[\n@@]*"
+#token "\n"
+#token BeginString "\""
+#token Integer "[0-9]+"
+#tokclass AudioFile @{ "AUDIOFILE" "FILE" @}
+
+#lexclass STRING
+#token EndString "\""
+#token StringQuote "\\\""
+#token StringOctal "\\[0-9][0-9][0-9]"
+#token String "\\"
+#token String "[ ]+"
+#token String "~[\\\n\"\t ]*"
+@end example
+
+@example
+
+<toc> ::= ( "CATALOG" <string> | <tocType> )* @{ <cdTextGlobal> @}
+ ( <track> )+ Eof
+
+<track> ::= "TRACK" <trackMode>
+ @{ <subChannelMode> @}
+ ( "ISRC" <string> | @{ "NO" @} "COPY" | @{ "NO" @} "PRE_EMPHASIS"
+ | "TWO_CHANNEL_AUDIO" | "FOUR_CHANNEL_AUDIO" )*
+ @{ <cdTextTrack> @}
+ @{ "PREGAP" <msf> @}
+ ( <subTrack> | "START" @{ msf @} | "END" @{ msf @} )+
+ ( "INDEX" <msf> )*
+
+<subTrack> ::=
+ AudioFile <string> @{ "SWAP" @} @{ "#" <sLong> @} <samples>
+ | "DATAFILE" <string> @{ "#" <sLong> @{ <dataLength> @} @}
+ | "FIFO" <string> <dataLength>
+ | "SILENCE" <samples>
+ | "ZERO" @{ dataMode @} @{ <subChannelMode> @} <dataLength>
+
+
+<string> ::= BeginString ( String | StringQuote | StringOctal )+
+ EndString
+
+<stringEmpty> ::= BeginString ( String | StringQuote | StringOctal )*
+ EndString
+
+<uLong> ::= Integer
+
+<sLong> ::= Integer
+
+<msf> ::= Integer ":" Integer ":" Integer
+
+<samples> ::= <msf> | <uLong>
+
+<dataLength> ::= <msf> | <uLong>
+
+<dataMode> ::= "AUDIO" | "MODE0" | "MODE1" | "MODE1_RAW" | "MODE2"
+ | "MODE2_RAW" | "MODE2_FORM1" | "MODE2_FORM2" | "MODE2_FORM_MIX"
+
+<trackMode> ::= "AUDIO" | "MODE1" | "MODE1_RAW" | "MODE2"
+ | "MODE2_RAW" | "MODE2_FORM1" | "MODE2_FORM2" | "MODE2_FORM_MIX"
+
+<subChannelMode> ::= "RW" | "RW_RAW"
+
+<tocType> ::= "CD_DA" | "CD_ROM" | "CD_ROM_XA" | "CD_I"
+
+<packType> ::= "TITLE" | "PERFORMER" | "SONGWRITER" | "COMPOSER" | "ARRANGER"
+ | "MESSAGE" | "DISC_ID" | "GENRE" | "TOC_INFO1" | "TOC_INFO2"
+ | "RESERVED1" | "RESERVED2" | "RESERVED3" | "RESERVED4" | "UPC_EAN" |
+ "ISRC" | "SIZE_INFO"
+
+<binaryData> ::= "@{"
+ @{ Integer ( "," Integer )* @}
+ "@}"
+
+<cdTextItem> ::= <packType> ( <stringEmpty> | <binaryData> )
+
+<cdTextBlock> ::= "LANGUAGE" Integer "@{" ( <cdTextItem> )* "@}"
+
+<cdTextLanguageMap> ::=
+ "LANGUAGE_MAP" "@{"
+ ( Integer ":" ( Integer | "EN" ) )+
+ "@}"
+
+<cdTextTrack> ::= "CD_TEXT" "@{" ( <cdTextBlock> )* "@}"
+
+<cdTextGlobal> ::= "CD_TEXT" "@{" @{ <cdTextLanguageMap> @} ( <cdTextBlock> )* "@}"
+@end example
+
+
+
+@node CDRWIN BIN/CUE Format
+@section CDRWIN BIN/CUE Format
+@cindex BIN/CUE, CD Image Format
+
+The format referred to as @emph{CDRWIN BIN/CUE Format} in this manual
+is a popular CD image format used in the @acronym{PC} world. Not
+unlike @command{cdrdao}'s TOC file, the @emph{cue} file describes the
+track layout, i.e. how the sectors are to be placed on the CD
+media. The @emph{cue} file usually contains a reference to a file
+traditionally having the @file{.bin} extension in its filename, the
+@emph{bin} file. This @emph{bin} file contains the sector data payload
+which is to be written to the CD medium according to the description
+in the @emph{cue} file.
+
+The following is an attempt to describe the subset of the @file{.cue}
+file syntax used in @value{libcdio} and vcdimager in an EBNF-like
+notation:
+
+@subsection BIN/CUE Grammar
+
+@example
+@cartouche
+<cue-document> ::= +( <file-line> +<track-expr> )
+
+<digit> ::= "0" | "1" ... "8" | "9"
+<number> ::= +<digit>
+<msf> ::= <digit><digit> ":" <digit><digit> ":" <digit><digit>
+
+<file-line> ::= "FILE" <pathname-expr> <file-type> <EOL>
+
+<pathname-expr> ::= [ "\"" ] <pathname-str-without-spaces> [ "\"" ]
+ | "\"" <pathname-str> "\""
+
+<file-type> ::= "BINARY"
+
+<track-expr> ::= <track-line> [ <flag-line> ]
+ [ <pregap-line> ] *<index-line> [ <postgap-line> ]
+
+<flag-line> ::= "FLAGS" *<flag-type> <EOL>
+<flag-type> ::= "DCP"
+
+<track-line> ::= "TRACK" <number> <track-type> <EOL>
+
+<pregap-line> ::= "PREGAP" <msf> <EOL>
+
+<index-line> ::= "INDEX" <number> <msf> <EOL>
+
+<postgap-line> ::= "POSTGAP" <msf> <EOL>
+
+<track-type> ::= "AUDIO" | "MODE1/2048" | "MODE1/2352"
+ | "MODE2/2336" | "MODE2/2352"
+
+<comment-line> ::= "REM" *<char> <EOL>
+@end cartouche
+@end example
+
+@node NRG Format
+@section NRG Format
+@cindex Nero NRG, CD-Image format
+
+The format referred to as @emph{NRG Format} in this manual is another
+popular CD image format. It is available only on Nero software
+on a Microsoft Windows Operating System. It is proprietary and not
+generally published, so the information we have comes from guessing
+based on sample CD images. So support for this is incomplete and using
+this format is not recommended.
+
+Unlike @command{cdrdao}'s TOC file the BIN/CUE format everything is
+contained in one file. that one can edit Meta information such as the
+number of tracks and track format is contained at the end of the
+file. This information is not intended to be edited through a text
+editor.
+
+@node CD Units
+@chapter The units that make up a CD
+
+@menu
+* Tracks:: Tracks
+* Sectors:: Block addressing (MSF, LSN, LBA)
+* Pre-gaps:: Track pre-gaps
+@end menu
+
+@node Tracks
+@section tracks --- disc subdivisions
+@cindex track
+@cindex gaps
+
+In this section we describe CD properties and terms that we make use
+of in @value{libcdio}.
+
+A CD is formatted into a number of @term{tracks}, and a CD can hold at
+most 99 such tracks. This is defined by @code{CDIO_CD_MAX_TRACKS} in
+@file{cdio/sector.h}. Between some tracks CD specifications require a
+``2 second'' in gap (called a @term{lead-in gap}. This is unused space
+with no ``data'' similar to the space between tracks on an old
+phonograph. The word ``second'' here really refers to a measure of
+space and not really necessarily an amount of time. However in the
+special case that the CD encodes an audio CD or CD-DA, the amount of
+time to play a gap of this size will take 2 seconds.
+
+@cindex lead out
+The beginning (or inner edge) of the CD is supposed to have a ``2
+second'' lead-in gap and there is supposed to be another ``2 second''
+@term{lead-out} gap at the end (or outer edge) of the CD.
+
+People have discovered that they can put useful data in the @term{lead-in}
+and @term{lead-out} gaps, and their equipment can read this, violating
+the standards but allowing a CD to store more data.
+
+In order to determine the number of tracks on a CD and where they
+start, commands are used to get this table-of-contents or @term{TOC}
+information. Asking about the start of the @term{lead-out track}
+gives the amount of data stored on the Compact Disk. To make it easy
+to specify this leadout track, special constant 0xAA (decimal 170) is
+used to indicate it. This is safe since this is higher than the
+largest legal track position. In @value{libcdio},
+@code{CDIO_CDROM_LEADOUT_TRACK} is defined to be this special value.
+
+@node Sectors
+@section block addressing (MSF, LSN, LBA)
+@cindex MSF
+@cindex LSN
+@cindex LBA
+@cindex sectors
+@cindex frames
+
+A track is broken up into a number of 2352-byte @emph{blocks} which we
+sometimes call @emph{sectors} or @emph{frames}. Whereas tracks may
+have a gap between them, a block or sector does not. (In
+@value{libcdio} the block size constant is defined using
+@code{CDIO_CD_FRAMESIZE_RAW}).
+
+A Compact Disc has a limit on the number of blocks or sectors. This
+values is defined by constant @code{CDIO_CD_MAX_LSN} in
+@file{cdio/sector.h}.
+
+One can addressing a block in one of three formats. The oldest format
+is by it's minute/second/frame number, also referred to as @term{MSF}
+and written in time-like format MM:SS:FF (e.g. 30:01:40). It is best
+suited in audio (Red Book) applications. In @value{libcdio}, the type
+@code{msf_t} can be used to declare variables to hold such
+values. Minute, second and frame values are one byte @emph{and stored
+BCD notation}.@footnote{Perhaps this is a @value{libcdio} design
+flaw. It was originally done I guess because it was convenient for
+VCDs.} There are @value{libcdio} conversion routines
+@code{cdio_from_bcd8()} and @code{cdio_to_bcd8()} to convert the
+minute, second, and frame values into or out of integers. If you want
+to print a field in a BCD-encoded MSF, one can use the format
+specifier @code{%x} @emph{(not @code{%d})} and things will come out
+right.
+
+In the MSF notation, there are 75 ``frames'' in a ``second,'' and the
+familiar (if awkward) 60 seconds in a minute. @emph{Frame} here is
+what we called a @emph{block} above. The CD specification defines
+``frame'' to be @emph{another} unit which makes up a block. Very
+confusing. A frame is also sometimes called a sector, analogous to
+hard-disk terminology.
+
+Even more confusing is using this time-like notation for an address or
+for a length. Too often people confuse the MSF notation this with an
+amount of time. A ``second'' (or @code{CDIO_CD_FRAMES_PER_SEC} blocks)
+in this notation is only a second of playing time for something
+encoded as CD-DA. It does @emph{not} necessarily represent the amount
+time that it will take to play a of Video CD---usually you need more
+blocks than this. Nor does it represent the amount of data used to
+play a second of an MP3---usually you need fewer blocks than this. It
+is also not the amount of time your CD-ROM will take to read a
+``second'' of data off a Compact Disc: for example a 12x CD player
+will read 12x @code{CDIO_CD_FRAMES_PER_SEC}
+@code{CDIO_CD_FRAMSIZE_RAW}-byte blocks in a one second of time.
+
+When programming, unless one is working with a CD-DA (and even here,
+only in a time-like fashion), is generally more cumbersome to use an
+MSF rather than a LBA or LSN described below, since subtraction of two
+MSF's has the awkwardness akin to subtraction using Roman Numerals.
+
+Probably the simplest way to address a block is to use its @term{LSN}
+or ``logical sector number.'' This just numbers the blocks usually
+from 0 on. @emph{fix me: LSNs can be negative up to the pregap size?}
+The Lead-in and Lead-out gaps described above have LSNs just like any
+other space on a CD. The last unit of address is a @term{LBA}. It is
+the same as a LSN but the 150 blocks associated with the initial
+lead-in is are not counted. So to convert a LBA into an LSN you just
+add 150. Why the distinction between LBA and LSN? I don't know,
+perhaps this has something to do with ``multisession'' CDs.
+
+@node Pre-gaps
+@section track pre-gaps -- @acronym{CD-DA} discs and gaps
+@cindex CD-DA
+@cindex gaps
+@cindex lead in
+@cindex lead out
+@cindex pre-gap
+@cindex Q sub-channel
+
+Gaps are possibly one of the least understood topics in audio discs.
+In the case of @acronym{CD-DA} discs, standards require a silent 2
+second gap before the first audio track and after the last audio track
+(in each session.) These are respectively referred to as
+@term{lead-in} and @term{lead-out} gaps. No other gaps are required.
+It is important not to confuse the required @term{lead-in} and
+@term{lead-out} gaps with the optional track @term{pre-gap}s. Track
+@term{pre-gap}s are the gaps that may occur between audio tracks.
+Typically, track @term{pre-gap}s are filled with silence so that the
+listener knows that one song has ended, and the next will soon begin.
+However, track @term{pre-gap}s do not have to contain silence. One
+exception is an audio disc of a live performance. Because the
+performer may seamlessly move from one piece of the performance to the
+next, it would be unnatural for the disc to contain silence between
+the two pieces. Instead, the track number updates with no
+interruption in the performance. This allows the listener to either
+hear the entire performance without unnatural interruptions, or to
+conveniently skip to certain pieces of the performance. Finally, some
+@acronym{CD-DA} discs--whose behavior will be described below--lack
+track @term{pre-gap}s altogether although they must still include the
+@term{lead-in} and @term{lead-out} gaps.
+
+In order to understand the track @term{pre-gap}s that occur between
+audio tracks, it is necessary to understand how CD players display the
+track number and time. Embedded in each block of audio data is
+non-audio information known as the @term{Q sub-channel}. The
+@term{Q sub-channel} data tells the CD player what track number and time
+it should display while it is playing the block of audio data in which
+the @term{Q sub-channel} data is embedded. Near the end of some
+tracks, the @term{Q sub-channel} may instruct the CD player to update
+the track number to the next track, and display a count down to the
+next track, often starting at -2 seconds and proceeding to zero. This
+is known as an audio track @term{pre-gap}. It may either contain
+silence, or as previously discussed--in the case of live
+performances--it may contain audio. Almost as often as not, there is
+no @term{pre-gap} whatsoever. Regardless, an audio track
+@term{pre-gap} is purely determined by the contents of the
+@term{Q sub-channel}, which is embedded in each audio sector. This has
+some interesting implications for the track forward button.
+
+When the track forward button is pressed on a CD player, the CD player
+advances to the next track, skipping that track's @term{pre-gap}.
+This is because the CD player uses the starting address of the track
+from the disc's table of contents (TOC) to determine where to start
+playing a track when either the track forward or track backward
+buttons are pressed. So to hear a @term{pre-gap} for track 4, the
+listener must either listen to track 3 first, or use the track forward
+or backward buttons to go to track 4, then use the seek backward
+button to back up into track 4's @term{pre-gap}, which is really part
+of track 3, at least according to the TOC. Track 1 @term{pre-gap}s
+are especially interesting because some commercial discs have audio
+hidden before the beginning of the first track! The only way to hear
+this hidden audio with a standard player is to use the seek backward
+button as soon as track 1 begins playing!
+
+Audio track @term{pre-gap}s may be specified in a couple of different
+ways in the popular cue file format. The first way of specifying a
+@term{pre-gap} is to use the @command{PREGAP} command. This will
+place a @term{pre-gap} containing silence before a track. The second
+way of specifying a @term{pre-gap} is to give a track an
+@command{INDEX 00} as well as the more normal @command{INDEX 01}.
+@command{INDEX 01} will be used to specify the start of the track in
+the disc's TOC, while @command{INDEX 00} will be used to specify the
+start of the track's @term{pre-gap} as recorded in the @term{Q sub-channel}.
+@command{INDEX 00} is ordinarily used for specifying
+track @term{pre-gap}s that contain audio rather than silence. Thus,
+the cue file format may be used to specify track @term{pre-gap}s with
+silence or audio, depending on whether the @command{PREGAP} or
+@command{INDEX 00} commands are specified. If neither type of
+@term{pre-gap} is specified for a track, no @term{pre-gap} is created
+for that track, which merely means the absence of @term{pre-gap}
+information in the @term{Q sub-channel}, and the lack of a short count
+down to the next track.
+
+Various @acronym{CD-DA} ripping programs take various approaches to
+track @term{pre-gap}s. Some ripping programs ignore track
+@term{pre-gap}s altogether, relying solely on the disc's TOC to
+determine where tracks begin and end. If a disc is ripped with such a
+program, then re-burned later, the resulting disc will lack track
+@term{pre-gap}s, and thereby lack the playback behavior of counting
+down to the next track. Other ripping programs detect track
+@term{pre-gap}s and record them in the popular cue file format among
+others. Such ripping programs sometimes allow the user to determine
+whether track @term{pre-gap}s will be appended to the prior track or
+pre-pended to the track to which they "belong". Note that if a
+ripping program is ignorant of track @term{pre-gap}s, the track
+@term{pre-gap}s will be appended to the prior track, because that is
+where the disc's TOC puts them. Thus, there are many different ways
+an application may chose to deal with track @term{pre-gap}s.
+Consequently, @kbd{libcdio} does not dictate the policy a ripping
+program should use in dealing with track @term{pre-gap}s. Hence,
+@kbd{libcdio} provides the @code{cdio_get_track_pregap_[lba|lsn]()}
+interfaces to allow the application to deal with track @term{pre-gap}s
+as it sees fit.
+
+Note that the @code{cdio_get_track_pregap_[lba|lsn]()} interfaces
+currently only provide information for CDRDAO TOC, CDRWIN BIN/CUE, and
+NRG images. Getting the track @term{pre-gap}s from a CD drive is a
+more complicated problem because not all CD drives support reading the
+@term{Q sub-channel} @emph{directly} at @emph{high} speed, and there is no
+interface to determine whether or not a drive supports this optional
+feature, aside from trying to read the @term{Q sub-channel}, and
+possibly incurring IO errors. However, all drives @emph{do} support reading
+the @term{Q sub-channel} @emph{indirectly} while playing an audio disc by
+asking the drive for the current position. Unfortunately, this occurs
+at normal playback speed, and requires a certain settling time after
+the disc starts playing. Thus, using this @emph{slow} interface
+requires a more sophisticated algorithm, such as binary search or some
+heuristic, like backing up progressively from the end of the prior
+track to look for the next track's @term{pre-gap}. Note that CD
+drives seek @emph{slow}ly, so it is better to simply use a drive that
+can read the @term{Q sub-channel} directly at @emph{high} speed, and
+avoid complicated software solutions. (Not to mention that if the
+user has an older system with an analog audio cable hooked up between
+their soundboard and their drive, and a ripping program uses the
+@emph{slow} interface, the user will hear bits of the audio on the
+disc!) Consequently, because there is no good universal solution to
+the problem of reading the @term{Q sub-channel} from a drive,
+@kbd{libcdio} currently leaves this problem up to the application, a
+problem which is readily approachable through either @kbd{libcdio}'s
+MMC interface or @kbd{libcdio}'s cdda interface. For an example of
+one such application, see @url{https://gna.org/projects/cued/}.
+
+The preceding section on track @term{pre-gaps} and @acronym{CD-DA} was
+contributed by Robert William Fuller (@email{hydrologiccycle@@gmail.com}).
+
+@node How to use
+@chapter How to use
+
+The @value{libcdio} package comes with a number of small example
+programs in the directory @file{example} which demonstrate different
+aspects of the library and show how to use the library. The source
+code to all of the examples here are contained on the package.
+
+Other sources for examples would be the larger utility programs
+@command{cd-drive}, @command{cd-info}, @command{cd-read},
+@command{iso-info}, and @command{iso-read} which are all in the
+@file{src} directory of the @value{libcdio} package. See also
+@xref{Utility Programs}.
+
+@menu
+* Example 1:: list out tracks and LSNs
+* Example 2:: list drivers available and default CD device
+* Example 3:: figure out what kind of CD (image) we've got
+* Example 4:: use libiso9660 to extract a file from an ISO-9660 image
+* Example 5:: list CD-Text and CD disc mode info
+* Example 6:: run a MMC INQUIRY command
+* Example 7:: using the CD Paranoia library for CD-DA reading
+* All sample programs:: list of all programs in the example directory
+@end menu
+
+@node Example 1
+@section Example 1: list out tracks and LSNs
+Here we will give an annotated example which can be found in the
+distribution as @file{example/tracks.c}.
+
+@smallexample
+ 1: #include <stdio.h>
+ 2: #include <sys/types.h>
+ 3: #include <cdio/cdio.h>
+ 4: int
+ 5: main(int argc, const char *argv[])
+ 6: @{
+ 7: CdIo_t *p_cdio = cdio_open ("/dev/cdrom", DRIVER_DEVICE);
+ 8: track_t first_track_num = cdio_get_first_track_num(p_cdio);
+ 9: track_t i_tracks = cdio_get_num_tracks(p_cdio);
+10: int j, i=first_track_num;
+11:
+12: printf("CD-ROM Track List (%i - %i)\n", first_track_num, i_tracks);
+13
+14: printf(" #: LSN\n");
+15:
+16: for (j = 0; j < i_tracks; i++, j++) @{
+17: lsn_t lsn = cdio_get_track_lsn(p_cdio, i);
+18: if (CDIO_INVALID_LSN != lsn)
+19: printf("%3d: %06d\n", (int) i, lsn);
+20: @}
+21: printf("%3X: %06d leadout\n", CDIO_CDROM_LEADOUT_TRACK,
+22: cdio_get_track_lsn(p_cdio, CDIO_CDROM_LEADOUT_TRACK));
+23: cdio_destroy(p_cdio);
+24: return 0;
+25: @}
+@end smallexample
+
+Already from the beginning on line 2 we see something odd. The
+@code{#include <sys/types.h>} is needed because @value{libcdio}
+assumes type definitions exist for @code{uint32_t}, @code{uint16_t}
+and so on. Alternatively you change line 2 to:
+
+@smallexample
+#define HAVE_SYS_TYPES_H
+@end smallexample
+
+and @code{<cdio/cdio.h>} will insert line 2. If you use GNU autoconf
+to configure your program, add @code{sys/types.h} to
+@code{AC_HAVE_HEADERS} and @emph{it} will arrange for
+@code{HAVE_SYS_TYPES_H} to get defined. If you don't have
+@code{<sys/types.h>} but have some other include that defines these
+types, put that instead of line 2. Or you could roll your own
+typedefs. (Note: In the future, this will probably get ``fixed'' by
+requiring glib.h.)
+
+Okay after getting over the hurdle of line 2, the next line pretty
+straightforward: you need to include this to get cdio definitions. One
+of the types that is defined via line 3 is @code{CdIo_t} and a pointer
+that is used pretty much in all operations. Line 6 initializes the
+variable @code{cdio} which we will be using in all of the subsequent
+libcdio calls. It does this via a call to @code{cdio_open()}.
+
+The second parameter of @code{cdio_open} is DRIVER_UNKNOWN. For any
+given installation a number of Compact Disc device drivers may be
+available. In particular it's not uncommon to have several drivers
+that can read CD disk-image formats as well as a driver that handles
+some CD-ROM piece of hardware. Using DRIVER_UNKNOWN as that second
+parameter we let the library select a driver amongst those that are
+available; generally the first hardware driver that is available is
+the one selected.
+
+If there is no CD in any of the CD-ROM drives or one does not have
+access to the CD-ROM, it is possible that @value{libcdio} will find a
+CD image in the directory you run this program and will pick a
+suitable CD-image driver. If this is not what you want, but always
+want some sort of CD-ROM driver (or failure if none), then use
+DRIVER_DEVICE instead of DRIVER_UNKNOWN.
+
+Note that in contrast to what is typically done using ioctls to read a
+CD, you don't issue any sort of CD-ROM read TOC command---that is all
+done by the driver. Of course, the information that you get from
+reading the TOC is often desired: many tracks are on the CD, or what
+number the first one is called. This is done through calls on lines 8
+and 9.
+
+For each track, we call a cdio routine to get the logical sector
+number, @code{cdio_get_track_lsn()} on line 17 and print the track
+number and LSN value. Finally we print out the ``lead-out track''
+information and we finally call @code{cdio_destroy()} in line 23 to
+indicate we're done with the CD.
+
+@node Example 2
+@section Example 2: list drivers available and default CD device
+
+One thing that's a bit hoaky in Example 1 is hard-coding the name of
+the device used: @code{/dev/cdrom}. Although often this is the name of
+a CD-ROM device on GNU/Linux and possibly some other Unix derivatives,
+there are many OSs for which use a different device name.
+
+In the next example, we'll let the driver give us the name of the CD-ROM
+device that is right for it.
+
+@smallexample
+ 1: #include <stdio.h>
+ 2: #include <sys/types.h>
+ 3: #include <cdio/cdio.h>
+ 4: int
+ 5: main(int argc, const char *argv[])
+ 6: @{
+ 7: CdIo_t *p_cdio = cdio_open (NULL, DRIVER_DEVICE);
+ 8: driver_id_t driver_id;
+ 9:
+10: if (NULL != p_cdio) @{
+11: printf("The driver selected is %s\n", cdio_get_driver_name(p_cdio));
+12: printf("The default device for this driver is %s\n\n",
+13: cdio_get_default_device(p_cdio));
+14: cdio_destroy(p_cdio);
+15: @} else @{
+16: printf("Problem in trying to find a driver.\n\n");
+17: @}
+18:
+19: for (driver_id=CDIO_MIN_DRIVER; driver_id<=CDIO_MAX_DRIVER; driver_id++)
+20: if (cdio_have_driver(driver_id))
+21: printf("We have: %s\n", cdio_driver_describe(driver_id));
+22: else
+23: printf("We don't have: %s\n", cdio_driver_describe(driver_id));
+24: return 0;
+25: @}
+@end smallexample
+
+
+@node Example 3
+@section Example 3: figure out what kind of CD (image) we've got
+
+In this example is a somewhat simplified program to show the use of
+@command{cdio_guess_cd_type()} to figure out the kind of CD image
+we've got. This can be found in the distribution as @file{example/sample3.c}.
+
+@smallexample
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <cdio/cdio.h>
+#include <cdio/cd_types.h>
+
+static void
+print_analysis(cdio_iso_analysis_t cdio_iso_analysis,
+ cdio_fs_anal_t fs, int first_data, unsigned int num_audio,
+ track_t i_tracks, track_t first_track_num, CdIo_t *cdio)
+@{
+ switch(CDIO_FSTYPE(fs)) @{
+ case CDIO_FS_AUDIO:
+ break;
+ case CDIO_FS_ISO_9660:
+ printf("CD-ROM with ISO 9660 filesystem");
+ if (fs & CDIO_FS_ANAL_JOLIET) @{
+ printf(" and joliet extension level %d", cdio_iso_analysis.joliet_level);
+ @}
+ if (fs & CDIO_FS_ANAL_ROCKRIDGE)
+ printf(" and rockridge extensions");
+ printf("\n");
+ break;
+ case CDIO_FS_ISO_9660_INTERACTIVE:
+ printf("CD-ROM with CD-RTOS and ISO 9660 filesystem\n");
+ break;
+ case CDIO_FS_HIGH_SIERRA:
+ printf("CD-ROM with High Sierra filesystem\n");
+ break;
+ case CDIO_FS_INTERACTIVE:
+ printf("CD-Interactive%s\n", num_audio > 0 ? "/Ready" : "");
+ break;
+ case CDIO_FS_HFS:
+ printf("CD-ROM with Macintosh HFS\n");
+ break;
+ case CDIO_FS_ISO_HFS:
+ printf("CD-ROM with both Macintosh HFS and ISO 9660 filesystem\n");
+ break;
+ case CDIO_FS_UFS:
+ printf("CD-ROM with Unix UFS\n");
+ break;
+ case CDIO_FS_EXT2:
+ printf("CD-ROM with Linux second extended filesystem\n");
+ break;
+ case CDIO_FS_3DO:
+ printf("CD-ROM with Panasonic 3DO filesystem\n");
+ break;
+ case CDIO_FS_UNKNOWN:
+ printf("CD-ROM with unknown filesystem\n");
+ break;
+ @}
+ switch(CDIO_FSTYPE(fs)) @{
+ case CDIO_FS_ISO_9660:
+ case CDIO_FS_ISO_9660_INTERACTIVE:
+ case CDIO_FS_ISO_HFS:
+ printf("ISO 9660: %i blocks, label `%.32s'\n",
+ cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
+ break;
+ @}
+ if (first_data == 1 && num_audio > 0)
+ printf("mixed mode CD ");
+ if (fs & CDIO_FS_ANAL_XA)
+ printf("XA sectors ");
+ if (fs & CDIO_FS_ANAL_MULTISESSION)
+ printf("Multisession");
+ if (fs & CDIO_FS_ANAL_HIDDEN_TRACK)
+ printf("Hidden Track ");
+ if (fs & CDIO_FS_ANAL_PHOTO_CD)
+ printf("%sPhoto CD ",
+ num_audio > 0 ? " Portfolio " : "");
+ if (fs & CDIO_FS_ANAL_CDTV)
+ printf("Commodore CDTV ");
+ if (first_data > 1)
+ printf("CD-Plus/Extra ");
+ if (fs & CDIO_FS_ANAL_BOOTABLE)
+ printf("bootable CD ");
+ if (fs & CDIO_FS_ANAL_VIDEOCD && num_audio == 0) @{
+ printf("Video CD ");
+ @}
+ if (fs & CDIO_FS_ANAL_SVCD)
+ printf("Super Video CD (SVCD) or Chaoji Video CD (CVD)");
+ if (fs & CDIO_FS_ANAL_CVD)
+ printf("Chaoji Video CD (CVD)");
+ printf("\n");
+@}
+
+int
+main(int argc, const char *argv[])
+@{
+ CdIo_t *p_cdio = cdio_open (NULL, DRIVER_UNKNOWN);
+ cdio_fs_anal_t fs=0;
+
+ track_t i_tracks;
+ track_t first_track_num;
+ lsn_t start_track; /* first sector of track */
+ lsn_t data_start =0; /* start of data area */
+
+ int first_data = -1; /* # of first data track */
+ int first_audio = -1; /* # of first audio track */
+ unsigned int num_data = 0; /* # of data tracks */
+ unsigned int num_audio = 0; /* # of audio tracks */
+ unsigned int i;
+
+ if (NULL == p_cdio) @{
+ printf("Problem in trying to find a driver.\n\n");
+ return 1;
+ @}
+
+ first_track_num = cdio_get_first_track_num(p_cdio);
+ i_tracks = cdio_get_num_tracks(p_cdio);
+
+ /* Count the number of data and audio tracks. */
+ for (i = first_track_num; i <= i_tracks; i++) @{
+ if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i)) @{
+ num_audio++;
+ if (-1 == first_audio) first_audio = i;
+ @} else @{
+ num_data++;
+ if (-1 == first_data) first_data = i;
+ @}
+ @}
+
+ /* try to find out what sort of CD we have */
+ if (0 == num_data) @{
+ printf("Audio CD\n");
+ @} else @{
+ /* we have data track(s) */
+ int j;
+ cdio_iso_analysis_t cdio_iso_analysis;
+
+ memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
+
+ for (j = 2, i = first_data; i <= i_tracks; i++) @{
+ lsn_t lsn;
+ track_format_t track_format = cdio_get_track_format(p_cdio, i);
+
+ lsn = cdio_get_track_lsn(p_cdio, i);
+
+ switch ( track_format ) @{
+ case TRACK_FORMAT_AUDIO:
+ case TRACK_FORMAT_ERROR:
+ break;
+ case TRACK_FORMAT_CDI:
+ case TRACK_FORMAT_XA:
+ case TRACK_FORMAT_DATA:
+ case TRACK_FORMAT_PSX:
+ ;
+ @}
+
+ start_track = (i == 1) ? 0 : lsn;
+
+ /* save the start of the data area */
+ if (i == first_data)
+ data_start = start_track;
+
+ /* skip tracks which belong to the current walked session */
+ if (start_track < data_start + cdio_iso_analysis.isofs_size)
+ continue;
+
+ fs = cdio_guess_cd_type(p_cdio, start_track, i, &cdio_iso_analysis);
+
+ print_analysis(cdio_iso_analysis, fs, first_data, num_audio,
+ i_tracks, first_track_num, p_cdio);
+
+ if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
+ CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS ||
+ CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
+ /* no method for non-ISO9660 multisessions */
+ break;
+ @}
+ @}
+ cdio_destroy(p_cdio);
+ return 0;
+@}
+@end smallexample
+
+@node Example 4
+@section Example 4: use libiso9660 to extract a file from an ISO-9660 image
+
+Next a program to show using @command{libiso9660} to extract a file
+from an ISO-9660 image. This can be found in the distribution as
+@file{example/iso3.c}. A more complete and expanded version of this
+is @command{iso-read}, part of this distribution.
+
+@smallexample
+/* This is the ISO 9660 image. */
+#define ISO9660_IMAGE_PATH "../"
+#define ISO9660_IMAGE ISO9660_IMAGE_PATH "test/copying.iso"
+
+#define LOCAL_FILENAME "copying"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <cdio/cdio.h>
+#include <cdio/iso9660.h>
+
+#include <stdio.h>
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#define my_exit(rc) \
+ fclose (p_outfd); \
+ free(p_statbuf); \
+ iso9660_close(p_iso); \
+ return rc; \
+
+int
+main(int argc, const char *argv[])
+@{
+ iso9660_stat_t *p_statbuf;
+ FILE *p_outfd;
+ int i;
+
+ iso9660_t *p_iso = iso9660_open (ISO9660_IMAGE);
+
+ if (NULL == p_iso) @{
+ fprintf(stderr, "Sorry, couldn't open ISO 9660 image %s\n", ISO9660_IMAGE);
+ return 1;
+ @}
+
+ p_statbuf = iso9660_ifs_stat_translate (p_iso, LOCAL_FILENAME);
+
+ if (NULL == p_statbuf)
+ @{
+ fprintf(stderr,
+ "Could not get ISO-9660 file information for file %s\n",
+ LOCAL_FILENAME);
+ iso9660_close(p_iso);
+ return 2;
+ @}
+
+ if (!(p_outfd = fopen (LOCAL_FILENAME, "wb")))
+ @{
+ perror ("fopen()");
+ free(p_statbuf);
+ iso9660_close(p_iso);
+ return 3;
+ @}
+
+ /* Copy the blocks from the ISO-9660 filesystem to the local filesystem. */
+ for (i = 0; i < p_statbuf->size; i += ISO_BLOCKSIZE)
+ @{
+ char buf[ISO_BLOCKSIZE];
+
+ memset (buf, 0, ISO_BLOCKSIZE);
+
+ if ( ISO_BLOCKSIZE != iso9660_iso_seek_read (p_iso, buf, p_statbuf->lsn
+ + (i / ISO_BLOCKSIZE),
+ 1) )
+ @{
+ fprintf(stderr, "Error reading ISO 9660 file at lsn %lu\n",
+ (long unsigned int) p_statbuf->lsn + (i / ISO_BLOCKSIZE));
+ my_exit(4);
+ @}
+
+
+ fwrite (buf, ISO_BLOCKSIZE, 1, p_outfd);
+
+ if (ferror (p_outfd))
+ @{
+ perror ("fwrite()");
+ my_exit(5);
+ @}
+ @}
+
+ fflush (p_outfd);
+
+ /* Make sure the file size has the exact same byte size. Without the
+ truncate below, the file will a multiple of ISO_BLOCKSIZE.
+ */
+ if (ftruncate (fileno (p_outfd), p_statbuf->size))
+ perror ("ftruncate()");
+
+ my_exit(0);
+@}
+@end smallexample
+
+@node Example 5
+@section Example 5: list CD-Text and disc mode info
+
+Next a program to show using @command{libcdio} to list CD-TEXT data.
+This can be found in the distribution as @file{example/cdtext.c}.
+
+@smallexample
+/* Simple program to list CD-Text info of a Compact Disc using libcdio. */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <cdio/cdio.h>
+#include <cdio/cdtext.h>
+
+
+static void
+print_cdtext_track_info(CdIo_t *p_cdio, track_t i_track, const char *message) @{
+ const cdtext_t *cdtext = cdio_get_cdtext(p_cdio, 0);
+ if (NULL != cdtext) @{
+ cdtext_field_t i;
+
+ printf("%s\n", message);
+
+ for (i=0; i < MAX_CDTEXT_FIELDS; i++) @{
+ if (cdtext->field[i]) @{
+ printf("\t%s: %s\n", cdtext_field2str(i), cdtext->field[i]);
+ @}
+ @}
+ @}
+
+@}
+
+static void
+print_disc_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) @{
+ track_t i_last_track = i_first_track+i_tracks;
+ discmode_t cd_discmode = cdio_get_discmode(p_cdio);
+
+ printf("%s\n", discmode2str[cd_discmode]);
+
+ print_cdtext_track_info(p_cdio, 0, "\nCD-Text for Disc:");
+ for ( ; i_first_track < i_last_track; i_first_track++ ) @{
+ char psz_msg[50];
+ sprintf(msg, "CD-Text for Track %d:", i_first_track);
+ print_cdtext_track_info(p_cdio, i_first_track, psz_msg);
+ @}
+@}
+
+int
+main(int argc, const char *argv[])
+@{
+ track_t i_first_track;
+ track_t i_tracks;
+ CdIo_t *p_cdio;
+ cdio = cdio_open (NULL, DRIVER_UNKNOWN);
+ i_first_track = cdio_get_first_track_num(p_cdio);
+ i_tracks = cdio_get_num_tracks(p_cdio);
+
+ if (NULL == p_cdio) @{
+ printf("Couldn't find CD\n");
+ return 1;
+ @} else @{
+ print_disc_info(p_cdio, i_tracks, i_first_track);
+ @}
+
+ cdio_destroy(p_cdio);
+
+ return 0;
+@}
+@end smallexample
+
+@node Example 6
+@section Example 6: Using MMC to run an @code{INQURY} command
+
+Now a program to show issuing a simple MMC command
+(@code{INQUIRY}). This MMC command retrieves the vendor, model and
+firmware revision number of a CD drive. For this command to work,
+usually a CD to be loaded into the drive; odd since the CD itself is
+not used.
+
+This can be found in the distribution as @file{example/mmc1.c}.
+
+@smallexample
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <cdio/cdio.h>
+#include <cdio/scsi_mmc.h>
+#include <string.h>
+
+/* Set how long to wait for MMC commands to complete */
+#define DEFAULT_TIMEOUT_MS 10000
+
+int
+main(int argc, const char *argv[])
+@{
+ CdIo_t *p_cdio;
+
+ p_cdio = cdio_open (NULL, DRIVER_UNKNOWN);
+
+ if (NULL == p_cdio) @{
+ printf("Couldn't find CD\n");
+ return 1;
+ @} else @{
+ int i_status; /* Result of MMC command */
+ char buf[36] = @{ 0, @}; /* Place to hold returned data */
+ scsi_mmc_cdb_t cdb = @{@{0, @}@}; /* Command Descriptor Buffer */
+
+ CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_INQUIRY);
+ cdb.field[4] = sizeof(buf);
+
+ i_status = scsi_mmc_run_cmd(p_cdio, DEFAULT_TIMEOUT_MS,
+ &cdb, SCSI_MMC_DATA_READ,
+ sizeof(buf), &buf);
+ if (i_status == 0) @{
+ char psz_vendor[CDIO_MMC_HW_VENDOR_LEN+1];
+ char psz_model[CDIO_MMC_HW_MODEL_LEN+1];
+ char psz_rev[CDIO_MMC_HW_REVISION_LEN+1];
+
+ memcpy(psz_vendor, buf + 8, sizeof(psz_vendor)-1);
+ psz_vendor[sizeof(psz_vendor)-1] = '\0';
+ memcpy(psz_model,
+ buf + 8 + CDIO_MMC_HW_VENDOR_LEN,
+ sizeof(psz_model)-1);
+ psz_model[sizeof(psz_model)-1] = '\0';
+ memcpy(psz_rev,
+ buf + 8 + CDIO_MMC_HW_VENDOR_LEN +CDIO_MMC_HW_MODEL_LEN,
+ sizeof(psz_rev)-1);
+ psz_rev[sizeof(psz_rev)-1] = '\0';
+
+ printf("Vendor: %s\nModel: %s\nRevision: %s\n",
+ psz_vendor, psz_model, psz_rev);
+ @} else @{
+ printf("Couldn't get INQUIRY data (vendor, model, and revision\n");
+ @}
+ @}
+
+ cdio_destroy(p_cdio);
+
+ return 0;
+@}
+@end smallexample
+
+@node Example 7
+@section Example 7: Using the CD Paranoia library for CD-DA reading
+
+@smallexample
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <cdio/cdda.h>
+#include <cdio/cd_types.h>
+#include <stdio.h>
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+int
+main(int argc, const char *argv[])
+@{
+ cdrom_drive_t *d = NULL; /* Place to store handle given by cd-paranoia. */
+ char **ppsz_cd_drives; /* List of all drives with a loaded CDDA in it. */
+
+ /* See if we can find a device with a loaded CD-DA in it. */
+ ppsz_cd_drives = cdio_get_devices_with_cap(NULL, CDIO_FS_AUDIO, false);
+
+ if (ppsz_cd_drives) @{
+ /* Found such a CD-ROM with a CD-DA loaded. Use the first drive in
+ the list. */
+ d=cdio_cddap_identify(*ppsz_cd_drives, 1, NULL);
+ @} else @{
+ printf("Unable find or access a CD-ROM drive with an audio CD in it.\n");
+ exit(1);
+ @}
+
+ /* Don't need a list of CD's with CD-DA's any more. */
+ cdio_free_device_list(ppsz_cd_drives);
+
+ /* We'll set for verbose paranoia messages. */
+ cdio_cddap_verbose_set(d, CDDA_MESSAGE_PRINTIT, CDDA_MESSAGE_PRINTIT);
+
+ if ( 0 != cdio_cddap_open(d) ) @{
+ printf("Unable to open disc.\n");
+ exit(1);
+ @}
+
+ /* Okay now set up to read up to the first 300 frames of the first
+ audio track of the Audio CD. */
+ @{
+ cdrom_paranoia_t *p = cdio_paranoia_init(d);
+ lsn_t i_first_lsn = cdio_cddap_disc_firstsector(d);
+
+ if ( -1 == i_first_lsn ) @{
+ printf("Trouble getting starting LSN\n");
+ @} else @{
+ lsn_t i_cursor;
+ track_t i_track = cdio_cddap_sector_gettrack(d, i_first_lsn);
+ lsn_t i_last_lsn = cdio_cddap_track_lastsector(d, i_track);
+
+ /* For demo purposes we'll read only 300 frames (about 4
+ seconds). We don't want this to take too long. On the other
+ hand, I suppose it should be something close to a real test.
+ */
+ if ( i_last_lsn - i_first_lsn > 300) i_last_lsn = i_first_lsn + 299;
+
+ printf("Reading track %d from LSN %ld to LSN %ld\n", i_track,
+ (long int) i_first_lsn, (long int) i_last_lsn);
+
+ /* Set reading mode for full paranoia, but allow skipping sectors. */
+ paranoia_modeset(p, PARANOIA_MODE_FULL^PARANOIA_MODE_NEVERSKIP);
+
+ paranoia_seek(p, i_first_lsn, SEEK_SET);
+
+ for ( i_cursor = i_first_lsn; i_cursor <= i_last_lsn; i_cursor ++) @{
+ /* read a sector */
+ int16_t *p_readbuf=cdio_paranoia_read(p, NULL);
+ char *psz_err=cdio_cddap_errors(d);
+ char *psz_mes=cdio_cddap_messages(d);
+
+ if (psz_mes || psz_err)
+ printf("%s%s\n", psz_mes ? psz_mes: "", psz_err ? psz_err: "");
+
+ if (psz_err) free(psz_err);
+ if (psz_mes) free(psz_mes);
+ if( !p_readbuf ) @{
+ printf("paranoia read error. Stopping.\n");
+ break;
+ @}
+ @}
+ @}
+ cdio_paranoia_free(p);
+ @}
+
+ cdio_cdda_close(d);
+
+ exit(0);
+@}
+@end smallexample
+
+Those who are die-hard cdparanoia programmers will notice that the
+@value{libcdio} paranoia names are similar but a little bit
+different. In particular instead of @code{paranoia_read} we have above
+@code{cdio_paranoia_read} and instead of @code{cdda_open} we have
+@code{cdio_cddap_open}.
+
+This was done intentionally so that it is possible for the original
+paranoia program can co-exist both in source code and linked libraries
+and not conflict with @value{libcdio}'s paranoia source and libraries.
+
+In general in place of any paranoia routine that begins
+@code{paranoia_}, use @code{cdio_paranoia_} and in place of any
+paranoia routine that begins @code{cdda_}, use @code{cdio_cddap_}. But
+for a limited time @value{libcdio} will accept the old paranoia names
+which may be useful for legacy paranoia code. The way this magic works
+is by defining the old paranoia name to be the @value{libcdio} name.
+
+In the unusual case where you do want to use both the original
+paranoia and @value{libcdio} routines in a single source, the C
+preprocessor symbol @code{DO_NOT_WANT_PARANOIA_COMPATIBILITY} can be
+@code{define}'d and this disables the @code{#define} substitution done
+automatically. The may still be a problem with conflicting structure
+definitions like @code{cdrom_drive_t}.
+
+@node All sample programs
+@section A list of all sample programs in the @code{example} directory
+
+The @code{example} directory contains some simple examples of the use
+of the @value{libcdio} library.
+
+A larger more-complicated example are the @command{cd-drive},
+@command{cd-info}, @command{cd-read}, @command{iso-info} and
+@command{iso-info} programs in the @command{src} directory.
+
+Descriptions of the sample are as follows...
+
+@table @code
+
+@item @code{cdchange.c}
+
+A program to test if a CD has been changed since the last change test.
+
+@item @code{cdtext.c}
+
+A program to show CD-Text and CD disc mode info.
+
+@item @code{drives.c}
+
+A program to show drivers installed and what the default CD-ROM drive
+is and what CD drives are available.
+
+@item @code{eject.c}
+
+A program eject a CD from a CD-ROM drive and then close the door again.
+
+@item @code{isolist.c}
+
+A program to show using @code{libiso9660} to list files in a
+ directory of an ISO-9660 image.
+
+@item @code{C++/isolist.cpp}
+
+The same program as @code{isolist.c} written in C++.
+
+@item @code{iso2.c}
+
+A program to show using @code{libiso9660} to extract a file from a
+CDRWIN cue/bin CD image.
+
+@item @code{C++/iso2.cpp}
+
+The same program as @code{iso2.c} written in C++.
+
+@item @code{iso3.c}
+
+A program to show using libiso9660 to extract a file from an ISO-9660
+image.
+
+@item @code{C++/iso3.cpp}
+
+The same program as @code{iso3.c} written in C++.
+
+@item @code{isofuzzy.c}
+
+A program showing fuzzy ISO-9660 detection/reading.
+
+@item @code{mmc1.c}
+
+A program to show issuing a simple MMC command (@code{INQUIRY}).
+
+@item @code{C++/mmc1.cpp}
+
+The same program as @code{mmc1.c} written in C++.
+
+@item @code{mmc2.c}
+
+A more involved MMC command to list CD and drive features from a
+SCSI-MMC @code{GET_CONFIGURATION} command.
+
+@item @code{mmc2a.c}
+
+Prints MMC @command{MODE_SENSE} page 2A parameters.
+Page 2a are the CD/DVD Capabilities and Mechanical Status.
+
+@item @code{C++/mmc2.cpp}
+
+The same program as @code{mmc2.c} written in C++.
+
+@item @code{paranoia.c}
+
+A program to show using libcdio's version of the CD-DA paranoia.
+
+@item @code{paranoia2.c}
+
+A program to show using libcdio's version of the CD-DA paranoia
+library. But in this version, we'll open a cdio object before calling
+paranoia's open. I imagine in many cases such as media players this
+may be what will be done since, one may want to get CDDB/CD-Text info
+beforehand.
+
+@item @code{tracks.c}
+
+A simple program to list track numbers and logical sector numbers of a
+Compact Disc using @value{libcdio}.
+
+@item @code{sample2.c}
+
+A simple program to show drivers installed and what the default CD-ROM
+drive is.
+
+@item @code{sample3.c}
+
+A simple program to show the use of @code{cdio_guess_cd_type()}. Figures out
+the kind of CD image we've got.
+
+@item @code{sample4.c}
+
+ A slightly improved sample3 program: we handle cdio logging and take
+an optional CD-location.
+
+@item @code{udf1.c}
+
+A program to show using libudf to list files in a directory of an UDF
+image.
+
+@item @code{udf2.c}
+
+A program to show using libudf to extract a file from an UDF image.
+
+@end table
+
+@node Utility Programs
+@chapter Diagnostic programs: @command{cd-drive}, @command{cd-info}, @command{cd-read}, @command{iso-info}, @command{iso-read}
+
+@menu
+* cd-drive:: list out CD-ROM drive information
+* cd-info:: list out CD or CD-image information
+* cd-read:: read blocks of a CD or CD image
+* iso-info:: list out ISO-9600 image information
+* iso-read:: extract a file from an ISO 9660 image
+@end menu
+
+@node cd-drive
+@section @samp{cd-drive}
+
+@samp{cd-drive} lists out drive information, what features drive
+supports, and information about what hardware drivers are available.
+
+@node cd-info
+@section @samp{cd-info}
+
+@samp{cd-info} will print out the structure of a CD medium which could
+either be a Compact Disc in a CD ROM or an CD image. It can try to
+analyze the medium to give characteristics of the medium, such as how
+many tracks are in the CD and the format of each track, whether a CD
+contains a Video CD, CD-DA, PhotoCD, whether a track has an ISO-9660
+filesystem.
+
+@node cd-read
+@section @samp{cd-read}
+
+@samp{cd-info} can be used to read blocks a CD medium which could
+either be a Compact Disc in a CD ROM or an CD image. You specify the
+beginning and ending LSN and what mode format to use in the reading.
+
+@node iso-info
+@section @samp{iso-info}
+
+@samp{iso-info} can be used to print out the structure of an ISO 9660
+image.
+
+@node iso-read
+@section @samp{iso-read}
+
+@samp{iso-read} can be used to extract a file in an ISO-9660 image.
+
+@node CD-ROM Access and Drivers
+@chapter CD-ROM Access and Drivers
+
+@menu
+* MMC:: ``SCSI'' Multimedia Commands (MMC)
+* GNU/Linux:: GNU/Linux ioctl
+* Microsoft:: Microsoft Windows ioctl and ASPI
+* Solaris:: Solaris ATAPI and SCSI
+* FreeBSD:: FreeBSD ioctl and CAM
+* OS X:: OSX (non-exclussive access)
+@end menu
+
+@node MMC
+@section Multimedia Commands (MMC)
+
+In contrast to the rest of the sections in this chapter, MMC
+(Multimedia commands) is not a driver per se, although many of the
+CD-ROM drivers do in fact issue MMC commands. MMC commands
+gives (in theory) a broad and uniform way to access a CD-ROM drive.
+
+If your CD-ROM drive understands MMC commands this is probably gives
+the most flexibility in control. SCSI and ATAPI CD-ROM devices
+generally support a fairly large set of MMC commands.
+
+The name ``SCSI MMC'' is often found in the literature in
+specifications and on the Internet. The ``SCSI'' part is probably a
+little bit misleading because a drive can understand ``SCSI MMC''
+commands but not use a SCSI interface---ATAPI CD-ROMs are one such
+broad class of examples. In fact there are drivers to ``encapsulate''
+non-SCSI drives or a non-MMC-compliant drives and make them act like
+MMC drives. I believe that many OS SCSI ``pass-through'' mechanisms do
+roughly the same thing.
+
+The name ``SCSI MMC'' is no doubt due to the fact that these commands
+grew out of the SCSI command set and thus were bundled in them.
+
+For clarity and precision we will use the term ``MMC'' rather than
+``SCSI MMC''.
+
+One of the problems with MMC is that there are so many different
+``standards''. In particular there are MMC
+@url{ftp://ftp.t10.org/t10/drafts/mmc/}, MMC 2
+@url{ftp://ftp.t10.org/t10/drafts/mmc2/}, MMC 3
+@url{ftp://ftp.t10.org/t10/drafts/mmc3/}, MMC 4
+@url{ftp://ftp.t10.org/t10/drafts/mmc4/}, and MMC 5
+@url{ftp://ftp.t10.org/t10/drafts/mmc5/} standards several ``drafts''
+for each standard. The good news about ATAPI drives is that they too
+understand some sort of MMC subset. The bad news (as I understand
+it) is that they do not understand any full MMC command set.
+
+Another problem with the MMC commands related to the variations in
+standards is the variation in the commands themselves and there are
+perhaps two or three ways to do many of the basic commands like read a
+CD frame.
+
+There seems to be a fascination with the number of bytes a command
+takes in the MMC-specification world. (Size matters?) So often the
+name of an operation will have a suffix with the number of bytes of
+the command (actually in MMC jargon this is called a ``CDB''
+@cindex CDB (Command Descriptor Block)
+or command descriptor block). So for example there is a 6-byte ``MODE
+SELECT'' often called ``MODE SELECT 6'' and a 10-byte ``MODE SELECT''
+often called ``MODE SELECT 10''. Presumably the 6-byte command came
+first and it was discovered that there was some deficiency causing the
+longer command. In @value{libcdio} where there are two formats we add
+the suffix in the name, e.g. @code{CDIO_MMC_GPCMD_MODE_SELECT_6} or
+@code{CDIO_MMC_GPCMD_MODE_SELECT_10}.
+
+If the fascination and emphasis in the MMC specifications of CDB size
+is a bit odd, equally so is the fact that this too often has bled
+through at the OS programming API. However in @value{libcdio}, you
+just give the opcode in @code{scsi_mmc_run_cmd()} and we'll do the
+work to figure out how many bytes of the CDB are used.
+
+Down the line it is hoped that @value{libcdio} will have a way to
+remove a distinction between the various alternative and
+alternative-size MMC commands. In @code{cdio/scsi-mmc.h} you will
+find a little bit of this for example via the routine
+@code{scsi_mmc_get_drive_cap()}. However much more work is needed.
+
+@node GNU/Linux
+@section GNU/Linux
+
+The GNU/Linux uses a hybrid of methods. Somethings are done vai ioctl
+and some things via MMC. GNU/Linux has a rather nice and complete
+ioctl mechanism. On the other hand, the MMC mechanism is more
+universal. There are other ``access modes'' listed which are not
+really access modes and should probably be redone/rethought. They are
+just different ways to run the read command. But for completeness
+These are ``READ_CD'' and ``READ_10''.
+
+@node Microsoft
+@section Microsoft Windows ioctl and ASPI
+
+There are two CD drive access methods on Microsoft Windows platforms:
+ioctl and ASPI.
+
+The ASPI interface specification was developed by Adaptec for
+sending commands to a SCSI host adapter (such as those controlling CD
+and DVD drives) and used on Window 9x/NT and later. Emulation for
+ATAPI drives was added so that the same sets of commands worked those
+even though the drives might not be SCSI nor might there even be a
+SCSI controller attached.
+
+However in Windows NT/2K/XP, Microsoft provides their Win32 ioctl
+interface, and has taken steps to make using ASPI more inaccessible
+(e.g. requiring administrative access to use ASPI).
+
+
+@node Solaris
+@section Solaris ATAPI and SCSI
+
+There is currently only one CD drive access methods in Solaris: SCSI
+(called ``USCSI'' or ``user SCSI'' in Solaris). There used to be an
+ATAPI method and it could be resurrected if needed. USCSI was
+preferred since on newer releases of Solaris and Solaris environments
+one would needs to have root access for ATAPI.
+
+@node FreeBSD
+@section FreeBSD ioctl and CAM
+
+There are two CD drive access methods on Solaris: ioctl and CAM
+(common access method). CAM is preferred when possible, especially on
+newer releases. However CAM is right now sort of a hybrid and includes
+some ioctl code.
+
+More work on this driver is needed. Volunteers?
+
+@node OS X
+@section OS X (non-exclusive access)
+
+A problem with OS/X is that if the OS thinks it understands the drive
+it gains exclusive access to it and thus prevents a library like this
+to get non-exclusive access.
+
+Currently @value{libcdio} access the CD-ROM non-exclusively. However
+in order to be able to issue MMC, the current belief is that
+exclusive access is needed. Probably in a future @value{libcdio},
+there will be some way to specify which kind of access is desired
+(with the inherent consequences of each).
+
+More work on this driver is needed. Volunteers?
+
+@node Internal Program Organization
+@chapter Internal Program Organization
+
+@subsection file organization
+
+Here is a list of @value{libcdio} directories.
+
+@itemize
+
+@item @code{include/cdio}
+
+This contains the headers that are public. One that will probably be
+used quite a bit is @code{<cdio/cdio.h>}.
+
+@item @code{lib}
+
+Code for installed libraries. See below for further breakout
+
+@item @code{lib/driver}
+
+Code for various OS-specific CD-ROM drivers, image drivers, and
+common MMC routines.
+
+This code comprises @code{libcdio.a} (or the shared version of it).
+
+@item @code{lib/iso9660}
+
+Code for to extract or query ISO-9660 images.
+
+This code comprises @code{libiso9660.a} (or the shared version of it).
+
+@item @code{lib/paranoia}
+
+This is from cdparanoia. It is the OS- and hardware- dependent code to
+detect and correct jitter for CD-DA CDs.
+
+@item @code{lib/cdda_interface}
+
+This is also from cdparanoia. It is the OS- and hardware- independent
+code to detect and correct jitter for CD-DA CDs.
+
+@item @code{doc}
+
+A home for fine documentation such as this masterpiece.
+
+@item @code{example}
+
+Here you will find various small example programs using
+@value{libcdio} which are largely for pedagogical purposes. You might
+be able to find one that is similar to what you want to do that could
+be extended. In fact some these are contain the kernel ideas behind of
+some of the larger programs in @file{src}.
+
+@item @code{src}
+
+Various stand-alone utility programs. See below.
+
+@item @code{src/paranoia}
+
+@value{libcdio}'s version of @code{cdparanoia}. Except for the fact
+that the back-end CD-reading code has been replaced by
+@value{libcdio}'s routines the code is pretty much identical.
+
+@item @code{test}
+
+Regression tests
+
+@end itemize
+
+@subsection @samp{libcdio}
+
+@value{libcdio} exports one opaque type @code{CdIo_t}. Internally this
+a structure containing an enumeration for the driver, a structure
+containing function pointers and a generic ``environment'' pointer
+which is passed as a parameter on a function call. See
+@file{lib/driver/cdio_private.h}. The initialization routine for each
+driver sets up the function pointers and allocates memory for the
+environment. When a particular user-level cdio routine is called (e.g
+@code{cdio_get_first_track_num} for lib/driver/track.c), the
+environment pointer is passed to a device-specific routine which will
+then cast this pointer into something of the appropriate type.
+
+Because function pointers are used, there can be and is quite a bit
+of sharing of common routines. Some of the common routines are found
+in the file @file{lib/driver/_cdio_generic.c}.
+
+Another set of routines that one is likely to find shared amongst
+drivers are the MMC commands. These are located in
+@file{lib/driver/scsi_mmc.c}.
+
+There is not only an attempt to share functions but we've tried to create
+a generic CD structure @code{generic_img_private_t} of file
+@file{lib/driver/generic.h}. By putting information into a common
+structure, we increase the likelihood of being able to have a common
+routine to perform some sort of function.
+
+The generic CD structure would also be useful in a utility to convert
+one CD-image format to another. Basically the first image format is
+``parsed'' into the common internal format and then from this
+structure it is not parsed.
+
+@subsection @samp{libiso9660}
+
+To be completed....
+
+@subsection Coding Conventions
+
+In @value{libcdio} there are a number of conventions used. If you
+understand some of these conventions it may facilitate understanding
+the code a little.
+
+@subsubsection namespace names
+
+For the most part, the visible external @value{libcdio} names follow
+conventions so as not to be confused with other applications or
+libraries. If you understand these conventions, there will be little
+or no chance that the names you use will conflict with @value{libcdio}
+and @code{libiso9660} and vice versa.
+
+All of the external @value{libcdio} C routines start out with
+@code{cdio_}, e.g. @code{cdio_open}; as a corollary, the
+@value{libcdio} CD-Paranoia routines start @code{cdio_cddap_},
+e.g. @code{cdio_cddap_open}. @code{libiso9660} routines start
+@code{iso9660_}, e.g. @code{iso9660_open}.
+
+@value{libcdio} C-Preprocessor names generally start @code{CDIO_}, for
+example @code{CDIO_CD_FRAMESIZE_RAW}; @code{libiso9660}
+C-preprocessor names start @code{ISO9660_},
+e.g. @code{ISO9660_FRAMESIZE}.
+
+@subsubsection suffixes (type and structure names)
+
+A few suffixes are used in type and structure names:
+
+@itemize
+
+@item @code{_e}
+
+An enumeration tag. Generally though the same name will appear with the
+@code{_t} suffix and probably that should be used instead.
+
+@item @code{_s}
+
+A structure tag. Generally though the same name will appear with the
+@code{_t} suffix and probably that should be used instead.
+
+@item @code{_t}
+
+A type suffix.
+
+@end itemize
+
+@subsubsection prefixes (variable names)
+
+A number of prefixes are used in variable names here's what they mean
+
+@itemize
+@item @code{i_}
+
+An integer type of some sort. A variable of this ilk one might find
+being iterated over in @code{for} loops or used as the index of an
+array for example.
+
+@item @code{b_}
+
+A Boolean type of some sort. A variable of this ilk one might find
+being in an @code{if} condition for example.
+
+@item @code{p_}
+
+A pointer of some sort. A variable of this ilk, say
+@code{p_foo} one is like likely to see @code{*p_foo} or
+@code{p_foo->...}.
+
+@item @code{pp_}
+
+A pointer to a pointer of some sort. A variable of this ilk, say
+@code{pp_foo} one is like likely to see @code{**p_foo} or
+@code{p_foo[x][y]} for example
+
+@item @code{psz_}
+
+A @code{char *} pointer of some sort. A variable of this ilk, say
+@code{psz_foo} may be used in a string operation. For example
+@code{printf(%s\n", psz_foo)} or @code{strdup(psz_foo)}.
+
+@item @code{ppsz_}
+
+A pointer to a @code{char *} pointer of some sort. A variable of this
+ilk, say @code{ppsz_foo} is used for example to return a list of
+CD-ROM device names
+
+@end itemize
+
+There are a some other naming conventions. Generally if a routine
+name starts @code{cdio_}, e.g. @code{cdio_open}, then it is an
+externally visible routine in @code{libcdio}. If a name starts
+@code{iso9660_}, e.g. @code{iso9660_is_dchar} then it is an externally
+visible routine in @code{libiso9660}. If a name starts
+@code{scsi_mmc_}, e.g. @code{scsi_mmc_get_discmode}, then it is an
+externally visible MMC routine. (We don't have a separate library for
+this yet.
+
+Names using entirely capital letters and that start @code{CDIO_} are
+externally visible @code{#defines}.
+
+
+@node ISO-9660 Character Sets
+@appendix ISO-9660 Character Sets
+
+For a description of where are used see @xref{ISO 9660 Level 1}.
+
+@menu
+* ISO646 d-Characters::
+* ISO646 a-Characters::
+@end menu
+
+@node ISO646 d-Characters
+@appendixsec ISO646 d-Characters
+
+@example
+ | 0 1 2 3 4 5 6 7
+--+-----------------
+0 | 0 P
+1 | 1 A Q
+2 | 2 B R
+3 | 3 C S
+4 | 4 D T
+5 | 5 E U
+6 | 6 F V
+7 | 7 G W
+8 | 8 H X
+9 | 9 I Y
+a | J Z
+b | K
+c | L
+d | M
+e | N
+f | O _
+@end example
+
+@node ISO646 a-Characters
+@appendixsec ISO646 a-Characters
+
+@example
+ | 0 1 2 3 4 5 6 7
+--+-----------------
+0 | 0 P
+1 | ! 1 A Q
+2 | " 2 B R
+3 | 3 C S
+4 | 4 D T
+5 | % 5 E U
+6 | & 6 F V
+7 | ' 7 G W
+8 | ( 8 H X
+9 | ) 9 I Y
+a | * : J Z
+b | + ; K
+c | , < L
+d | - = M
+e | . > N
+f | / ? O _
+@end example
+
+@node Glossary
+@appendix Glossary
+
+@include glossary.texi
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+@cindex FDL, GNU Free Documentation License
+
+@include fdl.texi
+
+@node General Index
+@unnumbered General Index
+@printindex cp
+
+@bye