$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r49852 - in sandbox/tools/auto_index: . doc doc/html doc/html/autoindex doc/html/images src
From: john_at_[hidden]
Date: 2008-11-20 13:24:34
Author: johnmaddock
Date: 2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
New Revision: 49852
URL: http://svn.boost.org/trac/boost/changeset/49852
Log:
Initial commit of automatic indexing tool.
Added:
   sandbox/tools/auto_index/
   sandbox/tools/auto_index/doc/
   sandbox/tools/auto_index/doc/Jamfile.v2   (contents, props changed)
   sandbox/tools/auto_index/doc/auto_index.qbk   (contents, props changed)
   sandbox/tools/auto_index/doc/html/
   sandbox/tools/auto_index/doc/html/autoindex/
   sandbox/tools/auto_index/doc/html/autoindex/overview.html   (contents, props changed)
   sandbox/tools/auto_index/doc/html/boostbook.css   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/
   sandbox/tools/auto_index/doc/html/images/blank.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/caution.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/caution.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/draft.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/home.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/home.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/important.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/important.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/next.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/next.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/next_disabled.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/note.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/note.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/prev.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/prev.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/prev_disabled.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/tip.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/tip.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/toc-blank.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/toc-minus.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/toc-plus.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/up.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/up.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/up_disabled.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/warning.png   (contents, props changed)
   sandbox/tools/auto_index/doc/html/images/warning.svg   (contents, props changed)
   sandbox/tools/auto_index/doc/html/index.html   (contents, props changed)
   sandbox/tools/auto_index/doc/html/reference.css   (contents, props changed)
   sandbox/tools/auto_index/doc/students_t_eg_1.png   (contents, props changed)
   sandbox/tools/auto_index/doc/students_t_eg_2.png   (contents, props changed)
   sandbox/tools/auto_index/doc/students_t_eg_3.png   (contents, props changed)
   sandbox/tools/auto_index/doc/students_t_eg_4.png   (contents, props changed)
   sandbox/tools/auto_index/src/
   sandbox/tools/auto_index/src/auto_index.cpp   (contents, props changed)
   sandbox/tools/auto_index/src/tiny_xml.cpp   (contents, props changed)
   sandbox/tools/auto_index/src/tiny_xml.hpp   (contents, props changed)
Added: sandbox/tools/auto_index/doc/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/Jamfile.v2	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,73 @@
+# Copyright John Maddock 2005. Use, modification, and distribution are
+# subject to the Boost Software License, Version 1.0. (See accompanying
+# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+using quickbook ;
+
+path-constant images_location : html ;
+
+xml auto_index : auto_index.qbk ;
+boostbook standalone
+    :
+        auto_index
+    :
+        # Path for links to Boost:
+        #<xsl:param>boost.root=../../../../../../../trunk
+        # Path for libraries index:
+        <xsl:param>boost.libraries=$(boost-root)/libs/libraries.htm
+        # Use the main Boost stylesheet:
+        <xsl:param>html.stylesheet=boostbook.css
+        
+        # Some general style settings:
+        <xsl:param>table.footnote.number.format=1
+        <xsl:param>footnote.number.format=1
+
+        # HTML options first:
+        # Use graphics not text for navigation:
+        <xsl:param>navig.graphics=1
+        # How far down we chunk nested sections, basically all of them:
+        <xsl:param>chunk.section.depth=10
+        # Don't put the first section on the same page as the TOC:
+        <xsl:param>chunk.first.sections=1
+        # How far down sections get TOC's
+        <xsl:param>toc.section.depth=10
+        # Max depth in each TOC:
+        <xsl:param>toc.max.depth=4
+        # How far down we go with TOC's
+        <xsl:param>generate.section.toc.level=10
+        # Index on type:
+        <xsl:param>index.on.type=1
+        
+        #<xsl:param>root.filename="sf_dist_and_tools"
+        #<xsl:param>graphicsize.extension=1
+        #<xsl:param>use.extensions=1
+        
+        # PDF Options:
+        # TOC Generation: this is needed for FOP-0.9 and later:
+        <xsl:param>fop1.extensions=0
+        <format>pdf:<xsl:param>xep.extensions=1
+        # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9!
+        <format>pdf:<xsl:param>fop.extensions=0
+        # No indent on body text:
+        <format>pdf:<xsl:param>body.start.indent=0pt
+        # Margin size:
+        <format>pdf:<xsl:param>page.margin.inner=0.5in
+        # Margin size:
+        <format>pdf:<xsl:param>page.margin.outer=0.5in
+        # Paper type = A4
+        <format>pdf:<xsl:param>paper.type=A4
+        # Yes, we want graphics for admonishments:
+        <xsl:param>admon.graphics=1
+        # Set this one for PDF generation *only*:
+        # default pnd graphics are awful in PDF form,
+        # better use SVG's instead:
+        <format>pdf:<xsl:param>admon.graphics.extension=".svg"
+        <format>pdf:<xsl:param>use.role.for.mediaobject=1 
+        <format>pdf:<xsl:param>preferred.mediaobject.role=print
+        <format>pdf:<xsl:param>img.src.path=$(images_location)/
+        <format>pdf:<xsl:param>admon.graphics.path=$(images_location)/images/
+        <format>pdf:<xsl:param>draft.mode="no"
+    ;
+
+
+
Added: sandbox/tools/auto_index/doc/auto_index.qbk
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/auto_index.qbk	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,77 @@
+[article AutoIndex
+    [quickbook 1.4]
+    [copyright 2008 John Maddock]
+    [license
+        Distributed under the Boost Software License, Version 1.0.
+        (See accompanying file LICENSE_1_0.txt or copy at
+        [@http://www.boost.org/LICENSE_1_0.txt])
+    ]
+    [authors [Maddock, John]]
+    [/last-revision $Date: 2008-11-04 17:11:53 +0000 (Tue, 04 Nov 2008) $]
+]
+
+[section:overview Overview]
+
+AutoIndex is a tool for taking the grunt work out of indexing a
+Quickbook\/Boostbook\/Docbook document that describes C/C++ code.
+
+Traditionally, in order to index a Docbook document you would
+have to manually add a large amount of `<indexterm>` markup: 
+in fact one `<indexterm>` for each occurance of each term to be
+indexed.  
+
+Instead AutoIndex will scan one or more C/C++ header files
+and extract all the ['function], ['class], ['macro] and ['typedef] 
+names that are defined by those headers, and then insert the 
+`<indexterm>`'s into the XML document for you.
+
+AutoIndex creates index entries as follows - for each occurance of 
+each search term, it creates two index entries - one has the search term
+as the primary index key and the title of the section it appears in as
+a subterm, the other has the section title as the main index entry and the
+search term as the subentry.  Thus the user has two chances to find what their
+looking for, based upon either the section name or the ['function], ['class], ['macro] 
+or ['typedef] name.
+
+So for example in Boost.Math the class name `students_t_distribution` has a primary
+entry that lists all sections it appears in:
+
+[$../students_t_eg_1.png]
+
+Then those sections also have primary entries, which list all the search terms those
+sections contain:
+
+[$../students_t_eg_2.png]
+
+Of course these automated index entries may not be quite
+what you're looking for: often you'll get a few spurious entries, a few missing entries,
+and a few entries where the section name used as an index entry is less than ideal.
+So AutoIndex provides some powerful regular expression based rules that allow you
+to add, remove, constrain, or rewrite entries.  Normally just a few lines in
+AutoIndex's script file are enough to tailor the output to match the authors
+expectations.
+
+AutoIndex also supports multiple indexes (as does Docbook), and since it knows
+which search terms are ['function], ['class], ['macro] or ['typedef] names, it
+can add the necessary attritubes to the XML so that you can have separate
+indexes for each of these different types.  These specialised indexes only contain
+entries for the ['function], ['class], ['macro] or ['typedef] names, ['section
+names] are never used as primary index terms here, unlike the main "include everything"
+index.
+
+Finally, while the Docbook XSL stylesheets create nice indexes complete with page
+numbers for PDF output, the HTML indexes look a lot less good, as these use
+section titles in place of page numbers... but as AutoIndex uses section titles
+as index entries this leads to a lot of repetition, so as an alternative AutoIndex
+can be instructed to construct the index itself.  This is faster than using
+the XSL stylesheets, and now each index entry is a hyperlink to the 
+approprate section:
+
+[$../students_t_eg_3.png]
+
+With internal index generation there is also a helpful navigation bar 
+at the start of each Index:
+
+[$../students_t_eg_4.png]
+
+[endsect]
Added: sandbox/tools/auto_index/doc/html/autoindex/overview.html
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/html/autoindex/overview.html	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,116 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Overview</title>
+<link rel="stylesheet" href="../boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot_8125">
+<link rel="home" href="../index.html" title="AutoIndex">
+<link rel="up" href="../index.html" title="AutoIndex">
+<link rel="prev" href="../index.html" title="AutoIndex">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="autoindex.overview"></a><a class="link" href="overview.html" title="Overview"> Overview</a>
+</h2></div></div></div>
+<p>
+      AutoIndex is a tool for taking the grunt work out of indexing a Quickbook/Boostbook/Docbook
+      document that describes C/C++ code.
+    </p>
+<p>
+      Traditionally, in order to index a Docbook document you would have to manually
+      add a large amount of <code class="computeroutput"><span class="special"><</span><span class="identifier">indexterm</span><span class="special">></span></code> markup: in fact one <code class="computeroutput"><span class="special"><</span><span class="identifier">indexterm</span><span class="special">></span></code>
+      for each occurance of each term to be indexed.
+    </p>
+<p>
+      Instead AutoIndex will scan one or more C/C++ header files and extract all
+      the <span class="emphasis"><em>function</em></span>, <span class="emphasis"><em>class</em></span>, <span class="emphasis"><em>macro</em></span>
+      and <span class="emphasis"><em>typedef</em></span> names that are defined by those headers, and
+      then insert the <code class="computeroutput"><span class="special"><</span><span class="identifier">indexterm</span><span class="special">></span></code>'s into the XML document for you.
+    </p>
+<p>
+      AutoIndex creates index entries as follows - for each occurance of each search
+      term, it creates two index entries - one has the search term as the primary
+      index key and the title of the section it appears in as a subterm, the other
+      has the section title as the main index entry and the search term as the subentry.
+      Thus the user has two chances to find what their looking for, based upon either
+      the section name or the <span class="emphasis"><em>function</em></span>, <span class="emphasis"><em>class</em></span>,
+      <span class="emphasis"><em>macro</em></span> or <span class="emphasis"><em>typedef</em></span> name.
+    </p>
+<p>
+      So for example in Boost.Math the class name <code class="computeroutput"><span class="identifier">students_t_distribution</span></code>
+      has a primary entry that lists all sections it appears in:
+    </p>
+<p>
+      <span class="inlinemediaobject"><img src="../../students_t_eg_1.png" alt="students_t_eg_1"></span>
+    </p>
+<p>
+      Then those sections also have primary entries, which list all the search terms
+      those sections contain:
+    </p>
+<p>
+      <span class="inlinemediaobject"><img src="../../students_t_eg_2.png" alt="students_t_eg_2"></span>
+    </p>
+<p>
+      Of course these automated index entries may not be quite what you're looking
+      for: often you'll get a few spurious entries, a few missing entries, and a
+      few entries where the section name used as an index entry is less than ideal.
+      So AutoIndex provides some powerful regular expression based rules that allow
+      you to add, remove, constrain, or rewrite entries.
+    </p>
+<p>
+      AutoIndex also supports multiple indexes (as does Docbook), and since it knows
+      which search terms are <span class="emphasis"><em>function</em></span>, <span class="emphasis"><em>class</em></span>,
+      <span class="emphasis"><em>macro</em></span> or <span class="emphasis"><em>typedef</em></span> names, it can add
+      the necessary attritubes to the XML so that you can have separate indexes for
+      each of these different types. These specialised indexes only contain entries
+      for the <span class="emphasis"><em>function</em></span>, <span class="emphasis"><em>class</em></span>, <span class="emphasis"><em>macro</em></span>
+      or <span class="emphasis"><em>typedef</em></span> names, <span class="emphasis"><em>section names</em></span> are
+      never used as primary index terms here, unlike the main "include everything"
+      index.
+    </p>
+<p>
+      Finally, while the Docbook XSL stylesheets create nice indexes complete with
+      page numbers for PDF output, the HTML indexes look a lot less good, as these
+      use section titles in place of page numbers... but as AutoIndex uses section
+      titles as index entries this leads to a lot of repetition, so as an alternative
+      AutoIndex can be instructed to construct the index itself. This is faster than
+      using the XSL stylesheets, and now each index entry is a hyperlink to the approprate
+      section:
+    </p>
+<p>
+      <span class="inlinemediaobject"><img src="../../students_t_eg_3.png" alt="students_t_eg_3"></span>
+    </p>
+<p>
+      There is also a navigation bar at the start of each Index:
+    </p>
+<p>
+      <span class="inlinemediaobject"><img src="../../students_t_eg_4.png" alt="students_t_eg_4"></span>
+    </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008 John Maddock<p>
+        Distributed under the Boost Software License, Version 1.0. (See accompanying
+        file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+      </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/html/images/home.png" alt="Home"></a>
+</div>
+</body>
+</html>
Added: sandbox/tools/auto_index/doc/html/boostbook.css
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/html/boostbook.css	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,538 @@
+/*=============================================================================
+    Copyright (c) 2004 Joel de Guzman
+    http://spirit.sourceforge.net/
+
+    Use, modification and distribution is subject to the Boost Software
+    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+    
+    New syntax color Paul A. Bristow 8 Jun 2007
+=============================================================================*/
+
+/*=============================================================================
+    Body defaults
+=============================================================================*/
+
+    body 
+    {
+        margin: 1em;
+        font-family: sans-serif;
+    }
+
+/*=============================================================================
+    Paragraphs
+=============================================================================*/
+
+    p 
+    {
+        text-align: left;
+        font-size: 10pt; 
+        line-height: 1.15;
+    }
+
+/*=============================================================================
+    Program listings
+=============================================================================*/
+
+    /* Code on paragraphs */
+    p tt.computeroutput
+    {
+        font-size: 9pt;
+    }
+
+    pre.synopsis
+    {
+        font-size: 90%;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    .programlisting, 
+    .screen
+    {
+        font-size: 9pt;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+
+    /* Program listings in tables don't get borders */
+    td .programlisting, 
+    td .screen
+    {
+        margin: 0pc 0pc 0pc 0pc;
+        padding:  0pc 0pc 0pc 0pc;
+    }
+
+/*=============================================================================
+    Headings
+=============================================================================*/
+
+    h1, h2, h3, h4, h5, h6 
+    { 
+        text-align: left; 
+        margin: 1em 0em 0.5em 0em;
+        font-weight: bold;
+    }
+
+    h1 { font: 140% }
+    h2 { font: bold 140% }
+    h3 { font: bold 130% }
+    h4 { font: bold 120% }
+    h5 { font: italic 110% }
+    h6 { font: italic 100% }
+
+    /* Top page titles */
+    title, 
+    h1.title, 
+    h2.title
+    h3.title, 
+    h4.title, 
+    h5.title, 
+    h6.title, 
+    .refentrytitle
+    {
+        font-weight: bold;
+        margin-bottom: 1pc;
+    }
+
+    h1.title { font-size: 140% }
+    h2.title { font-size: 140% }
+    h3.title { font-size: 130% }
+    h4.title { font-size: 120% }
+    h5.title { font-size: 110% }
+    h6.title { font-size: 100% }
+
+    .section h1 
+    {
+        margin: 0em 0em 0.5em 0em;
+        font-size: 140%;
+    }
+
+    .section h2 { font-size: 140% }
+    .section h3 { font-size: 130% }
+    .section h4 { font-size: 120% }
+    .section h5 { font-size: 110% }
+    .section h6 { font-size: 100% }
+
+    /* Code on titles */
+    h1 tt.computeroutput { font-size: 140% }
+    h2 tt.computeroutput { font-size: 140% }
+    h3 tt.computeroutput { font-size: 130% }
+    h4 tt.computeroutput { font-size: 120% }
+    h5 tt.computeroutput { font-size: 110% }
+    h6 tt.computeroutput { font-size: 100% }
+
+/*=============================================================================
+    Author
+=============================================================================*/
+
+    h3.author 
+    { 
+        font-size: 100% 
+    }
+
+/*=============================================================================
+    Lists
+=============================================================================*/
+
+    li
+    {
+        font-size: 10pt;
+        line-height: 1.3;
+    }
+    
+    /* Unordered lists */
+    ul 
+    {
+        text-align: left;
+    }
+    
+    /* Ordered lists */
+    ol 
+    {
+        text-align: left;
+    }
+
+/*=============================================================================
+    Links
+=============================================================================*/
+
+    a
+    {
+        text-decoration: none; /* no underline */
+    }
+    
+    a:hover
+    {
+        text-decoration: underline;
+    }
+
+/*=============================================================================
+    Spirit style navigation
+=============================================================================*/
+
+    .spirit-nav
+    {
+        text-align: right;
+    }
+    
+    .spirit-nav a
+    {
+        color: white;
+        padding-left: 0.5em;
+    }
+    
+    .spirit-nav img
+    {
+        border-width: 0px;
+    }
+
+/*=============================================================================
+    Table of contents
+=============================================================================*/
+
+    .toc
+    {
+       margin: 1pc 4% 0pc 4%;
+       padding: 0.1pc 1pc 0.1pc 1pc;
+       font-size: 80%; 
+       line-height: 1.15;
+    }
+    
+    .boost-toc
+    {
+       float: right;
+       padding: 0.5pc;
+    }
+
+/*=============================================================================
+    Tables
+=============================================================================*/
+
+    .table-title, 
+    div.table p.title
+    {
+        margin-left: 4%;
+        padding-right: 0.5em; 
+        padding-left: 0.5em;
+    }
+    
+    .informaltable table, 
+    .table table
+    {
+        width: 92%;
+        margin-left: 4%;
+        margin-right: 4%;
+    }
+    
+    div.informaltable table, 
+    div.table table
+    {
+        padding: 4px;
+    }
+    
+    /* Table Cells */
+    div.informaltable table tr td, 
+    div.table table tr td
+    {
+        padding: 0.5em;
+        text-align: left;
+        font-size: 9pt;
+    }
+
+    div.informaltable table tr th, 
+    div.table table tr th
+    {
+        padding: 0.5em 0.5em 0.5em 0.5em;
+        border: 1pt solid white;
+        font-size: 80%;
+    }
+
+/*=============================================================================
+    Blurbs
+=============================================================================*/
+
+    div.note,
+    div.tip,
+    div.important,
+    div.caution,
+    div.warning,
+    p.blurb
+    {
+        font-size: 9pt; /* A little bit smaller than the main text */
+        line-height: 1.2;
+        display: block;
+        margin: 1pc 4% 0pc 4%;
+        padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+    }
+    
+    p.blurb img
+    {
+        padding: 1pt;
+    }
+
+/*=============================================================================
+    Variable Lists
+=============================================================================*/
+
+    /* Make the terms in definition lists bold */
+    div.variablelist dl dt,
+    span.term
+    {
+        font-weight: bold;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td
+    {
+        text-align: left;
+        vertical-align: top;
+        padding: 0em 2em 0em 0em;
+        font-size: 10pt;
+        margin: 0em 0em 0.5em 0em;
+        line-height: 1;
+    }
+
+    div.variablelist dl dt
+    {
+        margin-bottom: 0.2em;
+    }
+
+    div.variablelist dl dd
+    {
+        margin: 0em 0em 0.5em 2em;
+        font-size: 10pt;
+    }
+
+    div.variablelist table tbody tr td p,
+    div.variablelist dl dd p
+    {
+        margin: 0em 0em 0.5em 0em;
+        line-height: 1;
+    }
+
+/*=============================================================================
+    Misc
+=============================================================================*/
+
+    /* Title of books and articles in bibliographies */
+    span.title
+    {
+        font-style: italic;
+    }
+
+    span.underline
+    {
+        text-decoration: underline;
+    }
+
+    span.strikethrough
+    {
+        text-decoration: line-through;
+    }
+
+    /* Copyright, Legal Notice */
+    div div.legalnotice p
+    {
+        text-align: left
+    }
+
+/*=============================================================================
+    Colors
+=============================================================================*/
+
+    @media screen
+    {
+    /* Links */
+        a
+        {
+            color: #005a9c;
+        }
+    
+        a:visited
+        {
+            color: #9c5a9c;
+        }
+
+        h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+        h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
+        h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
+        {
+            text-decoration: none; /* no underline */
+            color: #000000;
+        }
+    
+        /* New Syntax Highlighting 
+		       using Recognized color keyword names, for example:
+		       http://www.w3.org/TR/SVG/types.html see section 4.2 
+		    */
+		        .keyword        { color: blue; }
+		        .identifier     { color: black; }
+		        .special        { color: magenta; }
+		        .preprocessor   { color: blueviolet; }
+		        .char           { color: teal; }
+		        .comment        { color: green; }
+		        .string         { color: teal; }
+		        .number         { color: red; }
+		        .white_bkd      { background-color: white; }
+		        .dk_grey_bkd    { background-color: dimgray; }
+
+    /* Original Syntax Highlighting 
+        .keyword        { color: blue; }
+        .identifier     { color: #000000; }
+        .special        { color: #707070; }
+        .preprocessor   { color: #402080; }
+        .char           { color: teal; }
+        .comment        { color: #800000; }
+        .string         { color: teal; }
+        .number         { color: teal; }
+        .white_bkd      { background-color: #FFFFFF; }
+        .dk_grey_bkd    { background-color: #999999; }
+    */
+    /* Copyright, Legal Notice */
+        .copyright      
+        { 
+            color: #666666; 
+            font-size: small; 
+        }
+    
+        div div.legalnotice p
+        {
+            color: #666666;
+        }
+    
+    /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        td .programlisting, 
+        td .screen
+        {
+            border: 0px solid #DCDCDC;
+        }
+    
+    /* Blurbs */
+        div.note,
+        div.tip,
+        div.important,
+        div.caution,
+        div.warning,
+        p.blurb
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Table of contents */
+        .toc
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid #DCDCDC;
+        }
+    
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            background-color: #F0F0F0;
+            border: 1px solid #DCDCDC;
+        }
+    
+    /* Misc */
+        span.highlight
+        {
+            color: #00A000;
+        }
+    }
+    
+    @media print
+    {
+    /* Links */
+        a
+        {
+            color: black;
+        }
+    
+        a:visited
+        {
+            color: black;
+        }
+    
+        .spirit-nav
+        {
+            display: none;
+        }
+    
+    /* Program listing */
+        pre.synopsis
+        {
+            border: 1px solid gray;
+        }
+    
+        .programlisting, 
+        .screen
+        {
+            border: 1px solid gray;
+        }
+    
+        td .programlisting, 
+        td .screen
+        {
+            border: 0px solid #DCDCDC;
+        }
+    
+    /* Table of contents */
+        .toc
+        {
+            border: 1px solid gray;
+        }
+    
+        .informaltable table, 
+        .table table
+        {
+            border: 1px solid gray;
+            border-collapse: collapse;
+        }
+    
+    /* Tables */
+        div.informaltable table tr td, 
+        div.table table tr td
+        {
+            border: 1px solid gray;
+        }
+    
+        div.informaltable table tr th, 
+        div.table table tr th
+        {
+            border: 1px solid gray;
+        }
+    
+    /* Misc */
+        span.highlight
+        {
+            font-weight: bold;
+        }
+    }
+
+/*=============================================================================
+    Images
+=============================================================================*/
+
+    span.inlinemediaobject img
+    {
+        vertical-align: middle;
+    }
+
Added: sandbox/tools/auto_index/doc/html/images/blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/caution.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/caution.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/draft.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/home.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/home.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/important.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/important.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/next.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/next.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/next_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/note.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/note.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/prev.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/prev.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/prev_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/tip.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/tip.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/toc-blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/toc-minus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/toc-plus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/up.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/up.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/up_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/warning.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/images/warning.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/html/index.html
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/html/index.html	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,51 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>AutoIndex</title>
+<link rel="stylesheet" href="boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot_8125">
+<link rel="home" href="index.html" title="AutoIndex">
+<link rel="next" href="autoindex/overview.html" title="Overview">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="autoindex/overview.html"><img src="../../doc/html/images/next.png" alt="Next"></a></div>
+<div class="article" lang="en">
+<div class="titlepage">
+<div>
+<div><h2 class="title">
+<a name="autoindex"></a>AutoIndex</h2></div>
+<div><div class="authorgroup"><div class="author"><h3 class="author">
+<span class="firstname">John</span> <span class="surname">Maddock</span>
+</h3></div></div></div>
+<div><p class="copyright">Copyright © 2008 John Maddock</p></div>
+<div><div class="legalnotice">
+<a name="id473180"></a><p>
+        Distributed under the Boost Software License, Version 1.0. (See accompanying
+        file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+      </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl><dt><span class="section"> Overview</span></dt></dl>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"><p><small>Last revised: November 20, 2008 at 18:04:26 GMT</small></p></td>
+<td align="right"><div class="copyright-footer"></div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="autoindex/overview.html"><img src="../../doc/html/images/next.png" alt="Next"></a></div>
+</body>
+</html>
Added: sandbox/tools/auto_index/doc/html/reference.css
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/doc/html/reference.css	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,5 @@
+PRE.synopsis { 
+  background-color: #e0ffff;
+  border: thin solid blue;
+  padding: 1em
+}
Added: sandbox/tools/auto_index/doc/students_t_eg_1.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/students_t_eg_2.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/students_t_eg_3.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/doc/students_t_eg_4.png
==============================================================================
Binary file. No diff available.
Added: sandbox/tools/auto_index/src/auto_index.cpp
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/src/auto_index.cpp	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,804 @@
+
+#include "tiny_xml.hpp"
+#include <boost/regex.hpp>
+#include <boost/filesystem.hpp>
+#include <fstream>
+#include <cctype>
+#include <map>
+#include <set>
+#include <sstream>
+
+int help()
+{
+   return 1;
+}
+
+void eat_whitespace(std::istream & is)
+{
+   char c = is.peek();
+   while(std::isspace(c))
+   {
+      is.get(c);
+      c = is.peek();
+   }
+}
+
+void eat_block(std::string& result, std::istream & is)
+{
+   //
+   // everything until we get to a closing '>':
+   //
+   char c;
+   while(is.get(c) && c != '>')
+   {
+      result += c;
+      if(c == '\\')
+      {
+         is.get(c);
+         result += c;
+      }
+   }
+   result += c;
+}
+
+std::string get_header(std::istream & is)
+{
+   //
+   // We need to get any leading <? and <! elements:
+   //
+   std::string result;
+   eat_whitespace(is);
+   if(is.get() != '<')
+      throw std::runtime_error("Invalid leading markup in XML file found");
+   char c = is.peek();
+   while((c == '?') || (c == '!'))
+   {
+      result += '<';
+      eat_block(result, is);
+      eat_whitespace(is);
+      if(is.get() != '<')
+         throw std::runtime_error("Invalid leading markup in XML file found");
+      c = is.peek();
+      result += '\n';
+   }
+   return result;
+}
+
+struct index_info
+{
+   std::string term;
+   boost::regex search_text;
+   boost::regex search_id;
+   std::string category;
+};
+bool operator < (const index_info& a, const index_info& b)
+{
+   return a.term < b.term;
+}
+
+std::multiset<index_info> index_terms;
+std::set<std::pair<std::string, std::string> > found_terms;
+bool no_duplicates = false;
+
+struct index_entry;
+typedef boost::shared_ptr<index_entry> index_entry_ptr;
+bool operator < (const index_entry_ptr& a, const index_entry_ptr& b);
+typedef std::set<index_entry_ptr> index_entry_set;
+
+std::string make_upper_key(const std::string& s)
+{
+   std::string result;
+   for(std::string::const_iterator i = s.begin(); i != s.end(); ++i)
+      result.append(1, std::toupper(*i));
+   return result;
+}
+
+struct index_entry
+{
+   std::string key;
+   std::string sort_key;
+   std::string id;
+   std::string category;
+   index_entry_set sub_keys;
+
+   index_entry(){}
+   index_entry(const std::string& k) : key(k) { sort_key = make_upper_key(key); }
+   index_entry(const std::string& k, const std::string& i) : key(k), id(i) { sort_key = make_upper_key(key); }
+   index_entry(const std::string& k, const std::string& i, const std::string& c) : key(k), id(i), category(c) { sort_key = make_upper_key(key); }
+};
+
+index_entry_set index_entries;
+
+bool operator < (const index_entry_ptr& a, const index_entry_ptr& b)
+{
+   return a->sort_key < b->sort_key;
+}
+
+boost::tiny_xml::element_list indexes;
+
+struct id_rewrite_rule
+{
+   bool base_on_id;
+   boost::regex id;
+   std::string new_name;
+
+   id_rewrite_rule(const std::string& i, const std::string& n, bool b)
+      : base_on_id(b), id(i), new_name(n) {}
+};
+std::list<id_rewrite_rule> id_rewrite_list;
+
+bool internal_indexes = false;
+
+struct node_id
+{
+   const std::string* id;
+   node_id* prev;
+};
+
+struct title_info
+{
+   std::string title;
+   title_info* prev;
+};
+
+const std::string* find_attr(boost::tiny_xml::element_ptr node, const char* name)
+{
+   for(boost::tiny_xml::attribute_list::const_iterator i = node->attributes.begin();
+      i != node->attributes.end(); ++i)
+   {
+      if(i->name == name)
+         return &(i->value);
+   }
+   return 0;
+}
+
+const std::string* get_current_block_id(node_id const* id)
+{
+   while((id->id == 0) && (id->prev))
+      id = id->prev;
+   return id->id;
+}
+
+const std::string& get_current_block_title(title_info const* id)
+{
+   while((id->title.size() == 0) && (id->prev))
+      id = id->prev;
+   return id->title;
+}
+
+std::string get_consolidated_content(boost::tiny_xml::element_ptr node)
+{
+   std::string result(node->content);
+   for(boost::tiny_xml::element_list::const_iterator i = node->elements.begin();
+      i != node->elements.end(); ++i)
+   {
+      result += " ";
+      result += get_consolidated_content(*i);
+   }
+   static const boost::regex e("(^[[:space:]]+)|([[:space:]]+)|([[:space:]]+$)");
+   return regex_replace(result, e, "(?2 )", boost::regex_constants::format_all);
+}
+
+std::string rewrite_title(const std::string& title, const std::string& id)
+{
+   for(std::list<id_rewrite_rule>::const_iterator i = id_rewrite_list.begin(); i != id_rewrite_list.end(); ++i)
+   {
+      if(i->base_on_id)
+      {
+         if(regex_match(id, i->id))
+            return i->new_name;
+      }
+      else
+      {
+         if(regex_match(title, i->id))
+            return regex_replace(title, i->id, i->new_name);
+      }
+   }
+   return title;
+}
+
+void process_node(boost::tiny_xml::element_ptr node, node_id* prev, title_info* pt, boost::tiny_xml::element_ptr parent_node = boost::tiny_xml::element_ptr())
+{
+   node_id id = { 0, prev };
+   id.id = find_attr(node, "id");
+   title_info title = { "", pt};
+   if(node->name == "title")
+   {
+      //
+      // This actually sets the title of the enclosing scope, 
+      // not this tag itself:
+      //
+      title.prev->title = get_consolidated_content(node);
+      std::cout << "Indexing section: " << title.prev->title << std::endl;
+   }
+   else if(node->name == "index")
+   {
+      indexes.push_back(node);
+   }
+
+   //
+   // Search content for items:
+   //
+   static const boost::regex space_re("[[:space:]]+");
+   if((node->name == "") && node->content.size() && !regex_match(node->content, space_re))
+   {
+      const std::string* pid = get_current_block_id(&id);
+      const std::string& rtitle = get_current_block_title(&title);
+      const std::string simple_title = rewrite_title(rtitle, *pid);
+
+      for(std::multiset<index_info>::const_iterator i = index_terms.begin();
+            i != index_terms.end(); ++i)
+      {
+         if(regex_search(node->content, i->search_text))
+         {
+            //
+            // We need to check to see if this term has already been indexed
+            // in this zone, in order to prevent duplicate entries:
+            //
+            std::pair<std::string, std::string> item_index(*pid, i->term);
+            if(((no_duplicates == false) || (0 == found_terms.count(item_index))) 
+               && (i->search_id.empty() || regex_search(*pid, i->search_id)))
+            {
+               found_terms.insert(item_index);
+               /*
+               std::cout << "<indexterm zone=\"" << *pid << "\">\n  <primary>"
+                  << rtitle << "</primary>\n"
+                  << "  <secondary>" << i->first << "</secondary>\n</indexterm>" << std::endl;
+               std::cout << "<indexterm zone=\"" << *pid << "\">\n  <primary>"
+                  << i->first << "</primary>\n"
+                  << "  <secondary>" << rtitle << "</secondary>\n</indexterm>" << std::endl;
+               */
+
+               if(internal_indexes == false)
+               {
+                  boost::tiny_xml::element_ptr p(new boost::tiny_xml::element());
+                  p->name = "indexterm";
+                  boost::tiny_xml::element_ptr prim(new boost::tiny_xml::element());
+                  prim->name = "primary";
+                  prim->elements.push_front(boost::tiny_xml::element_ptr(new boost::tiny_xml::element()));
+                  prim->elements.front()->content = simple_title;
+                  p->elements.push_front(prim);
+
+                  boost::tiny_xml::element_ptr sec(new boost::tiny_xml::element());
+                  sec->name = "secondary";
+                  sec->elements.push_front(boost::tiny_xml::element_ptr(new boost::tiny_xml::element()));
+                  sec->elements.front()->content = i->term;
+                  p->elements.push_back(sec);
+                  if(parent_node)
+                     parent_node->elements.push_front(p);
+               }
+               index_entry_ptr item1(new index_entry(simple_title));
+               index_entry_ptr item2(new index_entry(i->term, *pid));
+               if(index_entries.find(item1) == index_entries.end())
+               {
+                  index_entries.insert(item1);
+               }
+               (**index_entries.find(item1)).sub_keys.insert(item2);
+
+               if(internal_indexes == false)
+               {
+                  boost::tiny_xml::element_ptr p2(new boost::tiny_xml::element());
+                  p2->name = "indexterm";
+                  if(i->category.size())
+                  {
+                     p2->attributes.push_back(boost::tiny_xml::attribute("type", i->category));
+                  }
+                  boost::tiny_xml::element_ptr prim2(new boost::tiny_xml::element());
+                  prim2->name = "primary";
+                  prim2->elements.push_front(boost::tiny_xml::element_ptr(new boost::tiny_xml::element()));
+                  prim2->elements.front()->content = i->term;
+                  p2->elements.push_front(prim2);
+
+                  boost::tiny_xml::element_ptr sec2(new boost::tiny_xml::element());
+                  sec2->name = "secondary";
+                  sec2->elements.push_front(boost::tiny_xml::element_ptr(new boost::tiny_xml::element()));
+                  sec2->elements.front()->content = rtitle;
+                  p2->elements.push_back(sec2);
+                  if(parent_node)
+                     parent_node->elements.push_front(p2);
+               }
+               index_entry_ptr item3(new index_entry(i->term));
+               index_entry_ptr item4(new index_entry(rtitle, *pid));
+               if(index_entries.find(item3) == index_entries.end())
+               {
+                  index_entries.insert(item3);
+                  if(i->category.size())
+                  {
+                     (**index_entries.find(item3)).category = i->category;
+                  }
+               }
+               (**index_entries.find(item3)).sub_keys.insert(item4);
+            }
+         }
+      }
+   }
+   //
+   // Recurse through children:
+   //
+   for(boost::tiny_xml::element_list::const_iterator i = node->elements.begin();
+      i != node->elements.end(); ++i)
+   {
+      process_node(*i, &id, &title, node);
+   }
+}
+
+void process_nodes(boost::tiny_xml::element_ptr node)
+{
+   node_id id = { 0, };
+   title_info t = { "", 0 };
+   process_node(node, &id, &t);
+}
+
+void load_file(std::string& s, std::istream& is)
+{
+   s.erase();
+   if(is.bad()) return;
+   s.reserve(is.rdbuf()->in_avail());
+   char c;
+   while(is.get(c))
+   {
+      if(s.capacity() == s.size())
+         s.reserve(s.capacity() * 3);
+      s.append(1, c);
+   }
+}
+
+void scan_file(const char* file)
+{
+   static const boost::regex class_e(
+         // possibly leading whitespace:   
+         "^[[:space:]]*" 
+         // possible template declaration:
+         "(template[[:space:]]*<[^;:{]+>[[:space:]]*)?"
+         // class or struct:
+         "(class|struct)[[:space:]]*" 
+         // leading declspec macros etc:
+         "("
+            "\\<\\w+\\>"
+            "("
+               "[[:blank:]]*\\([^)]*\\)"
+            ")?"
+            "[[:space:]]*"
+         ")*" 
+         // the class name
+         "(\\<\\w*\\>)[[:space:]]*" 
+         // template specialisation parameters
+         "(<[^;:{]+>)?[[:space:]]*"
+         // terminate in { or :
+         "(\\{|:[^;\\{()]*\\{)"
+      );
+   std::string text;
+   std::ifstream is(file);
+   load_file(text, is);
+   {
+      boost::sregex_token_iterator i(text.begin(), text.end(), class_e, 5), j;
+      while(i != j)
+      {
+         index_info info;
+         info.term = i->str();
+         info.search_text = "\\<" + i->str() + "\\>";
+         info.category = "class_name";
+         if(index_terms.count(info) == 0)
+         {
+            std::cout << "Indexing class " << info.term << std::endl;
+            index_terms.insert(info);
+         }
+         ++i;
+      }
+   }
+
+   //
+   // Now typedefs:
+   //
+   {
+      static const boost::regex typedef_exp(
+         "typedef.+?(\\w+)\\s*;");
+      boost::sregex_token_iterator i(text.begin(), text.end(), typedef_exp, 1), j;
+      while(i != j)
+      {
+         index_info info;
+         info.term = i->str();
+         info.search_text = "\\<" + i->str() + "\\>";
+         info.category = "typedef_name";
+         if(index_terms.count(info) == 0)
+         {
+            std::cout << "Indexing typedef " << info.term << std::endl;
+            index_terms.insert(info);
+         }
+         ++i;
+      }
+   }
+
+   //
+   // Now macros:
+   //
+   {
+      static const boost::regex e(
+         "^\\s*#\\s*define\\s+(\\w+)"
+         );
+      boost::sregex_token_iterator i(text.begin(), text.end(), e, 1), j;
+      while(i != j)
+      {
+         index_info info;
+         info.term = i->str();
+         info.search_text = "\\<" + i->str() + "\\>";
+         info.category = "macro_name";
+         if(index_terms.count(info) == 0)
+         {
+            std::cout << "Indexing macro " << info.term << std::endl;
+            index_terms.insert(info);
+         }
+         ++i;
+      }
+   }
+   //
+   // Now functions:
+   //
+   {
+      static const boost::regex e(
+         "\\w+\\s+(\\w+)\\s*\\([^\\)]*\\)\\s*\\{"
+         );
+      boost::sregex_token_iterator i(text.begin(), text.end(), e, 1), j;
+      while(i != j)
+      {
+         index_info info;
+         info.term = i->str();
+         info.search_text = "\\<" + i->str() + "\\>";
+         info.category = "function_name";
+         if(index_terms.count(info) == 0)
+         {
+            std::cout << "Indexing function " << info.term << std::endl;
+            index_terms.insert(info);
+         }
+         ++i;
+      }
+   }
+}
+
+void scan_dir(const std::string& dir, const std::string& mask, bool recurse)
+{
+   using namespace boost::filesystem;
+   boost::regex e(mask);
+   directory_iterator i(dir), j;
+
+   while(i != j)
+   {
+      if(regex_match(i->path().filename(), e))
+      {
+         scan_file(i->path().directory_string().c_str());
+      }
+      else if(recurse && is_directory(i->status()))
+      {
+         scan_dir(i->path().directory_string(), mask, recurse);
+      }
+      ++i;
+   }
+}
+
+std::string unquote(const std::string& s)
+{
+   std::string result(s);
+   if((s.size() >= 2) && (*s.begin() == '\"') && (*s.rbegin() == '\"'))
+   {
+      result.erase(result.begin());
+      result.erase(--result.end());
+   }
+   return result;
+}
+
+void process_script(const char* script)
+{
+   static const boost::regex scan_parser(
+      "!scan[[:space:]]+"
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      );
+   static const boost::regex scan_dir_parser(
+      "!scan-path[[:space:]]+"
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      "[[:space:]]+"
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      "(?:"
+         "[[:space:]]+"
+         "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      ")?"
+      );
+   static const boost::regex entry_parser( 
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      "(?:"
+         "[[:space:]]+"
+         "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+         "(?:"
+            "[[:space:]]+"
+            "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+            "(?:"
+               "[[:space:]]+"
+               "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+            ")?"
+         ")?"
+      ")?"
+      "[[:space:]]*");
+   static const boost::regex rewrite_parser(
+      "!(rewrite-name|rewrite-id)\\s+"
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")\\s+"
+      "([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")"
+      );
+   boost::smatch what;
+   std::string line;
+   std::ifstream is(script);
+   if(is.bad())
+   {
+      std::cerr << "Could not open script " << script << std::endl;
+      return;
+   }
+   while(std::getline(is, line).good())
+   {
+      if(regex_match(line, what, scan_parser))
+      {
+         std::string f = unquote(what[1].str());
+         scan_file(f.c_str());
+      }
+      else if(regex_match(line, what, scan_dir_parser))
+      {
+         std::string d = unquote(what[1].str());
+         std::string m = unquote(what[2].str());
+         bool r = unquote(what[3].str()) == "true";
+         scan_dir(d, m, r);
+      }
+      else if(regex_match(line, what, rewrite_parser))
+      {
+         bool id = what[1] == "rewrite-id";
+         std::string a = unquote(what[2].str());
+         std::string b = unquote(what[3].str());
+         id_rewrite_list.push_back(id_rewrite_rule(a, b, id));
+      }
+      else if(line.compare(0, 9, "!exclude ") == 0)
+      {
+         static const boost::regex delim("([^\"[:space:]]+|\"(?:[^\"\\\\]|\\\\.)+\")");
+         boost::sregex_token_iterator i(line.begin() + 9, line.end(), delim, 0), j;
+         while(i != j)
+         {
+            index_info info;
+            info.term = unquote(*i);
+            index_terms.erase(info);
+            ++i;
+         }
+      }
+      else if(regex_match(line, what, entry_parser))
+      {
+         // what[1] is the Index entry
+         // what[2] is the regex to search for (optional)
+         // what[3] is a section id that must be matched 
+         // in order for the term to be indexed (optional)
+         // what[4] is the index category to place the term in (optional).
+         index_info info;
+         info.term = unquote(what.str(1));
+         std::string s = unquote(what.str(2));
+         if(s.size())
+            info.search_text = boost::regex(s, boost::regex::icase|boost::regex::perl);
+         else
+            info.search_text = boost::regex("\\<" + what.str(1) + "\\>", boost::regex::icase|boost::regex::perl);
+         if(what[3].matched)
+            info.search_id = unquote(what.str(3));
+         if(what[4].matched)
+            info.category = unquote(what.str(4));
+         index_terms.insert(info);
+      }
+   }
+}
+
+std::string get_next_index_id()
+{
+   static int index_id_count = 0;
+   std::stringstream s;
+   s << "idx_id_" << index_id_count;
+   ++index_id_count;
+   return s.str();
+}
+
+void generate_indexes()
+{
+   for(boost::tiny_xml::element_list::const_iterator i = indexes.begin(); i != indexes.end(); ++i)
+   {
+      boost::tiny_xml::element_ptr node = *i;
+      const std::string* category = find_attr(node, "type");
+      bool has_title = false;
+
+      for(boost::tiny_xml::element_list::const_iterator k = (*i)->elements.begin(); k != (*i)->elements.end(); ++k)
+      {
+         if((**k).name == "title")
+         {
+            has_title = true;
+            break;
+         }
+      }
+
+      boost::tiny_xml::element_ptr navbar(new boost::tiny_xml::element());
+      navbar->name = "simplelist";
+      boost::tiny_xml::attribute attr;
+      attr.name = "type";
+      attr.value = "horiz";
+      navbar->attributes.push_back(attr);
+      node->elements.push_back(navbar);
+
+      char last_c = 0;
+      boost::tiny_xml::element_ptr list(new boost::tiny_xml::element());
+      list->name = "variablelist";
+      boost::tiny_xml::element_ptr listentry;
+      boost::tiny_xml::element_ptr listitem;
+      boost::tiny_xml::element_ptr sublist;
+      node->elements.push_back(list);
+
+      for(index_entry_set::const_iterator i = index_entries.begin(); i != index_entries.end(); ++i)
+      {
+         if((0 == category) || (category->size() == 0) || (category && (**i).category == *category))
+         {
+            if(std::toupper((**i).key[0]) != last_c)
+            {
+               std::string id_name = get_next_index_id();
+               last_c = std::toupper((**i).key[0]);
+               listentry.reset(new boost::tiny_xml::element());
+               listentry->name = "varlistentry";
+               boost::tiny_xml::attribute id;
+               id.name = "ID";
+               id.value = id_name;
+               boost::tiny_xml::element_ptr term(new boost::tiny_xml::element());
+               term->name = "term";
+               term->content.assign(&last_c, 1);
+               listentry->elements.push_front(term);
+               list->elements.push_back(listentry);
+               listitem.reset(new boost::tiny_xml::element());
+               listitem->name = "listitem";
+               sublist.reset(new boost::tiny_xml::element());
+               sublist->name = "variablelist";
+               listitem->elements.push_back(sublist);
+               listentry->elements.push_back(listitem);
+               boost::tiny_xml::element_ptr nav(new boost::tiny_xml::element());
+               nav->name = "member";
+               boost::tiny_xml::element_ptr navlink(new boost::tiny_xml::element());
+               navlink->name = "link";
+               navlink->content = term->content;
+               boost::tiny_xml::attribute navid;
+               navid.name = "linkend";
+               navid.value = id_name;
+               navlink->attributes.push_back(navid);
+               nav->elements.push_back(navlink);
+               navbar->elements.push_back(nav);
+            }
+            boost::tiny_xml::element_ptr subentry(new boost::tiny_xml::element());
+            subentry->name = "varlistentry";
+            boost::tiny_xml::element_ptr subterm(new boost::tiny_xml::element());
+            subterm->name = "term";
+            if((**i).id.empty())
+               subterm->content = (**i).key;
+            else
+            {
+               boost::tiny_xml::element_ptr link(new boost::tiny_xml::element());
+               link->name = "link";
+               link->content = (**i).key;
+               boost::tiny_xml::attribute at;
+               at.name = "linkend";
+               at.value = (**i).id;
+               link->attributes.push_back(at);
+               subterm->elements.push_back(link);
+            }
+            subentry->elements.push_back(subterm);
+            boost::tiny_xml::element_ptr subitem(new boost::tiny_xml::element());
+            subitem->name = "listitem";
+            subentry->elements.push_back(subitem);
+            sublist->elements.push_back(subentry);
+
+            boost::tiny_xml::element_ptr secondary_list(new boost::tiny_xml::element());
+            secondary_list->name = "simplelist";
+            subitem->elements.push_back(secondary_list);
+
+            for(index_entry_set::const_iterator k = (**i).sub_keys.begin(); k != (**i).sub_keys.end(); ++k)
+            {
+               boost::tiny_xml::element_ptr member(new boost::tiny_xml::element());
+               member->name = "member";
+               boost::tiny_xml::element_ptr para(new boost::tiny_xml::element());
+               para->name = "para";
+               if((**k).id.empty())
+                  para->content = (**k).key;
+               else
+               {
+                  boost::tiny_xml::element_ptr link(new boost::tiny_xml::element());
+                  link->name = "link";
+                  boost::tiny_xml::attribute at;
+                  at.name = "linkend";
+                  at.value = (**k).id;
+                  link->attributes.push_back(at);
+                  link->content = (**k).key;
+                  para->elements.push_back(link);
+               }
+               member->elements.push_back(para);
+               secondary_list->elements.push_back(member);
+            }
+         }
+      }
+      node->name = "section";
+      node->attributes.clear();
+      if(!has_title)
+      {
+         boost::tiny_xml::element_ptr t(new boost::tiny_xml::element());
+         t->name = "title";
+         t->content = "Index";
+         node->elements.push_front(t);
+      }
+   }
+}
+
+std::string infile, outfile;
+
+int main(int argc, char* argv[])
+{
+   if(argc < 2)
+      return help();
+
+   //
+   // Process arguments:
+   //
+   for(int i = 1; i < argc; ++i)
+   {
+      if(std::strncmp(argv[i], "in=", 3) == 0)
+      {
+         infile = argv[i] + 3;
+      }
+      else if(std::strncmp(argv[i], "out=", 4) == 0)
+      {
+         outfile = argv[i] + 4;
+      }
+      else if(std::strncmp(argv[i], "scan=", 5) == 0)
+      {
+         scan_file(argv[i] + 5);
+      }
+      else if(std::strncmp(argv[i], "script=", 7) == 0)
+      {
+         process_script(argv[i] + 7);
+      }
+      else if(std::strcmp(argv[i], "--no-duplicates") == 0)
+      {
+         no_duplicates = true;
+      }
+      else if(std::strcmp(argv[i], "--internal-index") == 0)
+      {
+         internal_indexes = true;
+      }
+   }
+
+   if(infile.empty())
+   {
+      return help();
+   }
+   if(outfile.empty())
+   {
+      return help();
+   }
+
+   std::ifstream is(infile.c_str());
+   if(!is.good())
+   {
+      std::cerr << "Unable to open XML data file " << argv[1] << std::endl;
+      return 1;
+   }
+   //
+   // We need to skip any leading <? and <! elements:
+   //
+   std::string header = get_header(is);
+   boost::tiny_xml::element_ptr xml = boost::tiny_xml::parse(is, "");
+   is.close();
+
+   //index_terms["students_t_distribution"] = "\\<students_t_distribution\\>";
+
+   std::cout << "Indexing " << index_terms.size() << " terms..." << std::endl;
+
+   process_nodes(xml);
+
+   if(internal_indexes)
+      generate_indexes();
+
+   std::ofstream os(outfile.c_str());
+   os << header << std::endl;
+   boost::tiny_xml::write(*xml, os);
+
+   return 0;
+}
Added: sandbox/tools/auto_index/src/tiny_xml.cpp
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/src/tiny_xml.cpp	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,222 @@
+//  tiny XML sub-set tools implementation  -----------------------------------//
+
+//  (C) Copyright Beman Dawes 2002.  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "tiny_xml.hpp"
+#include <cassert>
+#include <cstring>
+
+namespace
+{
+
+   void eat_whitespace( char & c, std::istream & in )
+   {
+      while ( c == ' ' || c == '\r' || c == '\n' || c == '\t' )
+         in.get( c );
+   }
+
+   void eat_comment( char & c, std::istream & in )
+   {
+      in.get(c);
+      if(c != '-')
+         throw std::string("Invalid comment in XML");
+      in.get(c);
+      if(c != '-')
+         throw std::string("Invalid comment in XML");
+      do{
+         while(in.get(c) && (c != '-'));
+         in.get(c);
+         if(c != '-') 
+            continue;
+         in.get(c);
+         if(c != '>') 
+            continue;
+         else
+            break;
+      }
+      while(true);
+   }
+
+   std::string get_name( char & c, std::istream & in )
+   {
+      std::string result;
+      eat_whitespace( c, in );
+      while ( std::strchr(
+         "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.:", c )
+         != 0 )
+      {
+         result += c;
+         if(!in.get( c ))
+            throw std::string("xml: unexpected eof");
+      }
+      return result;
+   }
+
+   void eat_delim( char & c, std::istream & in,
+      char delim, const std::string & msg )
+   {
+      eat_whitespace( c, in );
+      if ( c != delim )
+         throw std::string("xml syntax error, expected ") + delim
+         + " (" + msg + ")";
+      in.get( c );
+   }
+
+   std::string get_value( char & c, std::istream & in )
+   {
+      std::string result;
+      while ( c != '\"' )
+      {
+         result += c;
+         in.get( c );
+      }
+      in.get( c );
+      return result;
+   }
+
+}
+
+namespace boost
+{
+   namespace tiny_xml
+   {
+
+      //  parse  -----------------------------------------------------------------//
+
+      element_ptr parse( std::istream & in, const std::string & msg )
+      {
+         char c = 0;  // current character
+         element_ptr e( new element );
+
+         if(!in.get( c ))
+            throw std::string("xml: unexpected eof");
+         if ( c == '<' )
+            if(!in.get( c ))
+               throw std::string("xml: unexpected eof");
+
+         if(c == '!')
+         {
+            eat_comment(c, in);
+            return e;
+         }
+
+         e->name = get_name( c, in );
+         eat_whitespace( c, in );
+
+         // attributes
+         while ( (c != '>') && (c != '/') )
+         {
+            attribute a;
+            a.name = get_name( c, in );
+
+            eat_delim( c, in, '=', msg );
+            eat_delim( c, in, '\"', msg );
+
+            a.value = get_value( c, in );
+
+            e->attributes.push_back( a );
+            eat_whitespace( c, in );
+         }
+         if(c == '/')
+         {
+            if(!in.get( c )) // next after '/'
+               throw std::string("xml: unexpected eof");
+            eat_whitespace( c, in );
+            if(c != '>')
+               throw std::string("xml: unexpected /");
+            return e;
+         }
+         if(!in.get( c )) // next after '>'
+            throw std::string("xml: unexpected eof");
+
+         //eat_whitespace( c, in );
+
+         do{
+            // sub-elements
+            while ( c == '<' )
+            {
+               if ( in.peek() == '/' ) 
+                  break;
+               e->elements.push_back( parse( in, msg ) );
+               in.get( c ); // next after '>'
+               //eat_whitespace( c, in );
+            }
+            if (( in.peek() == '/' ) && (c == '<'))
+               break;
+
+            // content
+            if ( (c != '<') )
+            {
+               element_ptr sub( new element );
+               while ( c != '<' )
+               {
+                  sub->content += c;
+                  if(!in.get( c ))
+                     throw std::string("xml: unexpected eof");
+               }
+               e->elements.push_back( sub );
+            }
+
+            assert( c == '<' );
+            if( in.peek() == '/' )
+               break;
+         }while(true);
+
+         in.get(c);
+         eat_delim( c, in, '/', msg );
+         std::string end_name( get_name( c, in ) );
+         if ( e->name != end_name )
+            throw std::string("xml syntax error: beginning name ")
+            + e->name + " did not match end name " + end_name
+            + " (" + msg + ")";
+
+         eat_delim( c, in, '>', msg );
+         if(c != '>')
+         {
+            // we've eaten one character past the >, put it back:
+            if(!in.putback(c))
+               throw std::string("Unable to put back character");
+         }
+         return e;
+      }
+
+      //  write  ---------------------------------------------------------------//
+
+      void write( const element & e, std::ostream & out )
+      {
+         if(e.name.size())
+         {
+            out << "<" << e.name;
+            if ( !e.attributes.empty() )
+            {
+               for( attribute_list::const_iterator itr = e.attributes.begin();
+                  itr != e.attributes.end(); ++itr )
+               {
+                  out << " " << itr->name << "=\"" << itr->value << "\"";
+               }
+            }
+            out << ">";
+         }
+         if ( !e.elements.empty() )
+         {
+            for( element_list::const_iterator itr = e.elements.begin();
+               itr != e.elements.end(); ++itr )
+            {
+               write( **itr, out );
+            }
+         }
+         if ( !e.content.empty() )
+         {
+            out << e.content;
+         }
+         if(e.name.size())
+         {
+            out << "</" << e.name << ">";
+         }
+      }
+
+   } // namespace tiny_xml
+} // namespace boost
+
Added: sandbox/tools/auto_index/src/tiny_xml.hpp
==============================================================================
--- (empty file)
+++ sandbox/tools/auto_index/src/tiny_xml.hpp	2008-11-20 13:24:33 EST (Thu, 20 Nov 2008)
@@ -0,0 +1,70 @@
+//  tiny XML sub-set tools  --------------------------------------------------//
+
+//  (C) Copyright Beman Dawes 2002.  Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  Provides self-contained tools for this XML sub-set:
+//
+//    element ::= { "<" name { name "=" "\"" value "\"" } ">"
+//                  {element} [contents] "</" name ">" }
+//
+//  The point of "self-contained" is to minimize tool-chain dependencies.
+
+#ifndef BOOST_TINY_XML_H
+#define BOOST_TINY_XML_H
+
+#include "boost/smart_ptr.hpp" // for shared_ptr
+#include "boost/utility.hpp"   // for noncopyable
+#include <list>
+#include <iostream>
+#include <string>
+
+namespace boost
+{
+   namespace tiny_xml
+   {
+      class element;
+      struct attribute
+      {
+         std::string name;
+         std::string value;
+
+         attribute(){}
+         attribute( const std::string & name, const std::string & value )
+            : name(name), value(value) {}
+      };
+      typedef boost::shared_ptr< element >  element_ptr;
+      typedef std::list< element_ptr  >     element_list;
+      typedef std::list< attribute >        attribute_list;
+
+      class element
+         : private boost::noncopyable  // because deep copy sematics would be required
+      {
+      public:
+         std::string     name;
+         attribute_list  attributes;
+         element_list    elements;
+         std::string     content;
+
+         element() {}
+         explicit element( const std::string & name ) : name(name) {}
+      };
+
+      element_ptr parse( std::istream & in, const std::string & msg );
+      // Precondition: stream positioned at either the initial "<"
+      // or the first character after the initial "<".
+      // Postcondition: stream positioned at the first character after final
+      //  ">" (or eof).
+      // Returns: an element_ptr to an element representing the parsed stream.
+      // Throws: std::string on syntax error. msg appended to what() string.
+
+      void write( const element & e, std::ostream & out );
+
+   }
+}
+
+#endif  // BOOST_TINY_XML_H
+
+
+