www-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

www/software aeneas/index.html barcode/.symlink...


From: Pavel Kharitonov
Subject: www/software aeneas/index.html barcode/.symlink...
Date: Tue, 29 May 2012 04:16:09 +0000

CVSROOT:        /web/www
Module name:    www
Changes by:     Pavel Kharitonov <ineiev>       12/05/29 04:16:09

Removed files:
        software/aeneas: index.html 
        software/barcode: .symlinks barcode.html 
        software/enscript: .symlinks enscript.html 
        software/gcal  : gcal.html .symlinks 
        software/goodbye: form.php index.php 
        software/kopi  : index.html 
        software/leg   : legdev.tar.gz index.html 
        software/librefm: index.html 
        software/librejs: index.html 
        software/metahtml: .symlinks metahtml.html 
        software/mtools: .symlinks mtools.html 
        software/nana  : .symlinks nana.html 
        software/nana/manual/html_mono: nana.html 
        software/nana/manual/dvi: nana.dvi.gz 
        software/nana/manual: .symlinks nana.html 
        software/nana/manual/ps: nana.ps.gz 
        software/nana/manual/text: nana.txt 
        software/nana/manual/html_chapter: nana_4.html nana_toc.html 
                                           nana_5.html nana_6.html 
                                           nana_3.html nana_8.html 
                                           nana_7.html nana_foot.html 
                                           nana_1.html nana_2.html 
        software/nana/manual/texi: nana.texi.tar.gz 
        software/nana/manual/html_node: nana_4.html nana_toc.html 
                                        nana_13.html nana_12.html 
                                        nana_19.html nana_9.html 
                                        nana_5.html nana_30.html 
                                        nana_15.html nana_38.html 
                                        nana_36.html nana_42.html 
                                        nana_17.html nana_31.html 
                                        nana_6.html nana_29.html 
                                        nana_26.html nana_10.html 
                                        nana_23.html nana_25.html 
                                        nana_14.html nana_37.html 
                                        nana_16.html nana_27.html 
                                        nana_24.html nana_11.html 
                                        nana_3.html nana_28.html 
                                        nana_8.html nana_32.html 
                                        nana_39.html nana_34.html 
                                        nana_18.html nana_7.html 
                                        nana_41.html nana_21.html 
                                        nana_22.html nana_foot.html 
                                        nana_20.html nana_35.html 
                                        nana_33.html nana_40.html 
                                        nana_1.html nana_2.html 
        software/nana/manual/info: nana-info.tar.gz 
        software/patch : .symlinks patch.html 
        software/rcs   : .symlinks rcs.html 
        software/texmacs: index.html 
        software/vmslib: index.html vmslib-1996.tar.gz 

Log message:
        Remove directories for packages whose pages live in their savannah 
groups.

CVSWeb URLs:
http://web.cvs.savannah.gnu.org/viewcvs/www/software/aeneas/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/barcode/.symlinks?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/barcode/barcode.html?cvsroot=www&r1=1.5&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/enscript/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/enscript/enscript.html?cvsroot=www&r1=1.5&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/gcal/gcal.html?cvsroot=www&r1=1.6&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/gcal/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/goodbye/form.php?cvsroot=www&r1=1.4&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/goodbye/index.php?cvsroot=www&r1=1.24&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/kopi/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/leg/legdev.tar.gz?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/leg/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/librefm/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/librejs/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/metahtml/.symlinks?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/metahtml/metahtml.html?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/mtools/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/mtools/mtools.html?cvsroot=www&r1=1.3&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/nana.html?cvsroot=www&r1=1.6&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_mono/nana.html?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/dvi/nana.dvi.gz?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/.symlinks?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/nana.html?cvsroot=www&r1=1.3&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/ps/nana.ps.gz?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/text/nana.txt?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_4.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_toc.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_5.html?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_6.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_3.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_8.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_7.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_foot.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_1.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_chapter/nana_2.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/texi/nana.texi.tar.gz?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_4.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_toc.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_13.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_12.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_19.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_9.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_5.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_30.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_15.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_38.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_36.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_42.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_17.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_31.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_6.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_29.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_26.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_10.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_23.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_25.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_14.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_37.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_16.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_27.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_24.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_11.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_3.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_28.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_8.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_32.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_39.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_34.html?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_18.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_7.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_41.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_21.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_22.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_foot.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_20.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_35.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_33.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_40.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_1.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/html_node/nana_2.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/nana/manual/info/nana-info.tar.gz?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/patch/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/patch/patch.html?cvsroot=www&r1=1.3&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/rcs/.symlinks?cvsroot=www&r1=1.2&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/rcs/rcs.html?cvsroot=www&r1=1.10&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/texmacs/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/vmslib/index.html?cvsroot=www&r1=1.1&r2=0
http://web.cvs.savannah.gnu.org/viewcvs/www/software/vmslib/vmslib-1996.tar.gz?cvsroot=www&r1=1.1&r2=0

Patches:
Index: aeneas/index.html
===================================================================
RCS file: aeneas/index.html
diff -N aeneas/index.html
--- aeneas/index.html   14 May 2012 20:48:53 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-<meta http-equiv="refresh" content="0; 
url=http://www.gnu.org/software/archimedes";>

Index: barcode/.symlinks
===================================================================
RCS file: barcode/.symlinks
diff -N barcode/.symlinks
--- barcode/.symlinks   28 Feb 2001 00:15:38 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-barcode.html index.html

Index: barcode/barcode.html
===================================================================
RCS file: barcode/barcode.html
diff -N barcode/barcode.html
--- barcode/barcode.html        13 Apr 2009 21:19:21 -0000      1.5
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,105 +0,0 @@
-<!--#include virtual="/server/header.html" -->
-
-<title>Barcode - GNU Project - Free Software Foundation (FSF)</title>
-
-<!--#include virtual="/server/banner.html" -->
-
-<!-- End new header -->
-
-<!-- Old href moved to new location so links don't break -->
-<h2><a href="#TOCintroduction" name="introduction">GNU Barcode</a></h2>
-
-<p>
-GNU Barcode is a tool to convert text strings to printed bars. It
-supports a variety of standard codes to represent the textual strings
-and creates postscript output.
-</p>
-
-<p>
-Main features of GNU Barcode:
-<ul>
-<li>Available as both a library and an executable program</li>
-<li>Supports UPC, EAN, ISBN, CODE39 and other encoding standards</li>
-<li>Postscript and Encapsulated Postscript output</li>
-<li>Accepts sizes and positions as inches, centimeters, millimeters</li>
-<li>Can create tables of barcodes (to print labels on sticker pages)</li>
-</ul>
-<p>
-
-<h3><a href="#TOCdownloading" name="downloading">Downloading Barcode</a></h3>
-
-<p>
-Barcode can be found <a href="http://directory.fsf.org/barcode.html";>here</a>
-or in the subdirectory <code>/gnu/barcode/</code> on your favorite
-<a href="/prep/ftp.html">GNU mirror</a>. For other ways to obtain Barcode,
-please read
-<a HREF="/software/software.html#HowToGetSoftware">How to get GNU Software</a>
-</p>
-
-<!-- Begin new footer -->
-
-</div>
-
-<!--#include virtual="/server/footer.html" -->
-
-<div id="footer">
-<p>
-Please send FSF &amp; GNU inquiries to 
-<a href="mailto:address@hidden";><em>address@hidden</em></a>.
-There are also <a href="/contact/">other ways to contact</a> 
-the FSF.
-<br />
-Please send broken links and other corrections or suggestions to
-<a href="mailto:address@hidden";><em>address@hidden</em></a>.
-</p>
-
-<p>
-Please see the
-<a href="/server/standards/README.translations.html">Translations
-README</a> for information on coordinating and submitting
-translations of this article.
-</p>
-
-<p>
-Copyright &copy; 1999, 2001, 2006, 2009 Free Software Foundation, Inc.,</p>
-<address>51 Franklin St, Fifth Floor, Boston, MA 02110, USA</address>
-<p>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-</p>
-
-<p>
-Updated:
-<!-- timestamp start -->
-$Date: 2009/04/13 21:19:21 $
-<!-- timestamp end -->
-</p>
-</div>
-
-<div id="translations">
-<h4>Translations of this page</h4>
-
-<!-- Please keep this list alphabetical by language code. -->
-<!-- Comment what the language is for each type, i.e. de is German. -->
-<!-- Write the language name in its own language (Deutsch) in the text. -->
-<!-- If you add a new language here, please -->
-<!-- advise address@hidden and add it to -->
-<!--  - /home/www/html/server/standards/README.translations.html -->
-<!--  - one of the lists under the section "Translations Underway" -->
-<!--  - if there is a translation team, you also have to add an alias -->
-<!--  to mail.gnu.org:/com/mailer/aliases -->
-<!-- Please also check you have the language code right; see: -->
-<!-- http://www.loc.gov/standards/iso639-2/php/code_list.php -->
-<!-- If the 2-letter ISO 639-1 code is not available, -->
-<!-- use the 3-letter ISO 639-2. -->
-<!-- Please use W3C normative character entities. -->
-
-<ul class="translations-list">
-<!-- English -->
-<li><a href="/software/barcode.html">English</a>&nbsp;[en]</li>
-</ul>
-</div>
-</div>
-</body>
-</html>
-

Index: enscript/.symlinks
===================================================================
RCS file: enscript/.symlinks
diff -N enscript/.symlinks
--- enscript/.symlinks  7 Feb 2008 11:17:52 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-enscript.html index.html

Index: enscript/enscript.html
===================================================================
RCS file: enscript/enscript.html
diff -N enscript/enscript.html
--- enscript/enscript.html      24 Oct 2011 19:36:46 -0000      1.5
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>enscript - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-<META NAME="keywords" CONTENT="enscript">
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H3>enscript</H3>
-<A HREF="/graphics/agnuhead.html"><IMG SRC="/graphics/gnu-head-sm.jpg"
-ALT=" [image of the Head of a GNU] "
-WIDTH="129" HEIGHT="122"></A>
-
-<P>
-GNU Enscript converts ASCII files to PostScript, HTML, or RTF
-and stores generated output to a file
-or sends it directly to the printer.
-It includes features for `pretty-printing'
-(language-sensitive code highlighting)
-in several programming languages.
-<HR>
-
-Return to <A HREF="/home.html">GNU's home page</A>.
-
-<P>
-Please send FSF &amp; GNU inquiries &amp; questions to
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-There are also <A HREF="/home.html#ContactInfo">other ways to contact</A> the 
FSF.
-
-<P>
-Please send comments on these web pages to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-
-<P>
-Copyright (C) 2007 Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA  02111,  USA
-
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-<HR>
-</BODY>
-</HTML>

Index: gcal/gcal.html
===================================================================
RCS file: gcal/gcal.html
diff -N gcal/gcal.html
--- gcal/gcal.html      24 Oct 2011 19:37:01 -0000      1.6
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,64 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>gcal - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-<META NAME="keywords" CONTENT="gcal">
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H1>gcal</H1>
-<A HREF="/graphics/agnuhead.html"><IMG SRC="/graphics/gnu-head-sm.jpg"
-ALT=" [image of the Head of a GNU] "
-WIDTH="129" HEIGHT="122"></A>
-
-<P>
-<HR>
-
-<P> Gcal is a program for calculating and printing calendars. Gcal
-displays hybrid and proleptic Julian and Gregorian calendar sheets,
-respectively for one month, three months, or a whole year. It also
-displays eternal holiday lists for many countries around the globe,
-and features a very powerful creation of fixed date liststhat can be
-used for reminding purposes. Gcal can calculate various astronomical
-data and times of the Sun and the Moon for pleasure at any location,
-precisely enough for most civil purposes. Gcal supports some other
-calendar systems, for example, the Chinese and Japanese calendars, the
-Hebrew calendar, and the civil Islamic calendar, too.
-
-<P>
-You can get gcal <a href="http://directory.fsf.org/GNU/gcal.html";>here</a>.
-
-<P>
-<HR>
-
-<P>
-Return to <A HREF="/home.html">GNU's home page</A>.
-
-<P>
-Please send FSF &amp; GNU inquiries &amp; questions to
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-There are also <A HREF="http://www.fsf.org/about/contact.html";>other ways to 
contact</A> the FSF.
-
-<P>
-Please send comments on these web pages to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-
-<P>
-Copyright &copy; 1998, 2001, 2006 Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-<P>
-Updated:
-<!-- hhmts start -->
-$Date: 2011/10/24 19:37:01 $ $Author: jturner $
-<!-- hhmts end -->
-<P>
-<HR>
-</BODY>
-</HTML>

Index: gcal/.symlinks
===================================================================
RCS file: gcal/.symlinks
diff -N gcal/.symlinks
--- gcal/.symlinks      7 Feb 2008 11:18:51 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-gcal.html index.html

Index: goodbye/form.php
===================================================================
RCS file: goodbye/form.php
diff -N goodbye/form.php
--- goodbye/form.php    30 Dec 2009 18:18:33 -0000      1.4
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,8 +0,0 @@
-    <form id="form" method="post">
-       <p><label>User: <input type="text" size="12" maxlength="50" id="user" 
name="user" title="User" value="" /></label></p>
-       <p><label>Argument: <input type="text" size="10" maxlength="10" 
id="argument" name="arg" title="Argument" value="" /></label></p>
-    <p><label>Hash: <input type="password" size="20" maxlength="64" id="hash" 
name="hash" title="Hash" value="" /></label></p>
-    <p><input type="submit" value="Download" name="actual" /></p>
-    <p><input type="hidden" value="1" name="form-type" /></p>
-    </form>
-

Index: goodbye/index.php
===================================================================
RCS file: goodbye/index.php
diff -N goodbye/index.php
--- goodbye/index.php   5 Jan 2010 21:48:23 -0000       1.24
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,60 +0,0 @@
-<?php
-
-$goodbye=$_POST['goodbye'];
-$actual=$_POST['actual'];
-
-if ($actual) {
-
-  $u=$_POST['user'];
-  $a=$_POST['arg'];
-  $h=$_POST['hash'];
-
-  $f = fopen('http://fencepost.gnu.org/' . $u . ':' . $a . ':' . $h,'r');
-  $contents = '';
-    while (!feof($f)) {
-    $contents .= fread($f, 8192);
-  }
-
-  header("Content-Type: application/octet-stream; ");
-  header("Content-Transfer-Encoding: binary"); 
-  header("Content-Length: " . strlen($contents) ."; ");  
-  header("Content-Disposition: attachment; filename='goodbye-" . $u . "=" . $a 
 . "'");
-  flush();
-  echo $contents;
-
- } else {
-
-?>
-
-<!DOCTYPE html>
-<html>
-<head>
-<title>GNU Goodbye</title>
-</head>
-<body>
-
-<h1>GNU Goodbye</h1>
-<?php
-
-  if (!$goodbye) {
-
-?>
-
-<p>The GNU Goodbye program is intending to produce a familiar, friendly 
farewell. In many ways, it could be considered a sister-program to <a 
href="/software/hello/">GNU Hello</a>, but unlike GNU Hello, it has not yet 
been developed.</p>
-
-<form method="post">
-<p><input type="submit" value="Say Goodbye!" name="goodbye" /></p>
-</form>
-
-<?php
-
-    } 
-
- else {
-
- include('form.php');
-
- }
- }
-
-?>

Index: kopi/index.html
===================================================================
RCS file: kopi/index.html
diff -N kopi/index.html
--- kopi/index.html     20 Jul 2010 18:16:47 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-kopi is a GNU package maintained by Thomas Graf.

Index: leg/legdev.tar.gz
===================================================================
RCS file: leg/legdev.tar.gz
diff -N leg/legdev.tar.gz
Binary files /tmp/cvsEtQOkG and /dev/null differ

Index: leg/index.html
===================================================================
RCS file: leg/index.html
diff -N leg/index.html
--- leg/index.html      14 Mar 2009 16:29:16 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,9 +0,0 @@
-<p>GNU Leg is a C++ library for game engines.  Some <a
-href="legdev.tar.gz">code is available</a>.
-
-<p>Leg is looking for a maintainer to lead and develop the project.  If
-you're interested, please take a look at this <a
-href="/help/evaluation.html#whatmeans">general information about GNU
-packages and being a GNU maintainer</a>, and then email
address@hidden with a bit about your background and interest.
-Thanks!</p>

Index: librefm/index.html
===================================================================
RCS file: librefm/index.html
diff -N librefm/index.html
--- librefm/index.html  25 Mar 2011 18:43:30 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,2 +0,0 @@
-<meta http-equiv="refresh" content="0;
-      url=http://libre.fm";>

Index: librejs/index.html
===================================================================
RCS file: librejs/index.html
diff -N librejs/index.html
--- librejs/index.html  5 Apr 2012 22:43:09 -0000       1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-<meta http-equiv="refresh" content="0; url=http://lduros.net/librejs/";>

Index: metahtml/.symlinks
===================================================================
RCS file: metahtml/.symlinks
diff -N metahtml/.symlinks
--- metahtml/.symlinks  11 Dec 2009 01:26:10 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-metahtml.html index.html

Index: metahtml/metahtml.html
===================================================================
RCS file: metahtml/metahtml.html
diff -N metahtml/metahtml.html
--- metahtml/metahtml.html      5 Dec 2011 00:41:38 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,11 +0,0 @@
-<p>GNU Metahtml is looking for a maintainer.
-If you're interested, please take a look at this <a
-href="/help/evaluation.html#whatmeans">general information about GNU
-packages and being a GNU maintainer</a>, and then email
address@hidden with a bit about your background and particular
-interest in this package.  Thanks.</p>
-
-<p>The sources are currently at <a
-href="http://metahtml.sourceforge.net/";>, although we would like to move
-them to Savannah.
-

Index: mtools/.symlinks
===================================================================
RCS file: mtools/.symlinks
diff -N mtools/.symlinks
--- mtools/.symlinks    7 Feb 2008 11:31:13 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-mtools.html index.html

Index: mtools/mtools.html
===================================================================
RCS file: mtools/mtools.html
diff -N mtools/mtools.html
--- mtools/mtools.html  24 Oct 2011 19:40:29 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,56 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>mtools - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-<META NAME="keywords" CONTENT="mtools">
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H3>mtools</H3>
-<A HREF="/graphics/gnu-head-sm.jpg"><IMG SRC="/graphics/gnu-head-sm.jpg"
-ALT=" [image of the Head of a GNU] "
-WIDTH="129" HEIGHT="122"></A>
-
-<P>
-Mtools is a public domain collection of tools to
-allow Unix systems to manipulate MS-DOS files:
-read, write, and move around files
-on an MS-DOS filesystem (typically a floppy disk).
-Where reasonable, each program attempts to emulate
-the MS-DOS equivalent command.
-However, unnecessary restrictions and oddities of DOS
-are not emulated.
-For instance, it is possible to move subdirectories
-from one subdirectory to another.
-
-<HR>
-
-Return to <A HREF="/home.html">GNU's home page</A>.
-
-<P>
-Please send FSF &amp; GNU inquiries &amp; questions to
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-There are also <A HREF="/home.html#ContactInfo">other ways to contact</A> the 
FSF.
-
-<P>
-Please send comments on these web pages to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-
-<P>
-Copyright (C) 1998 Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA  02111,  USA
-
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-<P>
-Updated:
-<!-- hhmts start -->
-11 Dec 1999 jonas
-<!-- hhmts end -->
-<HR>
-</BODY>
-</HTML>

Index: nana/.symlinks
===================================================================
RCS file: nana/.symlinks
diff -N nana/.symlinks
--- nana/.symlinks      7 Feb 2008 11:31:17 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-nana.html index.html

Index: nana/nana.html
===================================================================
RCS file: nana/nana.html
diff -N nana/nana.html
--- nana/nana.html      24 Oct 2011 19:40:35 -0000      1.6
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,112 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Nana - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-<META NAME="keywords" CONTENT="nana">
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H3>GNU Nana: improved support for assertion checking and logging in 
-GNU C/C++</H3>
-<P>
-GNU Nana is a free library providing improved support for assertion
-checking (as in <code>assert.h</code>) and logging
-(<code>printf</code> style debugging) in GNU C and C++. It provides
-support for some of the ideas of Eiffel, VDM, Z and Anna in GNU C/C++.
-GNU Nana was developed by Phil Maker.
-
-<P>
-For full documentation, see the online manual available at <A
-HREF="/software/nana/manual/">www.gnu.org/software/nana/manual/nana.html</A>.
-
-<P>
-<H4>Features</H4>
-<P>
-<UL>
-
-<LI> Space/time efficient, at least compared to assert.h. For example
-<CODE>assert(i &gt;= 0)</CODE> uses 53 bytes on the x86,
-while Nana uses either 10 bytes or 1.
-
-<LI> Support for predicate calculus (``for all,'' ``exists,'' and so
-on) is provided using both C style for loops and C++ STL iterators
-over container classes.
-
-<LI> Assertions can refer to saved state; for exaple, the return value
-of a sort function can be checked against the arguments on function
-entry.
-
-<LI> Logging messages can be redirected to a variety of destinations 
-including files, processes (for automated testing or visualisation) or
-circular buffers in core.
-
-<LI> Assertions about time can be made in a simple manner.
-
-<LI> Lists of invariant checking or printing functions can be created
-which can then be called to check internal consistency or display state.
-
-<LI> All of the features can be selectively enabled or disabled at both
-compile and run time.
-
-</UL>
-
-<P> 
-<H4>Why is this useful?</H4> 
-<P> 
-
-<UL> 
-
-<LI> The sooner an error is detected, the cheaper it is to
-fix. Error correction is a (the) major cost in software development. 
-
-<LI> Recording what the system is doing before it goes off into
-``never never land'' is very useful.
-
-<LI> ``This style (Design by Contract) of analysis avoids a classic
-dilemma of analysis and specification: either you use a programming
-notation and run the risk of making premature implementation
-commitments; or you stick with a higher level notation (``bubbles and
-arrows'') and you must remain vague, forsaking one of the major
-benefits of the analysis process, the ability to state and clarify
-delicate properties of the system'' - ISE Inc.
-
-</UL>
-
-<P> 
-<H4>Mailing list?</H4> 
-<P> 
-
-The mailing list for discussion of Nana is &lt;address@hidden&gt;;
-you can subscribe automatically by mailing to <A
-HREF="mailto:address@hidden";>
-&lt;address@hidden&gt;</A>.
-
-<HR>
-Return to <A HREF="/home.html">GNU's home page</A>.
-<P>
-
-Please send FSF &amp; GNU inquiries &amp; questions to 
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-There are also <A HREF="/home.html#ContactInfo">other ways to
-contact</A> the FSF.
-<P>
-
-Please send comments on these web pages to
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-<P>
-Copyright (C) 1997, 1998 Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA  02111,  USA
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.<P>
-Updated:
-<!-- hhmts start -->
-Last modified: $Date: 2011/10/24 19:40:35 $ $Author: jturner $
-<!-- hhmts end -->
-<HR>
-</BODY>
-</HTML>

Index: nana/manual/html_mono/nana.html
===================================================================
RCS file: nana/manual/html_mono/nana.html
diff -N nana/manual/html_mono/nana.html
--- nana/manual/html_mono/nana.html     7 Feb 2007 02:37:35 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,3656 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and 
C++</TITLE>
-</HEAD>
-<BODY>
-<H1>GNU Nana</H1>
-<H2>Improved support for assertions and logging in C and C++</H2>
-<H2>last updated 27 February 1998 for version 1.14</H2>
-<ADDRESS>P.J.Maker (<A 
HREF="mailto:address@hidden";>address@hidden</A>)</ADDRESS>
-<P>
-<P><HR><P>
-<H1>Table of Contents</H1>
-<UL>
-<LI><A NAME="TOC1" HREF="nana.html#SEC1">Introduction</A>
-<UL>
-<LI><A NAME="TOC2" HREF="nana.html#SEC2">Related work</A>
-<LI><A NAME="TOC3" HREF="nana.html#SEC3">Assert.h considered harmful</A>
-<LI><A NAME="TOC4" HREF="nana.html#SEC4">Scope of this document</A>
-</UL>
-<LI><A NAME="TOC5" HREF="nana.html#SEC5">Installing the Nana library</A>
-<UL>
-<LI><A NAME="TOC6" HREF="nana.html#SEC6">Required Software</A>
-<LI><A NAME="TOC7" HREF="nana.html#SEC7">Optional Software</A>
-<LI><A NAME="TOC8" HREF="nana.html#SEC8">Configure</A>
-<LI><A NAME="TOC9" HREF="nana.html#SEC9">Variables for ./configure</A>
-<LI><A NAME="TOC10" HREF="nana.html#SEC10">Supported Platforms</A>
-<LI><A NAME="TOC11" HREF="nana.html#SEC11">Supported Debuggers</A>
-<LI><A NAME="TOC12" HREF="nana.html#SEC12">Known Problems</A>
-<LI><A NAME="TOC13" HREF="nana.html#SEC13">Bug Reports</A>
-<LI><A NAME="TOC14" HREF="nana.html#SEC14">New Versions</A>
-</UL>
-<LI><A NAME="TOC15" HREF="nana.html#SEC15">Invoking Nana</A>
-<LI><A NAME="TOC16" HREF="nana.html#SEC16">Interface</A>
-<UL>
-<LI><A NAME="TOC17" HREF="nana.html#SEC17">nana.h: the main header file</A>
-<LI><A NAME="TOC18" HREF="nana.html#SEC18">WITHOUT_NANA: disabling all nana 
code for portability.</A>
-<LI><A NAME="TOC19" HREF="nana.html#SEC19">I.h: C based invariant checking</A>
-<LI><A NAME="TOC20" HREF="nana.html#SEC20">DI.h: debugger based invariant 
checking</A>
-<LI><A NAME="TOC21" HREF="nana.html#SEC21">L.h: support for printf style 
logging</A>
-<LI><A NAME="TOC22" HREF="nana.html#SEC22">L_buffer.h: a circular buffer for 
logging.</A>
-<LI><A NAME="TOC23" HREF="nana.html#SEC23">L_times.h: recording events and 
times.</A>
-<LI><A NAME="TOC24" HREF="nana.html#SEC24">DL.h: support for printf style 
logging</A>
-<LI><A NAME="TOC25" HREF="nana.html#SEC25">GDB.h: sending plain gdb commands 
to the debugger</A>
-<LI><A NAME="TOC26" HREF="nana.html#SEC26">Q.h: support for quantifiers</A>
-<LI><A NAME="TOC27" HREF="nana.html#SEC27">Qstl.h: quantifiers for STL 
containers.</A>
-<LI><A NAME="TOC28" HREF="nana.html#SEC28">now.h: measuring time</A>
-<LI><A NAME="TOC29" HREF="nana.html#SEC29">eiffel.h: eiffel type assertions</A>
-<LI><A NAME="TOC30" HREF="nana.html#SEC30">assert.h: a drop in replacement for 
assert.h</A>
-<LI><A NAME="TOC31" HREF="nana.html#SEC31">calls.h: checking/printing many 
objects/facts.</A>
-</UL>
-<LI><A NAME="TOC32" HREF="nana.html#SEC32">Using Nana</A>
-<UL>
-<LI><A NAME="TOC33" HREF="nana.html#SEC33">Simplest example</A>
-<LI><A NAME="TOC34" HREF="nana.html#SEC34">Syslog</A>
-<LI><A NAME="TOC35" HREF="nana.html#SEC35">GNU Programs: how to avoid nana 
sometimes</A>
-<LI><A NAME="TOC36" HREF="nana.html#SEC36">Embedded Systems: testing 
non-deterministic systems.</A>
-<LI><A NAME="TOC37" HREF="nana.html#SEC37">Realtime Systems</A>
-<LI><A NAME="TOC38" HREF="nana.html#SEC38">A database</A>
-<LI><A NAME="TOC39" HREF="nana.html#SEC39">Program Visualisation: pretty 
pictures</A>
-</UL>
-<LI><A NAME="TOC40" HREF="nana.html#SEC40">FAQ</A>
-<LI><A NAME="TOC41" HREF="nana.html#SEC41">Future work</A>
-<LI><A NAME="TOC42" HREF="nana.html#SEC42">Index</A>
-</UL>
-<P><HR><P>
-
-<P>
-Copyright (C) 1996, 1997, P.J.Maker
-
-</P>
-<P>
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-</P>
-
-
-
-<H1><A NAME="SEC1" HREF="nana.html#TOC1">Introduction</A></H1>
-
-<P>
-Nana is a library that provides support for assertion checking
-and logging in a space and time efficient manner. The aim is to put
-common good practise<A NAME="DOCF1" HREF="nana.html#FOOT1">(1)</A> into a 
library that can be reused rather than
-writing this stuff every time you begin a new project.
-
-</P>
-<P>
-In addition assertion checking and logging code can be implemented using
-a debugger rather than as inline code with a large saving in code space.
-
-</P>
-<P>
-Nana aims to solve the following problems:
-
-</P>
-
-<OL>
-<LI>Avoid the two executables problem (one with asserts in and another
-
-without any).
-
-The code space and time costs of having assertion checking and detailed
-logging code in a program can be high. Normally people construct two
-versions of the program, one with checking code for testing and one
-without checking code for production use.
-
-With nana one version of the executable can be
-built for both testing and release since debugger based checking has 
-negligible space and time impact.
-
-<LI>Configurable: the nana library is designed to be reconfigured by
-
-the user according to their needs. For example we can:
-
-<UL>
-<LI>Modify the behaviour on assertion failure, e.g. to attempt
-
-a system restart rather than just shutting down.
-<LI>Selectively enable and disable assertion checking and
-
-logging both at compile and run time.
-<LI>Send the logging information off to various locations, e.g.
-
-
-<UL>
-<LI>Users terminal
-
-<LI>A file for later checking.
-
-<LI>Another process, e.g. a plotting program or a
-
-program that verifies that the system is behaving itself.
-<LI>A circular buffer in memory.
-
-This is an old embedded systems trick and is very useful
-for production systems. The time cost of logging into 
-memory is not large and when your production system in
-the field has problems you can then see what was happening 
-in the minutes before its unfortunate demise rather than
-asking some user what was happening before it died.
-</UL>
-
-</UL>
-
-<LI>Time and space efficient.
-
-For example the GNU <SAMP>`assert.h'</SAMP> implementation uses 53 bytes for 
-<SAMP>`assert(i&#62;=0)'</SAMP> on a i386. The nana version using the i386 
<SAMP>`stp'</SAMP>
-instruction on assert fail uses 10 bytes. If your willing to accept the
-time penalty this can be reduced to 0 or 1 byte by using debugger based
-assertions.
-
-<LI>Support for formal methods.
-
-
-<UL>
-<LI>Before and after state (e.g. x,x' in the Z notation).
-
-Specifications are often written in terms of the state of
-variables before and after an operation. For example the
-<SAMP>`isempty'</SAMP> operation on a stack should leave the stack
-unchanged. To verify this in nana we could use:
-      
-
-<PRE>
-bool isempty(){ /* true iff stack is empty */
-  DS($s = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  DI($s == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-        
-These <SAMP>`$..'</SAMP> variables are called convenience variables 
-and are implemented by gdb. They have a global scope and are 
-dynamically typed and initialised automatically to 0.
-
-In addition a C only version of before and after state is provided.
-For example:
-
-
-<PRE>
-bool isempty() { /* true iff stack is empty */
-  ID(int olds); /* declare variable to hold old value */
-  IS(olds = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  I(olds == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-<LI>Support for Predicate Calculus.
-
-Nana provides some support for universal (forall) and
-existential  (exists one or more) quantification. For example to specify
-that the string v contains only lower case letters we could use:
-
-
-<PRE>
-  I(A(char *p = v, *p != '\0', p++, islower(*p)));
-</PRE>
-
-These macros can be nested and used as normal boolean values in
-control constructs as well as assertions. Unfortunately they
-depend on the GNU CC statement value extensions and so are not 
-portable. The following macros are defined in <SAMP>`Q.h'</SAMP>:
-
-<DL COMPACT>
-
-<DT><CODE>A</CODE>
-<DD>
-<A NAME="IDX1"></A>
-For all values the expression must be true.
-<DT><CODE>E</CODE>
-<DD>
-<A NAME="IDX2"></A>
-There exists one or more values for which the expression is
-true.
-<DT><CODE>E1</CODE>
-<DD>
-<A NAME="IDX3"></A>
-There exists a single value for which the expression is true.
-<DT><CODE>C</CODE>
-<DD>
-<A NAME="IDX4"></A>
-Returns the number of times the expression is true.
-<DT><CODE>S</CODE>
-<DD>
-<A NAME="IDX5"></A>
-Returns the sum of the expressions.
-<DT><CODE>P</CODE>
-<DD>
-<A NAME="IDX6"></A>
-Returns the product of the expressions.
-</DL>
-
-<LI>Verifying timing.
-
-As well as using nana to verify timings with assertions using a
-hardware supported timer you can also a simulator (e.g. the
-PSIM power pc simulator by Cagney) with gdb. These simulators can
-model time and provide a register called <SAMP>`$cycles'</SAMP> which
-represents the current cycle count of the program. This can be 
-used to check that timing constraints are being meet.
-
-
-<PRE>
-void process_events() {
-  for(;;){ 
-    DS($start = $cycles); 
-    switch(get_event()){
-      case TOO_HOT:
-        ...;
-        DI($start - $cycles &#60;= 120);
-        break;
-      case TOO_COLD:
-        ...;
-        DI($start - $cycles &#60;= 240);
-        break;
-    }
-  }
-}
-</PRE>
-
-</UL>
-
-</OL>
-
-<P>
-The intended audience for Nana includes:
-
-</P>
-
-<UL>
-<LI>Software Engineers.
-
-<LI>Formal methods community.
-
-<LI>Real time programmers.
-
-<LI>System testers.
-
-<LI>People teaching programming.
-
-</UL>
-
-
-
-<H2><A NAME="SEC2" HREF="nana.html#TOC2">Related work</A></H2>
-<P>
-The Nana project was inspired by some other projects, in particular:
-
-</P>
-
-<UL>
-<LI>Anna - Anna stands for "Annotated Ada" where the programmer inserts
-
-various assertions into the code which can be automatically validated. 
-To quote from the WWW Virtual Library entry on Anna:
-
-
-<BLOCKQUOTE>
-<P>
-Anna is a language for formally specifying the intended behaviour of Ada
-programs. It extends Ada with various different kinds of specification
-constructs from ones as simple as assertions, to as complex as algebraic
-specifications. A tool set has been implemented at Stanford for
-Anna, including: 
-
-</P>
-
-<OL>
-<LI>standard DIANA extension packages, parsers, pretty-printers;
-
-<LI>a semantic checker;
-
-<LI>a specification analyser;
-
-<LI>an annotation transformer; and
-
-<LI>a special debugger that allows program debugging based on formal 
specifications
-
-</OL>
-
-<P>
-All tools have been developed in Ada and are therefore extremely
-portable. Anna has thus been ported to many platforms. For more
-information send e-mail to "address@hidden". Before
-down loading the huge Anna release, you may wish to copy and read some
-Anna LaTeX reports.
-
-</P>
-</BLOCKQUOTE>
-
-Anna is available from: <CODE>ftp://anna.stanford.edu/pub/anna</CODE>
-
-<LI>Eiffel - the Eiffel programming language provides support in the language
-
-flexible assertion checking. To quote from the Eiffel page in WWW
-Virtual library:
-
-
-<BLOCKQUOTE>
-
-<P>
-Eiffel is a pure object-oriented language featuring multiple
-inheritance, polymorphism, static typing and dynamic binding, genericity
-(constrained and unconstrained), a disciplined exception mechanism,
-systematic use of assertions to promote programming by contract, and
-deferred classes for high-level design and analysis.
-</BLOCKQUOTE>
-
-<LI>APP - Annotation PreProcessor.
-
-The APP was written by David S. Rosenblum and provides assertion checking
-functions for C and C++. It is implemented using a preprocessor wrapper
-around the C preprocessor and supports quantifiers and before/after state.
- 
-See "A Practical Approach to Programming with Assertions" in
-Vol 21, No. 1, January 1995 of IEEE Transactions on Software Engineering
-for an interesting paper describing APP. Unfortunately the APP tool
-doesn't seem to be freely available (I'm willing to be corrected on this). 
-Note that any similarity between my examples and David's are due
-to morphic resonance.
-</UL>
-
-<P>
-Nana is essentially a poor mans implementation of some of these ideas
-which works for C and C++. Ideally in the best of all possible worlds
-you might want to look at Eiffel or in the military world Ada and Anna.
-If you use TCL/TK you might also be interested in Jon Cook's 
-<SAMP>`AsserTCL'</SAMP> package.
-
-</P>
-
-
-<H2><A NAME="SEC3" HREF="nana.html#TOC3">Assert.h considered harmful</A></H2>
-<P>
-Most C programmers become familiar with assertions from the the
-<CODE>assert.h</CODE> header. As such its a very good thing and has a nice
-simple implementation. However it is also inefficient and leads some
-people to the conclusion that assertion checking is an expensive luxury.
-
-</P>
-<P>
-The implementation of <CODE>assert.h</CODE> as distributed with 
<CODE>gcc</CODE>
-looks like the following (after a bit of editing):
-
-</P>
-
-<PRE>
-# ifndef NDEBUG
-# define _assert(ex)   {if (!(ex)) \
-                         {(void)fprintf(stderr, \
-                           "Assertion failed: file \"%s\", line %d\n", \
-                           __FILE__, __LINE__);exit(1);}}
-# define assert(ex)    _assert(ex)
-# else
-# define _assert(ex)
-# define assert(ex)
-# endif
-</PRE>
-
-<P>
-There are are two main problems with this:
-
-</P>
-
-<OL>
-<LI>Code space overhead: each call to <SAMP>`assert'</SAMP> generates 2 
function
-
-calls with 4 and 1 arguments plus strings for error messages. 
-If <CODE>assert.h</CODE> had library code support we could make the 
implementation
-much more space efficient, e.g. by calling a single function on error
-detection.   
-<LI>The default behaviour simply prints a message and dies, ideally
-
-you like to be able to use a debugger to determine why the assertion
-failed. Even if you run this under the debugger you can't observe the
-failures of variables are an assert failure because the process exits
-rather than aborting back to the debugger.
-</OL>
-
-<P>
-Of course everyone merely rewrites their own <SAMP>`assert'</SAMP> macro so
-these are not significant objections. The only problem is if the author
-uses the libraries without modification.
-
-</P>
-
-
-<H2><A NAME="SEC4" HREF="nana.html#TOC4">Scope of this document</A></H2>
-<P>
-This document aims to both describe the library and provide a tutorial
-in its use. Further work is required, particularly on the tutorial sections. 
-If anyone has any suggestions please send them to me.
-
-</P>
-
-
-<H1><A NAME="SEC5" HREF="nana.html#TOC5">Installing the Nana library</A></H1>
-<P>
-Nana uses the normal GNU install method in the same way as <SAMP>`gcc'</SAMP>
-and <SAMP>`gdb'</SAMP>. To install nana in the default location
-<SAMP>`/usr/local/{bin,lib,include}'</SAMP> you would use:
-
-</P>
-
-<PRE>
-% gzcat nana-1.10.tar.gz | tar xvf -
-% cd nana-1.10
-% ./configure 
-% make
-% make install
-% make check
-% make check-mail
-% make subscribe 
-</PRE>
-
-<P>
-The <VAR>check-mail</VAR> and <VAR>subscribe</VAR> targets both send e-mail. If
-you need to change the mailer used try something like:
-
-</P>
-
-<PRE>
-% make MAIL=elm subscribe
-</PRE>
-
-<P>
-<STRONG>Note:</STRONG> we need to install nana before running the <SAMP>`make 
check'</SAMP> 
-target. The <SAMP>`check-mail'</SAMP> target sends the test report
-via e-mail to the <SAMP>address@hidden'</SAMP>.
-
-</P>
-<P>
-Of course things are never that simple.  If you want to install Nana in
-a different location or change the behaviour on error detection see section <A 
HREF="nana.html#SEC8">Configure</A>.
-
-</P>
-<P>
-Each of the sub-directories nana can be compiled and installed
-separately, e.g. if you don't need the documentation you can just
-compile and install from the <SAMP>`src'</SAMP> sub-directory after doing the
-configure statement.
-
-</P>
-
-
-
-<H2><A NAME="SEC6" HREF="nana.html#TOC6">Required Software</A></H2>
-<P>
-The following software is possibly required to run nana.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>gcc-2.7.2</CODE>
-<DD>
-<A NAME="IDX7"></A>
-Nana makes use of two GNU extensions in its library so you really should
-be using <SAMP>`gcc'</SAMP>. Some of the code can be used with any C compiler,
-though it may not be worth the bother. The dependencies on gcc are in 
-<SAMP>`Q.h'</SAMP> which uses the statement value extension and in 
<SAMP>`L.h'</SAMP>
-which uses the variable number of arguments extension to <SAMP>`cpp'</SAMP>.
-<DT><CODE>gdb-4.16</CODE>
-<DD>
-<A NAME="IDX8"></A>
-A recent version of <SAMP>`gdb'</SAMP> is worthwhile, some early 4.?? versions
-had problems setting a large number of breakpoints.
-<DT><CODE>gmake</CODE>
-<DD>
-<A NAME="IDX9"></A>
-The <SAMP>`configure'</SAMP> script and <SAMP>`Makefiles'</SAMP> are generated 
using the
-<SAMP>`automake'</SAMP> and <SAMP>`autoconf'</SAMP> programs. They should be 
reasonably
-portable but if you have problems try using GNU make. For example on
-some old DEC boxes we have had strange behaviour using the system make.
-</DL>
-
-<P>
-For a listing of porting results including software versions see:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC7" HREF="nana.html#TOC7">Optional Software</A></H2>
-
-<P>
-In addition to the required software you might also be interested
-in:
-
-</P>
-
-<UL>
-<LI><SAMP>`http://www.cs.tu-bs.de/softech/ddd/'</SAMP> -- a smart frontend for
-
-gdb which can display dynamic data structures such as linked lists, etc.
-<LI><SAMP>`ftp://ftp.ci.com.au/pub/psim/'</SAMP> -- a cycle level simulator
-
-for the PowerPC. A fine piece of work.
-</UL>
-
-
-
-<H2><A NAME="SEC8" HREF="nana.html#TOC8">Configure</A></H2>
-<P>
-Nana uses a standard GNU <CODE>autoconf</CODE> generated <CODE>configure</CODE>
-script. The <CODE>configure</CODE> script checks the setup on your machine and
-then generates the appropriate Makefiles. Some of the things checked by
-configure include:
-
-</P>
-
-<OL>
-<LI>Which compiler, compiler flags and libraries to use, e.g. you
-
-might need to include a <CODE>-lposix</CODE> flag to the linker to build 
programs
-on your machine.
-<LI>Which header (.h) files are available on this machine, e.g. is
-
- <CODE>unistd.h</CODE> available on this machine.
-<LI>Where to install programs, header file, man pages, etc.
-
-</OL>
-
-<P>
-In addition <SAMP>`configure'</SAMP> uses the host architecture and operating 
system
-to generate the <SAMP>`nana-config.h'</SAMP> file. This file contains some 
macro
-definitions which define how nana works on particular operating systems
-and hardware architectures. 
-
-</P>
-<P>
-For example on <SAMP>`i386'</SAMP> machines we would use the 
<SAMP>`asm("hlt")'</SAMP>
-instruction whenever an assertion fails, on a <SAMP>`sparc'</SAMP> we would use
-<SAMP>`asm("stp")'</SAMP>. Otherwise we would default to a plain C call to
-<SAMP>`abort()'</SAMP> If <SAMP>`configure'</SAMP> does not recognise your 
machine it
-uses plain C code.
-
-</P>
-<P>
-You may wish to change these defaults on installation, one method is to edit 
-a local copy of the <SAMP>`nana-config.h'</SAMP> file. Alternately you can 
define 
-the code yourself in the call to <SAMP>`configure'</SAMP>. For example
-to redefine the action we take when an error is detected by the <CODE>I</CODE>
-macro we can use: 
-
-</P>
-
-<PRE>
-I_DEFAULT_HANDLER="restart_system()" ./configure
-</PRE>
-
-<P>
-As well as simple calls to routines various other bits of information
-are passed off to the <SAMP>`I_DEFAULT_HANDLER'</SAMP> such as the expression
-that failure and a failure code. For example:
-
-</P>
-
-<PRE>
-% I_DEFAULT_HANDLER="restart(line,file,param)" ./configure
-</PRE>
-
-<P>
-The default for <SAMP>`I_DEFAULT_HANDLER'</SAMP> calls a function which prints 
a
-message and then dumps core.  Different behaviour on failure can be
-organised by setting the <SAMP>`I_DEFAULT'</SAMP> to <SAMP>`fast'</SAMP>, i.e. 
plain
-core dump or <SAMP>`verbose'</SAMP> which prints an error messsage and then 
does
-the core dump.
-
-</P>
-
-<PRE>
-% I_DEFAULT=fast ./configure   
-</PRE>
-
-<P>
- 
-For nana the following examples may be useful:
-
-</P>
-
-<OL>
-<LI><CODE>./configure</CODE>
-
-Accept the default values for everything. In particular the files will
-be installed in:
-
-<SAMP>`/usr/local/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --prefix=~project/tools</CODE>
-
-Install the files into:
-
-<SAMP>`~project/tools/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --bindir=~project/bin --libdir=~/project/lib \<BR>
-
---includedir=~/project/headers --infodir=/usr/local/info \<BR>
---mandir=~/project/doc</CODE>
-
-The install directory for program (<SAMP>`bin'</SAMP>), etc can all be set with
-command line arguments to<SAMP>`configure'</SAMP>.
-
-<LI><CODE>CC=xacc LIBS=-lposix ./configure sun3</CODE>
-
-If the defaults chosen by <SAMP>`configure'</SAMP> are not correct you can
-override them by setting variables such as <CODE>CC</CODE> before calling
- <SAMP>`configure'</SAMP>. The <SAMP>`sun3'</SAMP> argument is used to 
identify the
-machine we are running on and may be necessary on some machines.
-
-<LI><CODE>./configure --help</CODE>
-
-And of course when in doubt ask for help.
-</OL>
-
-<P>
-For even more details see the file <SAMP>`INSTALL.con'</SAMP> which contains 
the
-generic instructions for use with <SAMP>`autoconf'</SAMP> generated
-<SAMP>`configure'</SAMP> scripts.
-
-</P>
-
-
-<H2><A NAME="SEC9" HREF="nana.html#TOC9">Variables for ./configure</A></H2>
-<P>
-The configure program uses the following shell variables to change
-various defaults.  Another method is simply to edit the 
-<SAMP>`nana-config.h'</SAMP> file. Most of these values should be auto 
detected,
-so you can ignore this section until your need to save a few 
-bytes of store by using <SAMP>`asm("hlt")'</SAMP> instead of a call to 
-<SAMP>`abort()'</SAMP>. 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>DI_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX10"></A>
-This text is inserted when the <SAMP>`DI.h'</SAMP> library needs to set a
-breakpoint in the generated code. It should ideally update all
-variables which being kept in registers etc so that gdb gets the
-correct values for each variable.
-
-Possible values include:
-
-
-<OL>
-<LI><SAMP>`asm("nop")'</SAMP> -- a single <SAMP>`nop'</SAMP> instruction to 
set the
-
-breakpoint at.
-
-This is the default.
-
-<LI><SAMP>`_vi = 0'</SAMP> -- where <SAMP>`_vi'</SAMP> is a global volatile 
int.
-
-<LI><SAMP>`_vi = (exprn)'</SAMP> -- where <VAR>exprn</VAR> is the expression
-
-we are checking for this assertion.
-<LI><SAMP>`/* nothing */'</SAMP> -- nothing at all, this means the breakpoint
-
-will be set at the start of the next statement which works most of the
-time. However for some examples this will do the wrong thing.
-</OL>
-
-<DT><CODE>DL_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX11"></A>
-Used for the same purpose as <SAMP>`DI_MAKE_VALID_BREAKPOINT'</SAMP> for
-<SAMP>`DL.h'</SAMP>. It also defaults to <SAMP>`asm("nop")'</SAMP>.
-<DT><CODE>I_DEFAULT_HANDLER</CODE>
-<DD>
-<A NAME="IDX12"></A>
-The code called when <SAMP>`I.h'</SAMP> detects an error.
-<DL COMPACT>
-
-<DT><CODE>asm("hlt")</CODE>
-<DD>
-<A NAME="IDX13"></A>
-Some machines use a <SAMP>`hlt'</SAMP> instruction.
-<DT><CODE>asm("stp")</CODE>
-<DD>
-<A NAME="IDX14"></A>
-And other machines use a <SAMP>`stp'</SAMP> instruction.
-<DT><CODE>abort()</CODE>
-<DD>
-<A NAME="IDX15"></A>
-Or we could use a call to <SAMP>`abort'</SAMP> which is at least standard C. On
-some machines this is significantly larger than a single <SAMP>`hlt'</SAMP>
-instruction. 
-<DT><CODE>restart()</CODE>
-<DD>
-<A NAME="IDX16"></A>
-Or a call to a function which attempts to restart the system.
-</DL>
-<DT><CODE>ALWAYS_INCLUDE_MALLOC</CODE>
-<DD>
-<A NAME="IDX17"></A>
-This is a dodgey for some versions of Linux which don't seem to include 
-<SAMP>`malloc'</SAMP> when you include <SAMP>`stdio.h'</SAMP> and use 
<SAMP>`print'</SAMP>. This
-causes problems for <SAMP>`gdb'</SAMP> since it uses <SAMP>`malloc'</SAMP> in 
the
-executable to implement parts of its functionality. 
-
-This kludge should be removed!
-</DL>
-
-
-
-<H2><A NAME="SEC10" HREF="nana.html#TOC10">Supported Platforms</A></H2>
-<P>
-Nana has been tested on the following platforms:
-
-</P>
-
-<OL>
-<LI>i386-unknown-linux, gcc-2.7.0, gdb-4.16
-
-<LI>sparc-sun-sunos4.1.4, gcc-2.7.2.f.1, gdb-4.16
-
-<LI>sparc-sun-solaris2.3, gcc-2.7.2, gdb-4.16
-
-<LI>alpha-dec-osf3.2, gcc-2.7.2, gdb-4.16
-
-<LI>mips-sgi-irix5.3, gcc-2.7.0, gdb-4.16
-
-<LI>powerpc-ibm-aix3.2.5, gcc-2.6.3, gdb-4.16
-
-</OL>
-
-<P>
-The <SAMP>`alpha-dec-osf3.2'</SAMP>, <SAMP>`mips-sgi-irix5.3'</SAMP> and
-<SAMP>`powerpc-ibm-aix3.2.5'</SAMP> implementations have problems when you
-compile with <SAMP>`-O2'</SAMP> or <SAMP>`-O3'</SAMP> optimisation. This 
causes some
-errors in the the debugger based assertion and logging code since
-variables can be removed or changed by optimisation. At <SAMP>`-O'</SAMP>
-everything passes. Regardless of optimisation the C based checking code
-passes all tests on these platforms.
-
-</P>
-<P>
-If you use nana on a new platform please send the <SAMP>`check.log'</SAMP> file
-to <SAMP>address@hidden'</SAMP> via the <SAMP>`make check-mail'</SAMP>
-command. A machine generated list of this information is available 
-at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC11" HREF="nana.html#TOC11">Supported Debuggers</A></H2>
-
-<P>
-Currently Nana works with the GNU GDB debugger which is available on a
-wide range of platforms including embedded systems and even provides
-support for remote debugging. 
-Porting to any reasonable debugger with conditional
-breakpoints and commands is not very difficult. 
-
-</P>
-<P>
-As an example of an unreasonable debugger, Nana has been ported to
-work with the MicroSoft Codeview debugger. The port is small (60 lines of
-code) but suffers from a problem with variable scoping in Codeview. If
-a breakpoint is set at a point in the code the expressions are not
-evaluated from that particular scope. For example setting a breakpoint
-in the function <CODE>f</CODE> cannot access a variable local to <CODE>f</CODE>
-directly. Codeview has a unique (expletive deleted) scope operator
-which you must use to set the scope <SAMP>`{...}'</SAMP>.  This makes the
-interface somewhat less than beautiful.
-
-</P>
-<P>
-Another good thing about CodeView is to try a debug command which prints a
-message which contains a single open <SAMP>`{'</SAMP>. This of course causes it
-to hang and was the main problem during the porting to CodeView which
-took a whole day<A NAME="DOCF2" HREF="nana.html#FOOT2">(2)</A>. 
-
-</P>
-<P>
-If anyone is interested I may release the CodeView implementation,
-please contact me if you are interested. Of course a better bet is probably 
-to move to the <SAMP>`gdbserver'</SAMP> system. I think <SAMP>`gdb'</SAMP> has 
been released
-as a native even for some MicroSoft operating systems.
-
-</P>
-<P>
-Other debuggers like DBX don't seem to be worth the trouble since gdb
-works on those machines. A redesign of the nana internals may also be useful
-if we decide portability between debuggers is actually useful.
-
-</P>
-
-
-<H2><A NAME="SEC12" HREF="nana.html#TOC12">Known Problems</A></H2>
-<P>
-Nana has the following known features (or perhaps problems):
-
-</P>
-
-<OL>
-<LI>Nana macros which use the debugger
-
-such as <CODE>DI</CODE> or <CODE>DL</CODE> should be on lines by themselves. 
If you
-mix code and nana macros on the same line you will get errors, e.g:
-
-
-<PRE>
-main(){
-   int x;
-   x = 5; x--; DI(x == 4); 
-}
-</PRE>
-
-This doesn't work since breakpoints are set at line boundaries rather
-than statement ones. Of course anyone who writes code like this deserves
-whatever happens to them.
-
-<LI>Optimisation can remove variables so that debugger based
-
-assertions (<SAMP>`DI.h'</SAMP>) do not work correctly. As usual the
-interaction between the debugger and the compiler is rather
-complicated. This may not be a problem if the appropriate compile-time
-flags are selected, e.g. <SAMP>`-O0 and -O1'</SAMP> work on most platforms.
-
-<LI>The <SAMP>`Q.h'</SAMP> macros depend on the statement value extension to
-
-GNU CC so if you wish to use them you must use GCC. This can be fixed
-for C++ in a possibly useful manner, I can't see any solution for C.
-
-<LI>The logging macros depend on the Var Args extension provided by the
-
-GNU C Preprocessor.<A NAME="DOCF3" HREF="nana.html#FOOT3">(3)</A> We could 
(probably will) implement a fix for this 
-based on the tricks in the C FAQ. Unfortunately these tricks are not pretty.
-For now interested users could simply replace their CPP with the GNU CPP
-if they wished to stay with non-standard compilers. 
-
-<LI>The <SAMP>`Q.h'</SAMP> macros do not work in the debugger since 
<SAMP>`gdb'</SAMP>
-
-does support the statement expression extension.
-
-<LI>Multiline expressions do not work as expected in the debugger since
-
-you need to use a blackslash as an escape at the end of the line. 
-For example:
-
-
-<PRE>
-        DI(x +
-            10 &#62; 30);
-</PRE>
-
-A few backslashes may solve this particular problem.
-
-<LI>Problems with the <SAMP>`configure'</SAMP> script.
-
-The <SAMP>`configure'</SAMP> script automatically detects the target operating
-system and architecture and then generates <SAMP>`nana-config.h'</SAMP>. If the
-options selected in <SAMP>`nana-config.h'</SAMP> are incorrect they can be
-edited by hand and installed in the usual include directory. The easiest
-method is simply to delete all macros in <SAMP>`nana-config.h'</SAMP> since the
-system defaults to more portable (and less efficient)
-implementations. If you wish to do this from the configure script you 
-can try giving a unsupported machine type, e.g.
-
-
-<PRE>
-% ./configure pdp11-dec-ultrix
-</PRE>
-
-<LI>Some users have reported problems with the <CODE>configure</CODE>
-
-script detecting <CODE>vsnprintf</CODE>. If <CODE>configure</CODE> doesn't 
find it
-and it does exist then simply define it in <SAMP>`nana-config.h'</SAMP> as per
-the previous question. 
-
-If <CODE>vsnprintf</CODE> really doesn't exist then get a new C library,
-possibly the GNU libc.
-
-<LI>The use of <CODE>vsprintf</CODE> opens a security hole since no
-
-bounds checking is done by it. Nana attempts to use <CODE>vsnprintf</CODE>
-which is safe when it exists but it will resort to <CODE>vsprintf</CODE>
-if it can't find <CODE>vsnprintf</CODE>. All careful people should make
-sure that they have a library with <CODE>vsnprintf</CODE>.
-
-<LI><CODE>STL</CODE> header file errors due to nana.
-
-The C++ <CODE>STL</CODE> header files for version 3.0 at least must
-be included before the <CODE>Q.h</CODE> file. The problem is caused by the STL
-files using <CODE>S</CODE> as a template argument. Of course <CODE>Q.h</CODE> 
uses
-<CODE>S</CODE> for summing a series. Namespace pollution strikes again.
-
-(Thanks to Han Holl for this particular problem).
-</OL>
-
-
-
-<H2><A NAME="SEC13" HREF="nana.html#TOC13">Bug Reports</A></H2>
-
-<P>
-If you think you have found a bug in the Nana library, please
-investigate it and report it.  
-
-</P>
-
-<UL>
-<LI>Please make sure that the bug is really in the Nana library.
-
-<LI>You have to send us a test case that makes it possible for us to
-
-reproduce the bug.
-<LI>You also have to explain what is wrong; if you get a crash, or if the
-
-results printed are not good and in that case, in what way.
-Make sure that the bug report includes all information you would
-need to fix this kind of bug for someone else.  
-</UL>
-
-<P>
-If your bug report is good, we will do our best to help you to get a
-corrected version of the library; if the bug report is poor, we won't do
-anything about it (apart from asking you to send better bug reports).
-
-</P>
-<P>
-Send your bug report to:
-
-</P>
-<P>
-<SAMP>address@hidden'</SAMP>
-
-</P>
-<P>
-Copies of bug reports will be kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC14" HREF="nana.html#TOC14">New Versions</A></H2>
-<P>
-New versions of nana will be made available at:
-
-</P>
-<P>
-<SAMP>`ftp://ftp.cs.ntu.edu.au/pub/nana/'</SAMP> 
-
-</P>
-<P>
-If you wish to be informed about new
-releases of nana then subscribe to the nana mailing list. 
-Send a message containing <SAMP>`subscribe'</SAMP> &#60;your e-mail 
address&#62; to:
-
-</P>
-<P>
-<SAMP>`mailto:address@hidden'</SAMP>. 
-
-</P>
-<P>
-A hypermail archive of this list is kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/hypermail/nana-archive'</SAMP>
-
-</P>
-<P>
-If you wish to send a message to the list send it to
-<SAMP>`mailto:address@hidden'</SAMP>.
-
-</P>
-
-
-<H1><A NAME="SEC15" HREF="nana.html#TOC15">Invoking Nana</A></H1>
-<P>
-The functions defined by Nana are implemented either as pure C code or
-as a set of commands which are generated for the debugger. 
-To use the C based support for assertion checking you would use
-something like:
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this file includes the other nana .h files */
-
-int floor_sqrt(int i) { /* returns floor(sqrt(i) */ 
-  int answer;
-  I(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  L("floor_sqrt(%d) == %d\n", 
-        i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To compile and link the previous code you may need to use the 
<SAMP>`-Ipath'</SAMP>
-or <SAMP>`-lnana'</SAMP> flags with the compiler. For example:
-
-</P>
-
-<PRE>
-% gcc toy.c -lnana
-</PRE>
-
-<P>
-If the nana headers have been installed in a strange location you may
-need to do something like:
-
-</P>
-
-<PRE>
-% gcc -I&#60;strange location&#62; toy.c -lnana
-</PRE>
-
-<P>
-The next example uses the debugger versions of <SAMP>`L'</SAMP> and 
<SAMP>`I'</SAMP>.
-If the code is run under the debugger these checks will occur, otherwise
-they take up a negligible amount of space and time.
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this includes the other nana .h files */
-
-int floor_sqrt(int i){
-  int answer;
-  DI(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  DL("floor_sqrt(%d) == %d\n", i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To generate the debugger commands from the C source we just run the
-<SAMP>`nana'</SAMP> filter over the program and then execute the commands
-under gdb using the <SAMP>`source'</SAMP> command.  
-
-</P>
-
-<PRE>
-% nana sqrt.c &#62;sqrt.gdb
-% gdb a.out
-(gdb) source sqrt.gdb
-breakpoint insert: ...
-(gdb) run
-...
-(gdb) quit
-</PRE>
-
-<P>
-Note that any C preprocessor flags which you use must be passed off to 
-the <SAMP>`nana'</SAMP> command. The best way to do this of course is in a
-Makefile. Something like the following works for GNU Make:
-
-</P>
-
-<PRE>
-%.nana: %.c 
-        nana $(CFLAGS) $&#60; &#62;$@
-</PRE>
-
-<P>
-The <SAMP>`nana'</SAMP> filter can also be run over multiple source files in a
-single run if thats more convenient. 
-
-</P>
-<P>
-For convenience a number of other simple scripts are provided, in
-particular to: 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>nana-run</CODE>
-<DD>
-<A NAME="IDX18"></A>
-Run a program under the debugger without prompting, etc.
-For example:
-
-
-<PRE>
-% nana-run a.out -x main.gdb
-output from program
-</PRE>
-
-<DT><CODE>nana-clg</CODE>
-<DD>
-<A NAME="IDX19"></A>
-Compiles the program, generates the debugger commands and the runs the
-program using <SAMP>`nana-run'</SAMP>. For example:
-
-
-<PRE>
-% nana-clg -O3 main.c
-output from program
-</PRE>
-
-You can change the compiler invoked by <SAMP>`nana-clg'</SAMP> by redefining 
-the <SAMP>`NANACC'</SAMP> environment variable. For example:
-
-
-<PRE>
-% NANACC=g++ nana-clg -O3 main.cc
-</PRE>
-
-The installation also <SAMP>`nana-c++lg'</SAMP> which compiles your code
-using a GNU C++ compiler.
-
-<DT><CODE>nana-trace</CODE>
-<DD>
-<A NAME="IDX20"></A>
-Generates a line by line trace of the execution of a program 
-using GDB. For example:
-
-
-<PRE>
-% nana-trace a.out
-54           printf("main()\n");
-55           x = distance(5,-5);
-distance (i=5, j=-5) at test.c:47
-47           i = -i;
-48           j = -j;
-...
-</PRE>
-
-The arguments to <SAMP>`nana-trace'</SAMP> are passed directly to GDB. If you
-wish display variables or call procedures on each line then could use
-something like:
-
-
-<PRE>
-% nana-trace -x mycommands.gdb a.out
-</PRE>
-
-Where the <SAMP>`mycommands.gdb'</SAMP> contains the GDB commands such as 
-<SAMP>`display x'</SAMP> which causes <SAMP>`x'</SAMP> to be printed every 
time the
-debugger gets control of the program.
-
-</DL>
-
-
-
-<H1><A NAME="SEC16" HREF="nana.html#TOC16">Interface</A></H1>
-<P>
-This section describes the details of the interface to nana library.
-
-</P>
-<P>
-All of the files can be included multiple times without
-ill--effect since they use the C preprocessor to make sure the header
-declarations are only seen the first by the compiler.
-Each of the files can also be included individually.
-
-</P>
-
-<P>
-If any of the following routines have an internal problem (e.g. malloc
-fails due to lack of memory) they will call the <SAMP>`nana_error'</SAMP> 
function
-defined in <SAMP>`nana_error.c'</SAMP>. By default this function prints a 
message
-and dumps core using <SAMP>`abort'</SAMP>. If you wish to override this 
behaviour
-you should define your own handler before linking in the nana library.
-
-</P>
-
-
-<H2><A NAME="SEC17" HREF="nana.html#TOC17">nana.h: the main header 
file</A></H2>
-<P>
-The <SAMP>`nana.h'</SAMP> file includes most of the other files in the
-library. In particular it <SAMP>`#include's'</SAMP> the following
-files:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>I.h</CODE>
-<DD>
-<A NAME="IDX21"></A>
-<DT><CODE>DI.h</CODE>
-<DD>
-<A NAME="IDX22"></A>
-<DT><CODE>L.h</CODE>
-<DD>
-<A NAME="IDX23"></A>
-<DT><CODE>DL.h</CODE>
-<DD>
-<A NAME="IDX24"></A>
-<DT><CODE>Q.h</CODE>
-<DD>
-<A NAME="IDX25"></A>
-<DT><CODE>GDB.h</CODE>
-<DD>
-<A NAME="IDX26"></A>
-</DL>
-
-
-
-<H2><A NAME="SEC18" HREF="nana.html#TOC18">WITHOUT_NANA: disabling all nana 
code for portability.</A></H2>
-<P>
-If you wish to disable all nana code you can <SAMP>`#define'</SAMP> the
-<SAMP>`WITHOUT_NANA'</SAMP> macro. This selects versions of the 
-macros defined in <SAMP>`I.h'</SAMP>,<SAMP>`L.h'</SAMP>, etc which map to 
-<SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-So if you are using nana for your development but don't wish to 
-force  your customers to use it you can add an option to your
-<SAMP>`configure'</SAMP> script to define/undefine 
<SAMP>`WITHOUT_NANA'</SAMP>. 
-In addition you will need to distribute copies of the nana header
-files with your package to get the stubs.
-
-</P>
-<P>
-Note that the <SAMP>`L.h'</SAMP> and <SAMP>`DL.h'</SAMP> macros use the 
-macro variable number of arguments extension provided by 
-GNU C. If you wish your code to be portable you should use
-the macros <SAMP>`VL((..))'</SAMP>, etc rather than <SAMP>`L(..)'</SAMP> to
-avoid problems with non GNU C preprocessors which only take a fixed
-number of arguments.
-
-</P>
-
-
-<H2><A NAME="SEC19" HREF="nana.html#TOC19">I.h: C based invariant 
checking</A></H2>
-<P>
-This implements the C based invariant checking code and is a
-replacement for <SAMP>`assert.h'</SAMP>. The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX27"></A>
-The <VAR>exprn</VAR> should always be true if the program is correct.  If the
-<VAR>exprn</VAR> is false a message will be printed, followed by core
-dump.<A NAME="DOCF4" HREF="nana.html#FOOT4">(4)</A>
-
-</P>
-<P>
-Checking can be enabled and disabled by using the <VAR>I_LEVEL</VAR>
-and <VAR>I_DEFAULT_GUARD</VAR> macros. See the definitions below for these
-macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF5" 
HREF="nana.html#FOOT5">(5)</A>
-since disabling checking shouldn't change your programs behaviour.
-
-</P>
-
-<PRE>
-  I(z != 0); 
-  x = y / z;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX28"></A>
-The opposite of <SAMP>`I'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as a piece of syntactic sugar which may be helpful for complicated
-boolean expressions.
-
-</P>
-
-<PRE>
-char* strdup(char *s) {
-  N(s == NULL);
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>I_LEVEL</B>
-<DD><A NAME="IDX29"></A>
-The <SAMP>`I_LEVEL'</SAMP> macro is used to globally enable and disable
-checking by the macros in this file. It can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX30"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>I</CODE>, <CODE>N</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX31"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX32"></A>
-Enable all checking regardless of guard conditions.
-</DL>
-
-<P>
-<CODE>I_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>I_DEFAULT_GUARD</B>
-<DD><A NAME="IDX33"></A>
-The <CODE>I_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>I_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>I_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define I_DEFAULT_GUARD i_guard &#62; 0
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>I_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX34"></A>
-This is passed off to the <CODE>I_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>I_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX35"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>I_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX36"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX37"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX38"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX39"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>I_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-All of the remaining macros are used to individually override the
-default values defined above. Normally these macros would be used in a
-system wide header file to define macros appropriate for the
-application. For example you might use <SAMP>`IH'</SAMP> to define 
-different checking macros for hardware and software faults.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX40"></A>
-<DT><U>Macro:</U> void <B>IG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX41"></A>
-<DT><U>Macro:</U> void <B>IH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX42"></A>
-<DT><U>Macro:</U> void <B>IP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX43"></A>
-<DT><U>Macro:</U> void <B>IGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX44"></A>
-<DT><U>Macro:</U> void <B>IGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX45"></A>
-<DT><U>Macro:</U> void <B>IHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX46"></A>
-<DT><U>Macro:</U> void <B>IGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX47"></A>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX48"></A>
-<DT><U>Macro:</U> void <B>NG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX49"></A>
-<DT><U>Macro:</U> void <B>NH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX50"></A>
-<DT><U>Macro:</U> void <B>NP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX51"></A>
-<DT><U>Macro:</U> void <B>NGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX52"></A>
-<DT><U>Macro:</U> void <B>NGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX53"></A>
-<DT><U>Macro:</U> void <B>NHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX54"></A>
-<DT><U>Macro:</U> void <B>NGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX55"></A>
-</DL>
-
-</P>
-<P>
-We also provide support for referring to previous values of variables in 
-postconditions. The <CODE>ID</CODE> macro is used to create variables to 
-save the old state in. The <CODE>IS</CODE> and <CODE>ISG</CODE> macros are to 
-set these values. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ID</B> <I>(Text <VAR>decln</VAR>)</I>
-<DD><A NAME="IDX56"></A>
-<DT><U>Macro:</U> void <B>IS</B> <I>(Text <VAR>assignment</VAR>)</I>
-<DD><A NAME="IDX57"></A>
-<DT><U>Macro:</U> void <B>ISG</B> <I>(Text <VAR>decln</VAR>, bool 
<VAR>g</VAR>)</I>
-<DD><A NAME="IDX58"></A>
-</DL>
-
-</P>
-<P>
-For example:
-
-<PRE>
-void ex(int &#38;r) {
-  ID(int oldr = r); /* save parameter */
-  g(r);
-  I(oldr == r); /* check r is unchanged */
-  while(more()) {
-    IS(oldr = r); /* assign r to oldr */
-    h(r);
-    I(oldr == r * r);
-  }
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC20" HREF="nana.html#TOC20">DI.h: debugger based invariant 
checking</A></H2>
-<P>
-This implements the debugger based invariant checking code.
-The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. Note that these macros have no effect unless you run your 
-program under the debugger and read in the commands generated by the
-<SAMP>`nana'</SAMP> command.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX59"></A>
-The <VAR>exprn</VAR> should always be true if the program is working. 
-If it is true then nothing happens otherwise the code given by
-<SAMP>`DI_DEFAULT_HANDLER'</SAMP> will be called which by default prints 
-a message and dies just like <SAMP>`assert.h'</SAMP>.  
-
-</P>
-<P>
-The checking using <VAR>DI</VAR> can be enabled and disabled by using the
-<VAR>DI_LEVEL</VAR> and <VAR>DI_DEFAULT_GUARD</VAR> macros. See the definitions
-below for these macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF6" 
HREF="nana.html#FOOT6">(6)</A> since 
-disabling the checking shouldn't change your programs behaviour.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX60"></A>
-The opposite of <SAMP>`DI'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as piece of syntactic sugar which is helpful for complicated
-boolean expressions.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DI_LEVEL</B>
-<DD><A NAME="IDX61"></A>
-The <SAMP>`DI_LEVEL'</SAMP> macro is used to globally enable and disable
-checking, in particular it can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX62"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>DI</CODE>, <CODE>DN</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX63"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX64"></A>
-Enable all checking regardless of guard conditions, etc.
-</DL>
-
-<P>
-<CODE>DI_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DI_DEFAULT_GUARD</B>
-<DD><A NAME="IDX65"></A>
-The <CODE>DI_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>DI_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>DI_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define DI_DEFAULT_GUARD (i_guard)
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DI_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX66"></A>
-This is passed off to the <CODE>DI_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>DI_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX67"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>DI_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX68"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX69"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX70"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX71"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>DI_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_MAKE_VALID_BREAKPOINT</B> <I>(exprn 
<VAR>e</VAR>)</I>
-<DD><A NAME="IDX72"></A>
-This macro is used to ensure that a breakpoint can be set at the
-location we are checking using <CODE>DI</CODE>, etc. It defaults to
-<CODE>asm("nop")</CODE> and can be redefined by the user.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX73"></A>
-<DT><U>Macro:</U> void <B>DIG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX74"></A>
-<DT><U>Macro:</U> void <B>DIH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX75"></A>
-<DT><U>Macro:</U> void <B>DIP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX76"></A>
-<DT><U>Macro:</U> void <B>DIGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX77"></A>
-<DT><U>Macro:</U> void <B>DIGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX78"></A>
-<DT><U>Macro:</U> void <B>DIHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX79"></A>
-<DT><U>Macro:</U> void <B>DIGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX80"></A>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX81"></A>
-<DT><U>Macro:</U> void <B>DNG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX82"></A>
-<DT><U>Macro:</U> void <B>DNH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX83"></A>
-<DT><U>Macro:</U> void <B>DNP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX84"></A>
-<DT><U>Macro:</U> void <B>DNGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX85"></A>
-<DT><U>Macro:</U> void <B>DNGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX86"></A>
-<DT><U>Macro:</U> void <B>DNHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX87"></A>
-<DT><U>Macro:</U> void <B>DNGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX88"></A>
-
-</P>
-<P>
-All of these macros are used to individually override the
-default values defined above. Normally these macros
-would be used in a system wide header file to define macros appropriate 
-for the application.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DS</B> <I>(<VAR>e</VAR>)</I>
-<DD><A NAME="IDX89"></A>
-<DT><U>Macro:</U> void <B>DSG</B> <I>(<VAR>e</VAR>, <VAR>g</VAR>)</I>
-<DD><A NAME="IDX90"></A>
-These macros are used to assign values to convenience variables in the
-debugger. Convenience variables are dynamically typed, global in scope
-and initialised to 0. They start with a single <CODE>$</CODE> and can be used 
be
-used for saving the state of program or for counting events. The
-<SAMP>`DS'</SAMP> macro executes <VAR>e</VAR> under the same rules as 
<CODE>DI</CODE>.
-The <SAMP>`DSG'</SAMP> macro executes <VAR>e</VAR> only if the the expression
-<VAR>g</VAR> is true.
-
-</P>
-<P>
-Note that <SAMP>`DS'</SAMP> and <SAMP>`DSG'</SAMP> can also be used for 
modifying
-C variables and calling functions.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC21" HREF="nana.html#TOC21">L.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX91"></A>
-Used to log a message in a similar way to printf.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>LG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX92"></A>
-<DT><U>Macro:</U> void <B>LH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX93"></A>
-<DT><U>Macro:</U> void <B>LP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX94"></A>
-<DT><U>Macro:</U> void <B>LGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX95"></A>
-<DT><U>Macro:</U> void <B>LHP</B> <I>(function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX96"></A>
-<DT><U>Macro:</U> void <B>LGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX97"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`L'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`L'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX98"></A>
-<DT><U>Macro:</U> void <B>VLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX99"></A>
-<DT><U>Macro:</U> void <B>VLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX100"></A>
-<DT><U>Macro:</U> void <B>VLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX101"></A>
-<DT><U>Macro:</U> void <B>VLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX102"></A>
-<DT><U>Macro:</U> void <B>VLHP</B> <I>((function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX103"></A>
-<DT><U>Macro:</U> void <B>VLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX104"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VLG'</SAMP> is the same as a call to 
<SAMP>`LG'</SAMP>.
-If you define <SAMP>`WITHOUT_NANA'</SAMP> all these macros are translated
-to <SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-Thus you can have nana under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_LEVEL</B>
-<DD><A NAME="IDX105"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX106"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX107"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX108"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX109"></A>
-The default handler for printing which is simply the name of the
-logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>L_DEFAULT_GUARD</B>
-<DD><A NAME="IDX110"></A>
-The default guard condition for logging. 
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX111"></A>
-The default parameter passed off to the logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_SHOW_TIME</B>
-<DD><A NAME="IDX112"></A>
-If defined then display the time in front of each message.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> char* <B>L_SHOW_TIME_FORMAT</B>
-<DD><A NAME="IDX113"></A>
-A format string for the time stamp in the log. By default it prints the
-time out in seconds.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> value <B>L_SHOW_TIME_NOW</B>
-<DD><A NAME="IDX114"></A>
-The name of a function that returns the time for the time stamp. This
-defaults to the <SAMP>`now'</SAMP> function from <SAMP>`now.h'</SAMP>.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC22" HREF="nana.html#TOC22">L_buffer.h: a circular buffer for 
logging.</A></H2>
-<P>
-A traditional embedded systems trick is to log messages to a circular
-buffer in core. This has the following benefits:
-
-</P>
-
-<OL>
-<LI>Speed -- writing to a in core buffer is much faster than spitting
-
-out messages to a file on disk. It is often fast enough to leave at least
-most of the messages in the final product.
-<LI>Field debugging -- what the ... was the user doing before the
-
-system crashed. Oh lets ask them, I'm sure they'll give us a good
-problem report. 
-</OL>
-
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_BUFFER</B>
-<DD><A NAME="IDX115"></A>
-Used to define buffer variables, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_buffer_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_create</B> <I>(size_t 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX116"></A>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX117"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-characters. 
-
-</P>
-
-<PRE>
-  L_BUFFER *lbuffer;
-
-  lbuffer = L_buffer_create(32*1024); /* create a 32K buffer */
-  ...;
-  L_buffer_delete(lbuffer); /* and delete it after use */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_wraparound</B> <I>(L_BUFFER 
<VAR>*b</VAR>, int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX118"></A>
-A buffer created by <SAMP>`L_buffer_create'</SAMP> is set up so that the new
-messages will overwrite the older messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first 32K bytes
-of your system startup messages you should use 
<SAMP>`L_buffer_wraparound'</SAMP>.
-For example:
-
-</P>
-
-<PRE>
-  L_BUFFER *lb = L_buffer_create(32*1024);
-  L_buffer_wraparound(lb, 0); /* disable wraparound */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_printf</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*fmt</VAR>, ...)</I>
-<DD><A NAME="IDX119"></A>
-<DT><U>Function:</U> void <B>L_buffer_puts</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*str</VAR>)</I>
-<DD><A NAME="IDX120"></A>
-<DT><U>Function:</U> void <B>L_buffer_putchar</B> <I>(L_BUFFER <VAR>*b</VAR>, 
char <VAR>ch</VAR>)</I>
-<DD><A NAME="IDX121"></A>
-These are the routines which do that actual printing to the buffer.
-
-</P>
-
-<PRE>
-  L_buffer_printf(lbuffer, "U: user input %c\n", c);
-  L_buffer_puts(lbuffer, "warning: its too hot");
-  L_buffer_putchar(lbuffer, '*');
-</PRE>
-
-<P>
-Note: a null pointer passed to the <SAMP>`L_buffer_puts'</SAMP> function prints
-as <SAMP>`(null)'</SAMP>. <A NAME="DOCF7" HREF="nana.html#FOOT7">(7)</A>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_clear</B> <I>(L_BUFFER <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX122"></A>
-Clear the log, i.e. remove all messages and start again.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_dump</B> <I>(L_BUFFER <VAR>*b</VAR>, 
FILE *<VAR>fp</VAR>)</I>
-<DD><A NAME="IDX123"></A>
-Dump the contents of the log <VAR>*b</VAR> to the file descriptor 
<VAR>*fp</VAR>. 
-Typically <VAR>*fp</VAR> would be <SAMP>`stderr'</SAMP>. 
-
-</P>
-<P>
-Note that this does not change the contents of the buffer.  This is
-important since we may have a hardware or software problem part of the
-way through the dump operation and you don't want to loose anything.
-
-</P>
-<P>
-To reset the buffer after a successful dump use <SAMP>`L_buffer_clear'</SAMP>.
-
-</P>
-<P>
-The output of <SAMP>`L_buffer_dump'</SAMP> consists of a starting message
-followed by the contents of the log. If a character in the log is not
-printable we print it out in hex on a line by itself.
-
-</P>
-
-<PRE>
-* L_buffer_dump =
-log message
-and another
-* non-printable character 0x1
-more log messages
-* end of dump
-</PRE>
-
-</DL>
-
-<P>
-You also need to be able to integrate these functions into your
-design. See <SAMP>`examples/ott.c'</SAMP> for a complicated example. Here we
-will provide a simplified version which implements a new logging macro
-called <SAMP>`LFAST'</SAMP> which does a <SAMP>`printf'</SAMP> to the 
<SAMP>`log_buffer'</SAMP>.
-If you want to have all messages going to a <SAMP>`L_BUFFER'</SAMP> then you 
can
-redefine <SAMP>`L_DEFAULT_HANDLER'</SAMP>.
-
-</P>
-
-<PRE>
-/* project.h - the project wide include file */
-
-#include &#60;nana.h&#62;
-#include &#60;L_buffer.h&#62;
-
-/* LFAST(char *, ...) - log a message to the log_buffer */
-/*     ##f translates as the rest of the arguments to LFAST */
-
-#define LFAST(f...) LHP(L_buffer_printf,log_buffer,##f)
-
-extern L_BUFFER *log_buffer; /* the log buffer */
-</PRE>
-
-<P>
-The main program merely creates the <VAR>log_buffer</VAR> and eventually
-calls <SAMP>`L_buffer_dump'</SAMP> to print out the buffer when the system 
dies.
-
-<PRE>
-/* main.c - initialise the system and start things */
-
-#include &#60;project.h&#62;
-
-L_BUFFER *log_buffer;
-
-main() {
-  log_buffer = L_buffer_create(16000); 
-  if(log_buffer == NULL) { /* not enough store */
-    ...
-  }
-  LFAST("system starting at %f\n", now());
-  ...;
-}
-
-void fatal_error() { /* called on fatal errors */
-  FILE *f = fopen("project.errors","w");
-  L_buffer_dump(b, stderr); /* print log to stderr */
-  L_buffer_dump(b, f); /* print log to file */
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC23" HREF="nana.html#TOC23">L_times.h: recording events and 
times.</A></H2>
-<P>
-This component is used to record events and times with a lower time 
-and space overhead than the <SAMP>`L_buffer.h'</SAMP> component. Instead
-of using a <SAMP>`printf'</SAMP> style string we simply record the time
-and a pointer to a string identifying the event in a circular buffer.
-
-</P>
-<P>
-<STRONG>Note 0:</STRONG> the string arguments should not be modified after
-a call since we record pointers to the strings rather
-than the strings themselves.
-
-</P>
-<P>
-<STRONG>Note 1:</STRONG> there is no <VAR>printf</VAR> style formatting, e.g.
-<SAMP>`%d'</SAMP> in this package.
-
-</P>
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_TIMES</B>
-<DD><A NAME="IDX124"></A>
-Used to define buffers, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_times_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_TIMES* <B>L_times_create</B> <I>(int 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX125"></A>
-<DT><U>Function:</U> L_TIMES* <B>L_times_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX126"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-messages.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_wraparound</B> <I>(L_TIMES <VAR>*b</VAR>, 
int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX127"></A>
-A buffer created by <SAMP>`L_times_create'</SAMP> is set up so that the new
-messages will overwrite the oldest messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first few messages
-messages you could use <SAMP>`L_times_wraparound(b,0)'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_add</B> <I>(L_BUFFER <VAR>*b</VAR>, char 
<VAR>*m</VAR>, NANA_TIME <VAR>t</VAR>)</I>
-<DD><A NAME="IDX128"></A>
-Add an event identified by message <VAR>m</VAR> at time <VAR>t</VAR> to 
<VAR>b</VAR>.  
-The type <VAR>NANA_TIME</VAR> defaults to <SAMP>`double'</SAMP>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_dump</B> <I>(L_TIMES <VAR>*b</VAR>, FILE 
<VAR>*fd</VAR>)</I>
-<DD><A NAME="IDX129"></A>
-Dump the contents of the buffer out.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_clear</B> <I>(L_TIMES <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX130"></A>
-Clear all the messages from <VAR>b</VAR>.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC24" HREF="nana.html#TOC24">DL.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DL</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX131"></A>
-Used to log a message.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DLG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX132"></A>
-<DT><U>Macro:</U> void <B>DLH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX133"></A>
-<DT><U>Macro:</U> void <B>DLP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX134"></A>
-<DT><U>Macro:</U> void <B>DLGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX135"></A>
-<DT><U>Macro:</U> void <B>DLHP</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX136"></A>
-<DT><U>Macro:</U> void <B>DLGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX137"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`DL'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`DL'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VDL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX138"></A>
-<DT><U>Macro:</U> void <B>VDLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX139"></A>
-<DT><U>Macro:</U> void <B>VDLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX140"></A>
-<DT><U>Macro:</U> void <B>VDLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX141"></A>
-<DT><U>Macro:</U> void <B>VDLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX142"></A>
-<DT><U>Macro:</U> void <B>VDLHP</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX143"></A>
-<DT><U>Macro:</U> void <B>VDLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX144"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VDL'</SAMP> is equivelant to a call to 
<SAMP>`DL'</SAMP>.
-If <SAMP>`WITHOUT_NANA'</SAMP> is defined then the call too <SAMP>`VDL'</SAMP> 
is 
-equivelant to <SAMP>`/* empty */'</SAMP>.
-
-</P>
-<P>
-Thus you can have debugging under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VDL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DL_LEVEL</B>
-<DD><A NAME="IDX145"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX146"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX147"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX148"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX149"></A>
-The default handler for printing which is simply the name of the
-printing function. 
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DL_DEFAULT_GUARD</B>
-<DD><A NAME="IDX150"></A>
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX151"></A>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> flag <B>DL_SHOW_TIME</B>
-<DD><A NAME="IDX152"></A>
-Each message can be given an individual time stamp by defining 
-<CODE>DL_SHOW_TIME</CODE>. This causes the <CODE>_L_gettime</CODE> routine to 
be
-called before each message which generates the timestamp. A default
-version is provided by the nana library.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC25" HREF="nana.html#TOC25">GDB.h: sending plain gdb commands 
to the debugger</A></H2>
-<P>
-<SAMP>`GDB.h'</SAMP> provides macros for generating user specified commands in
-the output of the <SAMP>`nana'</SAMP> command.
-They are not included by default in the <SAMP>`nana.h'</SAMP> file.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDB</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX153"></A>
-Emit a single line command when running this file through <SAMP>`nana'</SAMP>. 
-Note that each line must be passed off separately to the <SAMP>`GDB'</SAMP>
-macro. 
-
-</P>
-<P>
-This could be used to set debugger options or to define procedures
-inside <SAMP>`gdb'</SAMP>, e.g.
-
-</P>
-
-<PRE>
-  GDB(define checkstack);
-  GDB(  if 0 &#60;= n &#38;&#38; n &#60;= 10);
-  GDB(    print "stack ok");
-  GDB(  else);
-  GDB(    print "stack corrupted");
-  GDB(  end);
-  GDB(end);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDBCALL</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX154"></A>
-Causes a single gdb <VAR>command</VAR> to be executed whenever control
-passes through this line of code. After the users command is executed
-control automatically returns to the program.
-
-</P>
-
-<PRE>
-  GDBCALL(set memory_check = 1)
-</PRE>
-
-</DL>
-
-<P>
-These macros could used for instrumenting code or setting up test
-harnesses, e.g.
-
-</P>
-
-<PRE>
-
-GDB(set $siocall = 0);
-GDB(set $sioerr = 0);
-
-void sio_driver() {
-  GDBCALL(set $siocall++)
-  if(SIO_REQ &#38; 0x010) {
-    GDBCALL(set $sioerr++); 
-    ...
-  }
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC26" HREF="nana.html#TOC26">Q.h: support for 
quantifiers</A></H2>
-<P>
-<SAMP>`Q.h'</SAMP> provides support for the quantifiers of predicate logic.  
For
-example to check that all elements in a data structure have some
-property we would use universal (forall, upside down A) quantification.
-To check that one or more values in a data structure have some property
-we would use existential (exists, back the front E) quantification.  For
-example:
-
-</P>
-
-<PRE>
-  /* all values in a[] must be between 0 and 10 */
-  I(A(int i = 0, i &#60; n_array, i++, 0 &#60;= a[i] &#38;&#38; a[i] &#60;= 
10));
-
-  /* there exists a value in linked list l which is smaller than 10 */
-  I(E(node *p = l, p != NULL, p = p-&#62;next, p-&#62;data &#60;= 10));
-</PRE>
-
-<P>
-The first three arguments to <SAMP>`A'</SAMP> and <SAMP>`E'</SAMP> are similar 
-to a C <SAMP>`for'</SAMP> loop which iterates over the values we wish to
-check. The final argument is the expression that must be true.
-
-</P>
-<P>
-The only minor difference from the C <SAMP>`for'</SAMP> loop is that variables
-may be declared at the start of the loop, even if you are using C rather
-than C++ which already supports this.<A NAME="DOCF8" 
HREF="nana.html#FOOT8">(8)</A>
-
-</P>
-<P>
-The <SAMP>`Q.h'</SAMP> macros can also be nested and used anywhere a boolean 
-value is required. For example:
-
-</P>
-
-<PRE>
-  if(A(int i = 0, i &#60; MAXX, i++,
-       A(int j = 0, j &#60; MAXY, j++,
-         m[i][j] == (i == j ? 1 : 0)))) { 
-        /* identity matrix, i.e. all 0's except for 1's on */
-        /* the diagonal */
-        ...
-  } else {
-        /* not an identity matrix */
-        ...
-  }
-</PRE>
-
-<P>
-The results from these 
-macros can also be combined using boolean operations, e.g.
-
-</P>
-
-<PRE>
-  /* the values in a[i]  are either ALL positive or ALL negative */
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)
-    ||
-    A(int i = 0, i &#60; MAX, i++, a[i] &#60; 0));
-</PRE>
-
-<P>
-<STRONG>Portability:</STRONG> note the macros in this file require the GNU
-CC/C++ statement expression extension of GCC to work. If your not using GNU CC
-then for now you are out of luck. At some time in the future we may
-implement a method which will work for standard C++, standard C is a bit of
-a challenge.
-
-</P>
-<P>
-<STRONG>Portability:</STRONG> unfortunately these macros do not for the 
-<SAMP>`DI'</SAMP> and <SAMP>`DL'</SAMP> macros since the statement expression 
extension has 
-not been implemented in GDB.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>A</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX155"></A>
-For all values generated by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> the 
<VAR>exprn</VAR> must be
-true. 
-
-<PRE>
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); /* all a[i] are +ve */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX156"></A>
-There exists at least one value for <VAR>exprn</VAR> generated by
- <SAMP>`for (<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> 
which is true.
-
-</P>
-
-<PRE>
-  /* one or more a[i] &#62;= 0 */
-  I(E(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> long <B>C</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX157"></A>
-Returns the number of times the <VAR>exprn</VAR> is true over the values
-generated by 
<SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-
-</P>
-
-<PRE>
-  /* 3 elements of a[] are +ve */
-  I(C(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0) == 3); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX158"></A>
-There exists only one value generated by 
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> for 
which the <VAR>exprn</VAR>
-is true.
-
-</P>
-
-<PRE>
-  /* a single elements of a[] is +ve */
-  I(E1(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>S</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX159"></A>
-Sum the values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>. The 
type of the value
-returned  is given by the type of the <VAR>exprn</VAR>.<A NAME="DOCF9" 
HREF="nana.html#FOOT9">(9)</A>
-
-</P>
-
-<PRE>
-  /* sum of a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i]) == 10);
-
-  /* sum of all +ve numbers in a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0 ? a[i] : 0) == 10);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>P</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX160"></A>
-Returns the product of the 
-values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-The type returned is the type of the expression.
-
-</P>
-
-<PRE>
-  /* product of all the values in a[] is 10 */
-  I(P(int i = 0, i &#60; MAX, i++, a[i]) == 10); 
-
-  /* a = x^y i.e. x*x..*x y times */
-  I(P(int i = 0, i &#60; y, i++, x) == a);
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC27" HREF="nana.html#TOC27">Qstl.h: quantifiers for STL 
containers.</A></H2>
-<P>
-The Standard Template Library (STL) is a library for C++ that makes
-extensive use of templates to implement the standard container
-classes and much more. Each of the container classes provides an
-interface to iterate over all the objects in the container, e.g.
-
-</P>
-
-<PRE>
-// MAP is an associate array from location(lat,long) onto the name.
-typedef map&#60;location,string,locationlt&#62; MAP;
-
-void print_map_names(MAP&#38; m) { // print out all the names in the map
-  for(MAP::iterator i = m.begin(); i != m.end(); ++i) {
-    cout &#60;&#60; (*i).second &#60;&#60; "\n";
-  }
-}
-</PRE>
-
-<P>
-<SAMP>`Qstl.h'</SAMP> provides the same facilities as <SAMP>`Q.h'</SAMP> but 
uses the
-standard STL iterator protocol shown above. The names in <SAMP>`Qstl.h'</SAMP>
-are generated by appending a <SAMP>`O'</SAMP> (O not zero!) to the names in
-<SAMP>`Q.h'</SAMP>. In particular:
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>AO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX161"></A>
-For all values in the <VAR>container</VAR> class the <VAR>predicate</VAR> must
-be true. The <VAR>predicate</VAR> refers to individual values using
-<VAR>name</VAR>. See the STL documentation for more details. 
-Another way of putting this is forall <VAR>name</VAR> in
-<VAR>container</VAR> the <VAR>predicate</VAR> must be true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char *,ltint&#62; m;
-  // all keys (or indexes) into m are positive 
-  I(AO(i, m, (*i).first &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>EO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX162"></A>
-There exists one or more values in the <VAR>container</VAR> class for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one or more characters in m are '$'
-  I(EO(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1O</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX163"></A>
-There exists one value in the <VAR>container</VAR> for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one characters in m is a '$'
-  I(E1O(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>CO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX164"></A>
-Returns the number of times the <VAR>predicate</VAR> was true for all
-values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-  int nalpha; 
-  // count the number of alphabetic chars in the map
-  nalpha = CO(i, m, isalpha((*i).second)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>SO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX165"></A>
-Sum the <VAR>exprn</VAR> for all values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float sum;
-  // sum all the values in m
-  sum = SO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>PO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX166"></A>
-Take the product of the <VAR>exprn</VAR> for all values in the 
<VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float product;
-  // multiply all the values in m
-  product = PO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC28" HREF="nana.html#TOC28">now.h: measuring time</A></H2>
-<P>
-The <SAMP>`now.h'</SAMP> file provides some simple time measurement routines.
-It is not included in <SAMP>`nana.h'</SAMP> so you must include this file 
-separately.  
-
-</P>
-<P>
-It uses the <SAMP>`gettimeofday'</SAMP> system call and has an accuracy of
-between 1us and 10ms depending on the operating system and hardware
-configuration.
-
-</P>
-<P>
-See the IPM package if you require better measurement tools.<A NAME="DOCF10" 
HREF="nana.html#FOOT10">(10)</A>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now</B> <I>()</I>
-<DD><A NAME="IDX167"></A>
-Returns the time in seconds since the beginning of time as defined by
-your system. If you call <SAMP>`now_reset'</SAMP> the time will start again at
-0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_reset</B> <I>()</I>
-<DD><A NAME="IDX168"></A>
-Reset the times returned by <SAMP>`now'</SAMP> to 0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_delta</B> <I>(double *<VAR>dp</VAR>)</I>
-<DD><A NAME="IDX169"></A>
-Returns the elapsed time between <VAR>*dp</VAR> and <VAR>now()</VAR>. It then 
sets
-<VAR>*dp</VAR> to <VAR>now</VAR>, thus giving a delta time between particular
-events. 
-
-</P>
-
-<PRE>
-  t = now();
-  for(;;) {
-    ...; /* code that must finish in 50ms */
-    I(now_delta(&#38;t) &#60;= 0.050);
-  }
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC29" HREF="nana.html#TOC29">eiffel.h: eiffel type 
assertions</A></H2>
-<P>
-Eiffel is a very nice language which provides the assertion checking
-facilities of nana inside the language itself.  The <SAMP>`eiffel.h'</SAMP>
-library is intended to provide a similar setup to Eiffel in the C++
-language. It is a pretty poor emulation, but it is hopefully
-better than nothing.
-
-</P>
-<P>
-Assertion checking is controlled by the <VAR>EIFFEL_CHECK</VAR> variable
-which can take on any of the following values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>CHECK_NO</CODE>
-<DD>
-<A NAME="IDX170"></A>
-Disable all checking.
-<DT><CODE>CHECK_REQUIRE</CODE>
-<DD>
-<A NAME="IDX171"></A>
-Check the preconditions for each method.
-<DT><CODE>CHECK_ENSURE</CODE>
-<DD>
-<A NAME="IDX172"></A>
-And also check the postconditions.
-<DT><CODE>CHECK_INVARIANT</CODE>
-<DD>
-<A NAME="IDX173"></A>
-And also check the class invariant before and after each method is
-called. The programmer should provide a class method called
-<SAMP>`invariant'</SAMP> which returns <SAMP>`true'</SAMP> if the object is 
consistent, 
-<SAMP>`false'</SAMP> otherwise.
-<DT><CODE>CHECK_LOOP</CODE>
-<DD>
-<A NAME="IDX174"></A>
-And also check the loop invariants.
-<DT><CODE>CHECK_ALL</CODE>
-<DD>
-<A NAME="IDX175"></A>
-And also check any assertions using the <SAMP>`CHECK'</SAMP> instruction.
-</DL>
-
-<P>
-A typical compile flag to the compile might be:
-
-</P>
-
-<PRE>
-% g++ -c -DEIFFEL_CHECK=CHECK_ALL play.cc
-</PRE>
-
-<P>
-And then we have the actual assertion macros.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>REQUIRE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX176"></A>
-Called at the beginning of each method.
-This checks the precondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ENSURE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX177"></A>
-Called at the end of each method.
-This checks the postcondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>INVARIANT</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX178"></A>
-Used to check a loop invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>CHECK</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX179"></A>
-Used for any other inline assertions.
-</DL>
-
-</P>
-<P>
-And finally a small example:
-
-</P>
-
-<PRE>
-#include &#60;eiffel.h&#62;
-
-class example {
-  int nobjects;
-  map&#60;location,string,locationlt&#62; layer;
-public:
-  bool invariant();
-  void changeit(location l);
-};
-
-bool example::invariant() {
-  return AO(i,layer,valid_location((*i).first)) &#38;&#38; 
-         nobjects &#62;= 0;
-}
-
-void example::changeit(string n, location l) {
-  REQUIRE(E1O(i,layer,(*i).second == n));
-  ...;
-  while(..) {
-    INVARIANT(...);
-    ...
-    INVARIANT(...);
-  }
-  ...
-  CHECK(x == 5);
-  ...
-  ENSURE(layer[l] == n);
-}
-</PRE>
-
-<P>
-Note that the invariant checking macro <SAMP>`example::invariant'</SAMP>
-is called automatically on function entry/exit using the 
-<SAMP>`REQUIRE'</SAMP> and <SAMP>`ENSURE'</SAMP> macros.
-
-</P>
-
-
-<H2><A NAME="SEC30" HREF="nana.html#TOC30">assert.h: a drop in replacement for 
assert.h</A></H2>
-<P>
-A drop in replacement for <SAMP>`assert.h'</SAMP> is provided in the 
<SAMP>`src'</SAMP>
-directory. It is <STRONG>not</STRONG> installed by default. If you wish to use
-it then you need to copy it to your include directory by hand.
-
-</P>
-<P>
-This might be of use if you are already using <SAMP>`assert.h'</SAMP> and
-wish to save some code space since the nana implementation is more 
-space efficient. 
-
-</P>
-<P>
-Calls to <SAMP>`assert'</SAMP> are translated to calls to <SAMP>`I'</SAMP> and 
-can be disabled by defining <SAMP>`NDEBUG'</SAMP>.
-
-</P>
-
-
-<H2><A NAME="SEC31" HREF="nana.html#TOC31">calls.h: checking/printing many 
objects/facts.</A></H2>
-<P>
-The <SAMP>`calls'</SAMP> module implements a simple list of functions which 
can be 
-modified and executed at run-time. It is similar in spirit to the 
-ANSI C <SAMP>`atexit'</SAMP> function. It is intended to be used for: 
-
-</P>
-
-<UL>
-<LI>Checking the consistency of the components in your system.
-
-For example each module could register a self checking function which
-uses the rest of the nana library. All of these functions would then be
-called using <SAMP>`calls.h'</SAMP> to check that the entire system is 
consistent.
-
-<LI>Printing out the state of your program in a readable format.
-
-</UL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>typedef</B> <I>FUNC</I>
-<DD><A NAME="IDX180"></A>
-A pointer to a <SAMP>`void'</SAMP> function which takes a single 
<SAMP>`void*'</SAMP>
-argument. The <SAMP>`void *'</SAMP> argument is intended to be used to pass
-information such as arguments or pointers to objects (e.g. <SAMP>`this'</SAMP>
-in C++). All of the checking/printing functions must be of this type, e.g.
-
-</P>
-
-<PRE>
-void print_object(void *f) {
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>struct</B> <I>CALL</I>
-<DD><A NAME="IDX181"></A>
-This structure represents a single call to a function, i.e. a function 
-pointer (<SAMP>`FUNC'</SAMP>) and the <SAMP>`void*'</SAMP> argument. 
-
-</P>
-
-<PRE>
-       CALL *head = 0;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_add</B> <I>(CALL **head, FUNC fp, *arg)</I>
-<DD><A NAME="IDX182"></A>
-Adds a call to function <SAMP>`fp'</SAMP> with argument <SAMP>`arg'</SAMP> to
-the list pointed to by <SAMP>`head'</SAMP>. 
-
-</P>
-
-<PRE>
-       CALL *global_checks = 0;
-
-       calls_add(&#38;global_checks,complex_ok,(void *)x); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_exec</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX183"></A>
-Execute all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_exec'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_exec(&#38;l,0,0); /* execute all functions in l  */
-calls_exec(&#38;l,complex_print,0); /* calls complex_print(*) in l */
-calls_exec(&#38;l,0,(void*) &#38;b); /* calls *(&#38;b) in l */
-calls_exec(&#38;l,f,(void*) &#38;b); /* calls f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_delete</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX184"></A>
-Delete all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_delete'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_delete(&#38;l,0,0); /* delete all functions in l  */
-calls_delete(&#38;l,complex_print,0); /* delete complex_print(*) in l */
-calls_delete(&#38;l,0,(void*) &#38;b); /* delete *(&#38;b) in l */
-calls_delete(&#38;l,f,(void*) &#38;b); /* delete f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<STRONG>Note:</STRONG> that calls are added to the head of the list rather 
than the 
-tail. This means that the most recently added call will be 
-executed first (as in a stack).
-
-</P>
-
-
-<H1><A NAME="SEC32" HREF="nana.html#TOC32">Using Nana</A></H1>
-<P>
-This chapter is intended to provide some hopefully useful examples of
-Nana. If any of the users of this library would be so kind as
-to contribute a section on their usage I would be obliged. 
-
-</P>
-<P>
-<STRONG>This section is under development</STRONG>
-
-</P>
-
-
-
-<H2><A NAME="SEC33" HREF="nana.html#TOC33">Simplest example</A></H2>
-<P>
-As a nice simple, indeed trivial example consider the following:
-
-</P>
-
-<OL>
-<LI>Include <SAMP>`nana.h'</SAMP> in your project wide include file.
-
-<LI>Use <SAMP>`I'</SAMP> to check invariants in your code. In particular
-
-all functions or methods should be required to check their pre and post
-conditions.
-<LI>Use <SAMP>`DL'</SAMP> to print debugging messages in your code. This means
-
-that debugging messages only occur when you run the program under the
-debugger.<A NAME="DOCF11" HREF="nana.html#FOOT11">(11)</A>
-</OL>
-
-
-
-<H2><A NAME="SEC34" HREF="nana.html#TOC34">Syslog</A></H2>
-<P>
-<SAMP>`syslog'</SAMP> is a comprehensive logging system written by Eric Allman
-which is available on most Unix systems. It provides facilities for
-sorting messages by source or severity and mechanisms for sending
-messages off to files, terminals or other machines. See chapter 12 of
-the "Unix System Administration Handbook (2nd Edition)" 
-by Nemeth, Snyder, Seebass and Hein for an excellent tutorial on
-<SAMP>`syslog'</SAMP>.
-
-</P>
-<P>
-The rules used by <SAMP>`syslog'</SAMP> are normally defined in
-<SAMP>`/etc/syslog.conf'</SAMP>. Each line specifies the destination for
-messages with particular sources and priorities.  For example:
-
-</P>
-
-<PRE>
-# log mail messages at priority info to mailinfo
-mail.info /var/log/mailinfo
-# log all ftp information to syslog on a remote machine
-ftp.* @remote-machine.cs.ntu.edu.au
-# all critical errors to console
-*.crit   /dev/console
-</PRE>
-
-<P>
-To use <SAMP>`syslog'</SAMP> we merely redefine the default handlers and
-parameter values for <SAMP>`nana'</SAMP>. For example:
-
-</P>
-
-<PRE>
-#include &#60;syslog.h&#62;
-#define L_DEFAULT_HANDLER syslog /* replaces fprintf(3) by syslog(3) */
-#define L_DEFAULT_PARAMS LOG_USER /* default priority for syslog info */
-#include &#60;nana.h&#62;
-
-int main() {
-     openlog("nana", /* identifier for these log messages */
-        LOG_PID, /* also log the process id */
-        LOG_DAEMON /* facility */
-     );
-
-     L("temperature is falling to %d", 35); /* logged at LOG_USER priority */
-     LP(LOG_CRIT, "the snow is falling in Darwin"); /* LOG_CRIT message */
-        
-     closelog();
-     return 0;
-}
-</PRE>
-
-<P>
-This program results in the following addition to 
<SAMP>`/var/adm/messages'</SAMP>:
-
-</P>
-
-<PRE>
-Jun 12 16:04:46 chingiz nana[2671]: the temperature is falling to 35
-Jun 12 16:04:46 chingiz nana[2671]: the snow is falling in Darwin
-</PRE>
-
-<P>
-In addition the <SAMP>`LOG_CRIT'</SAMP> message about snow falling in Darwin is
-sent to the console for immediate action. 
-
-</P>
-<P>
-<STRONG>Note:</STRONG> <SAMP>`syslog'</SAMP> normally uses <SAMP>`UDP'</SAMP> 
for its network
-communications and that <SAMP>`UDP'</SAMP> does not guarantee delivery. 
-
-</P>
-
-
-<H2><A NAME="SEC35" HREF="nana.html#TOC35">GNU Programs: how to avoid nana 
sometimes</A></H2>
-<P>
-Imagine you<A NAME="DOCF12" HREF="nana.html#FOOT12">(12)</A> are building a 
GNU program.
-Ideally it should run on systems without any other software including
-GCC, GDB and even Nana. 
-
-</P>
-<P>
-To achieve this noble goal you can provide your configure script
-with a <SAMP>`--without-nana'</SAMP><A NAME="DOCF13" 
HREF="nana.html#FOOT13">(13)</A> flag which then <SAMP>`#define's'</SAMP>
-<SAMP>`WITHOUT_NANA'</SAMP>. You should also use the <SAMP>`VL'</SAMP> macro 
rather than
-<SAMP>`L'</SAMP> macro since <SAMP>`L'</SAMP> takes a variable number of 
arguments and
-will break non GNU C preprocessors. 
-
-</P>
-
-<PRE>
-int half(int n) {
-  /* Don't use L(...) since it takes a variable number of args! */
-  VL(("hello world = %d\n", 10)); /* Note the doubled (( */
-  ...;
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC36" HREF="nana.html#TOC36">Embedded Systems: testing 
non-deterministic systems.</A></H2>
-<P>
-One of the uses (in fact the original use) for nana is in the 
-testing of non-deterministic systems. These systems behave in a 
-different way each time they are run because of timing or measurement
-noise. Thus you can't just <SAMP>`diff'</SAMP> the results against a known 
good run
-since they run differently each time. 
-
-</P>
-<P>
-Instead you can use a series of programs which execute over a 
-the results of the program and check that the behaviour meets the
-specification automatically. 
-
-</P>
-
-
-<H2><A NAME="SEC37" HREF="nana.html#TOC37">Realtime Systems</A></H2>
-<P>
-Assertions for the timing behaviour of you system can be done in nana
-nicely. You might also consider using an instruction level simulator
-such as PSIM and use the <SAMP>`cycles'</SAMP> variable to test realtime
-constraints.
-
-</P>
-
-
-<H2><A NAME="SEC38" HREF="nana.html#TOC38">A database</A></H2>
-<P>
-Ah databases, business boffins using assertions. It would nice
-to get a real example for this one! 
-
-</P>
-
-
-<H2><A NAME="SEC39" HREF="nana.html#TOC39">Program Visualisation: pretty 
pictures</A></H2>
-<P>
-One nice way to use <SAMP>`L'</SAMP>, <SAMP>`DL'</SAMP>, etc is to punt off 
the messages
-off to a program which displays the information. You would use the
-<SAMP>`L_DEFAULT_PARAM'</SAMP> argument to send commands off to a pipe with
-gnuplot or TCL/TK interpreter running at the end. 
-
-</P>
-<P>
-For a small example of this, see <SAMP>`tcl/status.c'</SAMP>. 
-
-</P>
-
-
-<H1><A NAME="SEC40" HREF="nana.html#TOC40">FAQ</A></H1>
-<P>
-This chapter is intended to answer some general questions about the
-usage of Nana. Most of the material (perhaps) has been presented elsewhere,
-my apologies for repeating myself.
-
-</P>
-
-<OL>
-<LI>Can I use GNU Nana in a commercial product?
-
-See the license details in the file <SAMP>`COPYING'</SAMP>. In summary GNU Nana
-is Free software which has been released under a license that allows
-commercial use provided the copyright is maintained. It is not under
-the GPL. 
-
-<LI>How do you completely disable assertion checking?
-
-Set the <SAMP>`I_LEVEL'</SAMP> command to <SAMP>`0'</SAMP> using 
<SAMP>`-D'</SAMP> or 
-<SAMP>`#define'</SAMP> before including <SAMP>`nana.h'</SAMP>. 
-
-<LI>How do I find out about future releases?
-
-Subscribe to the nana mailing list by using the <SAMP>`make subscribe'</SAMP>
-target in the nana root directory. 
-
-<LI>Where do I send bug reports, suggestions, etc?
-
-<SAMP>address@hidden'</SAMP> -- bug archive
-
-<SAMP>address@hidden'</SAMP> -- mailing list
-
-<SAMP>address@hidden'</SAMP> -- the author
-
-</OL>
-
-
-
-<H1><A NAME="SEC41" HREF="nana.html#TOC41">Future work</A></H1>
-<P>
-As usual, there is more work to be done than time to do it in.
-Workers or test pilots are invited to apply for the following
-tasks which may get down in the fullness of time minister. 
-I'm particularly interested in which projects people think 
-are worthwhile (or rubbish).
-
-</P>
-
-<OL>
-<LI>Ada support - pre 1.00 versions of nana provided support for
-
-        Ada. Adding a full version of nana into the GNATS compiler 
-        would probably be useful, particularly the real time part.
-<LI>FORTRAN support.
-
-<LI>Message browsing (<SAMP>`emacs/fess.el'</SAMP>) - a very prototypical mode 
for
-
-browsing message logs is distributed with nana. Features include hiding/showing
-lines by regular expression or predicate. If someone who knows what they
-are doing rewrites this that would be a good thing. Or perhaps a modified
-version of <SAMP>`less'</SAMP> would be useful.
-<LI>Program Visualisation (<SAMP>`tcl/status.c'</SAMP>) - another prototype
-
-which uses a small TCL/TK library and nana logging to generate some 
-nice pictures showing the behaviour of the program. For example
-the history of variables over time can be recorded, graphs drawn and
-long message logs kept. A new version of this has been created
-and may be released shortly. 
-<LI>Eiffel shortform program - the shortform of an Eiffel program
-
-contains the function signatures (arguments, etc) together with the
-assertions (pre/post conditions). 
-An extension could perhaps be put in a
-program such as <SAMP>`DOC++'</SAMP> or <SAMP>`cxref'</SAMP> which extracts 
the 
-nana assertions.
-<LI>Automated Testing - combine nana logs with a workbench
-
-that lets you verify properties of the logs using programs <SAMP>`gawk'</SAMP>
-or the <SAMP>`PRECC'</SAMP> (LL infinity version of YACC). This technique has
-been used on industrial strength products quite successfully. 
-<LI>GNU standards - perhaps it would be worthwhile to set up
-
-a prototype for checking and logging in GNU tools. 
-<LI>Extend GDB(1) so that we can support <SAMP>`Q.h'</SAMP> style quantifiers
-
-in <SAMP>`DI.h'</SAMP> expressions. Basically we need to add a restricted form 
-of the statement value expression to GDB.
-<LI>Support for other (particularly ANSI only) compilers.
-
-</OL>
-
-
-
-<H1><A NAME="SEC42" HREF="nana.html#TOC42">Index</A></H1>
-<P>
-Jump to:
-<A HREF="#cindex_0">0</A>
--
-<A HREF="#cindex_1">1</A>
--
-<A HREF="#cindex_2">2</A>
--
-<A HREF="#cindex_a">a</A>
--
-<A HREF="#cindex_c">c</A>
--
-<A HREF="#cindex_d">d</A>
--
-<A HREF="#cindex_e">e</A>
--
-<A HREF="#cindex_f">f</A>
--
-<A HREF="#cindex_g">g</A>
--
-<A HREF="#cindex_i">i</A>
--
-<A HREF="#cindex_l">l</A>
--
-<A HREF="#cindex_n">n</A>
--
-<A HREF="#cindex_p">p</A>
--
-<A HREF="#cindex_q">q</A>
--
-<A HREF="#cindex_r">r</A>
--
-<A HREF="#cindex_s">s</A>
--
-<A HREF="#cindex_t">t</A>
--
-<A HREF="#cindex_v">v</A>
-<P>
-<H2><A NAME="cindex_0">0</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX30">0</A>, <A HREF="nana.html#IDX62">0</A>, <A 
HREF="nana.html#IDX108">0</A>, <A HREF="nana.html#IDX148">0</A>
-</DIR>
-<H2><A NAME="cindex_1">1</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX31">1</A>, <A HREF="nana.html#IDX63">1</A>, <A 
HREF="nana.html#IDX107">1</A>, <A HREF="nana.html#IDX147">1</A>
-</DIR>
-<H2><A NAME="cindex_2">2</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX32">2</A>, <A HREF="nana.html#IDX64">2</A>, <A 
HREF="nana.html#IDX106">2</A>, <A HREF="nana.html#IDX146">2</A>
-</DIR>
-<H2><A NAME="cindex_a">a</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX1">A</A>, <A HREF="nana.html#IDX155">A</A>
-<LI><A HREF="nana.html#IDX15">abort()</A>
-<LI><A HREF="nana.html#IDX17">ALWAYS_INCLUDE_MALLOC</A>
-<LI><A HREF="nana.html#IDX161">AO</A>
-<LI><A HREF="nana.html#IDX13">asm("hlt")</A>
-<LI><A HREF="nana.html#IDX14">asm("stp")</A>
-</DIR>
-<H2><A NAME="cindex_c">c</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX4">C</A>, <A HREF="nana.html#IDX157">C</A>
-<LI><A HREF="nana.html#IDX182">calls_add</A>
-<LI><A HREF="nana.html#IDX184">calls_delete</A>
-<LI><A HREF="nana.html#IDX183">calls_exec</A>
-<LI><A HREF="nana.html#IDX179">CHECK</A>
-<LI><A HREF="nana.html#IDX175">CHECK_ALL</A>
-<LI><A HREF="nana.html#IDX172">CHECK_ENSURE</A>
-<LI><A HREF="nana.html#IDX173">CHECK_INVARIANT</A>
-<LI><A HREF="nana.html#IDX174">CHECK_LOOP</A>
-<LI><A HREF="nana.html#IDX170">CHECK_NO</A>
-<LI><A HREF="nana.html#IDX171">CHECK_REQUIRE</A>
-<LI><A HREF="nana.html#IDX164">CO</A>
-</DIR>
-<H2><A NAME="cindex_d">d</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX59">DI</A>, <A HREF="nana.html#IDX73">DI</A>
-<LI><A HREF="nana.html#IDX22">DI.h</A>
-<LI><A HREF="nana.html#IDX65">DI_DEFAULT_GUARD</A>
-<LI><A HREF="nana.html#IDX67">DI_DEFAULT_HANDLER</A>
-<LI><A HREF="nana.html#IDX66">DI_DEFAULT_PARAMS</A>
-<LI><A HREF="nana.html#IDX61">DI_LEVEL</A>
-<LI><A HREF="nana.html#IDX10">DI_MAKE_VALID_BREAKPOINT</A>, <A 
HREF="nana.html#IDX72">DI_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana.html#IDX74">DIG</A>
-<LI><A HREF="nana.html#IDX77">DIGH</A>
-<LI><A HREF="nana.html#IDX80">DIGHP</A>
-<LI><A HREF="nana.html#IDX78">DIGP</A>
-<LI><A HREF="nana.html#IDX75">DIH</A>
-<LI><A HREF="nana.html#IDX79">DIHP</A>
-<LI><A HREF="nana.html#IDX76">DIP</A>
-<LI><A HREF="nana.html#IDX131">DL</A>
-<LI><A HREF="nana.html#IDX24">DL.h</A>
-<LI><A HREF="nana.html#IDX150">DL_DEFAULT_GUARD</A>
-<LI><A HREF="nana.html#IDX149">DL_DEFAULT_HANDLER</A>
-<LI><A HREF="nana.html#IDX151">DL_DEFAULT_PARAMS</A>
-<LI><A HREF="nana.html#IDX145">DL_LEVEL</A>
-<LI><A HREF="nana.html#IDX11">DL_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana.html#IDX152">DL_SHOW_TIME</A>
-<LI><A HREF="nana.html#IDX132">DLG</A>
-<LI><A HREF="nana.html#IDX137">DLGHP</A>
-<LI><A HREF="nana.html#IDX135">DLGP</A>
-<LI><A HREF="nana.html#IDX133">DLH</A>
-<LI><A HREF="nana.html#IDX136">DLHP</A>
-<LI><A HREF="nana.html#IDX134">DLP</A>
-<LI><A HREF="nana.html#IDX60">DN</A>, <A HREF="nana.html#IDX81">DN</A>
-<LI><A HREF="nana.html#IDX82">DNG</A>
-<LI><A HREF="nana.html#IDX85">DNGH</A>
-<LI><A HREF="nana.html#IDX88">DNGHP</A>
-<LI><A HREF="nana.html#IDX86">DNGP</A>
-<LI><A HREF="nana.html#IDX83">DNH</A>
-<LI><A HREF="nana.html#IDX87">DNHP</A>
-<LI><A HREF="nana.html#IDX84">DNP</A>
-<LI><A HREF="nana.html#IDX89">DS</A>
-<LI><A HREF="nana.html#IDX90">DSG</A>
-</DIR>
-<H2><A NAME="cindex_e">e</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX2">E</A>, <A HREF="nana.html#IDX156">E</A>
-<LI><A HREF="nana.html#IDX3">E1</A>, <A HREF="nana.html#IDX158">E1</A>
-<LI><A HREF="nana.html#IDX163">E1O</A>
-<LI><A HREF="nana.html#IDX177">ENSURE</A>
-<LI><A HREF="nana.html#IDX162">EO</A>
-<LI><A HREF="nana.html#IDX36">exprn</A>, <A HREF="nana.html#IDX68">exprn</A>
-</DIR>
-<H2><A NAME="cindex_f">f</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX37">file</A>, <A HREF="nana.html#IDX69">file</A>
-</DIR>
-<H2><A NAME="cindex_g">g</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX7">gcc-2.7.2</A>
-<LI><A HREF="nana.html#IDX153">GDB</A>
-<LI><A HREF="nana.html#IDX8">gdb-4.16</A>
-<LI><A HREF="nana.html#IDX26">GDB.h</A>
-<LI><A HREF="nana.html#IDX154">GDBCALL</A>
-<LI><A HREF="nana.html#IDX9">gmake</A>
-</DIR>
-<H2><A NAME="cindex_i">i</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX27">I</A>, <A HREF="nana.html#IDX40">I</A>
-<LI><A HREF="nana.html#IDX21">I.h</A>
-<LI><A HREF="nana.html#IDX33">I_DEFAULT_GUARD</A>
-<LI><A HREF="nana.html#IDX12">I_DEFAULT_HANDLER</A>, <A 
HREF="nana.html#IDX35">I_DEFAULT_HANDLER</A>
-<LI><A HREF="nana.html#IDX34">I_DEFAULT_PARAMS</A>
-<LI><A HREF="nana.html#IDX29">I_LEVEL</A>
-<LI><A HREF="nana.html#IDX56">ID</A>
-<LI><A HREF="nana.html#IDX41">IG</A>
-<LI><A HREF="nana.html#IDX44">IGH</A>
-<LI><A HREF="nana.html#IDX47">IGHP</A>
-<LI><A HREF="nana.html#IDX45">IGP</A>
-<LI><A HREF="nana.html#IDX42">IH</A>
-<LI><A HREF="nana.html#IDX46">IHP</A>
-<LI><A HREF="nana.html#IDX178">INVARIANT</A>
-<LI><A HREF="nana.html#IDX43">IP</A>
-<LI><A HREF="nana.html#IDX57">IS</A>
-<LI><A HREF="nana.html#IDX58">ISG</A>
-</DIR>
-<H2><A NAME="cindex_l">l</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX91">L</A>
-<LI><A HREF="nana.html#IDX23">L.h</A>
-<LI><A HREF="nana.html#IDX115">L_BUFFER</A>
-<LI><A HREF="nana.html#IDX122">L_buffer_clear</A>
-<LI><A HREF="nana.html#IDX116">L_buffer_create</A>
-<LI><A HREF="nana.html#IDX117">L_buffer_delete</A>
-<LI><A HREF="nana.html#IDX123">L_buffer_dump</A>
-<LI><A HREF="nana.html#IDX119">L_buffer_printf</A>
-<LI><A HREF="nana.html#IDX121">L_buffer_putchar</A>
-<LI><A HREF="nana.html#IDX120">L_buffer_puts</A>
-<LI><A HREF="nana.html#IDX118">L_buffer_wraparound</A>
-<LI><A HREF="nana.html#IDX110">L_DEFAULT_GUARD</A>
-<LI><A HREF="nana.html#IDX109">L_DEFAULT_HANDLER</A>
-<LI><A HREF="nana.html#IDX111">L_DEFAULT_PARAMS</A>
-<LI><A HREF="nana.html#IDX105">L_LEVEL</A>
-<LI><A HREF="nana.html#IDX112">L_SHOW_TIME</A>
-<LI><A HREF="nana.html#IDX113">L_SHOW_TIME_FORMAT</A>
-<LI><A HREF="nana.html#IDX114">L_SHOW_TIME_NOW</A>
-<LI><A HREF="nana.html#IDX124">L_TIMES</A>
-<LI><A HREF="nana.html#IDX128">L_times_add</A>
-<LI><A HREF="nana.html#IDX130">L_times_clear</A>
-<LI><A HREF="nana.html#IDX125">L_times_create</A>
-<LI><A HREF="nana.html#IDX126">L_times_delete</A>
-<LI><A HREF="nana.html#IDX129">L_times_dump</A>
-<LI><A HREF="nana.html#IDX127">L_times_wraparound</A>
-<LI><A HREF="nana.html#IDX92">LG</A>
-<LI><A HREF="nana.html#IDX97">LGHP</A>
-<LI><A HREF="nana.html#IDX95">LGP</A>
-<LI><A HREF="nana.html#IDX93">LH</A>
-<LI><A HREF="nana.html#IDX96">LHP</A>
-<LI><A HREF="nana.html#IDX38">line</A>, <A HREF="nana.html#IDX70">line</A>
-<LI><A HREF="nana.html#IDX94">LP</A>
-</DIR>
-<H2><A NAME="cindex_n">n</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX28">N</A>, <A HREF="nana.html#IDX48">N</A>
-<LI><A HREF="nana.html#IDX19">nana-clg</A>
-<LI><A HREF="nana.html#IDX18">nana-run</A>
-<LI><A HREF="nana.html#IDX20">nana-trace</A>
-<LI><A HREF="nana.html#IDX49">NG</A>
-<LI><A HREF="nana.html#IDX52">NGH</A>
-<LI><A HREF="nana.html#IDX55">NGHP</A>
-<LI><A HREF="nana.html#IDX53">NGP</A>
-<LI><A HREF="nana.html#IDX50">NH</A>
-<LI><A HREF="nana.html#IDX54">NHP</A>
-<LI><A HREF="nana.html#IDX167">now</A>
-<LI><A HREF="nana.html#IDX169">now_delta</A>
-<LI><A HREF="nana.html#IDX168">now_reset</A>
-<LI><A HREF="nana.html#IDX51">NP</A>
-</DIR>
-<H2><A NAME="cindex_p">p</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX6">P</A>, <A HREF="nana.html#IDX160">P</A>
-<LI><A HREF="nana.html#IDX39">param</A>, <A HREF="nana.html#IDX71">param</A>
-<LI><A HREF="nana.html#IDX166">PO</A>
-</DIR>
-<H2><A NAME="cindex_q">q</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX25">Q.h</A>
-</DIR>
-<H2><A NAME="cindex_r">r</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX176">REQUIRE</A>
-<LI><A HREF="nana.html#IDX16">restart()</A>
-</DIR>
-<H2><A NAME="cindex_s">s</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX5">S</A>, <A HREF="nana.html#IDX159">S</A>
-<LI><A HREF="nana.html#IDX165">SO</A>
-<LI><A HREF="nana.html#IDX181">struct</A>
-</DIR>
-<H2><A NAME="cindex_t">t</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX180">typedef</A>
-</DIR>
-<H2><A NAME="cindex_v">v</A></H2>
-<DIR>
-<LI><A HREF="nana.html#IDX138">VDL</A>
-<LI><A HREF="nana.html#IDX139">VDLG</A>
-<LI><A HREF="nana.html#IDX144">VDLGHP</A>
-<LI><A HREF="nana.html#IDX142">VDLGP</A>
-<LI><A HREF="nana.html#IDX140">VDLH</A>
-<LI><A HREF="nana.html#IDX143">VDLHP</A>
-<LI><A HREF="nana.html#IDX141">VDLP</A>
-<LI><A HREF="nana.html#IDX98">VL</A>
-<LI><A HREF="nana.html#IDX99">VLG</A>
-<LI><A HREF="nana.html#IDX104">VLGHP</A>
-<LI><A HREF="nana.html#IDX102">VLGP</A>
-<LI><A HREF="nana.html#IDX100">VLH</A>
-<LI><A HREF="nana.html#IDX103">VLHP</A>
-<LI><A HREF="nana.html#IDX101">VLP</A>
-</DIR>
-
-</P>
-<P><HR><P>
-<H1>Footnotes</H1>
-<H3><A NAME="FOOT1" HREF="nana.html#DOCF1">(1)</A></H3>
-<P>Which is unfortunately quite uncommon in
-the authors experience.
-<H3><A NAME="FOOT2" HREF="nana.html#DOCF2">(2)</A></H3>
-<P>And about 60 reset cycles where the machine
-went off into hyperspace
-<H3><A NAME="FOOT3" HREF="nana.html#DOCF3">(3)</A></H3>
-<P>This allows variable number of arguments to
-C preprocessor macros.
-<H3><A NAME="FOOT4" HREF="nana.html#DOCF4">(4)</A></H3>
-<P>If you don't want a core dump then look at stopping the core
-dumps with <CODE>ulimit</CODE> rather than changing the handler.
-<H3><A NAME="FOOT5" HREF="nana.html#DOCF5">(5)</A></H3>
-<P>Side-effects
-include such operations as input/output or assignments, e.g. <SAMP>`x++'</SAMP>
-<H3><A NAME="FOOT6" HREF="nana.html#DOCF6">(6)</A></H3>
-<P>Side-effects
-include operations like input/output or assignments.
-<H3><A NAME="FOOT7" HREF="nana.html#DOCF7">(7)</A></H3>
-<P>This was suggested by Phil Blecker.
-<H3><A NAME="FOOT8" HREF="nana.html#DOCF8">(8)</A></H3>
-<P>ANSI C does not allow
-variable declarations at the beginning of loops unlike C++. The
- <SAMP>`Q.h'</SAMP> macros get around this by starting each loop with a new
-scope.
-<H3><A NAME="FOOT9" HREF="nana.html#DOCF9">(9)</A></H3>
-<P>This uses yet
-another GNU CC extension, however since we are already using statement 
-expressions we might as well use <SAMP>`typeof'</SAMP> as well.
-<H3><A NAME="FOOT10" HREF="nana.html#DOCF10">(10)</A></H3>
-<P>In
-the fullness of time, we may integrate these routines in here.
-<H3><A NAME="FOOT11" HREF="nana.html#DOCF11">(11)</A></H3>
-<P>Of course you also need to use the gdb commands
-generated by the <SAMP>`nana'</SAMP> command, perhaps using 
<SAMP>`nana-clg'</SAMP>
-<H3><A NAME="FOOT12" HREF="nana.html#DOCF12">(12)</A></H3>
-<P>Gordon Matzigkeit contributed some of the 
-ideas presented here and raised this problem.
-<H3><A NAME="FOOT13" HREF="nana.html#DOCF13">(13)</A></H3>
-<P>Or add a <SAMP>`--with-nana'</SAMP> flag
-to configure that does the opposite.
-<P><HR><P>
-This document was generated on 6 November 1998 using the
-<A HREF="http://wwwinfo.cern.ch/dis/texi2html/";>texi2html</A>
-translator version 1.52.</P>
-</BODY>
-</HTML>

Index: nana/manual/dvi/nana.dvi.gz
===================================================================
RCS file: nana/manual/dvi/nana.dvi.gz
diff -N nana/manual/dvi/nana.dvi.gz
Binary files /tmp/cvsUsK1fN and /dev/null differ

Index: nana/manual/.symlinks
===================================================================
RCS file: nana/manual/.symlinks
diff -N nana/manual/.symlinks
--- nana/manual/.symlinks       28 Oct 2003 20:27:23 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-nana.html index.html

Index: nana/manual/nana.html
===================================================================
RCS file: nana/manual/nana.html
diff -N nana/manual/nana.html
--- nana/manual/nana.html       24 Oct 2011 19:40:42 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,74 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Table of Contents - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H1>GNU Nana: improved support for assertions and logging in C and C++ - Table 
of Contents</H1>
-<ADDRESS>Free Software Foundation</ADDRESS>
-<ADDRESS>last updated November 06, 1998</ADDRESS>
-<P>
-<A HREF="/graphics/gnu-head-sm.jpg"><IMG SRC="/graphics/gnu-head-sm.jpg"
-   ALT=" [image of the Head of a GNU] "
-   WIDTH="129" HEIGHT="122">&#32;(jpeg 7k)</A>
-<A HREF="/graphics/gnu-head.jpg">(jpeg 21k)</A>
-
-<P>
-<P>
-<P><HR><P>
-<P>
-This manual is available in the following formats:
-<P>
-<UL>
-  <LI>formatted in <A HREF="html_mono/nana.html">HTML 
-      (105K characters)</A> entirely on one web page.
-  <P>
-  <LI> formatted in <a href="html_chapter/nana_toc.html">HTML</a> 
-       with one web page per chapter.
-  <p>
-  <LI> formatted in <a href="html_node/nana_toc.html">HTML</a> 
-       with one web page per node.
-  <p>
-  <LI>formatted as an
-      <A HREF="info/nana-info.tar.gz">Info document (27K characters
-      gzipped tar file)</A>.
-  <P>
-  <LI>formatted as
-      <A HREF="text/nana.txt">ASCII text (84K characters)</A>.
-  <P>
-  <LI>formatted as
-      <A HREF="dvi/nana.dvi.gz">a TeX dvi file (40K characters
-      gzipped)</A>.
-  <P>
-  <li>formatted as
-      <A href="ps/nana.ps.gz">a PostScript file (124K characters
-      gzipped)</a>.
-  <p>
-  <LI>the original 
-      <A HREF="texi/nana.texi.tar.gz">Texinfo source (25K characters
-      gzipped tar file)</A>
-  <P>
-</UL>
-<P>
-
-<HR>
-
-Return to <A HREF="/home.html">GNU's home page</A>.
-<P>
-FSF &amp; GNU inquiries &amp; questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-Other <A HREF="/home.html#ContactInfo">ways to contact</A> the FSF.
-<P>
-Comments on these web pages to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-<P>
-Copyright (C) 1997, 1998 Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA  02111,  USA
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.<HR>
-</BODY>
-</HTML>

Index: nana/manual/ps/nana.ps.gz
===================================================================
RCS file: nana/manual/ps/nana.ps.gz
diff -N nana/manual/ps/nana.ps.gz
Binary files /tmp/cvsRmMqMQ and /dev/null differ

Index: nana/manual/text/nana.txt
===================================================================
RCS file: nana/manual/text/nana.txt
diff -N nana/manual/text/nana.txt
--- nana/manual/text/nana.txt   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,2334 +0,0 @@
-START-INFO-DIR-ENTRY
-* Nana: (nana).          The GNU Nana library (assertions, logging, forall,etc)
-END-INFO-DIR-ENTRY
-
-   This file documents the features and implementation of the GNU Nana
-library.
-
-   Copyright (C) 1996, 1997, P.J.Maker
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   This manual documents how to install and use the Nana library which
-provides improved support for assertion checking and logging in C and
-C++.
-
-Introduction
-************
-
-   Nana is a library that provides support for assertion checking and
-logging in a space and time efficient manner. The aim is to put common
-good practise(1) into a library that can be reused rather than writing
-this stuff every time you begin a new project.
-
-   In addition assertion checking and logging code can be implemented
-using a debugger rather than as inline code with a large saving in code
-space.
-
-   Nana aims to solve the following problems:
-
-  1. Avoid the two executables problem (one with asserts in and another
-     without any).
-
-     The code space and time costs of having assertion checking and
-     detailed logging code in a program can be high. Normally people
-     construct two versions of the program, one with checking code for
-     testing and one without checking code for production use.
-
-     With nana one version of the executable can be built for both
-     testing and release since debugger based checking has negligible
-     space and time impact.
-
-  2. Configurable: the nana library is designed to be reconfigured by
-     the user according to their needs. For example we can:
-        * Modify the behaviour on assertion failure, e.g. to attempt a
-          system restart rather than just shutting down.
-
-        * Selectively enable and disable assertion checking and logging
-          both at compile and run time.
-
-        * Send the logging information off to various locations, e.g.
-             - Users terminal
-
-             - A file for later checking.
-
-             - Another process, e.g. a plotting program or a program
-               that verifies that the system is behaving itself.
-
-             - A circular buffer in memory.
-
-               This is an old embedded systems trick and is very useful
-               for production systems. The time cost of logging into
-               memory is not large and when your production system in
-               the field has problems you can then see what was
-               happening in the minutes before its unfortunate demise
-               rather than asking some user what was happening before
-               it died.
-
-  3. Time and space efficient.
-
-     For example the GNU `assert.h' implementation uses 53 bytes for
-     `assert(i>=0)' on a i386. The nana version using the i386 `stp'
-     instruction on assert fail uses 10 bytes. If your willing to
-     accept the time penalty this can be reduced to 0 or 1 byte by
-     using debugger based assertions.
-
-  4. Support for formal methods.
-
-        * Before and after state (e.g. x,x' in the Z notation).
-
-          Specifications are often written in terms of the state of
-          variables before and after an operation. For example the
-          `isempty' operation on a stack should leave the stack
-          unchanged. To verify this in nana we could use:
-
-               bool isempty(){ /* true iff stack is empty */
-                 DS($s = s); /* copy s into $s in the debugger */
-                 ...; /* code to do the operation */
-                 DI($s == s); /* verify that s hasn't been changed */
-               }
-
-          These `$..' variables are called convenience variables and
-          are implemented by gdb. They have a global scope and are
-          dynamically typed and initialised automatically to 0.
-
-          In addition a C only version of before and after state is
-          provided.  For example:
-
-               bool isempty() { /* true iff stack is empty */
-                 ID(int olds); /* declare variable to hold old value */
-                 IS(olds = s); /* copy s into $s in the debugger */
-                 ...; /* code to do the operation */
-                 I(olds == s); /* verify that s hasn't been changed */
-               }
-
-        * Support for Predicate Calculus.
-
-          Nana provides some support for universal (forall) and
-          existential  (exists one or more) quantification. For example
-          to specify that the string v contains only lower case letters
-          we could use:
-
-                 I(A(char *p = v, *p != '\0', p++, islower(*p)));
-
-          These macros can be nested and used as normal boolean values
-          in control constructs as well as assertions. Unfortunately
-          they depend on the GNU CC statement value extensions and so
-          are not portable. The following macros are defined in `Q.h':
-
-         `A'
-               For all values the expression must be true.
-
-         `E'
-               There exists one or more values for which the expression
-               is true.
-
-         `E1'
-               There exists a single value for which the expression is
-               true.
-
-         `C'
-               Returns the number of times the expression is true.
-
-         `S'
-               Returns the sum of the expressions.
-
-         `P'
-               Returns the product of the expressions.
-
-        * Verifying timing.
-
-          As well as using nana to verify timings with assertions using
-          a hardware supported timer you can also a simulator (e.g. the
-          PSIM power pc simulator by Cagney) with gdb. These simulators
-          can model time and provide a register called `$cycles' which
-          represents the current cycle count of the program. This can be
-          used to check that timing constraints are being meet.
-
-               void process_events() {
-                 for(;;){
-                   DS($start = $cycles);
-                   switch(get_event()){
-                     case TOO_HOT:
-                       ...;
-                       DI($start - $cycles <= 120);
-                       break;
-                     case TOO_COLD:
-                       ...;
-                       DI($start - $cycles <= 240);
-                       break;
-                   }
-                 }
-               }
-
-   The intended audience for Nana includes:
-
-   * Software Engineers.
-
-   * Formal methods community.
-
-   * Real time programmers.
-
-   * System testers.
-
-   * People teaching programming.
-
-   ---------- Footnotes ----------
-
-   (1)  Which is unfortunately quite uncommon in the authors experience.
-
-Related work
-============
-
-   The Nana project was inspired by some other projects, in particular:
-
-   * Anna - Anna stands for "Annotated Ada" where the programmer inserts
-     various assertions into the code which can be automatically
-     validated.  To quote from the WWW Virtual Library entry on Anna:
-
-          Anna is a language for formally specifying the intended
-          behaviour of Ada programs. It extends Ada with various
-          different kinds of specification constructs from ones as
-          simple as assertions, to as complex as algebraic
-          specifications. A tool set has been implemented at Stanford
-          for Anna, including:
-
-            1. standard DIANA extension packages, parsers,
-               pretty-printers;
-
-            2. a semantic checker;
-
-            3. a specification analyser;
-
-            4. an annotation transformer; and
-
-            5. a special debugger that allows program debugging based
-               on formal specifications
-
-          All tools have been developed in Ada and are therefore
-          extremely portable. Anna has thus been ported to many
-          platforms. For more information send e-mail to
-          "address@hidden". Before down loading the
-          huge Anna release, you may wish to copy and read some Anna
-          LaTeX reports.
-
-
-     Anna is available from: `ftp://anna.stanford.edu/pub/anna'
-
-   * Eiffel - the Eiffel programming language provides support in the
-     language flexible assertion checking. To quote from the Eiffel
-     page in WWW Virtual library:
-
-          Eiffel is a pure object-oriented language featuring multiple
-          inheritance, polymorphism, static typing and dynamic binding,
-          genericity (constrained and unconstrained), a disciplined
-          exception mechanism, systematic use of assertions to promote
-          programming by contract, and deferred classes for high-level
-          design and analysis.
-
-   * APP - Annotation PreProcessor.  The APP was written by David S.
-     Rosenblum and provides assertion checking functions for C and C++.
-     It is implemented using a preprocessor wrapper around the C
-     preprocessor and supports quantifiers and before/after state.
-
-     See "A Practical Approach to Programming with Assertions" in Vol
-     21, No. 1, January 1995 of IEEE Transactions on Software
-     Engineering for an interesting paper describing APP. Unfortunately
-     the APP tool doesn't seem to be freely available (I'm willing to
-     be corrected on this).  Note that any similarity between my
-     examples and David's are due to morphic resonance.
-
-   Nana is essentially a poor mans implementation of some of these ideas
-which works for C and C++. Ideally in the best of all possible worlds
-you might want to look at Eiffel or in the military world Ada and Anna.
-If you use TCL/TK you might also be interested in Jon Cook's `AsserTCL'
-package.
-
-Assert.h considered harmful
-===========================
-
-   Most C programmers become familiar with assertions from the the
-`assert.h' header. As such its a very good thing and has a nice simple
-implementation. However it is also inefficient and leads some people to
-the conclusion that assertion checking is an expensive luxury.
-
-   The implementation of `assert.h' as distributed with `gcc' looks
-like the following (after a bit of editing):
-
-     # ifndef NDEBUG
-     # define _assert(ex)      {if (!(ex)) \
-                              {(void)fprintf(stderr, \
-                                "Assertion failed: file \"%s\", line %d\n", \
-                                __FILE__, __LINE__);exit(1);}}
-     # define assert(ex)       _assert(ex)
-     # else
-     # define _assert(ex)
-     # define assert(ex)
-     # endif
-
-   There are are two main problems with this:
-
-  1. Code space overhead: each call to `assert' generates 2 function
-     calls with 4 and 1 arguments plus strings for error messages.  If
-     `assert.h' had library code support we could make the
-     implementation much more space efficient, e.g. by calling a single
-     function on error detection.
-
-  2. The default behaviour simply prints a message and dies, ideally
-     you like to be able to use a debugger to determine why the
-     assertion failed. Even if you run this under the debugger you
-     can't observe the failures of variables are an assert failure
-     because the process exits rather than aborting back to the
-     debugger.
-
-   Of course everyone merely rewrites their own `assert' macro so these
-are not significant objections. The only problem is if the author uses
-the libraries without modification.
-
-Scope of this document
-======================
-
-   This document aims to both describe the library and provide a
-tutorial in its use. Further work is required, particularly on the
-tutorial sections.  If anyone has any suggestions please send them to
-me.
-
-Installing the Nana library
-***************************
-
-   Nana uses the normal GNU install method in the same way as `gcc' and
-`gdb'. To install nana in the default location
-`/usr/local/{bin,lib,include}' you would use:
-
-     % gzcat nana-1.10.tar.gz | tar xvf -
-     % cd nana-1.10
-     % ./configure
-     % make
-     % make install
-     % make check
-     % make check-mail
-     % make subscribe
-
-   The CHECK-MAIL and SUBSCRIBE targets both send e-mail. If you need
-to change the mailer used try something like:
-
-     % make MAIL=elm subscribe
-
-   *Note:* we need to install nana before running the `make check'
-target. The `check-mail' target sends the test report via e-mail to the
address@hidden'.
-
-   Of course things are never that simple.  If you want to install Nana
-in a different location or change the behaviour on error detection see
-*Note Configure::.
-
-   Each of the sub-directories nana can be compiled and installed
-separately, e.g. if you don't need the documentation you can just
-compile and install from the `src' sub-directory after doing the
-configure statement.
-
-Required Software
-=================
-
-   The following software is possibly required to run nana.
-
-`gcc-2.7.2'
-     Nana makes use of two GNU extensions in its library so you really
-     should be using `gcc'. Some of the code can be used with any C
-     compiler, though it may not be worth the bother. The dependencies
-     on gcc are in `Q.h' which uses the statement value extension and
-     in `L.h' which uses the variable number of arguments extension to
-     `cpp'.
-
-`gdb-4.16'
-     A recent version of `gdb' is worthwhile, some early 4.?? versions
-     had problems setting a large number of breakpoints.
-
-`gmake'
-     The `configure' script and `Makefiles' are generated using the
-     `automake' and `autoconf' programs. They should be reasonably
-     portable but if you have problems try using GNU make. For example
-     on some old DEC boxes we have had strange behaviour using the
-     system make.
-
-   For a listing of porting results including software versions see:
-
-          `http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'
-
-Optional Software
-=================
-
-   In addition to the required software you might also be interested in:
-
-   * `http://www.cs.tu-bs.de/softech/ddd/' - a smart frontend for gdb
-     which can display dynamic data structures such as linked lists,
-     etc.
-
-   * `ftp://ftp.ci.com.au/pub/psim/' - a cycle level simulator for the
-     PowerPC. A fine piece of work.
-
-Configure
-=========
-
-   Nana uses a standard GNU `autoconf' generated `configure' script.
-The `configure' script checks the setup on your machine and then
-generates the appropriate Makefiles. Some of the things checked by
-configure include:
-
-  1. Which compiler, compiler flags and libraries to use, e.g. you
-     might need to include a `-lposix' flag to the linker to build
-     programs on your machine.
-
-  2. Which header (.h) files are available on this machine, e.g. is
-     `unistd.h' available on this machine.
-
-  3. Where to install programs, header file, man pages, etc.
-
-   In addition `configure' uses the host architecture and operating
-system to generate the `nana-config.h' file. This file contains some
-macro definitions which define how nana works on particular operating
-systems and hardware architectures.
-
-   For example on `i386' machines we would use the `asm("hlt")'
-instruction whenever an assertion fails, on a `sparc' we would use
-`asm("stp")'. Otherwise we would default to a plain C call to `abort()'
-If `configure' does not recognise your machine it uses plain C code.
-
-   You may wish to change these defaults on installation, one method is
-to edit a local copy of the `nana-config.h' file. Alternately you can
-define the code yourself in the call to `configure'. For example to
-redefine the action we take when an error is detected by the `I' macro
-we can use:
-
-     I_DEFAULT_HANDLER="restart_system()" ./configure
-
-   As well as simple calls to routines various other bits of information
-are passed off to the `I_DEFAULT_HANDLER' such as the expression that
-failure and a failure code. For example:
-
-     % I_DEFAULT_HANDLER="restart(line,file,param)" ./configure
-
-   The default for `I_DEFAULT_HANDLER' calls a function which prints a
-message and then dumps core.  Different behaviour on failure can be
-organised by setting the `I_DEFAULT' to `fast', i.e. plain core dump or
-`verbose' which prints an error messsage and then does the core dump.
-
-     % I_DEFAULT=fast ./configure
-
-   For nana the following examples may be useful:
-
-  1. `./configure'
-
-     Accept the default values for everything. In particular the files
-     will be installed in:
-
-                  `/usr/local/{bin,include,lib,man,info}'
-
-  2. `./configure --prefix=~project/tools'
-
-     Install the files into:
-
-                `~project/tools/{bin,include,lib,man,info}'
-
-  3. `./configure --bindir=~project/bin --libdir=~/project/lib \
-     --includedir=~/project/headers --infodir=/usr/local/info \
-     --mandir=~/project/doc'
-
-     The install directory for program (`bin'), etc can all be set with
-     command line arguments to`configure'.
-
-  4. `CC=xacc LIBS=-lposix ./configure sun3'
-
-     If the defaults chosen by `configure' are not correct you can
-     override them by setting variables such as `CC' before calling
-     `configure'. The `sun3' argument is used to identify the machine
-     we are running on and may be necessary on some machines.
-
-  5. `./configure --help'
-
-     And of course when in doubt ask for help.
-
-   For even more details see the file `INSTALL.con' which contains the
-generic instructions for use with `autoconf' generated `configure'
-scripts.
-
-Variables for ./configure
-=========================
-
-   The configure program uses the following shell variables to change
-various defaults.  Another method is simply to edit the `nana-config.h'
-file. Most of these values should be auto detected, so you can ignore
-this section until your need to save a few bytes of store by using
-`asm("hlt")' instead of a call to `abort()'.
-
-`DI_MAKE_VALID_BREAKPOINT'
-     This text is inserted when the `DI.h' library needs to set a
-     breakpoint in the generated code. It should ideally update all
-     variables which being kept in registers etc so that gdb gets the
-     correct values for each variable.
-
-     Possible values include:
-
-       1. `asm("nop")' - a single `nop' instruction to set the
-          breakpoint at.
-
-          This is the default.
-
-       2. `_vi = 0' - where `_vi' is a global volatile int.
-
-       3. `_vi = (exprn)' - where EXPRN is the expression we are
-          checking for this assertion.
-
-       4. `/* nothing */' - nothing at all, this means the breakpoint
-          will be set at the start of the next statement which works
-          most of the time. However for some examples this will do the
-          wrong thing.
-
-`DL_MAKE_VALID_BREAKPOINT'
-     Used for the same purpose as `DI_MAKE_VALID_BREAKPOINT' for
-     `DL.h'. It also defaults to `asm("nop")'.
-
-`I_DEFAULT_HANDLER'
-     The code called when `I.h' detects an error.
-    `asm("hlt")'
-          Some machines use a `hlt' instruction.
-
-    `asm("stp")'
-          And other machines use a `stp' instruction.
-
-    `abort()'
-          Or we could use a call to `abort' which is at least standard
-          C. On some machines this is significantly larger than a
-          single `hlt' instruction.
-
-    `restart()'
-          Or a call to a function which attempts to restart the system.
-
-`ALWAYS_INCLUDE_MALLOC'
-     This is a dodgey for some versions of Linux which don't seem to
-     include `malloc' when you include `stdio.h' and use `print'. This
-     causes problems for `gdb' since it uses `malloc' in the executable
-     to implement parts of its functionality.
-
-     This kludge should be removed!
-
-Supported Platforms
-===================
-
-   Nana has been tested on the following platforms:
-
-  1. i386-unknown-linux, gcc-2.7.0, gdb-4.16
-
-  2. sparc-sun-sunos4.1.4, gcc-2.7.2.f.1, gdb-4.16
-
-  3. sparc-sun-solaris2.3, gcc-2.7.2, gdb-4.16
-
-  4. alpha-dec-osf3.2, gcc-2.7.2, gdb-4.16
-
-  5. mips-sgi-irix5.3, gcc-2.7.0, gdb-4.16
-
-  6. powerpc-ibm-aix3.2.5, gcc-2.6.3, gdb-4.16
-
-   The `alpha-dec-osf3.2', `mips-sgi-irix5.3' and
-`powerpc-ibm-aix3.2.5' implementations have problems when you compile
-with `-O2' or `-O3' optimisation. This causes some errors in the the
-debugger based assertion and logging code since variables can be
-removed or changed by optimisation. At `-O' everything passes.
-Regardless of optimisation the C based checking code passes all tests
-on these platforms.
-
-   If you use nana on a new platform please send the `check.log' file
-to address@hidden' via the `make check-mail' command. A
-machine generated list of this information is available at:
-
-          `http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'
-
-Supported Debuggers
-===================
-
-   Currently Nana works with the GNU GDB debugger which is available on
-a wide range of platforms including embedded systems and even provides
-support for remote debugging.  Porting to any reasonable debugger with
-conditional breakpoints and commands is not very difficult.
-
-   As an example of an unreasonable debugger, Nana has been ported to
-work with the MicroSoft Codeview debugger. The port is small (60 lines
-of code) but suffers from a problem with variable scoping in Codeview.
-If a breakpoint is set at a point in the code the expressions are not
-evaluated from that particular scope. For example setting a breakpoint
-in the function `f' cannot access a variable local to `f' directly.
-Codeview has a unique (expletive deleted) scope operator which you must
-use to set the scope `{...}'.  This makes the interface somewhat less
-than beautiful.
-
-   Another good thing about CodeView is to try a debug command which
-prints a message which contains a single open `{'. This of course
-causes it to hang and was the main problem during the porting to
-CodeView which took a whole day(1).
-
-   If anyone is interested I may release the CodeView implementation,
-please contact me if you are interested. Of course a better bet is
-probably to move to the `gdbserver' system. I think `gdb' has been
-released as a native even for some MicroSoft operating systems.
-
-   Other debuggers like DBX don't seem to be worth the trouble since gdb
-works on those machines. A redesign of the nana internals may also be
-useful if we decide portability between debuggers is actually useful.
-
-   ---------- Footnotes ----------
-
-   (1)  And about 60 reset cycles where the machine went off into
-hyperspace
-
-Known Problems
-==============
-
-   Nana has the following known features (or perhaps problems):
-
-  1. Nana macros which use the debugger such as `DI' or `DL' should be
-     on lines by themselves. If you mix code and nana macros on the
-     same line you will get errors, e.g:
-
-          main(){
-             int x;
-             x = 5; x--; DI(x == 4);
-          }
-
-     This doesn't work since breakpoints are set at line boundaries
-     rather than statement ones. Of course anyone who writes code like
-     this deserves whatever happens to them.
-
-  2. Optimisation can remove variables so that debugger based
-     assertions (`DI.h') do not work correctly. As usual the
-     interaction between the debugger and the compiler is rather
-     complicated. This may not be a problem if the appropriate
-     compile-time flags are selected, e.g. `-O0 and -O1' work on most
-     platforms.
-
-  3. The `Q.h' macros depend on the statement value extension to GNU CC
-     so if you wish to use them you must use GCC. This can be fixed for
-     C++ in a possibly useful manner, I can't see any solution for C.
-
-  4. The logging macros depend on the Var Args extension provided by the
-     GNU C Preprocessor.(1) We could (probably will) implement a fix
-     for this based on the tricks in the C FAQ. Unfortunately these
-     tricks are not pretty.  For now interested users could simply
-     replace their CPP with the GNU CPP if they wished to stay with
-     non-standard compilers.
-
-  5. The `Q.h' macros do not work in the debugger since `gdb' does
-     support the statement expression extension.
-
-  6. Multiline expressions do not work as expected in the debugger since
-     you need to use a blackslash as an escape at the end of the line.
-     For example:
-
-                DI(x +
-                      10 > 30);
-     A few backslashes may solve this particular problem.
-
-  7. Problems with the `configure' script.
-
-     The `configure' script automatically detects the target operating
-     system and architecture and then generates `nana-config.h'. If the
-     options selected in `nana-config.h' are incorrect they can be
-     edited by hand and installed in the usual include directory. The
-     easiest method is simply to delete all macros in `nana-config.h'
-     since the system defaults to more portable (and less efficient)
-     implementations. If you wish to do this from the configure script
-     you can try giving a unsupported machine type, e.g.
-
-          % ./configure pdp11-dec-ultrix
-
-  8. Some users have reported problems with the `configure' script
-     detecting `vsnprintf'. If `configure' doesn't find it and it does
-     exist then simply define it in `nana-config.h' as per the previous
-     question.
-
-     If `vsnprintf' really doesn't exist then get a new C library,
-     possibly the GNU libc.
-
-  9. The use of `vsprintf' opens a security hole since no bounds
-     checking is done by it. Nana attempts to use `vsnprintf' which is
-     safe when it exists but it will resort to `vsprintf' if it can't
-     find `vsnprintf'. All careful people should make sure that they
-     have a library with `vsnprintf'.
-
- 10. `STL' header file errors due to nana.
-
-     The C++ `STL' header files for version 3.0 at least must be
-     included before the `Q.h' file. The problem is caused by the STL
-     files using `S' as a template argument. Of course `Q.h' uses `S'
-     for summing a series. Namespace pollution strikes again.
-
-     (Thanks to Han Holl for this particular problem).
-
-   ---------- Footnotes ----------
-
-   (1)  This allows variable number of arguments to C preprocessor
-macros.
-
-Bug Reports
-===========
-
-   If you think you have found a bug in the Nana library, please
-investigate it and report it.
-
-   * Please make sure that the bug is really in the Nana library.
-
-   * You have to send us a test case that makes it possible for us to
-     reproduce the bug.
-
-   * You also have to explain what is wrong; if you get a crash, or if
-     the results printed are not good and in that case, in what way.
-     Make sure that the bug report includes all information you would
-     need to fix this kind of bug for someone else.
-
-   If your bug report is good, we will do our best to help you to get a
-corrected version of the library; if the bug report is poor, we won't do
-anything about it (apart from asking you to send better bug reports).
-
-   Send your bug report to:
-
-                       address@hidden'
-
-   Copies of bug reports will be kept at:
-
-          `http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'
-
-New Versions
-============
-
-   New versions of nana will be made available at:
-
-                  `ftp://ftp.cs.ntu.edu.au/pub/nana/'
-
-   If you wish to be informed about new releases of nana then subscribe
-to the nana mailing list.  Send a message containing `subscribe' <your
-e-mail address> to:
-
-                 `mailto:address@hidden'.
-
-   A hypermail archive of this list is kept at:
-
-           `http://www.cs.ntu.edu.au/hypermail/nana-archive'
-
-   If you wish to send a message to the list send it to
-`mailto:address@hidden'.
-
-Invoking Nana
-*************
-
-   The functions defined by Nana are implemented either as pure C code
-or as a set of commands which are generated for the debugger.  To use
-the C based support for assertion checking you would use something like:
-
-     #include <nana.h> /* this file includes the other nana .h files */
-     
-     int floor_sqrt(int i) { /* returns floor(sqrt(i) */
-       int answer;
-       I(i >= 0); /* assert(i >= 0) if i -ve then exit */
-       ...; /* code to calculate sqrt(i) */
-       L("floor_sqrt(%d) == %d\n",
-             i, answer);  /* logs a printf style message */
-     }
-
-   To compile and link the previous code you may need to use the
-`-Ipath' or `-lnana' flags with the compiler. For example:
-
-     % gcc toy.c -lnana
-
-   If the nana headers have been installed in a strange location you may
-need to do something like:
-
-     % gcc -I<strange location> toy.c -lnana
-
-   The next example uses the debugger versions of `L' and `I'.  If the
-code is run under the debugger these checks will occur, otherwise they
-take up a negligible amount of space and time.
-
-     #include <nana.h> /* this includes the other nana .h files */
-     
-     int floor_sqrt(int i){
-       int answer;
-       DI(i >= 0); /* assert(i >= 0) if i -ve then exit */
-       ...; /* code to calculate sqrt(i) */
-       DL("floor_sqrt(%d) == %d\n", i, answer);  /* logs a printf style 
message */
-     }
-
-   To generate the debugger commands from the C source we just run the
-`nana' filter over the program and then execute the commands under gdb
-using the `source' command.
-
-     % nana sqrt.c >sqrt.gdb
-     % gdb a.out
-     (gdb) source sqrt.gdb
-     breakpoint insert: ...
-     (gdb) run
-     ...
-     (gdb) quit
-
-   Note that any C preprocessor flags which you use must be passed off
-to the `nana' command. The best way to do this of course is in a
-Makefile. Something like the following works for GNU Make:
-
-     %.nana: %.c
-             nana $(CFLAGS) $< >$@
-
-   The `nana' filter can also be run over multiple source files in a
-single run if thats more convenient.
-
-   For convenience a number of other simple scripts are provided, in
-particular to:
-
-`nana-run'
-     Run a program under the debugger without prompting, etc.  For
-     example:
-
-          % nana-run a.out -x main.gdb
-          output from program
-
-`nana-clg'
-     Compiles the program, generates the debugger commands and the runs
-     the program using `nana-run'. For example:
-
-          % nana-clg -O3 main.c
-          output from program
-
-     You can change the compiler invoked by `nana-clg' by redefining
-     the `NANACC' environment variable. For example:
-
-          % NANACC=g++ nana-clg -O3 main.cc
-
-     The installation also `nana-c++lg' which compiles your code using
-     a GNU C++ compiler.
-
-`nana-trace'
-     Generates a line by line trace of the execution of a program using
-     GDB. For example:
-
-          % nana-trace a.out
-          54           printf("main()\n");
-          55           x = distance(5,-5);
-          distance (i=5, j=-5) at test.c:47
-          47           i = -i;
-          48           j = -j;
-          ...
-
-     The arguments to `nana-trace' are passed directly to GDB. If you
-     wish display variables or call procedures on each line then could
-     use something like:
-
-          % nana-trace -x mycommands.gdb a.out
-
-     Where the `mycommands.gdb' contains the GDB commands such as
-     `display x' which causes `x' to be printed every time the debugger
-     gets control of the program.
-
-Interface
-*********
-
-   This section describes the details of the interface to nana library.
-
-   All of the files can be included multiple times without ill-effect
-since they use the C preprocessor to make sure the header declarations
-are only seen the first by the compiler.  Each of the files can also be
-included individually.
-
-   If any of the following routines have an internal problem (e.g.
-malloc fails due to lack of memory) they will call the `nana_error'
-function defined in `nana_error.c'. By default this function prints a
-message and dumps core using `abort'. If you wish to override this
-behaviour you should define your own handler before linking in the nana
-library.
-
-nana.h: the main header file
-============================
-
-   The `nana.h' file includes most of the other files in the library.
-In particular it `#include's' the following files:
-
-`I.h'
-`DI.h'
-`L.h'
-`DL.h'
-`Q.h'
-`GDB.h'
-WITHOUT_NANA: disabling all nana code for portability.
-======================================================
-
-   If you wish to disable all nana code you can `#define' the
-`WITHOUT_NANA' macro. This selects versions of the macros defined in
-`I.h',`L.h', etc which map to `/* empty */'.
-
-   So if you are using nana for your development but don't wish to
-force  your customers to use it you can add an option to your
-`configure' script to define/undefine `WITHOUT_NANA'.  In addition you
-will need to distribute copies of the nana header files with your
-package to get the stubs.
-
-   Note that the `L.h' and `DL.h' macros use the macro variable number
-of arguments extension provided by GNU C. If you wish your code to be
-portable you should use the macros `VL((..))', etc rather than `L(..)'
-to avoid problems with non GNU C preprocessors which only take a fixed
-number of arguments.
-
-I.h: C based invariant checking
-===============================
-
-   This implements the C based invariant checking code and is a
-replacement for `assert.h'. The first two macros are the normal user
-interface; the remainder are used for configuring the behaviour on
-failure, etc.
-
- - Macro: void I (bool EXPRN)
-     The EXPRN should always be true if the program is correct.  If the
-     EXPRN is false a message will be printed, followed by core dump.(1)
-
-     Checking can be enabled and disabled by using the I_LEVEL and
-     I_DEFAULT_GUARD macros. See the definitions below for these macros
-     for further details.
-
-     Note that EXPRN should have no side-effects(2) since disabling
-     checking shouldn't change your programs behaviour.
-
-            I(z != 0);
-            x = y / z;
-
- - Macro: void N (bool EXPRN)
-     The opposite of `I', i.e. the expression must never ever be true if
-     the program is working properly. It is equivelant to `I(!(e))' and
-     exists as a piece of syntactic sugar which may be helpful for
-     complicated boolean expressions.
-
-          char* strdup(char *s) {
-            N(s == NULL);
-            ...;
-          }
-
- - Macro: int I_LEVEL
-     The `I_LEVEL' macro is used to globally enable and disable
-     checking by the macros in this file. It can take on one of three
-     values:
-
-    `0'
-          Disable all checking. Regardless of anything else no code
-          will be generated for `I', `N', etc.
-
-    `1'
-          Enable checking only if the corresponding guard condition is
-          true. The guard condition can be used to enable and disable
-          checking at compile and run time.
-
-    `2'
-          Enable all checking regardless of guard conditions.
-
-     `I_LEVEL' defaults to `1'.
-
- - Macro: bool I_DEFAULT_GUARD
-     The `I_DEFAULT_GUARD' is used to selectively enable or disable
-     checking at compile or run time.
-
-     `I_DEFAULT_GUARD' defaults to `TRUE', i.e. always enabled.
-
-     A user would typically define `I_DEFAULT_GUARD' to be global or
-     local variable which is used to turn checking on or off at
-     run-time. For example:
-
-          #define I_DEFAULT_GUARD i_guard > 0
-          
-          extern int i_guard;
-
- - Macro: text I_DEFAULT_PARAMS
-     This is passed off to the `I_DEFAULT_HANDLER' and defaults to
-     nothing, it is just some text and is intended to pass failure codes
-     (e.g. `IEH303') or requests (e.g. `HW_DEAD') information off to
-     the handler.
-
-     `I_DEFAULT_PARAMS' defaults to nothing.
-
- - Macro: void I_DEFAULT_HANDLER (char *EXPRN, char *FILE, int LINE,
-          PARAM)
-     When an error is detected the `I_DEFAULT_HANDLER' will be called to
-     handle the error. The arguments are:
-
-    `exprn'
-          A string representation of the expression that has failed,
-          e.g. `"I(i>=0)"'.
-
-    `file'
-          The file that this error occurred in, i.e. `__FILE__'.
-
-    `line'
-          The line number for the error, i.e. `__LINE__'.
-
-    `param'
-          An optional parameter which can be passed across which
-          defaults to `I_DEFAULT_PARAMS'. This can be used to pass
-          failure codes or other information from the checking code to
-          the handler.
-
-   All of the remaining macros are used to individually override the
-default values defined above. Normally these macros would be used in a
-system wide header file to define macros appropriate for the
-application. For example you might use `IH' to define different
-checking macros for hardware and software faults.
-
- - Macro: void I (bool E)
- - Macro: void IG (bool E, bool G)
- - Macro: void IH (bool E, Macro H)
- - Macro: void IP (bool E, Text P)
- - Macro: void IGH (bool E, bool G, Macro H)
- - Macro: void IGP (bool E, bool G, Text P)
- - Macro: void IHP (bool E, Macro H, Text P)
- - Macro: void IGHP (bool E, bool G, Macro H, Text P)
- - Macro: void N (bool E)
- - Macro: void NG (bool E, bool G)
- - Macro: void NH (bool E, Macro H)
- - Macro: void NP (bool E, Text P)
- - Macro: void NGH (bool E, bool G, Macro H)
- - Macro: void NGP (bool E, bool G, Text P)
- - Macro: void NHP (bool E, Macro H, Text P)
- - Macro: void NGHP (bool E, bool G, Macro H, Text P)
-
-   We also provide support for referring to previous values of
-variables in postconditions. The `ID' macro is used to create variables
-to save the old state in. The `IS' and `ISG' macros are to set these
-values.
-
- - Macro: void ID (Text DECLN)
- - Macro: void IS (Text ASSIGNMENT)
- - Macro: void ISG (Text DECLN, bool G)
-
-   For example:
-     void ex(int &r) {
-       ID(int oldr = r); /* save parameter */
-       g(r);
-       I(oldr == r); /* check r is unchanged */
-       while(more()) {
-         IS(oldr = r); /* assign r to oldr */
-         h(r);
-         I(oldr == r * r);
-       }
-     }
-
-   ---------- Footnotes ----------
-
-   (1)  If you don't want a core dump then look at stopping the core
-dumps with `ulimit' rather than changing the handler.
-
-   (2)  Side-effects include such operations as input/output or
-assignments, e.g. `x++'
-
-DI.h: debugger based invariant checking
-=======================================
-
-   This implements the debugger based invariant checking code.  The
-first two macros are the normal user interface; the remainder are used
-for configuring the behaviour on failure, etc. Note that these macros
-have no effect unless you run your program under the debugger and read
-in the commands generated by the `nana' command.
-
- - Macro: void DI (bool EXPRN)
-     The EXPRN should always be true if the program is working.  If it
-     is true then nothing happens otherwise the code given by
-     `DI_DEFAULT_HANDLER' will be called which by default prints a
-     message and dies just like `assert.h'.
-
-     The checking using DI can be enabled and disabled by using the
-     DI_LEVEL and DI_DEFAULT_GUARD macros. See the definitions below
-     for these macros for further details.
-
-     Note that EXPRN should have no side-effects(1) since disabling the
-     checking shouldn't change your programs behaviour.
-
- - Macro: void DN (bool EXPRN)
-     The opposite of `DI', i.e. the expression must never ever be true
-     if the program is working properly. It is equivelant to `I(!(e))'
-     and exists as piece of syntactic sugar which is helpful for
-     complicated boolean expressions.
-
- - Macro: int DI_LEVEL
-     The `DI_LEVEL' macro is used to globally enable and disable
-     checking, in particular it can take on one of three values:
-
-    `0'
-          Disable all checking. Regardless of anything else no code
-          will be generated for `DI', `DN', etc.
-
-    `1'
-          Enable checking only if the corresponding guard condition is
-          true. The guard condition can be used to enable and disable
-          checking at compile and run time.
-
-    `2'
-          Enable all checking regardless of guard conditions, etc.
-
-     `DI_LEVEL' defaults to `1'.
-
- - Macro: bool DI_DEFAULT_GUARD
-     The `DI_DEFAULT_GUARD' is used to selectively enable or disable
-     checking at compile or run time.
-
-     `DI_DEFAULT_GUARD' defaults to `TRUE', i.e. always enabled.
-
-     A user would typically define `DI_DEFAULT_GUARD' to be global or
-     local variable which is used to turn checking on or off at
-     run-time. For example:
-
-          #define DI_DEFAULT_GUARD (i_guard)
-          
-          extern int i_guard;
-
- - Macro: text DI_DEFAULT_PARAMS
-     This is passed off to the `DI_DEFAULT_HANDLER' and defaults to
-     nothing, it is just some text and is intended to pass failure codes
-     (e.g. `IEH303') or requests (e.g. `HW_DEAD') information off to
-     the handler.
-
-     `DI_DEFAULT_PARAMS' defaults to nothing.
-
- - Macro: void DI_DEFAULT_HANDLER (char *EXPRN, char *FILE, int LINE,
-          PARAM)
-     When an error is detected the `DI_DEFAULT_HANDLER' will be called
-     to handle the error. The arguments are:
-
-    `exprn'
-          A string representation of the expression that has failed,
-          e.g. `"I(i>=0)"'.
-
-    `file'
-          The file that this error occurred in, i.e. `__FILE__'.
-
-    `line'
-          The line number for the error, i.e. `__LINE__'.
-
-    `param'
-          An optional parameter which can be passed across which
-          defaults to `DI_DEFAULT_PARAMS'. This can be used to pass
-          failure codes or other information from the checking code to
-          the handler.
-
- - Macro: void DI_MAKE_VALID_BREAKPOINT (exprn E)
-     This macro is used to ensure that a breakpoint can be set at the
-     location we are checking using `DI', etc. It defaults to
-     `asm("nop")' and can be redefined by the user.
-
- - Macro: void DI (bool E)
- - Macro: void DIG (bool E, bool G)
- - Macro: void DIH (bool E, Macro H)
- - Macro: void DIP (bool E, Text P)
- - Macro: void DIGH (bool E, bool G, Macro H)
- - Macro: void DIGP (bool E, bool G, Text P)
- - Macro: void DIHP (bool E, Macro H, Text P)
- - Macro: void DIGHP (bool E, bool G, Macro H, Text P)
- - Macro: void DN (bool E)
- - Macro: void DNG (bool E, bool G)
- - Macro: void DNH (bool E, Macro H)
- - Macro: void DNP (bool E, Text P)
- - Macro: void DNGH (bool E, bool G, Macro H)
- - Macro: void DNGP (bool E, bool G, Text P)
- - Macro: void DNHP (bool E, Macro H, Text P)
- - Macro: void DNGHP (bool E, bool G, Macro H, Text P)
-     All of these macros are used to individually override the default
-     values defined above. Normally these macros would be used in a
-     system wide header file to define macros appropriate for the
-     application.
-
- - Macro: void DS (E)
- - Macro: void DSG (E, G)
-     These macros are used to assign values to convenience variables in
-     the debugger. Convenience variables are dynamically typed, global
-     in scope and initialised to 0. They start with a single `$' and
-     can be used be used for saving the state of program or for
-     counting events. The `DS' macro executes E under the same rules as
-     `DI'.  The `DSG' macro executes E only if the the expression G is
-     true.
-
-     Note that `DS' and `DSG' can also be used for modifying C
-     variables and calling functions.
-
-   ---------- Footnotes ----------
-
-   (1)  Side-effects include operations like input/output or
-assignments.
-
-L.h: support for printf style logging
-=====================================
-
-   These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
- - Macro: void L (ARGS...)
-     Used to log a message in a similar way to printf.
-
-     Defaults to a using `fprintf' on `stderr'.
-
- - Macro: void LG (bool GUARD, ARGS...)
- - Macro: void LH (function HANDLER, ARGS...)
- - Macro: void LP (text PARAM, ARGS...)
- - Macro: void LGP (bool GUARD, text PARAM, ARGS...)
- - Macro: void LHP (function HANDLER, text PARAM, ARGS...)
- - Macro: void LGHP (bool GUARD, function HANDLER, text PARAM, ARGS...)
-     And all of the special functions.
-
-
-   The macros such as `L' depend on the GNU CC variable number of
-arguments to macros extension. If you wish to compile your code on
-other systems you might wish to use the following variations on `L',
-etc.
-
- - Macro: void VL ((ARGS...))
- - Macro: void VLG ((bool GUARD, ARGS...))
- - Macro: void VLH ((function HANDLER, ARGS...))
- - Macro: void VLP ((text PARAM, ARGS...))
- - Macro: void VLGP ((bool GUARD, TEXT PARAM, ARGS...))
- - Macro: void VLHP ((function HANDLER, text PARAM, ARGS...))
- - Macro: void VLGHP ((bool GUARD, function HANDLER, text PARAM,
-          ARGS...))
-     Each of these macros calls the corresponding function from the
-     previous group, i.e. by default `VLG' is the same as a call to
-     `LG'.  If you define `WITHOUT_NANA' all these macros are translated
-     to `/* empty */'.
-
-     Thus you can have nana under GCC whilst the code is still portable
-     to other compilers. However debugging information will not be
-     available on other platforms.
-
-     *Note:* the argument list is surrounded by *two* sets of brackets.
-     For example:
-
-             VL(("haze in darwin = %d\n", 3.4));
-
- - Macro: void L_LEVEL
-     Used to enable and disable logging independently of guard
-     expressions.
-
-    `2'
-          Always print message
-
-    `1'
-          Print message only if the guard expression is true.
-
-    `0'
-          Never print any messages.
-
-     Defaults to `1'.
-
- - Macro: text L_DEFAULT_HANDLER
-     The default handler for printing which is simply the name of the
-     logging function or macro.
-
-     Defaults to `fprintf'
-
- - Macro: bool L_DEFAULT_GUARD
-     The default guard condition for logging.
-
-     Defaults to `TRUE'.
-
- - Macro: text L_DEFAULT_PARAMS
-     The default parameter passed off to the logging function or macro.
-
-     Defaults to `stderr'
-
- - Macro: void L_SHOW_TIME
-     If defined then display the time in front of each message.
-
- - Macro: char* L_SHOW_TIME_FORMAT
-     A format string for the time stamp in the log. By default it
-     prints the time out in seconds.
-
- - Macro: value L_SHOW_TIME_NOW
-     The name of a function that returns the time for the time stamp.
-     This defaults to the `now' function from `now.h'.
-
-L_buffer.h: a circular buffer for logging.
-==========================================
-
-   A traditional embedded systems trick is to log messages to a circular
-buffer in core. This has the following benefits:
-
-  1. Speed - writing to a in core buffer is much faster than spitting
-     out messages to a file on disk. It is often fast enough to leave
-     at least most of the messages in the final product.
-
-  2. Field debugging - what the ... was the user doing before the
-     system crashed. Oh lets ask them, I'm sure they'll give us a good
-     problem report.
-
- - Type: struct L_BUFFER
-     Used to define buffer variables, it is similar to `FILE*' type in
-     `stdio.h'. To create an instance use `L_buffer_create'.
-
- - Function: L_BUFFER* L_buffer_create (size_t SIZE)
- - Function: L_BUFFER* L_buffer_delete (L_BUFFER *B)
-     These are used to create or delete a buffer which can contain SIZE
-     characters.
-
-            L_BUFFER *lbuffer;
-          
-            lbuffer = L_buffer_create(32*1024); /* create a 32K buffer */
-            ...;
-            L_buffer_delete(lbuffer); /* and delete it after use */
-
- - Function: void L_buffer_wraparound (L_BUFFER *B, int W)
-     A buffer created by `L_buffer_create' is set up so that the new
-     messages will overwrite the older messages in the buffer. If you
-     wish to disable this overwriting, e.g. to keep the first 32K bytes
-     of your system startup messages you should use
-     `L_buffer_wraparound'.  For example:
-
-            L_BUFFER *lb = L_buffer_create(32*1024);
-            L_buffer_wraparound(lb, 0); /* disable wraparound */
-
- - Function: void L_buffer_printf (L_BUFFER *B, const char *FMT, ...)
- - Function: void L_buffer_puts (L_BUFFER *B, const char *STR)
- - Function: void L_buffer_putchar (L_BUFFER *B, char CH)
-     These are the routines which do that actual printing to the buffer.
-
-            L_buffer_printf(lbuffer, "U: user input %c\n", c);
-            L_buffer_puts(lbuffer, "warning: its too hot");
-            L_buffer_putchar(lbuffer, '*');
-
-     Note: a null pointer passed to the `L_buffer_puts' function prints
-     as `(null)'. (1)
-
- - Function: void L_buffer_clear (L_BUFFER *B)
-     Clear the log, i.e. remove all messages and start again.
-
- - Function: void L_buffer_dump (L_BUFFER *B, FILE *FP)
-     Dump the contents of the log *B to the file descriptor *FP.
-     Typically *FP would be `stderr'.
-
-     Note that this does not change the contents of the buffer.  This is
-     important since we may have a hardware or software problem part of
-     the way through the dump operation and you don't want to loose
-     anything.
-
-     To reset the buffer after a successful dump use `L_buffer_clear'.
-
-     The output of `L_buffer_dump' consists of a starting message
-     followed by the contents of the log. If a character in the log is
-     not printable we print it out in hex on a line by itself.
-
-          * L_buffer_dump =
-          log message
-          and another
-          * non-printable character 0x1
-          more log messages
-          * end of dump
-
-   You also need to be able to integrate these functions into your
-design. See `examples/ott.c' for a complicated example. Here we will
-provide a simplified version which implements a new logging macro
-called `LFAST' which does a `printf' to the `log_buffer'.  If you want
-to have all messages going to a `L_BUFFER' then you can redefine
-`L_DEFAULT_HANDLER'.
-
-     /* project.h - the project wide include file */
-     
-     #include <nana.h>
-     #include <L_buffer.h>
-     
-     /* LFAST(char *, ...) - log a message to the log_buffer */
-     /*     ##f translates as the rest of the arguments to LFAST */
-     
-     #define LFAST(f...) LHP(L_buffer_printf,log_buffer,##f)
-     
-     extern L_BUFFER *log_buffer; /* the log buffer */
-
-   The main program merely creates the LOG_BUFFER and eventually calls
-`L_buffer_dump' to print out the buffer when the system dies.
-     /* main.c - initialise the system and start things */
-     
-     #include <project.h>
-     
-     L_BUFFER *log_buffer;
-     
-     main() {
-       log_buffer = L_buffer_create(16000);
-       if(log_buffer == NULL) { /* not enough store */
-         ...
-       }
-       LFAST("system starting at %f\n", now());
-       ...;
-     }
-     
-     void fatal_error() { /* called on fatal errors */
-       FILE *f = fopen("project.errors","w");
-       L_buffer_dump(b, stderr); /* print log to stderr */
-       L_buffer_dump(b, f); /* print log to file */
-     }
-
-   ---------- Footnotes ----------
-
-   (1)  This was suggested by Phil Blecker.
-
-L_times.h: recording events and times.
-======================================
-
-   This component is used to record events and times with a lower time
-and space overhead than the `L_buffer.h' component. Instead of using a
-`printf' style string we simply record the time and a pointer to a
-string identifying the event in a circular buffer.
-
-   *Note 0:* the string arguments should not be modified after a call
-since we record pointers to the strings rather than the strings
-themselves.
-
-   *Note 1:* there is no PRINTF style formatting, e.g.  `%d' in this
-package.
-
- - Type: struct L_TIMES
-     Used to define buffers, it is similar to `FILE*' type in
-     `stdio.h'. To create an instance use `L_times_create'.
-
- - Function: L_TIMES* L_times_create (int SIZE)
- - Function: L_TIMES* L_times_delete (L_BUFFER *B)
-     These are used to create or delete a buffer which can contain SIZE
-     messages.
-
- - Function: void L_times_wraparound (L_TIMES *B, int W)
-     A buffer created by `L_times_create' is set up so that the new
-     messages will overwrite the oldest messages in the buffer. If you
-     wish to disable this overwriting, e.g. to keep the first few
-     messages messages you could use `L_times_wraparound(b,0)'.
-
- - Function: void L_times_add (L_BUFFER *B, char *M, NANA_TIME T)
-     Add an event identified by message M at time T to B.  The type
-     NANA_TIME defaults to `double'.
-
- - Function: void L_times_dump (L_TIMES *B, FILE *FD)
-     Dump the contents of the buffer out.
-
- - Function: void L_times_clear (L_TIMES *B)
-     Clear all the messages from B.
-
-DL.h: support for printf style logging
-======================================
-
-   These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
- - Macro: void DL (ARGS...)
-     Used to log a message.
-
-     Defaults to a using `fprintf' on `stderr'.
-
- - Macro: void DLG (bool GUARD, ARGS...)
- - Macro: void DLH (function HANDLER, ARGS...)
- - Macro: void DLP (text PARAM, ARGS...)
- - Macro: void DLGP (bool GUARD, text PARAM, ARGS...)
- - Macro: void DLHP (function HANDLER, ARGS...)
- - Macro: void DLGHP (bool GUARD, function HANDLER, ARGS...)
-     And all of the special functions.
-
-
-   The macros such as `DL' depend on the GNU CC variable number of
-arguments to macros extension. If you wish to compile your code on
-other systems you might wish to use the following variations on `DL',
-etc.
-
- - Macro: void VDL ((ARGS...))
- - Macro: void VDLG ((bool GUARD, ARGS...))
- - Macro: void VDLH ((function HANDLER, ARGS...))
- - Macro: void VDLP ((text PARAM, ARGS...))
- - Macro: void VDLGP ((bool GUARD, TEXT PARAM, ARGS...))
- - Macro: void VDLHP ((function HANDLER, ARGS...))
- - Macro: void VDLGHP ((bool GUARD, function HANDLER, ARGS...))
-     Each of these macros calls the corresponding function from the
-     previous group, i.e. by default `VDL' is equivelant to a call to
-     `DL'.  If `WITHOUT_NANA' is defined then the call too `VDL' is
-     equivelant to `/* empty */'.
-
-     Thus you can have debugging under GCC whilst the code is still
-     portable to other compilers. However debugging information will
-     not be available on other platforms.
-
-     *Note:* the argument list is surrounded by *two* sets of brackets.
-     For example:
-
-             VDL(("haze in darwin = %d\n", 3.4));
-
- - Macro: int DL_LEVEL
-     Used to enable and disable logging independently of guard
-     expressions.
-
-    `2'
-          Always print message
-
-    `1'
-          Print message only if the guard expression is true.
-
-    `0'
-          Never print any messages.
-
-     Defaults to `1'.
-
- - Macro: text DL_DEFAULT_HANDLER
-     The default handler for printing which is simply the name of the
-     printing function.
-
-     Defaults to `fprintf'
-
- - Macro: bool DL_DEFAULT_GUARD
-     Defaults to `TRUE'.
-
- - Macro: text DL_DEFAULT_PARAMS
-     Defaults to `stderr'
-
- - Macro: flag DL_SHOW_TIME
-     Each message can be given an individual time stamp by defining
-     `DL_SHOW_TIME'. This causes the `_L_gettime' routine to be called
-     before each message which generates the timestamp. A default
-     version is provided by the nana library.
-
-GDB.h: sending plain gdb commands to the debugger
-=================================================
-
-   `GDB.h' provides macros for generating user specified commands in
-the output of the `nana' command.  They are not included by default in
-the `nana.h' file.
-
- - Macro: void GDB (COMMAND)
-     Emit a single line command when running this file through `nana'.
-     Note that each line must be passed off separately to the `GDB'
-     macro.
-
-     This could be used to set debugger options or to define procedures
-     inside `gdb', e.g.
-
-            GDB(define checkstack);
-            GDB(  if 0 <= n && n <= 10);
-            GDB(    print "stack ok");
-            GDB(  else);
-            GDB(    print "stack corrupted");
-            GDB(  end);
-            GDB(end);
-
- - Macro: void GDBCALL (COMMAND)
-     Causes a single gdb COMMAND to be executed whenever control passes
-     through this line of code. After the users command is executed
-     control automatically returns to the program.
-
-            GDBCALL(set memory_check = 1)
-
-   These macros could used for instrumenting code or setting up test
-harnesses, e.g.
-
-
-     GDB(set $siocall = 0);
-     GDB(set $sioerr = 0);
-     
-     void sio_driver() {
-       GDBCALL(set $siocall++)
-       if(SIO_REQ & 0x010) {
-         GDBCALL(set $sioerr++);
-         ...
-       }
-     }
-
-Q.h: support for quantifiers
-============================
-
-   `Q.h' provides support for the quantifiers of predicate logic.  For
-example to check that all elements in a data structure have some
-property we would use universal (forall, upside down A) quantification.
-To check that one or more values in a data structure have some property
-we would use existential (exists, back the front E) quantification.  For
-example:
-
-       /* all values in a[] must be between 0 and 10 */
-       I(A(int i = 0, i < n_array, i++, 0 <= a[i] && a[i] <= 10));
-     
-       /* there exists a value in linked list l which is smaller than 10 */
-       I(E(node *p = l, p != NULL, p = p->next, p->data <= 10));
-
-   The first three arguments to `A' and `E' are similar to a C `for'
-loop which iterates over the values we wish to check. The final
-argument is the expression that must be true.
-
-   The only minor difference from the C `for' loop is that variables
-may be declared at the start of the loop, even if you are using C rather
-than C++ which already supports this.(1)
-
-   The `Q.h' macros can also be nested and used anywhere a boolean
-value is required. For example:
-
-       if(A(int i = 0, i < MAXX, i++,
-            A(int j = 0, j < MAXY, j++,
-              m[i][j] == (i == j ? 1 : 0)))) {
-             /* identity matrix, i.e. all 0's except for 1's on */
-             /* the diagonal */
-             ...
-       } else {
-             /* not an identity matrix */
-             ...
-       }
-
-   The results from these macros can also be combined using boolean
-operations, e.g.
-
-       /* the values in a[i]  are either ALL positive or ALL negative */
-       I(A(int i = 0, i < MAX, i++, a[i] >= 0)
-         ||
-         A(int i = 0, i < MAX, i++, a[i] < 0));
-
-   *Portability:* note the macros in this file require the GNU CC/C++
-statement expression extension of GCC to work. If your not using GNU CC
-then for now you are out of luck. At some time in the future we may
-implement a method which will work for standard C++, standard C is a
-bit of a challenge.
-
-   *Portability:* unfortunately these macros do not for the `DI' and
-`DL' macros since the statement expression extension has not been
-implemented in GDB.
-
- - Macro: bool A (INIT,CONDITION,NEXT,EXPRN)
-     For all values generated by  `for(INT;CONDITION;NEXT)' the EXPRN
-     must be true.
-            I(A(int i = 0, i < MAX, i++, a[i] >= 0)); /* all a[i] are +ve */
-
- - Macro: bool E (INIT,CONDITION,NEXT,EXPRN)
-     There exists at least one value for EXPRN generated by  `for
-     (INT;CONDITION;NEXT)' which is true.
-
-            /* one or more a[i] >= 0 */
-            I(E(int i = 0, i < MAX, i++, a[i] >= 0));
-
- - Macro: long C (INIT,CONDITION,NEXT,EXPRN)
-     Returns the number of times the EXPRN is true over the values
-     generated by `for(INT;CONDITION;NEXT)'.
-
-            /* 3 elements of a[] are +ve */
-            I(C(int i = 0, i < MAX, i++, a[i] >= 0) == 3);
-
- - Macro: bool E1 (INIT,CONDITION,NEXT,EXPRN)
-     There exists only one value generated by
-     `for(INT;CONDITION;NEXT)' for which the EXPRN is true.
-
-            /* a single elements of a[] is +ve */
-            I(E1(int i = 0, i < MAX, i++, a[i] >= 0));
-
- - Macro: typeof (EXPRN) S (INIT,CONDITION,NEXT,EXPRN)
-     Sum the values generated by EXPRN for all values given by
-     `for(INT;CONDITION;NEXT)'. The type of the value returned  is
-     given by the type of the EXPRN.(2)
-
-            /* sum of a[] is 10 */
-            I(S(int i = 0, i < MAX, i++, a[i]) == 10);
-          
-            /* sum of all +ve numbers in a[] is 10 */
-            I(S(int i = 0, i < MAX, i++, a[i] >= 0 ? a[i] : 0) == 10);
-
- - Macro: typeof (EXPRN) P (INIT,CONDITION,NEXT,EXPRN)
-     Returns the product of the values generated by EXPRN for all
-     values given by  `for(INT;CONDITION;NEXT)'.  The type returned is
-     the type of the expression.
-
-            /* product of all the values in a[] is 10 */
-            I(P(int i = 0, i < MAX, i++, a[i]) == 10);
-          
-            /* a = x^y i.e. x*x..*x y times */
-            I(P(int i = 0, i < y, i++, x) == a);
-
-   ---------- Footnotes ----------
-
-   (1)  ANSI C does not allow variable declarations at the beginning of
-loops unlike C++. The  `Q.h' macros get around this by starting each
-loop with a new scope.
-
-   (2)  This uses yet another GNU CC extension, however since we are
-already using statement expressions we might as well use `typeof' as
-well.
-
-Qstl.h: quantifiers for STL containers.
-=======================================
-
-   The Standard Template Library (STL) is a library for C++ that makes
-extensive use of templates to implement the standard container classes
-and much more. Each of the container classes provides an interface to
-iterate over all the objects in the container, e.g.
-
-     // MAP is an associate array from location(lat,long) onto the name.
-     typedef map<location,string,locationlt> MAP;
-     
-     void print_map_names(MAP& m) { // print out all the names in the map
-       for(MAP::iterator i = m.begin(); i != m.end(); ++i) {
-         cout << (*i).second << "\n";
-       }
-     }
-
-   `Qstl.h' provides the same facilities as `Q.h' but uses the standard
-STL iterator protocol shown above. The names in `Qstl.h' are generated
-by appending a `O' (O not zero!) to the names in `Q.h'. In particular:
-
- - Macro: bool AO (NAME,CONTAINER,PREDICATE)
-     For all values in the CONTAINER class the PREDICATE must be true.
-     The PREDICATE refers to individual values using NAME. See the STL
-     documentation for more details.  Another way of putting this is
-     forall NAME in CONTAINER the PREDICATE must be true.
-
-            map<int,char *,ltint> m;
-            // all keys (or indexes) into m are positive
-            I(AO(i, m, (*i).first >= 0));
-
- - Macro: bool EO (NAME,CONTAINER,PREDICATE)
-     There exists one or more values in the CONTAINER class for which
-     the PREDICATE is true.
-
-            map<int,char,ltint> m;
-          
-            // one or more characters in m are '$'
-            I(EO(i, m, (*i).second == '$'));
-
- - Macro: bool E1O (NAME,CONTAINER,PREDICATE)
-     There exists one value in the CONTAINER for which the PREDICATE is
-     true.
-
-            map<int,char,ltint> m;
-          
-            // one characters in m is a '$'
-            I(E1O(i, m, (*i).second == '$'));
-
- - Macro: int CO (NAME,CONTAINER,PREDICATE)
-     Returns the number of times the PREDICATE was true for all values
-     in the CONTAINER.
-
-            map<int,char,ltint> m;
-            int nalpha;
-            // count the number of alphabetic chars in the map
-            nalpha = CO(i, m, isalpha((*i).second));
-
- - Macro: typeof (EXPRN) SO (NAME,CONTAINER,EXPRN)
-     Sum the EXPRN for all values in the CONTAINER.
-
-            map<int,float,ltint> m;
-            float sum;
-            // sum all the values in m
-            sum = SO(i, m, (*i).second);
-
- - Macro: typeof (EXPRN) PO (NAME,CONTAINER,EXPRN)
-     Take the product of the EXPRN for all values in the CONTAINER.
-
-            map<int,float,ltint> m;
-            float product;
-            // multiply all the values in m
-            product = PO(i, m, (*i).second);
-
-now.h: measuring time
-=====================
-
-   The `now.h' file provides some simple time measurement routines.  It
-is not included in `nana.h' so you must include this file separately.
-
-   It uses the `gettimeofday' system call and has an accuracy of
-between 1us and 10ms depending on the operating system and hardware
-configuration.
-
-   See the IPM package if you require better measurement tools.(1)
-
- - Function: double now ()
-     Returns the time in seconds since the beginning of time as defined
-     by your system. If you call `now_reset' the time will start again
-     at 0.
-
- - Function: double now_reset ()
-     Reset the times returned by `now' to 0.
-
- - Function: double now_delta (double *DP)
-     Returns the elapsed time between *DP and NOW(). It then sets *DP
-     to NOW, thus giving a delta time between particular events.
-
-            t = now();
-            for(;;) {
-              ...; /* code that must finish in 50ms */
-              I(now_delta(&t) <= 0.050);
-            }
-
-   ---------- Footnotes ----------
-
-   (1)  In the fullness of time, we may integrate these routines in
-here.
-
-eiffel.h: eiffel type assertions
-================================
-
-   Eiffel is a very nice language which provides the assertion checking
-facilities of nana inside the language itself.  The `eiffel.h' library
-is intended to provide a similar setup to Eiffel in the C++ language.
-It is a pretty poor emulation, but it is hopefully better than nothing.
-
-   Assertion checking is controlled by the EIFFEL_CHECK variable which
-can take on any of the following values:
-
-`CHECK_NO'
-     Disable all checking.
-
-`CHECK_REQUIRE'
-     Check the preconditions for each method.
-
-`CHECK_ENSURE'
-     And also check the postconditions.
-
-`CHECK_INVARIANT'
-     And also check the class invariant before and after each method is
-     called. The programmer should provide a class method called
-     `invariant' which returns `true' if the object is consistent,
-     `false' otherwise.
-
-`CHECK_LOOP'
-     And also check the loop invariants.
-
-`CHECK_ALL'
-     And also check any assertions using the `CHECK' instruction.
-
-   A typical compile flag to the compile might be:
-
-     % g++ -c -DEIFFEL_CHECK=CHECK_ALL play.cc
-
-   And then we have the actual assertion macros.
-
- - Macro: void REQUIRE (EXPRN)
-     Called at the beginning of each method.  This checks the
-     precondition to a method and the class invariant.
-
- - Macro: void ENSURE (EXPRN)
-     Called at the end of each method.  This checks the postcondition
-     to a method and the class invariant.
-
- - Macro: void INVARIANT (EXPRN)
-     Used to check a loop invariant.
-
- - Macro: void CHECK (EXPRN)
-     Used for any other inline assertions.
-
-   And finally a small example:
-
-     #include <eiffel.h>
-     
-     class example {
-       int nobjects;
-       map<location,string,locationlt> layer;
-     public:
-       bool invariant();
-       void changeit(location l);
-     };
-     
-     bool example::invariant() {
-       return AO(i,layer,valid_location((*i).first)) &&
-              nobjects >= 0;
-     }
-     
-     void example::changeit(string n, location l) {
-       REQUIRE(E1O(i,layer,(*i).second == n));
-       ...;
-       while(..) {
-         INVARIANT(...);
-         ...
-         INVARIANT(...);
-       }
-       ...
-       CHECK(x == 5);
-       ...
-       ENSURE(layer[l] == n);
-     }
-
-   Note that the invariant checking macro `example::invariant' is
-called automatically on function entry/exit using the `REQUIRE' and
-`ENSURE' macros.
-
-assert.h: a drop in replacement for assert.h
-============================================
-
-   A drop in replacement for `assert.h' is provided in the `src'
-directory. It is *not* installed by default. If you wish to use it then
-you need to copy it to your include directory by hand.
-
-   This might be of use if you are already using `assert.h' and wish to
-save some code space since the nana implementation is more space
-efficient.
-
-   Calls to `assert' are translated to calls to `I' and can be disabled
-by defining `NDEBUG'.
-
-calls.h: checking/printing many objects/facts.
-==============================================
-
-   The `calls' module implements a simple list of functions which can be
-modified and executed at run-time. It is similar in spirit to the ANSI
-C `atexit' function. It is intended to be used for:
-
-   * Checking the consistency of the components in your system.
-
-     For example each module could register a self checking function
-     which uses the rest of the nana library. All of these functions
-     would then be called using `calls.h' to check that the entire
-     system is consistent.
-
-   * Printing out the state of your program in a readable format.
-
- - Type: typedef FUNC
-     A pointer to a `void' function which takes a single `void*'
-     argument. The `void *' argument is intended to be used to pass
-     information such as arguments or pointers to objects (e.g. `this'
-     in C++). All of the checking/printing functions must be of this
-     type, e.g.
-
-          void print_object(void *f) {
-            ...;
-          }
-
- - Type: struct CALL
-     This structure represents a single call to a function, i.e. a
-     function pointer (`FUNC') and the `void*' argument.
-
-               CALL *head = 0;
-
- - Function: void calls_add (CALL **head, FUNC fp, *arg)
-     Adds a call to function `fp' with argument `arg' to the list
-     pointed to by `head'.
-
-               CALL *global_checks = 0;
-          
-               calls_add(&global_checks,complex_ok,(void *)x);
-
- - Function: void calls_exec (CALL **head, FUNC fp, void *arg)
-     Execute all/some of the calls in the list given by `head'.  The
-     arguments `fp' and `arg' must both match for each individual call.
-     The null pointer (`0') matches anything whilst any other value
-     requires an exact match between the `CALL' and the arguments to
-     `calls_exec'.  For example:
-
-          calls_exec(&l,0,0); /* execute all functions in l  */
-          calls_exec(&l,complex_print,0); /* calls complex_print(*) in l */
-          calls_exec(&l,0,(void*) &b); /* calls *(&b) in l */
-          calls_exec(&l,f,(void*) &b); /* calls f(&b) in l */
-
- - Function: void calls_delete (CALL **head, FUNC fp, void *arg)
-     Delete all/some of the calls in the list given by `head'.  The
-     arguments `fp' and `arg' must both match for each individual call.
-     The null pointer (`0') matches anything whilst any other value
-     requires an exact match between the `CALL' and the arguments to
-     `calls_delete'.  For example:
-
-          calls_delete(&l,0,0); /* delete all functions in l  */
-          calls_delete(&l,complex_print,0); /* delete complex_print(*) in l */
-          calls_delete(&l,0,(void*) &b); /* delete *(&b) in l */
-          calls_delete(&l,f,(void*) &b); /* delete f(&b) in l */
-
-   *Note:* that calls are added to the head of the list rather than the
-tail. This means that the most recently added call will be executed
-first (as in a stack).
-
-Using Nana
-**********
-
-   This chapter is intended to provide some hopefully useful examples of
-Nana. If any of the users of this library would be so kind as to
-contribute a section on their usage I would be obliged.
-
-   *This section is under development*
-
-Simplest example
-================
-
-   As a nice simple, indeed trivial example consider the following:
-
-  1. Include `nana.h' in your project wide include file.
-
-  2. Use `I' to check invariants in your code. In particular all
-     functions or methods should be required to check their pre and post
-     conditions.
-
-  3. Use `DL' to print debugging messages in your code. This means that
-     debugging messages only occur when you run the program under the
-     debugger.(1)
-
-   ---------- Footnotes ----------
-
-   (1)  Of course you also need to use the gdb commands generated by
-the `nana' command, perhaps using `nana-clg'
-
-Syslog
-======
-
-   `syslog' is a comprehensive logging system written by Eric Allman
-which is available on most UNIX systems. It provides facilities for
-sorting messages by source or severity and mechanisms for sending
-messages off to files, terminals or other machines. See chapter 12 of
-the "UNIX System Administration Handbook (2nd Edition)" by Nemeth,
-Snyder, Seebass and Hein for an excellent tutorial on `syslog'.
-
-   The rules used by `syslog' are normally defined in
-`/etc/syslog.conf'. Each line specifies the destination for messages
-with particular sources and priorities.  For example:
-
-     # log mail messages at priority info to mailinfo
-     mail.info /var/log/mailinfo
-     # log all ftp information to syslog on a remote machine
-     ftp.* @remote-machine.cs.ntu.edu.au
-     # all critical errors to console
-     *.crit   /dev/console
-
-   To use `syslog' we merely redefine the default handlers and
-parameter values for `nana'. For example:
-
-     #include <syslog.h>
-     #define L_DEFAULT_HANDLER syslog /* replaces fprintf(3) by syslog(3) */
-     #define L_DEFAULT_PARAMS LOG_USER /* default priority for syslog info */
-     #include <nana.h>
-     
-     int main() {
-          openlog("nana", /* identifier for these log messages */
-             LOG_PID, /* also log the process id */
-             LOG_DAEMON /* facility */
-          );
-     
-          L("temperature is falling to %d", 35); /* logged at LOG_USER 
priority */
-          LP(LOG_CRIT, "the snow is falling in Darwin"); /* LOG_CRIT message */
-     
-          closelog();
-          return 0;
-     }
-
-   This program results in the following addition to
-`/var/adm/messages':
-
-     Jun 12 16:04:46 chingiz nana[2671]: the temperature is falling to 35
-     Jun 12 16:04:46 chingiz nana[2671]: the snow is falling in Darwin
-
-   In addition the `LOG_CRIT' message about snow falling in Darwin is
-sent to the console for immediate action.
-
-   *Note:* `syslog' normally uses `UDP' for its network communications
-and that `UDP' does not guarantee delivery.
-
-GNU Programs: how to avoid nana sometimes
-=========================================
-
-   Imagine you(1) are building a GNU program.  Ideally it should run on
-systems without any other software including GCC, GDB and even Nana.
-
-   To achieve this noble goal you can provide your configure script
-with a `--without-nana'(2) flag which then `#define's' `WITHOUT_NANA'.
-You should also use the `VL' macro rather than `L' macro since `L'
-takes a variable number of arguments and will break non GNU C
-preprocessors.
-
-     int half(int n) {
-       /* Don't use L(...) since it takes a variable number of args! */
-       VL(("hello world = %d\n", 10)); /* Note the doubled (( */
-       ...;
-     }
-
-   ---------- Footnotes ----------
-
-   (1)  Gordon Matzigkeit contributed some of the ideas presented here
-and raised this problem.
-
-   (2)  Or add a `--with-nana' flag to configure that does the opposite.
-
-Embedded Systems: testing non-deterministic systems.
-====================================================
-
-   One of the uses (in fact the original use) for nana is in the
-testing of non-deterministic systems. These systems behave in a
-different way each time they are run because of timing or measurement
-noise. Thus you can't just `diff' the results against a known good run
-since they run differently each time.
-
-   Instead you can use a series of programs which execute over a the
-results of the program and check that the behaviour meets the
-specification automatically.
-
-Realtime Systems
-================
-
-   Assertions for the timing behaviour of you system can be done in nana
-nicely. You might also consider using an instruction level simulator
-such as PSIM and use the `cycles' variable to test realtime constraints.
-
-A database
-==========
-
-   Ah databases, business boffins using assertions. It would nice to
-get a real example for this one!
-
-Program Visualisation: pretty pictures
-======================================
-
-   One nice way to use `L', `DL', etc is to punt off the messages off
-to a program which displays the information. You would use the
-`L_DEFAULT_PARAM' argument to send commands off to a pipe with gnuplot
-or TCL/TK interpreter running at the end.
-
-   For a small example of this, see `tcl/status.c'.
-
-FAQ
-***
-
-   This chapter is intended to answer some general questions about the
-usage of Nana. Most of the material (perhaps) has been presented
-elsewhere, my apologies for repeating myself.
-
-  1. Can I use GNU Nana in a commercial product?
-
-     See the license details in the file `COPYING'. In summary GNU Nana
-     is Free software which has been released under a license that
-     allows commercial use provided the copyright is maintained. It is
-     not under the GPL.
-
-  2. How do you completely disable assertion checking?
-
-     Set the `I_LEVEL' command to `0' using `-D' or `#define' before
-     including `nana.h'.
-
-  3. How do I find out about future releases?
-
-     Subscribe to the nana mailing list by using the `make subscribe'
-     target in the nana root directory.
-
-  4. Where do I send bug reports, suggestions, etc?
-
-     address@hidden' - bug archive
-
-     address@hidden' - mailing list
-
-     address@hidden' - the author
-
-
-Future work
-***********
-
-   As usual, there is more work to be done than time to do it in.
-Workers or test pilots are invited to apply for the following tasks
-which may get down in the fullness of time minister.  I'm particularly
-interested in which projects people think are worthwhile (or rubbish).
-
-  1. Ada support - pre 1.00 versions of nana provided support for
-      Ada. Adding a full version of nana into the GNATS compiler
-      would probably be useful, particularly the real time part.
-
-  2. FORTRAN support.
-
-  3. Message browsing (`emacs/fess.el') - a very prototypical mode for
-     browsing message logs is distributed with nana. Features include
-     hiding/showing lines by regular expression or predicate. If
-     someone who knows what they are doing rewrites this that would be
-     a good thing. Or perhaps a modified version of `less' would be
-     useful.
-
-  4. Program Visualisation (`tcl/status.c') - another prototype which
-     uses a small TCL/TK library and nana logging to generate some nice
-     pictures showing the behaviour of the program. For example the
-     history of variables over time can be recorded, graphs drawn and
-     long message logs kept. A new version of this has been created and
-     may be released shortly.
-
-  5. Eiffel shortform program - the shortform of an Eiffel program
-     contains the function signatures (arguments, etc) together with the
-     assertions (pre/post conditions).  An extension could perhaps be
-     put in a program such as `DOC++' or `cxref' which extracts the
-     nana assertions.
-
-  6. Automated Testing - combine nana logs with a workbench that lets
-     you verify properties of the logs using programs `gawk' or the
-     `PRECC' (LL infinity version of YACC). This technique has been
-     used on industrial strength products quite successfully.
-
-  7. GNU standards - perhaps it would be worthwhile to set up a
-     prototype for checking and logging in GNU tools.
-
-  8. Extend GDB(1) so that we can support `Q.h' style quantifiers in
-     `DI.h' expressions. Basically we need to add a restricted form of
-     the statement value expression to GDB.
-
-  9. Support for other (particularly ANSI only) compilers.
-
-Index
-*****
-
-* Menu:
-
-* ( <1>:                                Qstl.h.
-* (:                                    Q.h.
-* 0 <1>:                                DL.h.
-* 0 <2>:                                L.h.
-* 0 <3>:                                DI.h.
-* 0:                                    I.h.
-* 1 <1>:                                DL.h.
-* 1 <2>:                                L.h.
-* 1 <3>:                                DI.h.
-* 1:                                    I.h.
-* 2 <1>:                                DL.h.
-* 2 <2>:                                L.h.
-* 2 <3>:                                DI.h.
-* 2:                                    I.h.
-* A <1>:                                Q.h.
-* A:                                    Introduction.
-* abort():                              Variables.
-* ALWAYS_INCLUDE_MALLOC:                Variables.
-* AO:                                   Qstl.h.
-* asm("hlt"):                           Variables.
-* asm("stp"):                           Variables.
-* C <1>:                                Q.h.
-* C:                                    Introduction.
-* calls_add:                            calls.h.
-* calls_delete:                         calls.h.
-* calls_exec:                           calls.h.
-* CHECK:                                eiffel.h.
-* CHECK_ALL:                            eiffel.h.
-* CHECK_ENSURE:                         eiffel.h.
-* CHECK_INVARIANT:                      eiffel.h.
-* CHECK_LOOP:                           eiffel.h.
-* CHECK_NO:                             eiffel.h.
-* CHECK_REQUIRE:                        eiffel.h.
-* CO:                                   Qstl.h.
-* DI:                                   DI.h.
-* DI.h:                                 nana.h.
-* DI_DEFAULT_GUARD:                     DI.h.
-* DI_DEFAULT_HANDLER:                   DI.h.
-* DI_DEFAULT_PARAMS:                    DI.h.
-* DI_LEVEL:                             DI.h.
-* DI_MAKE_VALID_BREAKPOINT <1>:         DI.h.
-* DI_MAKE_VALID_BREAKPOINT:             Variables.
-* DIG:                                  DI.h.
-* DIGH:                                 DI.h.
-* DIGHP:                                DI.h.
-* DIGP:                                 DI.h.
-* DIH:                                  DI.h.
-* DIHP:                                 DI.h.
-* DIP:                                  DI.h.
-* DL:                                   DL.h.
-* DL.h:                                 nana.h.
-* DL_DEFAULT_GUARD:                     DL.h.
-* DL_DEFAULT_HANDLER:                   DL.h.
-* DL_DEFAULT_PARAMS:                    DL.h.
-* DL_LEVEL:                             DL.h.
-* DL_MAKE_VALID_BREAKPOINT:             Variables.
-* DL_SHOW_TIME:                         DL.h.
-* DLG:                                  DL.h.
-* DLGHP:                                DL.h.
-* DLGP:                                 DL.h.
-* DLH:                                  DL.h.
-* DLHP:                                 DL.h.
-* DLP:                                  DL.h.
-* DN:                                   DI.h.
-* DNG:                                  DI.h.
-* DNGH:                                 DI.h.
-* DNGHP:                                DI.h.
-* DNGP:                                 DI.h.
-* DNH:                                  DI.h.
-* DNHP:                                 DI.h.
-* DNP:                                  DI.h.
-* DS:                                   DI.h.
-* DSG:                                  DI.h.
-* E <1>:                                Q.h.
-* E:                                    Introduction.
-* E1 <1>:                               Q.h.
-* E1:                                   Introduction.
-* E1O:                                  Qstl.h.
-* ENSURE:                               eiffel.h.
-* EO:                                   Qstl.h.
-* exprn <1>:                            DI.h.
-* exprn:                                I.h.
-* file <1>:                             DI.h.
-* file:                                 I.h.
-* gcc-2.7.2:                            Required Software.
-* GDB:                                  GDB.h.
-* gdb-4.16:                             Required Software.
-* GDB.h:                                nana.h.
-* GDBCALL:                              GDB.h.
-* gmake:                                Required Software.
-* I:                                    I.h.
-* I.h:                                  nana.h.
-* I_DEFAULT_GUARD:                      I.h.
-* I_DEFAULT_HANDLER <1>:                I.h.
-* I_DEFAULT_HANDLER:                    Variables.
-* I_DEFAULT_PARAMS:                     I.h.
-* I_LEVEL:                              I.h.
-* ID:                                   I.h.
-* IG:                                   I.h.
-* IGH:                                  I.h.
-* IGHP:                                 I.h.
-* IGP:                                  I.h.
-* IH:                                   I.h.
-* IHP:                                  I.h.
-* INVARIANT:                            eiffel.h.
-* IP:                                   I.h.
-* IS:                                   I.h.
-* ISG:                                  I.h.
-* L:                                    L.h.
-* L.h:                                  nana.h.
-* L_BUFFER:                             L_buffer.h.
-* L_buffer_clear:                       L_buffer.h.
-* L_buffer_create:                      L_buffer.h.
-* L_buffer_delete:                      L_buffer.h.
-* L_buffer_dump:                        L_buffer.h.
-* L_buffer_printf:                      L_buffer.h.
-* L_buffer_putchar:                     L_buffer.h.
-* L_buffer_puts:                        L_buffer.h.
-* L_buffer_wraparound:                  L_buffer.h.
-* L_DEFAULT_GUARD:                      L.h.
-* L_DEFAULT_HANDLER:                    L.h.
-* L_DEFAULT_PARAMS:                     L.h.
-* L_LEVEL:                              L.h.
-* L_SHOW_TIME:                          L.h.
-* L_SHOW_TIME_FORMAT:                   L.h.
-* L_SHOW_TIME_NOW:                      L.h.
-* L_TIMES:                              L_times.h.
-* L_times_add:                          L_times.h.
-* L_times_clear:                        L_times.h.
-* L_times_create:                       L_times.h.
-* L_times_delete:                       L_times.h.
-* L_times_dump:                         L_times.h.
-* L_times_wraparound:                   L_times.h.
-* LG:                                   L.h.
-* LGHP:                                 L.h.
-* LGP:                                  L.h.
-* LH:                                   L.h.
-* LHP:                                  L.h.
-* line <1>:                             DI.h.
-* line:                                 I.h.
-* LP:                                   L.h.
-* N:                                    I.h.
-* nana-clg:                             Invoking.
-* nana-run:                             Invoking.
-* nana-trace:                           Invoking.
-* NG:                                   I.h.
-* NGH:                                  I.h.
-* NGHP:                                 I.h.
-* NGP:                                  I.h.
-* NH:                                   I.h.
-* NHP:                                  I.h.
-* now:                                  now.h.
-* now_delta:                            now.h.
-* now_reset:                            now.h.
-* NP:                                   I.h.
-* P:                                    Introduction.
-* param <1>:                            DI.h.
-* param:                                I.h.
-* Q.h:                                  nana.h.
-* REQUIRE:                              eiffel.h.
-* restart():                            Variables.
-* S:                                    Introduction.
-* struct:                               calls.h.
-* typedef:                              calls.h.
-* VDL:                                  DL.h.
-* VDLG:                                 DL.h.
-* VDLGHP:                               DL.h.
-* VDLGP:                                DL.h.
-* VDLH:                                 DL.h.
-* VDLHP:                                DL.h.
-* VDLP:                                 DL.h.
-* VL:                                   L.h.
-* VLG:                                  L.h.
-* VLGHP:                                L.h.
-* VLGP:                                 L.h.
-* VLH:                                  L.h.
-* VLHP:                                 L.h.
-* VLP:                                  L.h.
-

Index: nana/manual/html_chapter/nana_4.html
===================================================================
RCS file: nana/manual/html_chapter/nana_4.html
diff -N nana/manual/html_chapter/nana_4.html
--- nana/manual/html_chapter/nana_4.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,1892 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Interface</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_3.html">previous</A>, 
<A HREF="nana_5.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC16" HREF="nana_toc.html#TOC16">Interface</A></H1>
-<P>
-This section describes the details of the interface to nana library.
-
-</P>
-<P>
-All of the files can be included multiple times without
-ill--effect since they use the C preprocessor to make sure the header
-declarations are only seen the first by the compiler.
-Each of the files can also be included individually.
-
-</P>
-
-<P>
-If any of the following routines have an internal problem (e.g. malloc
-fails due to lack of memory) they will call the <SAMP>`nana_error'</SAMP> 
function
-defined in <SAMP>`nana_error.c'</SAMP>. By default this function prints a 
message
-and dumps core using <SAMP>`abort'</SAMP>. If you wish to override this 
behaviour
-you should define your own handler before linking in the nana library.
-
-</P>
-
-
-<H2><A NAME="SEC17" HREF="nana_toc.html#TOC17">nana.h: the main header 
file</A></H2>
-<P>
-The <SAMP>`nana.h'</SAMP> file includes most of the other files in the
-library. In particular it <SAMP>`#include's'</SAMP> the following
-files:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>I.h</CODE>
-<DD>
-<A NAME="IDX21"></A>
-<DT><CODE>DI.h</CODE>
-<DD>
-<A NAME="IDX22"></A>
-<DT><CODE>L.h</CODE>
-<DD>
-<A NAME="IDX23"></A>
-<DT><CODE>DL.h</CODE>
-<DD>
-<A NAME="IDX24"></A>
-<DT><CODE>Q.h</CODE>
-<DD>
-<A NAME="IDX25"></A>
-<DT><CODE>GDB.h</CODE>
-<DD>
-<A NAME="IDX26"></A>
-</DL>
-
-
-
-<H2><A NAME="SEC18" HREF="nana_toc.html#TOC18">WITHOUT_NANA: disabling all 
nana code for portability.</A></H2>
-<P>
-If you wish to disable all nana code you can <SAMP>`#define'</SAMP> the
-<SAMP>`WITHOUT_NANA'</SAMP> macro. This selects versions of the 
-macros defined in <SAMP>`I.h'</SAMP>,<SAMP>`L.h'</SAMP>, etc which map to 
-<SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-So if you are using nana for your development but don't wish to 
-force  your customers to use it you can add an option to your
-<SAMP>`configure'</SAMP> script to define/undefine 
<SAMP>`WITHOUT_NANA'</SAMP>. 
-In addition you will need to distribute copies of the nana header
-files with your package to get the stubs.
-
-</P>
-<P>
-Note that the <SAMP>`L.h'</SAMP> and <SAMP>`DL.h'</SAMP> macros use the 
-macro variable number of arguments extension provided by 
-GNU C. If you wish your code to be portable you should use
-the macros <SAMP>`VL((..))'</SAMP>, etc rather than <SAMP>`L(..)'</SAMP> to
-avoid problems with non GNU C preprocessors which only take a fixed
-number of arguments.
-
-</P>
-
-
-<H2><A NAME="SEC19" HREF="nana_toc.html#TOC19">I.h: C based invariant 
checking</A></H2>
-<P>
-This implements the C based invariant checking code and is a
-replacement for <SAMP>`assert.h'</SAMP>. The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX27"></A>
-The <VAR>exprn</VAR> should always be true if the program is correct.  If the
-<VAR>exprn</VAR> is false a message will be printed, followed by core
-dump.<A NAME="DOCF4" HREF="nana_foot.html#FOOT4">(4)</A>
-
-</P>
-<P>
-Checking can be enabled and disabled by using the <VAR>I_LEVEL</VAR>
-and <VAR>I_DEFAULT_GUARD</VAR> macros. See the definitions below for these
-macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF5" 
HREF="nana_foot.html#FOOT5">(5)</A>
-since disabling checking shouldn't change your programs behaviour.
-
-</P>
-
-<PRE>
-  I(z != 0); 
-  x = y / z;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX28"></A>
-The opposite of <SAMP>`I'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as a piece of syntactic sugar which may be helpful for complicated
-boolean expressions.
-
-</P>
-
-<PRE>
-char* strdup(char *s) {
-  N(s == NULL);
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>I_LEVEL</B>
-<DD><A NAME="IDX29"></A>
-The <SAMP>`I_LEVEL'</SAMP> macro is used to globally enable and disable
-checking by the macros in this file. It can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX30"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>I</CODE>, <CODE>N</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX31"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX32"></A>
-Enable all checking regardless of guard conditions.
-</DL>
-
-<P>
-<CODE>I_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>I_DEFAULT_GUARD</B>
-<DD><A NAME="IDX33"></A>
-The <CODE>I_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>I_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>I_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define I_DEFAULT_GUARD i_guard &#62; 0
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>I_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX34"></A>
-This is passed off to the <CODE>I_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>I_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX35"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>I_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX36"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX37"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX38"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX39"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>I_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-All of the remaining macros are used to individually override the
-default values defined above. Normally these macros would be used in a
-system wide header file to define macros appropriate for the
-application. For example you might use <SAMP>`IH'</SAMP> to define 
-different checking macros for hardware and software faults.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX40"></A>
-<DT><U>Macro:</U> void <B>IG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX41"></A>
-<DT><U>Macro:</U> void <B>IH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX42"></A>
-<DT><U>Macro:</U> void <B>IP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX43"></A>
-<DT><U>Macro:</U> void <B>IGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX44"></A>
-<DT><U>Macro:</U> void <B>IGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX45"></A>
-<DT><U>Macro:</U> void <B>IHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX46"></A>
-<DT><U>Macro:</U> void <B>IGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX47"></A>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX48"></A>
-<DT><U>Macro:</U> void <B>NG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX49"></A>
-<DT><U>Macro:</U> void <B>NH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX50"></A>
-<DT><U>Macro:</U> void <B>NP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX51"></A>
-<DT><U>Macro:</U> void <B>NGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX52"></A>
-<DT><U>Macro:</U> void <B>NGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX53"></A>
-<DT><U>Macro:</U> void <B>NHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX54"></A>
-<DT><U>Macro:</U> void <B>NGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX55"></A>
-</DL>
-
-</P>
-<P>
-We also provide support for referring to previous values of variables in 
-postconditions. The <CODE>ID</CODE> macro is used to create variables to 
-save the old state in. The <CODE>IS</CODE> and <CODE>ISG</CODE> macros are to 
-set these values. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ID</B> <I>(Text <VAR>decln</VAR>)</I>
-<DD><A NAME="IDX56"></A>
-<DT><U>Macro:</U> void <B>IS</B> <I>(Text <VAR>assignment</VAR>)</I>
-<DD><A NAME="IDX57"></A>
-<DT><U>Macro:</U> void <B>ISG</B> <I>(Text <VAR>decln</VAR>, bool 
<VAR>g</VAR>)</I>
-<DD><A NAME="IDX58"></A>
-</DL>
-
-</P>
-<P>
-For example:
-
-<PRE>
-void ex(int &#38;r) {
-  ID(int oldr = r); /* save parameter */
-  g(r);
-  I(oldr == r); /* check r is unchanged */
-  while(more()) {
-    IS(oldr = r); /* assign r to oldr */
-    h(r);
-    I(oldr == r * r);
-  }
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC20" HREF="nana_toc.html#TOC20">DI.h: debugger based invariant 
checking</A></H2>
-<P>
-This implements the debugger based invariant checking code.
-The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. Note that these macros have no effect unless you run your 
-program under the debugger and read in the commands generated by the
-<SAMP>`nana'</SAMP> command.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX59"></A>
-The <VAR>exprn</VAR> should always be true if the program is working. 
-If it is true then nothing happens otherwise the code given by
-<SAMP>`DI_DEFAULT_HANDLER'</SAMP> will be called which by default prints 
-a message and dies just like <SAMP>`assert.h'</SAMP>.  
-
-</P>
-<P>
-The checking using <VAR>DI</VAR> can be enabled and disabled by using the
-<VAR>DI_LEVEL</VAR> and <VAR>DI_DEFAULT_GUARD</VAR> macros. See the definitions
-below for these macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF6" 
HREF="nana_foot.html#FOOT6">(6)</A> since 
-disabling the checking shouldn't change your programs behaviour.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX60"></A>
-The opposite of <SAMP>`DI'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as piece of syntactic sugar which is helpful for complicated
-boolean expressions.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DI_LEVEL</B>
-<DD><A NAME="IDX61"></A>
-The <SAMP>`DI_LEVEL'</SAMP> macro is used to globally enable and disable
-checking, in particular it can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX62"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>DI</CODE>, <CODE>DN</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX63"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX64"></A>
-Enable all checking regardless of guard conditions, etc.
-</DL>
-
-<P>
-<CODE>DI_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DI_DEFAULT_GUARD</B>
-<DD><A NAME="IDX65"></A>
-The <CODE>DI_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>DI_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>DI_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define DI_DEFAULT_GUARD (i_guard)
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DI_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX66"></A>
-This is passed off to the <CODE>DI_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>DI_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX67"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>DI_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX68"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX69"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX70"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX71"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>DI_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_MAKE_VALID_BREAKPOINT</B> <I>(exprn 
<VAR>e</VAR>)</I>
-<DD><A NAME="IDX72"></A>
-This macro is used to ensure that a breakpoint can be set at the
-location we are checking using <CODE>DI</CODE>, etc. It defaults to
-<CODE>asm("nop")</CODE> and can be redefined by the user.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX73"></A>
-<DT><U>Macro:</U> void <B>DIG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX74"></A>
-<DT><U>Macro:</U> void <B>DIH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX75"></A>
-<DT><U>Macro:</U> void <B>DIP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX76"></A>
-<DT><U>Macro:</U> void <B>DIGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX77"></A>
-<DT><U>Macro:</U> void <B>DIGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX78"></A>
-<DT><U>Macro:</U> void <B>DIHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX79"></A>
-<DT><U>Macro:</U> void <B>DIGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX80"></A>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX81"></A>
-<DT><U>Macro:</U> void <B>DNG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX82"></A>
-<DT><U>Macro:</U> void <B>DNH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX83"></A>
-<DT><U>Macro:</U> void <B>DNP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX84"></A>
-<DT><U>Macro:</U> void <B>DNGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX85"></A>
-<DT><U>Macro:</U> void <B>DNGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX86"></A>
-<DT><U>Macro:</U> void <B>DNHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX87"></A>
-<DT><U>Macro:</U> void <B>DNGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX88"></A>
-
-</P>
-<P>
-All of these macros are used to individually override the
-default values defined above. Normally these macros
-would be used in a system wide header file to define macros appropriate 
-for the application.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DS</B> <I>(<VAR>e</VAR>)</I>
-<DD><A NAME="IDX89"></A>
-<DT><U>Macro:</U> void <B>DSG</B> <I>(<VAR>e</VAR>, <VAR>g</VAR>)</I>
-<DD><A NAME="IDX90"></A>
-These macros are used to assign values to convenience variables in the
-debugger. Convenience variables are dynamically typed, global in scope
-and initialised to 0. They start with a single <CODE>$</CODE> and can be used 
be
-used for saving the state of program or for counting events. The
-<SAMP>`DS'</SAMP> macro executes <VAR>e</VAR> under the same rules as 
<CODE>DI</CODE>.
-The <SAMP>`DSG'</SAMP> macro executes <VAR>e</VAR> only if the the expression
-<VAR>g</VAR> is true.
-
-</P>
-<P>
-Note that <SAMP>`DS'</SAMP> and <SAMP>`DSG'</SAMP> can also be used for 
modifying
-C variables and calling functions.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC21" HREF="nana_toc.html#TOC21">L.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX91"></A>
-Used to log a message in a similar way to printf.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>LG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX92"></A>
-<DT><U>Macro:</U> void <B>LH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX93"></A>
-<DT><U>Macro:</U> void <B>LP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX94"></A>
-<DT><U>Macro:</U> void <B>LGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX95"></A>
-<DT><U>Macro:</U> void <B>LHP</B> <I>(function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX96"></A>
-<DT><U>Macro:</U> void <B>LGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX97"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`L'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`L'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX98"></A>
-<DT><U>Macro:</U> void <B>VLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX99"></A>
-<DT><U>Macro:</U> void <B>VLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX100"></A>
-<DT><U>Macro:</U> void <B>VLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX101"></A>
-<DT><U>Macro:</U> void <B>VLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX102"></A>
-<DT><U>Macro:</U> void <B>VLHP</B> <I>((function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX103"></A>
-<DT><U>Macro:</U> void <B>VLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX104"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VLG'</SAMP> is the same as a call to 
<SAMP>`LG'</SAMP>.
-If you define <SAMP>`WITHOUT_NANA'</SAMP> all these macros are translated
-to <SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-Thus you can have nana under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_LEVEL</B>
-<DD><A NAME="IDX105"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX106"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX107"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX108"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX109"></A>
-The default handler for printing which is simply the name of the
-logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>L_DEFAULT_GUARD</B>
-<DD><A NAME="IDX110"></A>
-The default guard condition for logging. 
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX111"></A>
-The default parameter passed off to the logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_SHOW_TIME</B>
-<DD><A NAME="IDX112"></A>
-If defined then display the time in front of each message.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> char* <B>L_SHOW_TIME_FORMAT</B>
-<DD><A NAME="IDX113"></A>
-A format string for the time stamp in the log. By default it prints the
-time out in seconds.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> value <B>L_SHOW_TIME_NOW</B>
-<DD><A NAME="IDX114"></A>
-The name of a function that returns the time for the time stamp. This
-defaults to the <SAMP>`now'</SAMP> function from <SAMP>`now.h'</SAMP>.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC22" HREF="nana_toc.html#TOC22">L_buffer.h: a circular buffer 
for logging.</A></H2>
-<P>
-A traditional embedded systems trick is to log messages to a circular
-buffer in core. This has the following benefits:
-
-</P>
-
-<OL>
-<LI>Speed -- writing to a in core buffer is much faster than spitting
-
-out messages to a file on disk. It is often fast enough to leave at least
-most of the messages in the final product.
-<LI>Field debugging -- what the ... was the user doing before the
-
-system crashed. Oh lets ask them, I'm sure they'll give us a good
-problem report. 
-</OL>
-
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_BUFFER</B>
-<DD><A NAME="IDX115"></A>
-Used to define buffer variables, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_buffer_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_create</B> <I>(size_t 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX116"></A>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX117"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-characters. 
-
-</P>
-
-<PRE>
-  L_BUFFER *lbuffer;
-
-  lbuffer = L_buffer_create(32*1024); /* create a 32K buffer */
-  ...;
-  L_buffer_delete(lbuffer); /* and delete it after use */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_wraparound</B> <I>(L_BUFFER 
<VAR>*b</VAR>, int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX118"></A>
-A buffer created by <SAMP>`L_buffer_create'</SAMP> is set up so that the new
-messages will overwrite the older messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first 32K bytes
-of your system startup messages you should use 
<SAMP>`L_buffer_wraparound'</SAMP>.
-For example:
-
-</P>
-
-<PRE>
-  L_BUFFER *lb = L_buffer_create(32*1024);
-  L_buffer_wraparound(lb, 0); /* disable wraparound */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_printf</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*fmt</VAR>, ...)</I>
-<DD><A NAME="IDX119"></A>
-<DT><U>Function:</U> void <B>L_buffer_puts</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*str</VAR>)</I>
-<DD><A NAME="IDX120"></A>
-<DT><U>Function:</U> void <B>L_buffer_putchar</B> <I>(L_BUFFER <VAR>*b</VAR>, 
char <VAR>ch</VAR>)</I>
-<DD><A NAME="IDX121"></A>
-These are the routines which do that actual printing to the buffer.
-
-</P>
-
-<PRE>
-  L_buffer_printf(lbuffer, "U: user input %c\n", c);
-  L_buffer_puts(lbuffer, "warning: its too hot");
-  L_buffer_putchar(lbuffer, '*');
-</PRE>
-
-<P>
-Note: a null pointer passed to the <SAMP>`L_buffer_puts'</SAMP> function prints
-as <SAMP>`(null)'</SAMP>. <A NAME="DOCF7" HREF="nana_foot.html#FOOT7">(7)</A>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_clear</B> <I>(L_BUFFER <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX122"></A>
-Clear the log, i.e. remove all messages and start again.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_dump</B> <I>(L_BUFFER <VAR>*b</VAR>, 
FILE *<VAR>fp</VAR>)</I>
-<DD><A NAME="IDX123"></A>
-Dump the contents of the log <VAR>*b</VAR> to the file descriptor 
<VAR>*fp</VAR>. 
-Typically <VAR>*fp</VAR> would be <SAMP>`stderr'</SAMP>. 
-
-</P>
-<P>
-Note that this does not change the contents of the buffer.  This is
-important since we may have a hardware or software problem part of the
-way through the dump operation and you don't want to loose anything.
-
-</P>
-<P>
-To reset the buffer after a successful dump use <SAMP>`L_buffer_clear'</SAMP>.
-
-</P>
-<P>
-The output of <SAMP>`L_buffer_dump'</SAMP> consists of a starting message
-followed by the contents of the log. If a character in the log is not
-printable we print it out in hex on a line by itself.
-
-</P>
-
-<PRE>
-* L_buffer_dump =
-log message
-and another
-* non-printable character 0x1
-more log messages
-* end of dump
-</PRE>
-
-</DL>
-
-<P>
-You also need to be able to integrate these functions into your
-design. See <SAMP>`examples/ott.c'</SAMP> for a complicated example. Here we
-will provide a simplified version which implements a new logging macro
-called <SAMP>`LFAST'</SAMP> which does a <SAMP>`printf'</SAMP> to the 
<SAMP>`log_buffer'</SAMP>.
-If you want to have all messages going to a <SAMP>`L_BUFFER'</SAMP> then you 
can
-redefine <SAMP>`L_DEFAULT_HANDLER'</SAMP>.
-
-</P>
-
-<PRE>
-/* project.h - the project wide include file */
-
-#include &#60;nana.h&#62;
-#include &#60;L_buffer.h&#62;
-
-/* LFAST(char *, ...) - log a message to the log_buffer */
-/*     ##f translates as the rest of the arguments to LFAST */
-
-#define LFAST(f...) LHP(L_buffer_printf,log_buffer,##f)
-
-extern L_BUFFER *log_buffer; /* the log buffer */
-</PRE>
-
-<P>
-The main program merely creates the <VAR>log_buffer</VAR> and eventually
-calls <SAMP>`L_buffer_dump'</SAMP> to print out the buffer when the system 
dies.
-
-<PRE>
-/* main.c - initialise the system and start things */
-
-#include &#60;project.h&#62;
-
-L_BUFFER *log_buffer;
-
-main() {
-  log_buffer = L_buffer_create(16000); 
-  if(log_buffer == NULL) { /* not enough store */
-    ...
-  }
-  LFAST("system starting at %f\n", now());
-  ...;
-}
-
-void fatal_error() { /* called on fatal errors */
-  FILE *f = fopen("project.errors","w");
-  L_buffer_dump(b, stderr); /* print log to stderr */
-  L_buffer_dump(b, f); /* print log to file */
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC23" HREF="nana_toc.html#TOC23">L_times.h: recording events and 
times.</A></H2>
-<P>
-This component is used to record events and times with a lower time 
-and space overhead than the <SAMP>`L_buffer.h'</SAMP> component. Instead
-of using a <SAMP>`printf'</SAMP> style string we simply record the time
-and a pointer to a string identifying the event in a circular buffer.
-
-</P>
-<P>
-<STRONG>Note 0:</STRONG> the string arguments should not be modified after
-a call since we record pointers to the strings rather
-than the strings themselves.
-
-</P>
-<P>
-<STRONG>Note 1:</STRONG> there is no <VAR>printf</VAR> style formatting, e.g.
-<SAMP>`%d'</SAMP> in this package.
-
-</P>
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_TIMES</B>
-<DD><A NAME="IDX124"></A>
-Used to define buffers, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_times_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_TIMES* <B>L_times_create</B> <I>(int 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX125"></A>
-<DT><U>Function:</U> L_TIMES* <B>L_times_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX126"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-messages.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_wraparound</B> <I>(L_TIMES <VAR>*b</VAR>, 
int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX127"></A>
-A buffer created by <SAMP>`L_times_create'</SAMP> is set up so that the new
-messages will overwrite the oldest messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first few messages
-messages you could use <SAMP>`L_times_wraparound(b,0)'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_add</B> <I>(L_BUFFER <VAR>*b</VAR>, char 
<VAR>*m</VAR>, NANA_TIME <VAR>t</VAR>)</I>
-<DD><A NAME="IDX128"></A>
-Add an event identified by message <VAR>m</VAR> at time <VAR>t</VAR> to 
<VAR>b</VAR>.  
-The type <VAR>NANA_TIME</VAR> defaults to <SAMP>`double'</SAMP>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_dump</B> <I>(L_TIMES <VAR>*b</VAR>, FILE 
<VAR>*fd</VAR>)</I>
-<DD><A NAME="IDX129"></A>
-Dump the contents of the buffer out.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_clear</B> <I>(L_TIMES <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX130"></A>
-Clear all the messages from <VAR>b</VAR>.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC24" HREF="nana_toc.html#TOC24">DL.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DL</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX131"></A>
-Used to log a message.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DLG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX132"></A>
-<DT><U>Macro:</U> void <B>DLH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX133"></A>
-<DT><U>Macro:</U> void <B>DLP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX134"></A>
-<DT><U>Macro:</U> void <B>DLGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX135"></A>
-<DT><U>Macro:</U> void <B>DLHP</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX136"></A>
-<DT><U>Macro:</U> void <B>DLGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX137"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`DL'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`DL'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VDL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX138"></A>
-<DT><U>Macro:</U> void <B>VDLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX139"></A>
-<DT><U>Macro:</U> void <B>VDLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX140"></A>
-<DT><U>Macro:</U> void <B>VDLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX141"></A>
-<DT><U>Macro:</U> void <B>VDLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX142"></A>
-<DT><U>Macro:</U> void <B>VDLHP</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX143"></A>
-<DT><U>Macro:</U> void <B>VDLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX144"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VDL'</SAMP> is equivelant to a call to 
<SAMP>`DL'</SAMP>.
-If <SAMP>`WITHOUT_NANA'</SAMP> is defined then the call too <SAMP>`VDL'</SAMP> 
is 
-equivelant to <SAMP>`/* empty */'</SAMP>.
-
-</P>
-<P>
-Thus you can have debugging under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VDL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DL_LEVEL</B>
-<DD><A NAME="IDX145"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX146"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX147"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX148"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX149"></A>
-The default handler for printing which is simply the name of the
-printing function. 
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DL_DEFAULT_GUARD</B>
-<DD><A NAME="IDX150"></A>
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX151"></A>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> flag <B>DL_SHOW_TIME</B>
-<DD><A NAME="IDX152"></A>
-Each message can be given an individual time stamp by defining 
-<CODE>DL_SHOW_TIME</CODE>. This causes the <CODE>_L_gettime</CODE> routine to 
be
-called before each message which generates the timestamp. A default
-version is provided by the nana library.
-</DL>
-
-</P>
-
-
-<H2><A NAME="SEC25" HREF="nana_toc.html#TOC25">GDB.h: sending plain gdb 
commands to the debugger</A></H2>
-<P>
-<SAMP>`GDB.h'</SAMP> provides macros for generating user specified commands in
-the output of the <SAMP>`nana'</SAMP> command.
-They are not included by default in the <SAMP>`nana.h'</SAMP> file.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDB</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX153"></A>
-Emit a single line command when running this file through <SAMP>`nana'</SAMP>. 
-Note that each line must be passed off separately to the <SAMP>`GDB'</SAMP>
-macro. 
-
-</P>
-<P>
-This could be used to set debugger options or to define procedures
-inside <SAMP>`gdb'</SAMP>, e.g.
-
-</P>
-
-<PRE>
-  GDB(define checkstack);
-  GDB(  if 0 &#60;= n &#38;&#38; n &#60;= 10);
-  GDB(    print "stack ok");
-  GDB(  else);
-  GDB(    print "stack corrupted");
-  GDB(  end);
-  GDB(end);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDBCALL</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX154"></A>
-Causes a single gdb <VAR>command</VAR> to be executed whenever control
-passes through this line of code. After the users command is executed
-control automatically returns to the program.
-
-</P>
-
-<PRE>
-  GDBCALL(set memory_check = 1)
-</PRE>
-
-</DL>
-
-<P>
-These macros could used for instrumenting code or setting up test
-harnesses, e.g.
-
-</P>
-
-<PRE>
-
-GDB(set $siocall = 0);
-GDB(set $sioerr = 0);
-
-void sio_driver() {
-  GDBCALL(set $siocall++)
-  if(SIO_REQ &#38; 0x010) {
-    GDBCALL(set $sioerr++); 
-    ...
-  }
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC26" HREF="nana_toc.html#TOC26">Q.h: support for 
quantifiers</A></H2>
-<P>
-<SAMP>`Q.h'</SAMP> provides support for the quantifiers of predicate logic.  
For
-example to check that all elements in a data structure have some
-property we would use universal (forall, upside down A) quantification.
-To check that one or more values in a data structure have some property
-we would use existential (exists, back the front E) quantification.  For
-example:
-
-</P>
-
-<PRE>
-  /* all values in a[] must be between 0 and 10 */
-  I(A(int i = 0, i &#60; n_array, i++, 0 &#60;= a[i] &#38;&#38; a[i] &#60;= 
10));
-
-  /* there exists a value in linked list l which is smaller than 10 */
-  I(E(node *p = l, p != NULL, p = p-&#62;next, p-&#62;data &#60;= 10));
-</PRE>
-
-<P>
-The first three arguments to <SAMP>`A'</SAMP> and <SAMP>`E'</SAMP> are similar 
-to a C <SAMP>`for'</SAMP> loop which iterates over the values we wish to
-check. The final argument is the expression that must be true.
-
-</P>
-<P>
-The only minor difference from the C <SAMP>`for'</SAMP> loop is that variables
-may be declared at the start of the loop, even if you are using C rather
-than C++ which already supports this.<A NAME="DOCF8" 
HREF="nana_foot.html#FOOT8">(8)</A>
-
-</P>
-<P>
-The <SAMP>`Q.h'</SAMP> macros can also be nested and used anywhere a boolean 
-value is required. For example:
-
-</P>
-
-<PRE>
-  if(A(int i = 0, i &#60; MAXX, i++,
-       A(int j = 0, j &#60; MAXY, j++,
-         m[i][j] == (i == j ? 1 : 0)))) { 
-        /* identity matrix, i.e. all 0's except for 1's on */
-        /* the diagonal */
-        ...
-  } else {
-        /* not an identity matrix */
-        ...
-  }
-</PRE>
-
-<P>
-The results from these 
-macros can also be combined using boolean operations, e.g.
-
-</P>
-
-<PRE>
-  /* the values in a[i]  are either ALL positive or ALL negative */
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)
-    ||
-    A(int i = 0, i &#60; MAX, i++, a[i] &#60; 0));
-</PRE>
-
-<P>
-<STRONG>Portability:</STRONG> note the macros in this file require the GNU
-CC/C++ statement expression extension of GCC to work. If your not using GNU CC
-then for now you are out of luck. At some time in the future we may
-implement a method which will work for standard C++, standard C is a bit of
-a challenge.
-
-</P>
-<P>
-<STRONG>Portability:</STRONG> unfortunately these macros do not for the 
-<SAMP>`DI'</SAMP> and <SAMP>`DL'</SAMP> macros since the statement expression 
extension has 
-not been implemented in GDB.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>A</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX155"></A>
-For all values generated by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> the 
<VAR>exprn</VAR> must be
-true. 
-
-<PRE>
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); /* all a[i] are +ve */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX156"></A>
-There exists at least one value for <VAR>exprn</VAR> generated by
- <SAMP>`for (<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> 
which is true.
-
-</P>
-
-<PRE>
-  /* one or more a[i] &#62;= 0 */
-  I(E(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> long <B>C</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX157"></A>
-Returns the number of times the <VAR>exprn</VAR> is true over the values
-generated by 
<SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-
-</P>
-
-<PRE>
-  /* 3 elements of a[] are +ve */
-  I(C(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0) == 3); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX158"></A>
-There exists only one value generated by 
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> for 
which the <VAR>exprn</VAR>
-is true.
-
-</P>
-
-<PRE>
-  /* a single elements of a[] is +ve */
-  I(E1(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>S</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX159"></A>
-Sum the values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>. The 
type of the value
-returned  is given by the type of the <VAR>exprn</VAR>.<A NAME="DOCF9" 
HREF="nana_foot.html#FOOT9">(9)</A>
-
-</P>
-
-<PRE>
-  /* sum of a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i]) == 10);
-
-  /* sum of all +ve numbers in a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0 ? a[i] : 0) == 10);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>P</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX160"></A>
-Returns the product of the 
-values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-The type returned is the type of the expression.
-
-</P>
-
-<PRE>
-  /* product of all the values in a[] is 10 */
-  I(P(int i = 0, i &#60; MAX, i++, a[i]) == 10); 
-
-  /* a = x^y i.e. x*x..*x y times */
-  I(P(int i = 0, i &#60; y, i++, x) == a);
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC27" HREF="nana_toc.html#TOC27">Qstl.h: quantifiers for STL 
containers.</A></H2>
-<P>
-The Standard Template Library (STL) is a library for C++ that makes
-extensive use of templates to implement the standard container
-classes and much more. Each of the container classes provides an
-interface to iterate over all the objects in the container, e.g.
-
-</P>
-
-<PRE>
-// MAP is an associate array from location(lat,long) onto the name.
-typedef map&#60;location,string,locationlt&#62; MAP;
-
-void print_map_names(MAP&#38; m) { // print out all the names in the map
-  for(MAP::iterator i = m.begin(); i != m.end(); ++i) {
-    cout &#60;&#60; (*i).second &#60;&#60; "\n";
-  }
-}
-</PRE>
-
-<P>
-<SAMP>`Qstl.h'</SAMP> provides the same facilities as <SAMP>`Q.h'</SAMP> but 
uses the
-standard STL iterator protocol shown above. The names in <SAMP>`Qstl.h'</SAMP>
-are generated by appending a <SAMP>`O'</SAMP> (O not zero!) to the names in
-<SAMP>`Q.h'</SAMP>. In particular:
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>AO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX161"></A>
-For all values in the <VAR>container</VAR> class the <VAR>predicate</VAR> must
-be true. The <VAR>predicate</VAR> refers to individual values using
-<VAR>name</VAR>. See the STL documentation for more details. 
-Another way of putting this is forall <VAR>name</VAR> in
-<VAR>container</VAR> the <VAR>predicate</VAR> must be true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char *,ltint&#62; m;
-  // all keys (or indexes) into m are positive 
-  I(AO(i, m, (*i).first &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>EO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX162"></A>
-There exists one or more values in the <VAR>container</VAR> class for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one or more characters in m are '$'
-  I(EO(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1O</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX163"></A>
-There exists one value in the <VAR>container</VAR> for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one characters in m is a '$'
-  I(E1O(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>CO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX164"></A>
-Returns the number of times the <VAR>predicate</VAR> was true for all
-values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-  int nalpha; 
-  // count the number of alphabetic chars in the map
-  nalpha = CO(i, m, isalpha((*i).second)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>SO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX165"></A>
-Sum the <VAR>exprn</VAR> for all values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float sum;
-  // sum all the values in m
-  sum = SO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>PO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX166"></A>
-Take the product of the <VAR>exprn</VAR> for all values in the 
<VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float product;
-  // multiply all the values in m
-  product = PO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC28" HREF="nana_toc.html#TOC28">now.h: measuring time</A></H2>
-<P>
-The <SAMP>`now.h'</SAMP> file provides some simple time measurement routines.
-It is not included in <SAMP>`nana.h'</SAMP> so you must include this file 
-separately.  
-
-</P>
-<P>
-It uses the <SAMP>`gettimeofday'</SAMP> system call and has an accuracy of
-between 1us and 10ms depending on the operating system and hardware
-configuration.
-
-</P>
-<P>
-See the IPM package if you require better measurement tools.<A NAME="DOCF10" 
HREF="nana_foot.html#FOOT10">(10)</A>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now</B> <I>()</I>
-<DD><A NAME="IDX167"></A>
-Returns the time in seconds since the beginning of time as defined by
-your system. If you call <SAMP>`now_reset'</SAMP> the time will start again at
-0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_reset</B> <I>()</I>
-<DD><A NAME="IDX168"></A>
-Reset the times returned by <SAMP>`now'</SAMP> to 0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_delta</B> <I>(double *<VAR>dp</VAR>)</I>
-<DD><A NAME="IDX169"></A>
-Returns the elapsed time between <VAR>*dp</VAR> and <VAR>now()</VAR>. It then 
sets
-<VAR>*dp</VAR> to <VAR>now</VAR>, thus giving a delta time between particular
-events. 
-
-</P>
-
-<PRE>
-  t = now();
-  for(;;) {
-    ...; /* code that must finish in 50ms */
-    I(now_delta(&#38;t) &#60;= 0.050);
-  }
-</PRE>
-
-</DL>
-
-
-
-<H2><A NAME="SEC29" HREF="nana_toc.html#TOC29">eiffel.h: eiffel type 
assertions</A></H2>
-<P>
-Eiffel is a very nice language which provides the assertion checking
-facilities of nana inside the language itself.  The <SAMP>`eiffel.h'</SAMP>
-library is intended to provide a similar setup to Eiffel in the C++
-language. It is a pretty poor emulation, but it is hopefully
-better than nothing.
-
-</P>
-<P>
-Assertion checking is controlled by the <VAR>EIFFEL_CHECK</VAR> variable
-which can take on any of the following values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>CHECK_NO</CODE>
-<DD>
-<A NAME="IDX170"></A>
-Disable all checking.
-<DT><CODE>CHECK_REQUIRE</CODE>
-<DD>
-<A NAME="IDX171"></A>
-Check the preconditions for each method.
-<DT><CODE>CHECK_ENSURE</CODE>
-<DD>
-<A NAME="IDX172"></A>
-And also check the postconditions.
-<DT><CODE>CHECK_INVARIANT</CODE>
-<DD>
-<A NAME="IDX173"></A>
-And also check the class invariant before and after each method is
-called. The programmer should provide a class method called
-<SAMP>`invariant'</SAMP> which returns <SAMP>`true'</SAMP> if the object is 
consistent, 
-<SAMP>`false'</SAMP> otherwise.
-<DT><CODE>CHECK_LOOP</CODE>
-<DD>
-<A NAME="IDX174"></A>
-And also check the loop invariants.
-<DT><CODE>CHECK_ALL</CODE>
-<DD>
-<A NAME="IDX175"></A>
-And also check any assertions using the <SAMP>`CHECK'</SAMP> instruction.
-</DL>
-
-<P>
-A typical compile flag to the compile might be:
-
-</P>
-
-<PRE>
-% g++ -c -DEIFFEL_CHECK=CHECK_ALL play.cc
-</PRE>
-
-<P>
-And then we have the actual assertion macros.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>REQUIRE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX176"></A>
-Called at the beginning of each method.
-This checks the precondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ENSURE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX177"></A>
-Called at the end of each method.
-This checks the postcondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>INVARIANT</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX178"></A>
-Used to check a loop invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>CHECK</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX179"></A>
-Used for any other inline assertions.
-</DL>
-
-</P>
-<P>
-And finally a small example:
-
-</P>
-
-<PRE>
-#include &#60;eiffel.h&#62;
-
-class example {
-  int nobjects;
-  map&#60;location,string,locationlt&#62; layer;
-public:
-  bool invariant();
-  void changeit(location l);
-};
-
-bool example::invariant() {
-  return AO(i,layer,valid_location((*i).first)) &#38;&#38; 
-         nobjects &#62;= 0;
-}
-
-void example::changeit(string n, location l) {
-  REQUIRE(E1O(i,layer,(*i).second == n));
-  ...;
-  while(..) {
-    INVARIANT(...);
-    ...
-    INVARIANT(...);
-  }
-  ...
-  CHECK(x == 5);
-  ...
-  ENSURE(layer[l] == n);
-}
-</PRE>
-
-<P>
-Note that the invariant checking macro <SAMP>`example::invariant'</SAMP>
-is called automatically on function entry/exit using the 
-<SAMP>`REQUIRE'</SAMP> and <SAMP>`ENSURE'</SAMP> macros.
-
-</P>
-
-
-<H2><A NAME="SEC30" HREF="nana_toc.html#TOC30">assert.h: a drop in replacement 
for assert.h</A></H2>
-<P>
-A drop in replacement for <SAMP>`assert.h'</SAMP> is provided in the 
<SAMP>`src'</SAMP>
-directory. It is <STRONG>not</STRONG> installed by default. If you wish to use
-it then you need to copy it to your include directory by hand.
-
-</P>
-<P>
-This might be of use if you are already using <SAMP>`assert.h'</SAMP> and
-wish to save some code space since the nana implementation is more 
-space efficient. 
-
-</P>
-<P>
-Calls to <SAMP>`assert'</SAMP> are translated to calls to <SAMP>`I'</SAMP> and 
-can be disabled by defining <SAMP>`NDEBUG'</SAMP>.
-
-</P>
-
-
-<H2><A NAME="SEC31" HREF="nana_toc.html#TOC31">calls.h: checking/printing many 
objects/facts.</A></H2>
-<P>
-The <SAMP>`calls'</SAMP> module implements a simple list of functions which 
can be 
-modified and executed at run-time. It is similar in spirit to the 
-ANSI C <SAMP>`atexit'</SAMP> function. It is intended to be used for: 
-
-</P>
-
-<UL>
-<LI>Checking the consistency of the components in your system.
-
-For example each module could register a self checking function which
-uses the rest of the nana library. All of these functions would then be
-called using <SAMP>`calls.h'</SAMP> to check that the entire system is 
consistent.
-
-<LI>Printing out the state of your program in a readable format.
-
-</UL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>typedef</B> <I>FUNC</I>
-<DD><A NAME="IDX180"></A>
-A pointer to a <SAMP>`void'</SAMP> function which takes a single 
<SAMP>`void*'</SAMP>
-argument. The <SAMP>`void *'</SAMP> argument is intended to be used to pass
-information such as arguments or pointers to objects (e.g. <SAMP>`this'</SAMP>
-in C++). All of the checking/printing functions must be of this type, e.g.
-
-</P>
-
-<PRE>
-void print_object(void *f) {
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>struct</B> <I>CALL</I>
-<DD><A NAME="IDX181"></A>
-This structure represents a single call to a function, i.e. a function 
-pointer (<SAMP>`FUNC'</SAMP>) and the <SAMP>`void*'</SAMP> argument. 
-
-</P>
-
-<PRE>
-       CALL *head = 0;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_add</B> <I>(CALL **head, FUNC fp, *arg)</I>
-<DD><A NAME="IDX182"></A>
-Adds a call to function <SAMP>`fp'</SAMP> with argument <SAMP>`arg'</SAMP> to
-the list pointed to by <SAMP>`head'</SAMP>. 
-
-</P>
-
-<PRE>
-       CALL *global_checks = 0;
-
-       calls_add(&#38;global_checks,complex_ok,(void *)x); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_exec</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX183"></A>
-Execute all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_exec'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_exec(&#38;l,0,0); /* execute all functions in l  */
-calls_exec(&#38;l,complex_print,0); /* calls complex_print(*) in l */
-calls_exec(&#38;l,0,(void*) &#38;b); /* calls *(&#38;b) in l */
-calls_exec(&#38;l,f,(void*) &#38;b); /* calls f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_delete</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX184"></A>
-Delete all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_delete'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_delete(&#38;l,0,0); /* delete all functions in l  */
-calls_delete(&#38;l,complex_print,0); /* delete complex_print(*) in l */
-calls_delete(&#38;l,0,(void*) &#38;b); /* delete *(&#38;b) in l */
-calls_delete(&#38;l,f,(void*) &#38;b); /* delete f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<STRONG>Note:</STRONG> that calls are added to the head of the list rather 
than the 
-tail. This means that the most recently added call will be 
-executed first (as in a stack).
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_3.html">previous</A>, 
<A HREF="nana_5.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_toc.html
===================================================================
RCS file: nana/manual/html_chapter/nana_toc.html
diff -N nana/manual/html_chapter/nana_toc.html
--- nana/manual/html_chapter/nana_toc.html      28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,72 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Table of Contents</TITLE>
-</HEAD>
-<BODY>
-<H1>GNU Nana</H1>
-<H2>Improved support for assertions and logging in C and C++</H2>
-<H2>last updated 27 February 1998 for version 1.14</H2>
-<ADDRESS>P.J.Maker (<A 
HREF="mailto:address@hidden";>address@hidden</A>)</ADDRESS>
-<P>
-<P><HR><P>
-<UL>
-<LI><A NAME="TOC1" HREF="nana_1.html#SEC1">Introduction</A>
-<UL>
-<LI><A NAME="TOC2" HREF="nana_1.html#SEC2">Related work</A>
-<LI><A NAME="TOC3" HREF="nana_1.html#SEC3">Assert.h considered harmful</A>
-<LI><A NAME="TOC4" HREF="nana_1.html#SEC4">Scope of this document</A>
-</UL>
-<LI><A NAME="TOC5" HREF="nana_2.html#SEC5">Installing the Nana library</A>
-<UL>
-<LI><A NAME="TOC6" HREF="nana_2.html#SEC6">Required Software</A>
-<LI><A NAME="TOC7" HREF="nana_2.html#SEC7">Optional Software</A>
-<LI><A NAME="TOC8" HREF="nana_2.html#SEC8">Configure</A>
-<LI><A NAME="TOC9" HREF="nana_2.html#SEC9">Variables for ./configure</A>
-<LI><A NAME="TOC10" HREF="nana_2.html#SEC10">Supported Platforms</A>
-<LI><A NAME="TOC11" HREF="nana_2.html#SEC11">Supported Debuggers</A>
-<LI><A NAME="TOC12" HREF="nana_2.html#SEC12">Known Problems</A>
-<LI><A NAME="TOC13" HREF="nana_2.html#SEC13">Bug Reports</A>
-<LI><A NAME="TOC14" HREF="nana_2.html#SEC14">New Versions</A>
-</UL>
-<LI><A NAME="TOC15" HREF="nana_3.html#SEC15">Invoking Nana</A>
-<LI><A NAME="TOC16" HREF="nana_4.html#SEC16">Interface</A>
-<UL>
-<LI><A NAME="TOC17" HREF="nana_4.html#SEC17">nana.h: the main header file</A>
-<LI><A NAME="TOC18" HREF="nana_4.html#SEC18">WITHOUT_NANA: disabling all nana 
code for portability.</A>
-<LI><A NAME="TOC19" HREF="nana_4.html#SEC19">I.h: C based invariant 
checking</A>
-<LI><A NAME="TOC20" HREF="nana_4.html#SEC20">DI.h: debugger based invariant 
checking</A>
-<LI><A NAME="TOC21" HREF="nana_4.html#SEC21">L.h: support for printf style 
logging</A>
-<LI><A NAME="TOC22" HREF="nana_4.html#SEC22">L_buffer.h: a circular buffer for 
logging.</A>
-<LI><A NAME="TOC23" HREF="nana_4.html#SEC23">L_times.h: recording events and 
times.</A>
-<LI><A NAME="TOC24" HREF="nana_4.html#SEC24">DL.h: support for printf style 
logging</A>
-<LI><A NAME="TOC25" HREF="nana_4.html#SEC25">GDB.h: sending plain gdb commands 
to the debugger</A>
-<LI><A NAME="TOC26" HREF="nana_4.html#SEC26">Q.h: support for quantifiers</A>
-<LI><A NAME="TOC27" HREF="nana_4.html#SEC27">Qstl.h: quantifiers for STL 
containers.</A>
-<LI><A NAME="TOC28" HREF="nana_4.html#SEC28">now.h: measuring time</A>
-<LI><A NAME="TOC29" HREF="nana_4.html#SEC29">eiffel.h: eiffel type 
assertions</A>
-<LI><A NAME="TOC30" HREF="nana_4.html#SEC30">assert.h: a drop in replacement 
for assert.h</A>
-<LI><A NAME="TOC31" HREF="nana_4.html#SEC31">calls.h: checking/printing many 
objects/facts.</A>
-</UL>
-<LI><A NAME="TOC32" HREF="nana_5.html#SEC32">Using Nana</A>
-<UL>
-<LI><A NAME="TOC33" HREF="nana_5.html#SEC33">Simplest example</A>
-<LI><A NAME="TOC34" HREF="nana_5.html#SEC34">Syslog</A>
-<LI><A NAME="TOC35" HREF="nana_5.html#SEC35">GNU Programs: how to avoid nana 
sometimes</A>
-<LI><A NAME="TOC36" HREF="nana_5.html#SEC36">Embedded Systems: testing 
non-deterministic systems.</A>
-<LI><A NAME="TOC37" HREF="nana_5.html#SEC37">Realtime Systems</A>
-<LI><A NAME="TOC38" HREF="nana_5.html#SEC38">A database</A>
-<LI><A NAME="TOC39" HREF="nana_5.html#SEC39">Program Visualisation: pretty 
pictures</A>
-</UL>
-<LI><A NAME="TOC40" HREF="nana_6.html#SEC40">FAQ</A>
-<LI><A NAME="TOC41" HREF="nana_7.html#SEC41">Future work</A>
-<LI><A NAME="TOC42" HREF="nana_8.html#SEC42">Index</A>
-</UL>
-<P><HR><P>
-This document was generated on 6 November 1998 using the
-<A HREF="http://wwwinfo.cern.ch/dis/texi2html/";>texi2html</A>
-translator version 1.52.</P>
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_5.html
===================================================================
RCS file: nana/manual/html_chapter/nana_5.html
diff -N nana/manual/html_chapter/nana_5.html
--- nana/manual/html_chapter/nana_5.html        7 Feb 2007 02:37:31 -0000       
1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,199 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Using Nana</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_4.html">previous</A>, 
<A HREF="nana_6.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC32" HREF="nana_toc.html#TOC32">Using Nana</A></H1>
-<P>
-This chapter is intended to provide some hopefully useful examples of
-Nana. If any of the users of this library would be so kind as
-to contribute a section on their usage I would be obliged. 
-
-</P>
-<P>
-<STRONG>This section is under development</STRONG>
-
-</P>
-
-
-
-<H2><A NAME="SEC33" HREF="nana_toc.html#TOC33">Simplest example</A></H2>
-<P>
-As a nice simple, indeed trivial example consider the following:
-
-</P>
-
-<OL>
-<LI>Include <SAMP>`nana.h'</SAMP> in your project wide include file.
-
-<LI>Use <SAMP>`I'</SAMP> to check invariants in your code. In particular
-
-all functions or methods should be required to check their pre and post
-conditions.
-<LI>Use <SAMP>`DL'</SAMP> to print debugging messages in your code. This means
-
-that debugging messages only occur when you run the program under the
-debugger.<A NAME="DOCF11" HREF="nana_foot.html#FOOT11">(11)</A>
-</OL>
-
-
-
-<H2><A NAME="SEC34" HREF="nana_toc.html#TOC34">Syslog</A></H2>
-<P>
-<SAMP>`syslog'</SAMP> is a comprehensive logging system written by Eric Allman
-which is available on most Unix systems. It provides facilities for
-sorting messages by source or severity and mechanisms for sending
-messages off to files, terminals or other machines. See chapter 12 of
-the "Unix System Administration Handbook (2nd Edition)" 
-by Nemeth, Snyder, Seebass and Hein for an excellent tutorial on
-<SAMP>`syslog'</SAMP>.
-
-</P>
-<P>
-The rules used by <SAMP>`syslog'</SAMP> are normally defined in
-<SAMP>`/etc/syslog.conf'</SAMP>. Each line specifies the destination for
-messages with particular sources and priorities.  For example:
-
-</P>
-
-<PRE>
-# log mail messages at priority info to mailinfo
-mail.info /var/log/mailinfo
-# log all ftp information to syslog on a remote machine
-ftp.* @remote-machine.cs.ntu.edu.au
-# all critical errors to console
-*.crit   /dev/console
-</PRE>
-
-<P>
-To use <SAMP>`syslog'</SAMP> we merely redefine the default handlers and
-parameter values for <SAMP>`nana'</SAMP>. For example:
-
-</P>
-
-<PRE>
-#include &#60;syslog.h&#62;
-#define L_DEFAULT_HANDLER syslog /* replaces fprintf(3) by syslog(3) */
-#define L_DEFAULT_PARAMS LOG_USER /* default priority for syslog info */
-#include &#60;nana.h&#62;
-
-int main() {
-     openlog("nana", /* identifier for these log messages */
-        LOG_PID, /* also log the process id */
-        LOG_DAEMON /* facility */
-     );
-
-     L("temperature is falling to %d", 35); /* logged at LOG_USER priority */
-     LP(LOG_CRIT, "the snow is falling in Darwin"); /* LOG_CRIT message */
-        
-     closelog();
-     return 0;
-}
-</PRE>
-
-<P>
-This program results in the following addition to 
<SAMP>`/var/adm/messages'</SAMP>:
-
-</P>
-
-<PRE>
-Jun 12 16:04:46 chingiz nana[2671]: the temperature is falling to 35
-Jun 12 16:04:46 chingiz nana[2671]: the snow is falling in Darwin
-</PRE>
-
-<P>
-In addition the <SAMP>`LOG_CRIT'</SAMP> message about snow falling in Darwin is
-sent to the console for immediate action. 
-
-</P>
-<P>
-<STRONG>Note:</STRONG> <SAMP>`syslog'</SAMP> normally uses <SAMP>`UDP'</SAMP> 
for its network
-communications and that <SAMP>`UDP'</SAMP> does not guarantee delivery. 
-
-</P>
-
-
-<H2><A NAME="SEC35" HREF="nana_toc.html#TOC35">GNU Programs: how to avoid nana 
sometimes</A></H2>
-<P>
-Imagine you<A NAME="DOCF12" HREF="nana_foot.html#FOOT12">(12)</A> are building 
a GNU program.
-Ideally it should run on systems without any other software including
-GCC, GDB and even Nana. 
-
-</P>
-<P>
-To achieve this noble goal you can provide your configure script
-with a <SAMP>`--without-nana'</SAMP><A NAME="DOCF13" 
HREF="nana_foot.html#FOOT13">(13)</A> flag which then <SAMP>`#define's'</SAMP>
-<SAMP>`WITHOUT_NANA'</SAMP>. You should also use the <SAMP>`VL'</SAMP> macro 
rather than
-<SAMP>`L'</SAMP> macro since <SAMP>`L'</SAMP> takes a variable number of 
arguments and
-will break non GNU C preprocessors. 
-
-</P>
-
-<PRE>
-int half(int n) {
-  /* Don't use L(...) since it takes a variable number of args! */
-  VL(("hello world = %d\n", 10)); /* Note the doubled (( */
-  ...;
-}
-</PRE>
-
-
-
-<H2><A NAME="SEC36" HREF="nana_toc.html#TOC36">Embedded Systems: testing 
non-deterministic systems.</A></H2>
-<P>
-One of the uses (in fact the original use) for nana is in the 
-testing of non-deterministic systems. These systems behave in a 
-different way each time they are run because of timing or measurement
-noise. Thus you can't just <SAMP>`diff'</SAMP> the results against a known 
good run
-since they run differently each time. 
-
-</P>
-<P>
-Instead you can use a series of programs which execute over a 
-the results of the program and check that the behaviour meets the
-specification automatically. 
-
-</P>
-
-
-<H2><A NAME="SEC37" HREF="nana_toc.html#TOC37">Realtime Systems</A></H2>
-<P>
-Assertions for the timing behaviour of you system can be done in nana
-nicely. You might also consider using an instruction level simulator
-such as PSIM and use the <SAMP>`cycles'</SAMP> variable to test realtime
-constraints.
-
-</P>
-
-
-<H2><A NAME="SEC38" HREF="nana_toc.html#TOC38">A database</A></H2>
-<P>
-Ah databases, business boffins using assertions. It would nice
-to get a real example for this one! 
-
-</P>
-
-
-<H2><A NAME="SEC39" HREF="nana_toc.html#TOC39">Program Visualisation: pretty 
pictures</A></H2>
-<P>
-One nice way to use <SAMP>`L'</SAMP>, <SAMP>`DL'</SAMP>, etc is to punt off 
the messages
-off to a program which displays the information. You would use the
-<SAMP>`L_DEFAULT_PARAM'</SAMP> argument to send commands off to a pipe with
-gnuplot or TCL/TK interpreter running at the end. 
-
-</P>
-<P>
-For a small example of this, see <SAMP>`tcl/status.c'</SAMP>. 
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_4.html">previous</A>, 
<A HREF="nana_6.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_6.html
===================================================================
RCS file: nana/manual/html_chapter/nana_6.html
diff -N nana/manual/html_chapter/nana_6.html
--- nana/manual/html_chapter/nana_6.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,52 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
FAQ</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_5.html">previous</A>, 
<A HREF="nana_7.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC40" HREF="nana_toc.html#TOC40">FAQ</A></H1>
-<P>
-This chapter is intended to answer some general questions about the
-usage of Nana. Most of the material (perhaps) has been presented elsewhere,
-my apologies for repeating myself.
-
-</P>
-
-<OL>
-<LI>Can I use GNU Nana in a commercial product?
-
-See the license details in the file <SAMP>`COPYING'</SAMP>. In summary GNU Nana
-is Free software which has been released under a license that allows
-commercial use provided the copyright is maintained. It is not under
-the GPL. 
-
-<LI>How do you completely disable assertion checking?
-
-Set the <SAMP>`I_LEVEL'</SAMP> command to <SAMP>`0'</SAMP> using 
<SAMP>`-D'</SAMP> or 
-<SAMP>`#define'</SAMP> before including <SAMP>`nana.h'</SAMP>. 
-
-<LI>How do I find out about future releases?
-
-Subscribe to the nana mailing list by using the <SAMP>`make subscribe'</SAMP>
-target in the nana root directory. 
-
-<LI>Where do I send bug reports, suggestions, etc?
-
-<SAMP>address@hidden'</SAMP> -- bug archive
-
-<SAMP>address@hidden'</SAMP> -- mailing list
-
-<SAMP>address@hidden'</SAMP> -- the author
-
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_5.html">previous</A>, 
<A HREF="nana_7.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_3.html
===================================================================
RCS file: nana/manual/html_chapter/nana_3.html
diff -N nana/manual/html_chapter/nana_3.html
--- nana/manual/html_chapter/nana_3.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,183 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Invoking Nana</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_2.html">previous</A>, 
<A HREF="nana_4.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC15" HREF="nana_toc.html#TOC15">Invoking Nana</A></H1>
-<P>
-The functions defined by Nana are implemented either as pure C code or
-as a set of commands which are generated for the debugger. 
-To use the C based support for assertion checking you would use
-something like:
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this file includes the other nana .h files */
-
-int floor_sqrt(int i) { /* returns floor(sqrt(i) */ 
-  int answer;
-  I(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  L("floor_sqrt(%d) == %d\n", 
-        i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To compile and link the previous code you may need to use the 
<SAMP>`-Ipath'</SAMP>
-or <SAMP>`-lnana'</SAMP> flags with the compiler. For example:
-
-</P>
-
-<PRE>
-% gcc toy.c -lnana
-</PRE>
-
-<P>
-If the nana headers have been installed in a strange location you may
-need to do something like:
-
-</P>
-
-<PRE>
-% gcc -I&#60;strange location&#62; toy.c -lnana
-</PRE>
-
-<P>
-The next example uses the debugger versions of <SAMP>`L'</SAMP> and 
<SAMP>`I'</SAMP>.
-If the code is run under the debugger these checks will occur, otherwise
-they take up a negligible amount of space and time.
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this includes the other nana .h files */
-
-int floor_sqrt(int i){
-  int answer;
-  DI(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  DL("floor_sqrt(%d) == %d\n", i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To generate the debugger commands from the C source we just run the
-<SAMP>`nana'</SAMP> filter over the program and then execute the commands
-under gdb using the <SAMP>`source'</SAMP> command.  
-
-</P>
-
-<PRE>
-% nana sqrt.c &#62;sqrt.gdb
-% gdb a.out
-(gdb) source sqrt.gdb
-breakpoint insert: ...
-(gdb) run
-...
-(gdb) quit
-</PRE>
-
-<P>
-Note that any C preprocessor flags which you use must be passed off to 
-the <SAMP>`nana'</SAMP> command. The best way to do this of course is in a
-Makefile. Something like the following works for GNU Make:
-
-</P>
-
-<PRE>
-%.nana: %.c 
-        nana $(CFLAGS) $&#60; &#62;$@
-</PRE>
-
-<P>
-The <SAMP>`nana'</SAMP> filter can also be run over multiple source files in a
-single run if thats more convenient. 
-
-</P>
-<P>
-For convenience a number of other simple scripts are provided, in
-particular to: 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>nana-run</CODE>
-<DD>
-<A NAME="IDX18"></A>
-Run a program under the debugger without prompting, etc.
-For example:
-
-
-<PRE>
-% nana-run a.out -x main.gdb
-output from program
-</PRE>
-
-<DT><CODE>nana-clg</CODE>
-<DD>
-<A NAME="IDX19"></A>
-Compiles the program, generates the debugger commands and the runs the
-program using <SAMP>`nana-run'</SAMP>. For example:
-
-
-<PRE>
-% nana-clg -O3 main.c
-output from program
-</PRE>
-
-You can change the compiler invoked by <SAMP>`nana-clg'</SAMP> by redefining 
-the <SAMP>`NANACC'</SAMP> environment variable. For example:
-
-
-<PRE>
-% NANACC=g++ nana-clg -O3 main.cc
-</PRE>
-
-The installation also <SAMP>`nana-c++lg'</SAMP> which compiles your code
-using a GNU C++ compiler.
-
-<DT><CODE>nana-trace</CODE>
-<DD>
-<A NAME="IDX20"></A>
-Generates a line by line trace of the execution of a program 
-using GDB. For example:
-
-
-<PRE>
-% nana-trace a.out
-54           printf("main()\n");
-55           x = distance(5,-5);
-distance (i=5, j=-5) at test.c:47
-47           i = -i;
-48           j = -j;
-...
-</PRE>
-
-The arguments to <SAMP>`nana-trace'</SAMP> are passed directly to GDB. If you
-wish display variables or call procedures on each line then could use
-something like:
-
-
-<PRE>
-% nana-trace -x mycommands.gdb a.out
-</PRE>
-
-Where the <SAMP>`mycommands.gdb'</SAMP> contains the GDB commands such as 
-<SAMP>`display x'</SAMP> which causes <SAMP>`x'</SAMP> to be printed every 
time the
-debugger gets control of the program.
-
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_2.html">previous</A>, 
<A HREF="nana_4.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_8.html
===================================================================
RCS file: nana/manual/html_chapter/nana_8.html
diff -N nana/manual/html_chapter/nana_8.html
--- nana/manual/html_chapter/nana_8.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,270 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Index</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_7.html">previous</A>, 
next, last section, <A HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC42" HREF="nana_toc.html#TOC42">Index</A></H1>
-<P>
-Jump to:
-<A HREF="#cindex_0">0</A>
--
-<A HREF="#cindex_1">1</A>
--
-<A HREF="#cindex_2">2</A>
--
-<A HREF="#cindex_a">a</A>
--
-<A HREF="#cindex_c">c</A>
--
-<A HREF="#cindex_d">d</A>
--
-<A HREF="#cindex_e">e</A>
--
-<A HREF="#cindex_f">f</A>
--
-<A HREF="#cindex_g">g</A>
--
-<A HREF="#cindex_i">i</A>
--
-<A HREF="#cindex_l">l</A>
--
-<A HREF="#cindex_n">n</A>
--
-<A HREF="#cindex_p">p</A>
--
-<A HREF="#cindex_q">q</A>
--
-<A HREF="#cindex_r">r</A>
--
-<A HREF="#cindex_s">s</A>
--
-<A HREF="#cindex_t">t</A>
--
-<A HREF="#cindex_v">v</A>
-<P>
-<H2><A NAME="cindex_0">0</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX30">0</A>, <A HREF="nana_4.html#IDX62">0</A>, <A 
HREF="nana_4.html#IDX108">0</A>, <A HREF="nana_4.html#IDX148">0</A>
-</DIR>
-<H2><A NAME="cindex_1">1</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX31">1</A>, <A HREF="nana_4.html#IDX63">1</A>, <A 
HREF="nana_4.html#IDX107">1</A>, <A HREF="nana_4.html#IDX147">1</A>
-</DIR>
-<H2><A NAME="cindex_2">2</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX32">2</A>, <A HREF="nana_4.html#IDX64">2</A>, <A 
HREF="nana_4.html#IDX106">2</A>, <A HREF="nana_4.html#IDX146">2</A>
-</DIR>
-<H2><A NAME="cindex_a">a</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX1">A</A>, <A HREF="nana_4.html#IDX155">A</A>
-<LI><A HREF="nana_2.html#IDX15">abort()</A>
-<LI><A HREF="nana_2.html#IDX17">ALWAYS_INCLUDE_MALLOC</A>
-<LI><A HREF="nana_4.html#IDX161">AO</A>
-<LI><A HREF="nana_2.html#IDX13">asm("hlt")</A>
-<LI><A HREF="nana_2.html#IDX14">asm("stp")</A>
-</DIR>
-<H2><A NAME="cindex_c">c</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX4">C</A>, <A HREF="nana_4.html#IDX157">C</A>
-<LI><A HREF="nana_4.html#IDX182">calls_add</A>
-<LI><A HREF="nana_4.html#IDX184">calls_delete</A>
-<LI><A HREF="nana_4.html#IDX183">calls_exec</A>
-<LI><A HREF="nana_4.html#IDX179">CHECK</A>
-<LI><A HREF="nana_4.html#IDX175">CHECK_ALL</A>
-<LI><A HREF="nana_4.html#IDX172">CHECK_ENSURE</A>
-<LI><A HREF="nana_4.html#IDX173">CHECK_INVARIANT</A>
-<LI><A HREF="nana_4.html#IDX174">CHECK_LOOP</A>
-<LI><A HREF="nana_4.html#IDX170">CHECK_NO</A>
-<LI><A HREF="nana_4.html#IDX171">CHECK_REQUIRE</A>
-<LI><A HREF="nana_4.html#IDX164">CO</A>
-</DIR>
-<H2><A NAME="cindex_d">d</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX59">DI</A>, <A HREF="nana_4.html#IDX73">DI</A>
-<LI><A HREF="nana_4.html#IDX22">DI.h</A>
-<LI><A HREF="nana_4.html#IDX65">DI_DEFAULT_GUARD</A>
-<LI><A HREF="nana_4.html#IDX67">DI_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_4.html#IDX66">DI_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_4.html#IDX61">DI_LEVEL</A>
-<LI><A HREF="nana_2.html#IDX10">DI_MAKE_VALID_BREAKPOINT</A>, <A 
HREF="nana_4.html#IDX72">DI_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana_4.html#IDX74">DIG</A>
-<LI><A HREF="nana_4.html#IDX77">DIGH</A>
-<LI><A HREF="nana_4.html#IDX80">DIGHP</A>
-<LI><A HREF="nana_4.html#IDX78">DIGP</A>
-<LI><A HREF="nana_4.html#IDX75">DIH</A>
-<LI><A HREF="nana_4.html#IDX79">DIHP</A>
-<LI><A HREF="nana_4.html#IDX76">DIP</A>
-<LI><A HREF="nana_4.html#IDX131">DL</A>
-<LI><A HREF="nana_4.html#IDX24">DL.h</A>
-<LI><A HREF="nana_4.html#IDX150">DL_DEFAULT_GUARD</A>
-<LI><A HREF="nana_4.html#IDX149">DL_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_4.html#IDX151">DL_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_4.html#IDX145">DL_LEVEL</A>
-<LI><A HREF="nana_2.html#IDX11">DL_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana_4.html#IDX152">DL_SHOW_TIME</A>
-<LI><A HREF="nana_4.html#IDX132">DLG</A>
-<LI><A HREF="nana_4.html#IDX137">DLGHP</A>
-<LI><A HREF="nana_4.html#IDX135">DLGP</A>
-<LI><A HREF="nana_4.html#IDX133">DLH</A>
-<LI><A HREF="nana_4.html#IDX136">DLHP</A>
-<LI><A HREF="nana_4.html#IDX134">DLP</A>
-<LI><A HREF="nana_4.html#IDX60">DN</A>, <A HREF="nana_4.html#IDX81">DN</A>
-<LI><A HREF="nana_4.html#IDX82">DNG</A>
-<LI><A HREF="nana_4.html#IDX85">DNGH</A>
-<LI><A HREF="nana_4.html#IDX88">DNGHP</A>
-<LI><A HREF="nana_4.html#IDX86">DNGP</A>
-<LI><A HREF="nana_4.html#IDX83">DNH</A>
-<LI><A HREF="nana_4.html#IDX87">DNHP</A>
-<LI><A HREF="nana_4.html#IDX84">DNP</A>
-<LI><A HREF="nana_4.html#IDX89">DS</A>
-<LI><A HREF="nana_4.html#IDX90">DSG</A>
-</DIR>
-<H2><A NAME="cindex_e">e</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX2">E</A>, <A HREF="nana_4.html#IDX156">E</A>
-<LI><A HREF="nana_1.html#IDX3">E1</A>, <A HREF="nana_4.html#IDX158">E1</A>
-<LI><A HREF="nana_4.html#IDX163">E1O</A>
-<LI><A HREF="nana_4.html#IDX177">ENSURE</A>
-<LI><A HREF="nana_4.html#IDX162">EO</A>
-<LI><A HREF="nana_4.html#IDX36">exprn</A>, <A 
HREF="nana_4.html#IDX68">exprn</A>
-</DIR>
-<H2><A NAME="cindex_f">f</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX37">file</A>, <A HREF="nana_4.html#IDX69">file</A>
-</DIR>
-<H2><A NAME="cindex_g">g</A></H2>
-<DIR>
-<LI><A HREF="nana_2.html#IDX7">gcc-2.7.2</A>
-<LI><A HREF="nana_4.html#IDX153">GDB</A>
-<LI><A HREF="nana_2.html#IDX8">gdb-4.16</A>
-<LI><A HREF="nana_4.html#IDX26">GDB.h</A>
-<LI><A HREF="nana_4.html#IDX154">GDBCALL</A>
-<LI><A HREF="nana_2.html#IDX9">gmake</A>
-</DIR>
-<H2><A NAME="cindex_i">i</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX27">I</A>, <A HREF="nana_4.html#IDX40">I</A>
-<LI><A HREF="nana_4.html#IDX21">I.h</A>
-<LI><A HREF="nana_4.html#IDX33">I_DEFAULT_GUARD</A>
-<LI><A HREF="nana_2.html#IDX12">I_DEFAULT_HANDLER</A>, <A 
HREF="nana_4.html#IDX35">I_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_4.html#IDX34">I_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_4.html#IDX29">I_LEVEL</A>
-<LI><A HREF="nana_4.html#IDX56">ID</A>
-<LI><A HREF="nana_4.html#IDX41">IG</A>
-<LI><A HREF="nana_4.html#IDX44">IGH</A>
-<LI><A HREF="nana_4.html#IDX47">IGHP</A>
-<LI><A HREF="nana_4.html#IDX45">IGP</A>
-<LI><A HREF="nana_4.html#IDX42">IH</A>
-<LI><A HREF="nana_4.html#IDX46">IHP</A>
-<LI><A HREF="nana_4.html#IDX178">INVARIANT</A>
-<LI><A HREF="nana_4.html#IDX43">IP</A>
-<LI><A HREF="nana_4.html#IDX57">IS</A>
-<LI><A HREF="nana_4.html#IDX58">ISG</A>
-</DIR>
-<H2><A NAME="cindex_l">l</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX91">L</A>
-<LI><A HREF="nana_4.html#IDX23">L.h</A>
-<LI><A HREF="nana_4.html#IDX115">L_BUFFER</A>
-<LI><A HREF="nana_4.html#IDX122">L_buffer_clear</A>
-<LI><A HREF="nana_4.html#IDX116">L_buffer_create</A>
-<LI><A HREF="nana_4.html#IDX117">L_buffer_delete</A>
-<LI><A HREF="nana_4.html#IDX123">L_buffer_dump</A>
-<LI><A HREF="nana_4.html#IDX119">L_buffer_printf</A>
-<LI><A HREF="nana_4.html#IDX121">L_buffer_putchar</A>
-<LI><A HREF="nana_4.html#IDX120">L_buffer_puts</A>
-<LI><A HREF="nana_4.html#IDX118">L_buffer_wraparound</A>
-<LI><A HREF="nana_4.html#IDX110">L_DEFAULT_GUARD</A>
-<LI><A HREF="nana_4.html#IDX109">L_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_4.html#IDX111">L_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_4.html#IDX105">L_LEVEL</A>
-<LI><A HREF="nana_4.html#IDX112">L_SHOW_TIME</A>
-<LI><A HREF="nana_4.html#IDX113">L_SHOW_TIME_FORMAT</A>
-<LI><A HREF="nana_4.html#IDX114">L_SHOW_TIME_NOW</A>
-<LI><A HREF="nana_4.html#IDX124">L_TIMES</A>
-<LI><A HREF="nana_4.html#IDX128">L_times_add</A>
-<LI><A HREF="nana_4.html#IDX130">L_times_clear</A>
-<LI><A HREF="nana_4.html#IDX125">L_times_create</A>
-<LI><A HREF="nana_4.html#IDX126">L_times_delete</A>
-<LI><A HREF="nana_4.html#IDX129">L_times_dump</A>
-<LI><A HREF="nana_4.html#IDX127">L_times_wraparound</A>
-<LI><A HREF="nana_4.html#IDX92">LG</A>
-<LI><A HREF="nana_4.html#IDX97">LGHP</A>
-<LI><A HREF="nana_4.html#IDX95">LGP</A>
-<LI><A HREF="nana_4.html#IDX93">LH</A>
-<LI><A HREF="nana_4.html#IDX96">LHP</A>
-<LI><A HREF="nana_4.html#IDX38">line</A>, <A HREF="nana_4.html#IDX70">line</A>
-<LI><A HREF="nana_4.html#IDX94">LP</A>
-</DIR>
-<H2><A NAME="cindex_n">n</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX28">N</A>, <A HREF="nana_4.html#IDX48">N</A>
-<LI><A HREF="nana_3.html#IDX19">nana-clg</A>
-<LI><A HREF="nana_3.html#IDX18">nana-run</A>
-<LI><A HREF="nana_3.html#IDX20">nana-trace</A>
-<LI><A HREF="nana_4.html#IDX49">NG</A>
-<LI><A HREF="nana_4.html#IDX52">NGH</A>
-<LI><A HREF="nana_4.html#IDX55">NGHP</A>
-<LI><A HREF="nana_4.html#IDX53">NGP</A>
-<LI><A HREF="nana_4.html#IDX50">NH</A>
-<LI><A HREF="nana_4.html#IDX54">NHP</A>
-<LI><A HREF="nana_4.html#IDX167">now</A>
-<LI><A HREF="nana_4.html#IDX169">now_delta</A>
-<LI><A HREF="nana_4.html#IDX168">now_reset</A>
-<LI><A HREF="nana_4.html#IDX51">NP</A>
-</DIR>
-<H2><A NAME="cindex_p">p</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX6">P</A>, <A HREF="nana_4.html#IDX160">P</A>
-<LI><A HREF="nana_4.html#IDX39">param</A>, <A 
HREF="nana_4.html#IDX71">param</A>
-<LI><A HREF="nana_4.html#IDX166">PO</A>
-</DIR>
-<H2><A NAME="cindex_q">q</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX25">Q.h</A>
-</DIR>
-<H2><A NAME="cindex_r">r</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX176">REQUIRE</A>
-<LI><A HREF="nana_2.html#IDX16">restart()</A>
-</DIR>
-<H2><A NAME="cindex_s">s</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX5">S</A>, <A HREF="nana_4.html#IDX159">S</A>
-<LI><A HREF="nana_4.html#IDX165">SO</A>
-<LI><A HREF="nana_4.html#IDX181">struct</A>
-</DIR>
-<H2><A NAME="cindex_t">t</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX180">typedef</A>
-</DIR>
-<H2><A NAME="cindex_v">v</A></H2>
-<DIR>
-<LI><A HREF="nana_4.html#IDX138">VDL</A>
-<LI><A HREF="nana_4.html#IDX139">VDLG</A>
-<LI><A HREF="nana_4.html#IDX144">VDLGHP</A>
-<LI><A HREF="nana_4.html#IDX142">VDLGP</A>
-<LI><A HREF="nana_4.html#IDX140">VDLH</A>
-<LI><A HREF="nana_4.html#IDX143">VDLHP</A>
-<LI><A HREF="nana_4.html#IDX141">VDLP</A>
-<LI><A HREF="nana_4.html#IDX98">VL</A>
-<LI><A HREF="nana_4.html#IDX99">VLG</A>
-<LI><A HREF="nana_4.html#IDX104">VLGHP</A>
-<LI><A HREF="nana_4.html#IDX102">VLGP</A>
-<LI><A HREF="nana_4.html#IDX100">VLH</A>
-<LI><A HREF="nana_4.html#IDX103">VLHP</A>
-<LI><A HREF="nana_4.html#IDX101">VLP</A>
-</DIR>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_7.html">previous</A>, 
next, last section, <A HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_7.html
===================================================================
RCS file: nana/manual/html_chapter/nana_7.html
diff -N nana/manual/html_chapter/nana_7.html
--- nana/manual/html_chapter/nana_7.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Future work</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_6.html">previous</A>, 
<A HREF="nana_8.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC41" HREF="nana_toc.html#TOC41">Future work</A></H1>
-<P>
-As usual, there is more work to be done than time to do it in.
-Workers or test pilots are invited to apply for the following
-tasks which may get down in the fullness of time minister. 
-I'm particularly interested in which projects people think 
-are worthwhile (or rubbish).
-
-</P>
-
-<OL>
-<LI>Ada support - pre 1.00 versions of nana provided support for
-
-        Ada. Adding a full version of nana into the GNATS compiler 
-        would probably be useful, particularly the real time part.
-<LI>FORTRAN support.
-
-<LI>Message browsing (<SAMP>`emacs/fess.el'</SAMP>) - a very prototypical mode 
for
-
-browsing message logs is distributed with nana. Features include hiding/showing
-lines by regular expression or predicate. If someone who knows what they
-are doing rewrites this that would be a good thing. Or perhaps a modified
-version of <SAMP>`less'</SAMP> would be useful.
-<LI>Program Visualisation (<SAMP>`tcl/status.c'</SAMP>) - another prototype
-
-which uses a small TCL/TK library and nana logging to generate some 
-nice pictures showing the behaviour of the program. For example
-the history of variables over time can be recorded, graphs drawn and
-long message logs kept. A new version of this has been created
-and may be released shortly. 
-<LI>Eiffel shortform program - the shortform of an Eiffel program
-
-contains the function signatures (arguments, etc) together with the
-assertions (pre/post conditions). 
-An extension could perhaps be put in a
-program such as <SAMP>`DOC++'</SAMP> or <SAMP>`cxref'</SAMP> which extracts 
the 
-nana assertions.
-<LI>Automated Testing - combine nana logs with a workbench
-
-that lets you verify properties of the logs using programs <SAMP>`gawk'</SAMP>
-or the <SAMP>`PRECC'</SAMP> (LL infinity version of YACC). This technique has
-been used on industrial strength products quite successfully. 
-<LI>GNU standards - perhaps it would be worthwhile to set up
-
-a prototype for checking and logging in GNU tools. 
-<LI>Extend GDB(1) so that we can support <SAMP>`Q.h'</SAMP> style quantifiers
-
-in <SAMP>`DI.h'</SAMP> expressions. Basically we need to add a restricted form 
-of the statement value expression to GDB.
-<LI>Support for other (particularly ANSI only) compilers.
-
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_6.html">previous</A>, 
<A HREF="nana_8.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_foot.html
===================================================================
RCS file: nana/manual/html_chapter/nana_foot.html
diff -N nana/manual/html_chapter/nana_foot.html
--- nana/manual/html_chapter/nana_foot.html     28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,61 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Footnotes</TITLE>
-</HEAD>
-<BODY>
-<H1>GNU Nana</H1>
-<H2>Improved support for assertions and logging in C and C++</H2>
-<H2>last updated 27 February 1998 for version 1.14</H2>
-<ADDRESS>P.J.Maker (<A 
HREF="mailto:address@hidden";>address@hidden</A>)</ADDRESS>
-<P>
-<P><HR><P>
-<H3><A NAME="FOOT1" HREF="nana_1.html#DOCF1">(1)</A></H3>
-<P>Which is unfortunately quite uncommon in
-the authors experience.
-<H3><A NAME="FOOT2" HREF="nana_2.html#DOCF2">(2)</A></H3>
-<P>And about 60 reset cycles where the machine
-went off into hyperspace
-<H3><A NAME="FOOT3" HREF="nana_2.html#DOCF3">(3)</A></H3>
-<P>This allows variable number of arguments to
-C preprocessor macros.
-<H3><A NAME="FOOT4" HREF="nana_4.html#DOCF4">(4)</A></H3>
-<P>If you don't want a core dump then look at stopping the core
-dumps with <CODE>ulimit</CODE> rather than changing the handler.
-<H3><A NAME="FOOT5" HREF="nana_4.html#DOCF5">(5)</A></H3>
-<P>Side-effects
-include such operations as input/output or assignments, e.g. <SAMP>`x++'</SAMP>
-<H3><A NAME="FOOT6" HREF="nana_4.html#DOCF6">(6)</A></H3>
-<P>Side-effects
-include operations like input/output or assignments.
-<H3><A NAME="FOOT7" HREF="nana_4.html#DOCF7">(7)</A></H3>
-<P>This was suggested by Phil Blecker.
-<H3><A NAME="FOOT8" HREF="nana_4.html#DOCF8">(8)</A></H3>
-<P>ANSI C does not allow
-variable declarations at the beginning of loops unlike C++. The
- <SAMP>`Q.h'</SAMP> macros get around this by starting each loop with a new
-scope.
-<H3><A NAME="FOOT9" HREF="nana_4.html#DOCF9">(9)</A></H3>
-<P>This uses yet
-another GNU CC extension, however since we are already using statement 
-expressions we might as well use <SAMP>`typeof'</SAMP> as well.
-<H3><A NAME="FOOT10" HREF="nana_4.html#DOCF10">(10)</A></H3>
-<P>In
-the fullness of time, we may integrate these routines in here.
-<H3><A NAME="FOOT11" HREF="nana_5.html#DOCF11">(11)</A></H3>
-<P>Of course you also need to use the gdb commands
-generated by the <SAMP>`nana'</SAMP> command, perhaps using 
<SAMP>`nana-clg'</SAMP>
-<H3><A NAME="FOOT12" HREF="nana_5.html#DOCF12">(12)</A></H3>
-<P>Gordon Matzigkeit contributed some of the 
-ideas presented here and raised this problem.
-<H3><A NAME="FOOT13" HREF="nana_5.html#DOCF13">(13)</A></H3>
-<P>Or add a <SAMP>`--with-nana'</SAMP> flag
-to configure that does the opposite.
-<P><HR><P>
-This document was generated on 6 November 1998 using the
-<A HREF="http://wwwinfo.cern.ch/dis/texi2html/";>texi2html</A>
-translator version 1.52.</P>
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_1.html
===================================================================
RCS file: nana/manual/html_chapter/nana_1.html
diff -N nana/manual/html_chapter/nana_1.html
--- nana/manual/html_chapter/nana_1.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,388 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Introduction</TITLE>
-</HEAD>
-<BODY>
-Go to the first, previous, <A HREF="nana_2.html">next</A>, <A 
HREF="nana_8.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-<P>
-Copyright (C) 1996, 1997, P.J.Maker
-
-</P>
-<P>
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-</P>
-
-
-
-<H1><A NAME="SEC1" HREF="nana_toc.html#TOC1">Introduction</A></H1>
-
-<P>
-Nana is a library that provides support for assertion checking
-and logging in a space and time efficient manner. The aim is to put
-common good practise<A NAME="DOCF1" HREF="nana_foot.html#FOOT1">(1)</A> into a 
library that can be reused rather than
-writing this stuff every time you begin a new project.
-
-</P>
-<P>
-In addition assertion checking and logging code can be implemented using
-a debugger rather than as inline code with a large saving in code space.
-
-</P>
-<P>
-Nana aims to solve the following problems:
-
-</P>
-
-<OL>
-<LI>Avoid the two executables problem (one with asserts in and another
-
-without any).
-
-The code space and time costs of having assertion checking and detailed
-logging code in a program can be high. Normally people construct two
-versions of the program, one with checking code for testing and one
-without checking code for production use.
-
-With nana one version of the executable can be
-built for both testing and release since debugger based checking has 
-negligible space and time impact.
-
-<LI>Configurable: the nana library is designed to be reconfigured by
-
-the user according to their needs. For example we can:
-
-<UL>
-<LI>Modify the behaviour on assertion failure, e.g. to attempt
-
-a system restart rather than just shutting down.
-<LI>Selectively enable and disable assertion checking and
-
-logging both at compile and run time.
-<LI>Send the logging information off to various locations, e.g.
-
-
-<UL>
-<LI>Users terminal
-
-<LI>A file for later checking.
-
-<LI>Another process, e.g. a plotting program or a
-
-program that verifies that the system is behaving itself.
-<LI>A circular buffer in memory.
-
-This is an old embedded systems trick and is very useful
-for production systems. The time cost of logging into 
-memory is not large and when your production system in
-the field has problems you can then see what was happening 
-in the minutes before its unfortunate demise rather than
-asking some user what was happening before it died.
-</UL>
-
-</UL>
-
-<LI>Time and space efficient.
-
-For example the GNU <SAMP>`assert.h'</SAMP> implementation uses 53 bytes for 
-<SAMP>`assert(i&#62;=0)'</SAMP> on a i386. The nana version using the i386 
<SAMP>`stp'</SAMP>
-instruction on assert fail uses 10 bytes. If your willing to accept the
-time penalty this can be reduced to 0 or 1 byte by using debugger based
-assertions.
-
-<LI>Support for formal methods.
-
-
-<UL>
-<LI>Before and after state (e.g. x,x' in the Z notation).
-
-Specifications are often written in terms of the state of
-variables before and after an operation. For example the
-<SAMP>`isempty'</SAMP> operation on a stack should leave the stack
-unchanged. To verify this in nana we could use:
-      
-
-<PRE>
-bool isempty(){ /* true iff stack is empty */
-  DS($s = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  DI($s == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-        
-These <SAMP>`$..'</SAMP> variables are called convenience variables 
-and are implemented by gdb. They have a global scope and are 
-dynamically typed and initialised automatically to 0.
-
-In addition a C only version of before and after state is provided.
-For example:
-
-
-<PRE>
-bool isempty() { /* true iff stack is empty */
-  ID(int olds); /* declare variable to hold old value */
-  IS(olds = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  I(olds == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-<LI>Support for Predicate Calculus.
-
-Nana provides some support for universal (forall) and
-existential  (exists one or more) quantification. For example to specify
-that the string v contains only lower case letters we could use:
-
-
-<PRE>
-  I(A(char *p = v, *p != '\0', p++, islower(*p)));
-</PRE>
-
-These macros can be nested and used as normal boolean values in
-control constructs as well as assertions. Unfortunately they
-depend on the GNU CC statement value extensions and so are not 
-portable. The following macros are defined in <SAMP>`Q.h'</SAMP>:
-
-<DL COMPACT>
-
-<DT><CODE>A</CODE>
-<DD>
-<A NAME="IDX1"></A>
-For all values the expression must be true.
-<DT><CODE>E</CODE>
-<DD>
-<A NAME="IDX2"></A>
-There exists one or more values for which the expression is
-true.
-<DT><CODE>E1</CODE>
-<DD>
-<A NAME="IDX3"></A>
-There exists a single value for which the expression is true.
-<DT><CODE>C</CODE>
-<DD>
-<A NAME="IDX4"></A>
-Returns the number of times the expression is true.
-<DT><CODE>S</CODE>
-<DD>
-<A NAME="IDX5"></A>
-Returns the sum of the expressions.
-<DT><CODE>P</CODE>
-<DD>
-<A NAME="IDX6"></A>
-Returns the product of the expressions.
-</DL>
-
-<LI>Verifying timing.
-
-As well as using nana to verify timings with assertions using a
-hardware supported timer you can also a simulator (e.g. the
-PSIM power pc simulator by Cagney) with gdb. These simulators can
-model time and provide a register called <SAMP>`$cycles'</SAMP> which
-represents the current cycle count of the program. This can be 
-used to check that timing constraints are being meet.
-
-
-<PRE>
-void process_events() {
-  for(;;){ 
-    DS($start = $cycles); 
-    switch(get_event()){
-      case TOO_HOT:
-        ...;
-        DI($start - $cycles &#60;= 120);
-        break;
-      case TOO_COLD:
-        ...;
-        DI($start - $cycles &#60;= 240);
-        break;
-    }
-  }
-}
-</PRE>
-
-</UL>
-
-</OL>
-
-<P>
-The intended audience for Nana includes:
-
-</P>
-
-<UL>
-<LI>Software Engineers.
-
-<LI>Formal methods community.
-
-<LI>Real time programmers.
-
-<LI>System testers.
-
-<LI>People teaching programming.
-
-</UL>
-
-
-
-<H2><A NAME="SEC2" HREF="nana_toc.html#TOC2">Related work</A></H2>
-<P>
-The Nana project was inspired by some other projects, in particular:
-
-</P>
-
-<UL>
-<LI>Anna - Anna stands for "Annotated Ada" where the programmer inserts
-
-various assertions into the code which can be automatically validated. 
-To quote from the WWW Virtual Library entry on Anna:
-
-
-<BLOCKQUOTE>
-<P>
-Anna is a language for formally specifying the intended behaviour of Ada
-programs. It extends Ada with various different kinds of specification
-constructs from ones as simple as assertions, to as complex as algebraic
-specifications. A tool set has been implemented at Stanford for
-Anna, including: 
-
-</P>
-
-<OL>
-<LI>standard DIANA extension packages, parsers, pretty-printers;
-
-<LI>a semantic checker;
-
-<LI>a specification analyser;
-
-<LI>an annotation transformer; and
-
-<LI>a special debugger that allows program debugging based on formal 
specifications
-
-</OL>
-
-<P>
-All tools have been developed in Ada and are therefore extremely
-portable. Anna has thus been ported to many platforms. For more
-information send e-mail to "address@hidden". Before
-down loading the huge Anna release, you may wish to copy and read some
-Anna LaTeX reports.
-
-</P>
-</BLOCKQUOTE>
-
-Anna is available from: <CODE>ftp://anna.stanford.edu/pub/anna</CODE>
-
-<LI>Eiffel - the Eiffel programming language provides support in the language
-
-flexible assertion checking. To quote from the Eiffel page in WWW
-Virtual library:
-
-
-<BLOCKQUOTE>
-
-<P>
-Eiffel is a pure object-oriented language featuring multiple
-inheritance, polymorphism, static typing and dynamic binding, genericity
-(constrained and unconstrained), a disciplined exception mechanism,
-systematic use of assertions to promote programming by contract, and
-deferred classes for high-level design and analysis.
-</BLOCKQUOTE>
-
-<LI>APP - Annotation PreProcessor.
-
-The APP was written by David S. Rosenblum and provides assertion checking
-functions for C and C++. It is implemented using a preprocessor wrapper
-around the C preprocessor and supports quantifiers and before/after state.
- 
-See "A Practical Approach to Programming with Assertions" in
-Vol 21, No. 1, January 1995 of IEEE Transactions on Software Engineering
-for an interesting paper describing APP. Unfortunately the APP tool
-doesn't seem to be freely available (I'm willing to be corrected on this). 
-Note that any similarity between my examples and David's are due
-to morphic resonance.
-</UL>
-
-<P>
-Nana is essentially a poor mans implementation of some of these ideas
-which works for C and C++. Ideally in the best of all possible worlds
-you might want to look at Eiffel or in the military world Ada and Anna.
-If you use TCL/TK you might also be interested in Jon Cook's 
-<SAMP>`AsserTCL'</SAMP> package.
-
-</P>
-
-
-<H2><A NAME="SEC3" HREF="nana_toc.html#TOC3">Assert.h considered 
harmful</A></H2>
-<P>
-Most C programmers become familiar with assertions from the the
-<CODE>assert.h</CODE> header. As such its a very good thing and has a nice
-simple implementation. However it is also inefficient and leads some
-people to the conclusion that assertion checking is an expensive luxury.
-
-</P>
-<P>
-The implementation of <CODE>assert.h</CODE> as distributed with 
<CODE>gcc</CODE>
-looks like the following (after a bit of editing):
-
-</P>
-
-<PRE>
-# ifndef NDEBUG
-# define _assert(ex)   {if (!(ex)) \
-                         {(void)fprintf(stderr, \
-                           "Assertion failed: file \"%s\", line %d\n", \
-                           __FILE__, __LINE__);exit(1);}}
-# define assert(ex)    _assert(ex)
-# else
-# define _assert(ex)
-# define assert(ex)
-# endif
-</PRE>
-
-<P>
-There are are two main problems with this:
-
-</P>
-
-<OL>
-<LI>Code space overhead: each call to <SAMP>`assert'</SAMP> generates 2 
function
-
-calls with 4 and 1 arguments plus strings for error messages. 
-If <CODE>assert.h</CODE> had library code support we could make the 
implementation
-much more space efficient, e.g. by calling a single function on error
-detection.   
-<LI>The default behaviour simply prints a message and dies, ideally
-
-you like to be able to use a debugger to determine why the assertion
-failed. Even if you run this under the debugger you can't observe the
-failures of variables are an assert failure because the process exits
-rather than aborting back to the debugger.
-</OL>
-
-<P>
-Of course everyone merely rewrites their own <SAMP>`assert'</SAMP> macro so
-these are not significant objections. The only problem is if the author
-uses the libraries without modification.
-
-</P>
-
-
-<H2><A NAME="SEC4" HREF="nana_toc.html#TOC4">Scope of this document</A></H2>
-<P>
-This document aims to both describe the library and provide a tutorial
-in its use. Further work is required, particularly on the tutorial sections. 
-If anyone has any suggestions please send them to me.
-
-</P>
-<P><HR><P>
-Go to the first, previous, <A HREF="nana_2.html">next</A>, <A 
HREF="nana_8.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_chapter/nana_2.html
===================================================================
RCS file: nana/manual/html_chapter/nana_2.html
diff -N nana/manual/html_chapter/nana_2.html
--- nana/manual/html_chapter/nana_2.html        28 Oct 2003 20:27:23 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,598 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Installing the Nana library</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_1.html">previous</A>, 
<A HREF="nana_3.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC5" HREF="nana_toc.html#TOC5">Installing the Nana 
library</A></H1>
-<P>
-Nana uses the normal GNU install method in the same way as <SAMP>`gcc'</SAMP>
-and <SAMP>`gdb'</SAMP>. To install nana in the default location
-<SAMP>`/usr/local/{bin,lib,include}'</SAMP> you would use:
-
-</P>
-
-<PRE>
-% gzcat nana-1.10.tar.gz | tar xvf -
-% cd nana-1.10
-% ./configure 
-% make
-% make install
-% make check
-% make check-mail
-% make subscribe 
-</PRE>
-
-<P>
-The <VAR>check-mail</VAR> and <VAR>subscribe</VAR> targets both send e-mail. If
-you need to change the mailer used try something like:
-
-</P>
-
-<PRE>
-% make MAIL=elm subscribe
-</PRE>
-
-<P>
-<STRONG>Note:</STRONG> we need to install nana before running the <SAMP>`make 
check'</SAMP> 
-target. The <SAMP>`check-mail'</SAMP> target sends the test report
-via e-mail to the <SAMP>address@hidden'</SAMP>.
-
-</P>
-<P>
-Of course things are never that simple.  If you want to install Nana in
-a different location or change the behaviour on error detection see section <A 
HREF="nana_2.html#SEC8">Configure</A>.
-
-</P>
-<P>
-Each of the sub-directories nana can be compiled and installed
-separately, e.g. if you don't need the documentation you can just
-compile and install from the <SAMP>`src'</SAMP> sub-directory after doing the
-configure statement.
-
-</P>
-
-
-
-<H2><A NAME="SEC6" HREF="nana_toc.html#TOC6">Required Software</A></H2>
-<P>
-The following software is possibly required to run nana.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>gcc-2.7.2</CODE>
-<DD>
-<A NAME="IDX7"></A>
-Nana makes use of two GNU extensions in its library so you really should
-be using <SAMP>`gcc'</SAMP>. Some of the code can be used with any C compiler,
-though it may not be worth the bother. The dependencies on gcc are in 
-<SAMP>`Q.h'</SAMP> which uses the statement value extension and in 
<SAMP>`L.h'</SAMP>
-which uses the variable number of arguments extension to <SAMP>`cpp'</SAMP>.
-<DT><CODE>gdb-4.16</CODE>
-<DD>
-<A NAME="IDX8"></A>
-A recent version of <SAMP>`gdb'</SAMP> is worthwhile, some early 4.?? versions
-had problems setting a large number of breakpoints.
-<DT><CODE>gmake</CODE>
-<DD>
-<A NAME="IDX9"></A>
-The <SAMP>`configure'</SAMP> script and <SAMP>`Makefiles'</SAMP> are generated 
using the
-<SAMP>`automake'</SAMP> and <SAMP>`autoconf'</SAMP> programs. They should be 
reasonably
-portable but if you have problems try using GNU make. For example on
-some old DEC boxes we have had strange behaviour using the system make.
-</DL>
-
-<P>
-For a listing of porting results including software versions see:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC7" HREF="nana_toc.html#TOC7">Optional Software</A></H2>
-
-<P>
-In addition to the required software you might also be interested
-in:
-
-</P>
-
-<UL>
-<LI><SAMP>`http://www.cs.tu-bs.de/softech/ddd/'</SAMP> -- a smart frontend for
-
-gdb which can display dynamic data structures such as linked lists, etc.
-<LI><SAMP>`ftp://ftp.ci.com.au/pub/psim/'</SAMP> -- a cycle level simulator
-
-for the PowerPC. A fine piece of work.
-</UL>
-
-
-
-<H2><A NAME="SEC8" HREF="nana_toc.html#TOC8">Configure</A></H2>
-<P>
-Nana uses a standard GNU <CODE>autoconf</CODE> generated <CODE>configure</CODE>
-script. The <CODE>configure</CODE> script checks the setup on your machine and
-then generates the appropriate Makefiles. Some of the things checked by
-configure include:
-
-</P>
-
-<OL>
-<LI>Which compiler, compiler flags and libraries to use, e.g. you
-
-might need to include a <CODE>-lposix</CODE> flag to the linker to build 
programs
-on your machine.
-<LI>Which header (.h) files are available on this machine, e.g. is
-
- <CODE>unistd.h</CODE> available on this machine.
-<LI>Where to install programs, header file, man pages, etc.
-
-</OL>
-
-<P>
-In addition <SAMP>`configure'</SAMP> uses the host architecture and operating 
system
-to generate the <SAMP>`nana-config.h'</SAMP> file. This file contains some 
macro
-definitions which define how nana works on particular operating systems
-and hardware architectures. 
-
-</P>
-<P>
-For example on <SAMP>`i386'</SAMP> machines we would use the 
<SAMP>`asm("hlt")'</SAMP>
-instruction whenever an assertion fails, on a <SAMP>`sparc'</SAMP> we would use
-<SAMP>`asm("stp")'</SAMP>. Otherwise we would default to a plain C call to
-<SAMP>`abort()'</SAMP> If <SAMP>`configure'</SAMP> does not recognise your 
machine it
-uses plain C code.
-
-</P>
-<P>
-You may wish to change these defaults on installation, one method is to edit 
-a local copy of the <SAMP>`nana-config.h'</SAMP> file. Alternately you can 
define 
-the code yourself in the call to <SAMP>`configure'</SAMP>. For example
-to redefine the action we take when an error is detected by the <CODE>I</CODE>
-macro we can use: 
-
-</P>
-
-<PRE>
-I_DEFAULT_HANDLER="restart_system()" ./configure
-</PRE>
-
-<P>
-As well as simple calls to routines various other bits of information
-are passed off to the <SAMP>`I_DEFAULT_HANDLER'</SAMP> such as the expression
-that failure and a failure code. For example:
-
-</P>
-
-<PRE>
-% I_DEFAULT_HANDLER="restart(line,file,param)" ./configure
-</PRE>
-
-<P>
-The default for <SAMP>`I_DEFAULT_HANDLER'</SAMP> calls a function which prints 
a
-message and then dumps core.  Different behaviour on failure can be
-organised by setting the <SAMP>`I_DEFAULT'</SAMP> to <SAMP>`fast'</SAMP>, i.e. 
plain
-core dump or <SAMP>`verbose'</SAMP> which prints an error messsage and then 
does
-the core dump.
-
-</P>
-
-<PRE>
-% I_DEFAULT=fast ./configure   
-</PRE>
-
-<P>
- 
-For nana the following examples may be useful:
-
-</P>
-
-<OL>
-<LI><CODE>./configure</CODE>
-
-Accept the default values for everything. In particular the files will
-be installed in:
-
-<SAMP>`/usr/local/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --prefix=~project/tools</CODE>
-
-Install the files into:
-
-<SAMP>`~project/tools/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --bindir=~project/bin --libdir=~/project/lib \<BR>
-
---includedir=~/project/headers --infodir=/usr/local/info \<BR>
---mandir=~/project/doc</CODE>
-
-The install directory for program (<SAMP>`bin'</SAMP>), etc can all be set with
-command line arguments to<SAMP>`configure'</SAMP>.
-
-<LI><CODE>CC=xacc LIBS=-lposix ./configure sun3</CODE>
-
-If the defaults chosen by <SAMP>`configure'</SAMP> are not correct you can
-override them by setting variables such as <CODE>CC</CODE> before calling
- <SAMP>`configure'</SAMP>. The <SAMP>`sun3'</SAMP> argument is used to 
identify the
-machine we are running on and may be necessary on some machines.
-
-<LI><CODE>./configure --help</CODE>
-
-And of course when in doubt ask for help.
-</OL>
-
-<P>
-For even more details see the file <SAMP>`INSTALL.con'</SAMP> which contains 
the
-generic instructions for use with <SAMP>`autoconf'</SAMP> generated
-<SAMP>`configure'</SAMP> scripts.
-
-</P>
-
-
-<H2><A NAME="SEC9" HREF="nana_toc.html#TOC9">Variables for ./configure</A></H2>
-<P>
-The configure program uses the following shell variables to change
-various defaults.  Another method is simply to edit the 
-<SAMP>`nana-config.h'</SAMP> file. Most of these values should be auto 
detected,
-so you can ignore this section until your need to save a few 
-bytes of store by using <SAMP>`asm("hlt")'</SAMP> instead of a call to 
-<SAMP>`abort()'</SAMP>. 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>DI_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX10"></A>
-This text is inserted when the <SAMP>`DI.h'</SAMP> library needs to set a
-breakpoint in the generated code. It should ideally update all
-variables which being kept in registers etc so that gdb gets the
-correct values for each variable.
-
-Possible values include:
-
-
-<OL>
-<LI><SAMP>`asm("nop")'</SAMP> -- a single <SAMP>`nop'</SAMP> instruction to 
set the
-
-breakpoint at.
-
-This is the default.
-
-<LI><SAMP>`_vi = 0'</SAMP> -- where <SAMP>`_vi'</SAMP> is a global volatile 
int.
-
-<LI><SAMP>`_vi = (exprn)'</SAMP> -- where <VAR>exprn</VAR> is the expression
-
-we are checking for this assertion.
-<LI><SAMP>`/* nothing */'</SAMP> -- nothing at all, this means the breakpoint
-
-will be set at the start of the next statement which works most of the
-time. However for some examples this will do the wrong thing.
-</OL>
-
-<DT><CODE>DL_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX11"></A>
-Used for the same purpose as <SAMP>`DI_MAKE_VALID_BREAKPOINT'</SAMP> for
-<SAMP>`DL.h'</SAMP>. It also defaults to <SAMP>`asm("nop")'</SAMP>.
-<DT><CODE>I_DEFAULT_HANDLER</CODE>
-<DD>
-<A NAME="IDX12"></A>
-The code called when <SAMP>`I.h'</SAMP> detects an error.
-<DL COMPACT>
-
-<DT><CODE>asm("hlt")</CODE>
-<DD>
-<A NAME="IDX13"></A>
-Some machines use a <SAMP>`hlt'</SAMP> instruction.
-<DT><CODE>asm("stp")</CODE>
-<DD>
-<A NAME="IDX14"></A>
-And other machines use a <SAMP>`stp'</SAMP> instruction.
-<DT><CODE>abort()</CODE>
-<DD>
-<A NAME="IDX15"></A>
-Or we could use a call to <SAMP>`abort'</SAMP> which is at least standard C. On
-some machines this is significantly larger than a single <SAMP>`hlt'</SAMP>
-instruction. 
-<DT><CODE>restart()</CODE>
-<DD>
-<A NAME="IDX16"></A>
-Or a call to a function which attempts to restart the system.
-</DL>
-<DT><CODE>ALWAYS_INCLUDE_MALLOC</CODE>
-<DD>
-<A NAME="IDX17"></A>
-This is a dodgey for some versions of Linux which don't seem to include 
-<SAMP>`malloc'</SAMP> when you include <SAMP>`stdio.h'</SAMP> and use 
<SAMP>`print'</SAMP>. This
-causes problems for <SAMP>`gdb'</SAMP> since it uses <SAMP>`malloc'</SAMP> in 
the
-executable to implement parts of its functionality. 
-
-This kludge should be removed!
-</DL>
-
-
-
-<H2><A NAME="SEC10" HREF="nana_toc.html#TOC10">Supported Platforms</A></H2>
-<P>
-Nana has been tested on the following platforms:
-
-</P>
-
-<OL>
-<LI>i386-unknown-linux, gcc-2.7.0, gdb-4.16
-
-<LI>sparc-sun-sunos4.1.4, gcc-2.7.2.f.1, gdb-4.16
-
-<LI>sparc-sun-solaris2.3, gcc-2.7.2, gdb-4.16
-
-<LI>alpha-dec-osf3.2, gcc-2.7.2, gdb-4.16
-
-<LI>mips-sgi-irix5.3, gcc-2.7.0, gdb-4.16
-
-<LI>powerpc-ibm-aix3.2.5, gcc-2.6.3, gdb-4.16
-
-</OL>
-
-<P>
-The <SAMP>`alpha-dec-osf3.2'</SAMP>, <SAMP>`mips-sgi-irix5.3'</SAMP> and
-<SAMP>`powerpc-ibm-aix3.2.5'</SAMP> implementations have problems when you
-compile with <SAMP>`-O2'</SAMP> or <SAMP>`-O3'</SAMP> optimisation. This 
causes some
-errors in the the debugger based assertion and logging code since
-variables can be removed or changed by optimisation. At <SAMP>`-O'</SAMP>
-everything passes. Regardless of optimisation the C based checking code
-passes all tests on these platforms.
-
-</P>
-<P>
-If you use nana on a new platform please send the <SAMP>`check.log'</SAMP> file
-to <SAMP>address@hidden'</SAMP> via the <SAMP>`make check-mail'</SAMP>
-command. A machine generated list of this information is available 
-at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC11" HREF="nana_toc.html#TOC11">Supported Debuggers</A></H2>
-
-<P>
-Currently Nana works with the GNU GDB debugger which is available on a
-wide range of platforms including embedded systems and even provides
-support for remote debugging. 
-Porting to any reasonable debugger with conditional
-breakpoints and commands is not very difficult. 
-
-</P>
-<P>
-As an example of an unreasonable debugger, Nana has been ported to
-work with the MicroSoft Codeview debugger. The port is small (60 lines of
-code) but suffers from a problem with variable scoping in Codeview. If
-a breakpoint is set at a point in the code the expressions are not
-evaluated from that particular scope. For example setting a breakpoint
-in the function <CODE>f</CODE> cannot access a variable local to <CODE>f</CODE>
-directly. Codeview has a unique (expletive deleted) scope operator
-which you must use to set the scope <SAMP>`{...}'</SAMP>.  This makes the
-interface somewhat less than beautiful.
-
-</P>
-<P>
-Another good thing about CodeView is to try a debug command which prints a
-message which contains a single open <SAMP>`{'</SAMP>. This of course causes it
-to hang and was the main problem during the porting to CodeView which
-took a whole day<A NAME="DOCF2" HREF="nana_foot.html#FOOT2">(2)</A>. 
-
-</P>
-<P>
-If anyone is interested I may release the CodeView implementation,
-please contact me if you are interested. Of course a better bet is probably 
-to move to the <SAMP>`gdbserver'</SAMP> system. I think <SAMP>`gdb'</SAMP> has 
been released
-as a native even for some MicroSoft operating systems.
-
-</P>
-<P>
-Other debuggers like DBX don't seem to be worth the trouble since gdb
-works on those machines. A redesign of the nana internals may also be useful
-if we decide portability between debuggers is actually useful.
-
-</P>
-
-
-<H2><A NAME="SEC12" HREF="nana_toc.html#TOC12">Known Problems</A></H2>
-<P>
-Nana has the following known features (or perhaps problems):
-
-</P>
-
-<OL>
-<LI>Nana macros which use the debugger
-
-such as <CODE>DI</CODE> or <CODE>DL</CODE> should be on lines by themselves. 
If you
-mix code and nana macros on the same line you will get errors, e.g:
-
-
-<PRE>
-main(){
-   int x;
-   x = 5; x--; DI(x == 4); 
-}
-</PRE>
-
-This doesn't work since breakpoints are set at line boundaries rather
-than statement ones. Of course anyone who writes code like this deserves
-whatever happens to them.
-
-<LI>Optimisation can remove variables so that debugger based
-
-assertions (<SAMP>`DI.h'</SAMP>) do not work correctly. As usual the
-interaction between the debugger and the compiler is rather
-complicated. This may not be a problem if the appropriate compile-time
-flags are selected, e.g. <SAMP>`-O0 and -O1'</SAMP> work on most platforms.
-
-<LI>The <SAMP>`Q.h'</SAMP> macros depend on the statement value extension to
-
-GNU CC so if you wish to use them you must use GCC. This can be fixed
-for C++ in a possibly useful manner, I can't see any solution for C.
-
-<LI>The logging macros depend on the Var Args extension provided by the
-
-GNU C Preprocessor.<A NAME="DOCF3" HREF="nana_foot.html#FOOT3">(3)</A> We 
could (probably will) implement a fix for this 
-based on the tricks in the C FAQ. Unfortunately these tricks are not pretty.
-For now interested users could simply replace their CPP with the GNU CPP
-if they wished to stay with non-standard compilers. 
-
-<LI>The <SAMP>`Q.h'</SAMP> macros do not work in the debugger since 
<SAMP>`gdb'</SAMP>
-
-does support the statement expression extension.
-
-<LI>Multiline expressions do not work as expected in the debugger since
-
-you need to use a blackslash as an escape at the end of the line. 
-For example:
-
-
-<PRE>
-        DI(x +
-            10 &#62; 30);
-</PRE>
-
-A few backslashes may solve this particular problem.
-
-<LI>Problems with the <SAMP>`configure'</SAMP> script.
-
-The <SAMP>`configure'</SAMP> script automatically detects the target operating
-system and architecture and then generates <SAMP>`nana-config.h'</SAMP>. If the
-options selected in <SAMP>`nana-config.h'</SAMP> are incorrect they can be
-edited by hand and installed in the usual include directory. The easiest
-method is simply to delete all macros in <SAMP>`nana-config.h'</SAMP> since the
-system defaults to more portable (and less efficient)
-implementations. If you wish to do this from the configure script you 
-can try giving a unsupported machine type, e.g.
-
-
-<PRE>
-% ./configure pdp11-dec-ultrix
-</PRE>
-
-<LI>Some users have reported problems with the <CODE>configure</CODE>
-
-script detecting <CODE>vsnprintf</CODE>. If <CODE>configure</CODE> doesn't 
find it
-and it does exist then simply define it in <SAMP>`nana-config.h'</SAMP> as per
-the previous question. 
-
-If <CODE>vsnprintf</CODE> really doesn't exist then get a new C library,
-possibly the GNU libc.
-
-<LI>The use of <CODE>vsprintf</CODE> opens a security hole since no
-
-bounds checking is done by it. Nana attempts to use <CODE>vsnprintf</CODE>
-which is safe when it exists but it will resort to <CODE>vsprintf</CODE>
-if it can't find <CODE>vsnprintf</CODE>. All careful people should make
-sure that they have a library with <CODE>vsnprintf</CODE>.
-
-<LI><CODE>STL</CODE> header file errors due to nana.
-
-The C++ <CODE>STL</CODE> header files for version 3.0 at least must
-be included before the <CODE>Q.h</CODE> file. The problem is caused by the STL
-files using <CODE>S</CODE> as a template argument. Of course <CODE>Q.h</CODE> 
uses
-<CODE>S</CODE> for summing a series. Namespace pollution strikes again.
-
-(Thanks to Han Holl for this particular problem).
-</OL>
-
-
-
-<H2><A NAME="SEC13" HREF="nana_toc.html#TOC13">Bug Reports</A></H2>
-
-<P>
-If you think you have found a bug in the Nana library, please
-investigate it and report it.  
-
-</P>
-
-<UL>
-<LI>Please make sure that the bug is really in the Nana library.
-
-<LI>You have to send us a test case that makes it possible for us to
-
-reproduce the bug.
-<LI>You also have to explain what is wrong; if you get a crash, or if the
-
-results printed are not good and in that case, in what way.
-Make sure that the bug report includes all information you would
-need to fix this kind of bug for someone else.  
-</UL>
-
-<P>
-If your bug report is good, we will do our best to help you to get a
-corrected version of the library; if the bug report is poor, we won't do
-anything about it (apart from asking you to send better bug reports).
-
-</P>
-<P>
-Send your bug report to:
-
-</P>
-<P>
-<SAMP>address@hidden'</SAMP>
-
-</P>
-<P>
-Copies of bug reports will be kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-
-
-<H2><A NAME="SEC14" HREF="nana_toc.html#TOC14">New Versions</A></H2>
-<P>
-New versions of nana will be made available at:
-
-</P>
-<P>
-<SAMP>`ftp://ftp.cs.ntu.edu.au/pub/nana/'</SAMP> 
-
-</P>
-<P>
-If you wish to be informed about new
-releases of nana then subscribe to the nana mailing list. 
-Send a message containing <SAMP>`subscribe'</SAMP> &#60;your e-mail 
address&#62; to:
-
-</P>
-<P>
-<SAMP>`mailto:address@hidden'</SAMP>. 
-
-</P>
-<P>
-A hypermail archive of this list is kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/hypermail/nana-archive'</SAMP>
-
-</P>
-<P>
-If you wish to send a message to the list send it to
-<SAMP>`mailto:address@hidden'</SAMP>.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_1.html">previous</A>, 
<A HREF="nana_3.html">next</A>, <A HREF="nana_8.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/texi/nana.texi.tar.gz
===================================================================
RCS file: nana/manual/texi/nana.texi.tar.gz
diff -N nana/manual/texi/nana.texi.tar.gz
Binary files /tmp/cvsWJdaWU and /dev/null differ

Index: nana/manual/html_node/nana_4.html
===================================================================
RCS file: nana/manual/html_node/nana_4.html
diff -N nana/manual/html_node/nana_4.html
--- nana/manual/html_node/nana_4.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,23 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Scope</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_3.html">previous</A>, 
<A HREF="nana_5.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC4" HREF="nana_toc.html#TOC4">Scope of this document</A></H2>
-<P>
-This document aims to both describe the library and provide a tutorial
-in its use. Further work is required, particularly on the tutorial sections. 
-If anyone has any suggestions please send them to me.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_3.html">previous</A>, 
<A HREF="nana_5.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_toc.html
===================================================================
RCS file: nana/manual/html_node/nana_toc.html
diff -N nana/manual/html_node/nana_toc.html
--- nana/manual/html_node/nana_toc.html 28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,72 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Table of Contents</TITLE>
-</HEAD>
-<BODY>
-<H1>GNU Nana</H1>
-<H2>Improved support for assertions and logging in C and C++</H2>
-<H2>last updated 27 February 1998 for version 1.14</H2>
-<ADDRESS>P.J.Maker (<A 
HREF="mailto:address@hidden";>address@hidden</A>)</ADDRESS>
-<P>
-<P><HR><P>
-<UL>
-<LI><A NAME="TOC1" HREF="nana_1.html#SEC1">Introduction</A>
-<UL>
-<LI><A NAME="TOC2" HREF="nana_2.html#SEC2">Related work</A>
-<LI><A NAME="TOC3" HREF="nana_3.html#SEC3">Assert.h considered harmful</A>
-<LI><A NAME="TOC4" HREF="nana_4.html#SEC4">Scope of this document</A>
-</UL>
-<LI><A NAME="TOC5" HREF="nana_5.html#SEC5">Installing the Nana library</A>
-<UL>
-<LI><A NAME="TOC6" HREF="nana_6.html#SEC6">Required Software</A>
-<LI><A NAME="TOC7" HREF="nana_7.html#SEC7">Optional Software</A>
-<LI><A NAME="TOC8" HREF="nana_8.html#SEC8">Configure</A>
-<LI><A NAME="TOC9" HREF="nana_9.html#SEC9">Variables for ./configure</A>
-<LI><A NAME="TOC10" HREF="nana_10.html#SEC10">Supported Platforms</A>
-<LI><A NAME="TOC11" HREF="nana_11.html#SEC11">Supported Debuggers</A>
-<LI><A NAME="TOC12" HREF="nana_12.html#SEC12">Known Problems</A>
-<LI><A NAME="TOC13" HREF="nana_13.html#SEC13">Bug Reports</A>
-<LI><A NAME="TOC14" HREF="nana_14.html#SEC14">New Versions</A>
-</UL>
-<LI><A NAME="TOC15" HREF="nana_15.html#SEC15">Invoking Nana</A>
-<LI><A NAME="TOC16" HREF="nana_16.html#SEC16">Interface</A>
-<UL>
-<LI><A NAME="TOC17" HREF="nana_17.html#SEC17">nana.h: the main header file</A>
-<LI><A NAME="TOC18" HREF="nana_18.html#SEC18">WITHOUT_NANA: disabling all nana 
code for portability.</A>
-<LI><A NAME="TOC19" HREF="nana_19.html#SEC19">I.h: C based invariant 
checking</A>
-<LI><A NAME="TOC20" HREF="nana_20.html#SEC20">DI.h: debugger based invariant 
checking</A>
-<LI><A NAME="TOC21" HREF="nana_21.html#SEC21">L.h: support for printf style 
logging</A>
-<LI><A NAME="TOC22" HREF="nana_22.html#SEC22">L_buffer.h: a circular buffer 
for logging.</A>
-<LI><A NAME="TOC23" HREF="nana_23.html#SEC23">L_times.h: recording events and 
times.</A>
-<LI><A NAME="TOC24" HREF="nana_24.html#SEC24">DL.h: support for printf style 
logging</A>
-<LI><A NAME="TOC25" HREF="nana_25.html#SEC25">GDB.h: sending plain gdb 
commands to the debugger</A>
-<LI><A NAME="TOC26" HREF="nana_26.html#SEC26">Q.h: support for quantifiers</A>
-<LI><A NAME="TOC27" HREF="nana_27.html#SEC27">Qstl.h: quantifiers for STL 
containers.</A>
-<LI><A NAME="TOC28" HREF="nana_28.html#SEC28">now.h: measuring time</A>
-<LI><A NAME="TOC29" HREF="nana_29.html#SEC29">eiffel.h: eiffel type 
assertions</A>
-<LI><A NAME="TOC30" HREF="nana_30.html#SEC30">assert.h: a drop in replacement 
for assert.h</A>
-<LI><A NAME="TOC31" HREF="nana_31.html#SEC31">calls.h: checking/printing many 
objects/facts.</A>
-</UL>
-<LI><A NAME="TOC32" HREF="nana_32.html#SEC32">Using Nana</A>
-<UL>
-<LI><A NAME="TOC33" HREF="nana_33.html#SEC33">Simplest example</A>
-<LI><A NAME="TOC34" HREF="nana_34.html#SEC34">Syslog</A>
-<LI><A NAME="TOC35" HREF="nana_35.html#SEC35">GNU Programs: how to avoid nana 
sometimes</A>
-<LI><A NAME="TOC36" HREF="nana_36.html#SEC36">Embedded Systems: testing 
non-deterministic systems.</A>
-<LI><A NAME="TOC37" HREF="nana_37.html#SEC37">Realtime Systems</A>
-<LI><A NAME="TOC38" HREF="nana_38.html#SEC38">A database</A>
-<LI><A NAME="TOC39" HREF="nana_39.html#SEC39">Program Visualisation: pretty 
pictures</A>
-</UL>
-<LI><A NAME="TOC40" HREF="nana_40.html#SEC40">FAQ</A>
-<LI><A NAME="TOC41" HREF="nana_41.html#SEC41">Future work</A>
-<LI><A NAME="TOC42" HREF="nana_42.html#SEC42">Index</A>
-</UL>
-<P><HR><P>
-This document was generated on 6 November 1998 using the
-<A HREF="http://wwwinfo.cern.ch/dis/texi2html/";>texi2html</A>
-translator version 1.52.</P>
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_13.html
===================================================================
RCS file: nana/manual/html_node/nana_13.html
diff -N nana/manual/html_node/nana_13.html
--- nana/manual/html_node/nana_13.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,59 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Bug Reports</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_12.html">previous</A>, <A HREF="nana_14.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC13" HREF="nana_toc.html#TOC13">Bug Reports</A></H2>
-
-<P>
-If you think you have found a bug in the Nana library, please
-investigate it and report it.  
-
-</P>
-
-<UL>
-<LI>Please make sure that the bug is really in the Nana library.
-
-<LI>You have to send us a test case that makes it possible for us to
-
-reproduce the bug.
-<LI>You also have to explain what is wrong; if you get a crash, or if the
-
-results printed are not good and in that case, in what way.
-Make sure that the bug report includes all information you would
-need to fix this kind of bug for someone else.  
-</UL>
-
-<P>
-If your bug report is good, we will do our best to help you to get a
-corrected version of the library; if the bug report is poor, we won't do
-anything about it (apart from asking you to send better bug reports).
-
-</P>
-<P>
-Send your bug report to:
-
-</P>
-<P>
-<SAMP>address@hidden'</SAMP>
-
-</P>
-<P>
-Copies of bug reports will be kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_12.html">previous</A>, <A HREF="nana_14.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_12.html
===================================================================
RCS file: nana/manual/html_node/nana_12.html
diff -N nana/manual/html_node/nana_12.html
--- nana/manual/html_node/nana_12.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,118 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Known Problems</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_11.html">previous</A>, <A HREF="nana_13.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC12" HREF="nana_toc.html#TOC12">Known Problems</A></H2>
-<P>
-Nana has the following known features (or perhaps problems):
-
-</P>
-
-<OL>
-<LI>Nana macros which use the debugger
-
-such as <CODE>DI</CODE> or <CODE>DL</CODE> should be on lines by themselves. 
If you
-mix code and nana macros on the same line you will get errors, e.g:
-
-
-<PRE>
-main(){
-   int x;
-   x = 5; x--; DI(x == 4); 
-}
-</PRE>
-
-This doesn't work since breakpoints are set at line boundaries rather
-than statement ones. Of course anyone who writes code like this deserves
-whatever happens to them.
-
-<LI>Optimisation can remove variables so that debugger based
-
-assertions (<SAMP>`DI.h'</SAMP>) do not work correctly. As usual the
-interaction between the debugger and the compiler is rather
-complicated. This may not be a problem if the appropriate compile-time
-flags are selected, e.g. <SAMP>`-O0 and -O1'</SAMP> work on most platforms.
-
-<LI>The <SAMP>`Q.h'</SAMP> macros depend on the statement value extension to
-
-GNU CC so if you wish to use them you must use GCC. This can be fixed
-for C++ in a possibly useful manner, I can't see any solution for C.
-
-<LI>The logging macros depend on the Var Args extension provided by the
-
-GNU C Preprocessor.<A NAME="DOCF3" HREF="nana_foot.html#FOOT3">(3)</A> We 
could (probably will) implement a fix for this 
-based on the tricks in the C FAQ. Unfortunately these tricks are not pretty.
-For now interested users could simply replace their CPP with the GNU CPP
-if they wished to stay with non-standard compilers. 
-
-<LI>The <SAMP>`Q.h'</SAMP> macros do not work in the debugger since 
<SAMP>`gdb'</SAMP>
-
-does support the statement expression extension.
-
-<LI>Multiline expressions do not work as expected in the debugger since
-
-you need to use a blackslash as an escape at the end of the line. 
-For example:
-
-
-<PRE>
-        DI(x +
-            10 &#62; 30);
-</PRE>
-
-A few backslashes may solve this particular problem.
-
-<LI>Problems with the <SAMP>`configure'</SAMP> script.
-
-The <SAMP>`configure'</SAMP> script automatically detects the target operating
-system and architecture and then generates <SAMP>`nana-config.h'</SAMP>. If the
-options selected in <SAMP>`nana-config.h'</SAMP> are incorrect they can be
-edited by hand and installed in the usual include directory. The easiest
-method is simply to delete all macros in <SAMP>`nana-config.h'</SAMP> since the
-system defaults to more portable (and less efficient)
-implementations. If you wish to do this from the configure script you 
-can try giving a unsupported machine type, e.g.
-
-
-<PRE>
-% ./configure pdp11-dec-ultrix
-</PRE>
-
-<LI>Some users have reported problems with the <CODE>configure</CODE>
-
-script detecting <CODE>vsnprintf</CODE>. If <CODE>configure</CODE> doesn't 
find it
-and it does exist then simply define it in <SAMP>`nana-config.h'</SAMP> as per
-the previous question. 
-
-If <CODE>vsnprintf</CODE> really doesn't exist then get a new C library,
-possibly the GNU libc.
-
-<LI>The use of <CODE>vsprintf</CODE> opens a security hole since no
-
-bounds checking is done by it. Nana attempts to use <CODE>vsnprintf</CODE>
-which is safe when it exists but it will resort to <CODE>vsprintf</CODE>
-if it can't find <CODE>vsnprintf</CODE>. All careful people should make
-sure that they have a library with <CODE>vsnprintf</CODE>.
-
-<LI><CODE>STL</CODE> header file errors due to nana.
-
-The C++ <CODE>STL</CODE> header files for version 3.0 at least must
-be included before the <CODE>Q.h</CODE> file. The problem is caused by the STL
-files using <CODE>S</CODE> as a template argument. Of course <CODE>Q.h</CODE> 
uses
-<CODE>S</CODE> for summing a series. Namespace pollution strikes again.
-
-(Thanks to Han Holl for this particular problem).
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_11.html">previous</A>, <A HREF="nana_13.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_19.html
===================================================================
RCS file: nana/manual/html_node/nana_19.html
diff -N nana/manual/html_node/nana_19.html
--- nana/manual/html_node/nana_19.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,259 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
I.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_18.html">previous</A>, <A HREF="nana_20.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC19" HREF="nana_toc.html#TOC19">I.h: C based invariant 
checking</A></H2>
-<P>
-This implements the C based invariant checking code and is a
-replacement for <SAMP>`assert.h'</SAMP>. The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX27"></A>
-The <VAR>exprn</VAR> should always be true if the program is correct.  If the
-<VAR>exprn</VAR> is false a message will be printed, followed by core
-dump.<A NAME="DOCF4" HREF="nana_foot.html#FOOT4">(4)</A>
-
-</P>
-<P>
-Checking can be enabled and disabled by using the <VAR>I_LEVEL</VAR>
-and <VAR>I_DEFAULT_GUARD</VAR> macros. See the definitions below for these
-macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF5" 
HREF="nana_foot.html#FOOT5">(5)</A>
-since disabling checking shouldn't change your programs behaviour.
-
-</P>
-
-<PRE>
-  I(z != 0); 
-  x = y / z;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX28"></A>
-The opposite of <SAMP>`I'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as a piece of syntactic sugar which may be helpful for complicated
-boolean expressions.
-
-</P>
-
-<PRE>
-char* strdup(char *s) {
-  N(s == NULL);
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>I_LEVEL</B>
-<DD><A NAME="IDX29"></A>
-The <SAMP>`I_LEVEL'</SAMP> macro is used to globally enable and disable
-checking by the macros in this file. It can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX30"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>I</CODE>, <CODE>N</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX31"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX32"></A>
-Enable all checking regardless of guard conditions.
-</DL>
-
-<P>
-<CODE>I_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>I_DEFAULT_GUARD</B>
-<DD><A NAME="IDX33"></A>
-The <CODE>I_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>I_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>I_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define I_DEFAULT_GUARD i_guard &#62; 0
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>I_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX34"></A>
-This is passed off to the <CODE>I_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>I_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX35"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>I_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX36"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX37"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX38"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX39"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>I_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-All of the remaining macros are used to individually override the
-default values defined above. Normally these macros would be used in a
-system wide header file to define macros appropriate for the
-application. For example you might use <SAMP>`IH'</SAMP> to define 
-different checking macros for hardware and software faults.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>I</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX40"></A>
-<DT><U>Macro:</U> void <B>IG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX41"></A>
-<DT><U>Macro:</U> void <B>IH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX42"></A>
-<DT><U>Macro:</U> void <B>IP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX43"></A>
-<DT><U>Macro:</U> void <B>IGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX44"></A>
-<DT><U>Macro:</U> void <B>IGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX45"></A>
-<DT><U>Macro:</U> void <B>IHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX46"></A>
-<DT><U>Macro:</U> void <B>IGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX47"></A>
-<DT><U>Macro:</U> void <B>N</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX48"></A>
-<DT><U>Macro:</U> void <B>NG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX49"></A>
-<DT><U>Macro:</U> void <B>NH</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX50"></A>
-<DT><U>Macro:</U> void <B>NP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX51"></A>
-<DT><U>Macro:</U> void <B>NGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX52"></A>
-<DT><U>Macro:</U> void <B>NGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX53"></A>
-<DT><U>Macro:</U> void <B>NHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX54"></A>
-<DT><U>Macro:</U> void <B>NGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX55"></A>
-</DL>
-
-</P>
-<P>
-We also provide support for referring to previous values of variables in 
-postconditions. The <CODE>ID</CODE> macro is used to create variables to 
-save the old state in. The <CODE>IS</CODE> and <CODE>ISG</CODE> macros are to 
-set these values. 
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ID</B> <I>(Text <VAR>decln</VAR>)</I>
-<DD><A NAME="IDX56"></A>
-<DT><U>Macro:</U> void <B>IS</B> <I>(Text <VAR>assignment</VAR>)</I>
-<DD><A NAME="IDX57"></A>
-<DT><U>Macro:</U> void <B>ISG</B> <I>(Text <VAR>decln</VAR>, bool 
<VAR>g</VAR>)</I>
-<DD><A NAME="IDX58"></A>
-</DL>
-
-</P>
-<P>
-For example:
-
-<PRE>
-void ex(int &#38;r) {
-  ID(int oldr = r); /* save parameter */
-  g(r);
-  I(oldr == r); /* check r is unchanged */
-  while(more()) {
-    IS(oldr = r); /* assign r to oldr */
-    h(r);
-    I(oldr == r * r);
-  }
-}
-</PRE>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_18.html">previous</A>, <A HREF="nana_20.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_9.html
===================================================================
RCS file: nana/manual/html_node/nana_9.html
diff -N nana/manual/html_node/nana_9.html
--- nana/manual/html_node/nana_9.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,98 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Variables</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_8.html">previous</A>, 
<A HREF="nana_10.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC9" HREF="nana_toc.html#TOC9">Variables for ./configure</A></H2>
-<P>
-The configure program uses the following shell variables to change
-various defaults.  Another method is simply to edit the 
-<SAMP>`nana-config.h'</SAMP> file. Most of these values should be auto 
detected,
-so you can ignore this section until your need to save a few 
-bytes of store by using <SAMP>`asm("hlt")'</SAMP> instead of a call to 
-<SAMP>`abort()'</SAMP>. 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>DI_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX10"></A>
-This text is inserted when the <SAMP>`DI.h'</SAMP> library needs to set a
-breakpoint in the generated code. It should ideally update all
-variables which being kept in registers etc so that gdb gets the
-correct values for each variable.
-
-Possible values include:
-
-
-<OL>
-<LI><SAMP>`asm("nop")'</SAMP> -- a single <SAMP>`nop'</SAMP> instruction to 
set the
-
-breakpoint at.
-
-This is the default.
-
-<LI><SAMP>`_vi = 0'</SAMP> -- where <SAMP>`_vi'</SAMP> is a global volatile 
int.
-
-<LI><SAMP>`_vi = (exprn)'</SAMP> -- where <VAR>exprn</VAR> is the expression
-
-we are checking for this assertion.
-<LI><SAMP>`/* nothing */'</SAMP> -- nothing at all, this means the breakpoint
-
-will be set at the start of the next statement which works most of the
-time. However for some examples this will do the wrong thing.
-</OL>
-
-<DT><CODE>DL_MAKE_VALID_BREAKPOINT</CODE>
-<DD>
-<A NAME="IDX11"></A>
-Used for the same purpose as <SAMP>`DI_MAKE_VALID_BREAKPOINT'</SAMP> for
-<SAMP>`DL.h'</SAMP>. It also defaults to <SAMP>`asm("nop")'</SAMP>.
-<DT><CODE>I_DEFAULT_HANDLER</CODE>
-<DD>
-<A NAME="IDX12"></A>
-The code called when <SAMP>`I.h'</SAMP> detects an error.
-<DL COMPACT>
-
-<DT><CODE>asm("hlt")</CODE>
-<DD>
-<A NAME="IDX13"></A>
-Some machines use a <SAMP>`hlt'</SAMP> instruction.
-<DT><CODE>asm("stp")</CODE>
-<DD>
-<A NAME="IDX14"></A>
-And other machines use a <SAMP>`stp'</SAMP> instruction.
-<DT><CODE>abort()</CODE>
-<DD>
-<A NAME="IDX15"></A>
-Or we could use a call to <SAMP>`abort'</SAMP> which is at least standard C. On
-some machines this is significantly larger than a single <SAMP>`hlt'</SAMP>
-instruction. 
-<DT><CODE>restart()</CODE>
-<DD>
-<A NAME="IDX16"></A>
-Or a call to a function which attempts to restart the system.
-</DL>
-<DT><CODE>ALWAYS_INCLUDE_MALLOC</CODE>
-<DD>
-<A NAME="IDX17"></A>
-This is a dodgey for some versions of Linux which don't seem to include 
-<SAMP>`malloc'</SAMP> when you include <SAMP>`stdio.h'</SAMP> and use 
<SAMP>`print'</SAMP>. This
-causes problems for <SAMP>`gdb'</SAMP> since it uses <SAMP>`malloc'</SAMP> in 
the
-executable to implement parts of its functionality. 
-
-This kludge should be removed!
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_8.html">previous</A>, 
<A HREF="nana_10.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_5.html
===================================================================
RCS file: nana/manual/html_node/nana_5.html
diff -N nana/manual/html_node/nana_5.html
--- nana/manual/html_node/nana_5.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,64 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Installation</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_4.html">previous</A>, 
<A HREF="nana_6.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC5" HREF="nana_toc.html#TOC5">Installing the Nana 
library</A></H1>
-<P>
-Nana uses the normal GNU install method in the same way as <SAMP>`gcc'</SAMP>
-and <SAMP>`gdb'</SAMP>. To install nana in the default location
-<SAMP>`/usr/local/{bin,lib,include}'</SAMP> you would use:
-
-</P>
-
-<PRE>
-% gzcat nana-1.10.tar.gz | tar xvf -
-% cd nana-1.10
-% ./configure 
-% make
-% make install
-% make check
-% make check-mail
-% make subscribe 
-</PRE>
-
-<P>
-The <VAR>check-mail</VAR> and <VAR>subscribe</VAR> targets both send e-mail. If
-you need to change the mailer used try something like:
-
-</P>
-
-<PRE>
-% make MAIL=elm subscribe
-</PRE>
-
-<P>
-<STRONG>Note:</STRONG> we need to install nana before running the <SAMP>`make 
check'</SAMP> 
-target. The <SAMP>`check-mail'</SAMP> target sends the test report
-via e-mail to the <SAMP>address@hidden'</SAMP>.
-
-</P>
-<P>
-Of course things are never that simple.  If you want to install Nana in
-a different location or change the behaviour on error detection see section <A 
HREF="nana_8.html#SEC8">Configure</A>.
-
-</P>
-<P>
-Each of the sub-directories nana can be compiled and installed
-separately, e.g. if you don't need the documentation you can just
-compile and install from the <SAMP>`src'</SAMP> sub-directory after doing the
-configure statement.
-
-</P>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_4.html">previous</A>, 
<A HREF="nana_6.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_30.html
===================================================================
RCS file: nana/manual/html_node/nana_30.html
diff -N nana/manual/html_node/nana_30.html
--- nana/manual/html_node/nana_30.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,34 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
assert.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_29.html">previous</A>, <A HREF="nana_31.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC30" HREF="nana_toc.html#TOC30">assert.h: a drop in replacement 
for assert.h</A></H2>
-<P>
-A drop in replacement for <SAMP>`assert.h'</SAMP> is provided in the 
<SAMP>`src'</SAMP>
-directory. It is <STRONG>not</STRONG> installed by default. If you wish to use
-it then you need to copy it to your include directory by hand.
-
-</P>
-<P>
-This might be of use if you are already using <SAMP>`assert.h'</SAMP> and
-wish to save some code space since the nana implementation is more 
-space efficient. 
-
-</P>
-<P>
-Calls to <SAMP>`assert'</SAMP> are translated to calls to <SAMP>`I'</SAMP> and 
-can be disabled by defining <SAMP>`NDEBUG'</SAMP>.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_29.html">previous</A>, <A HREF="nana_31.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_15.html
===================================================================
RCS file: nana/manual/html_node/nana_15.html
diff -N nana/manual/html_node/nana_15.html
--- nana/manual/html_node/nana_15.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,183 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Invoking</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_14.html">previous</A>, <A HREF="nana_16.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC15" HREF="nana_toc.html#TOC15">Invoking Nana</A></H1>
-<P>
-The functions defined by Nana are implemented either as pure C code or
-as a set of commands which are generated for the debugger. 
-To use the C based support for assertion checking you would use
-something like:
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this file includes the other nana .h files */
-
-int floor_sqrt(int i) { /* returns floor(sqrt(i) */ 
-  int answer;
-  I(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  L("floor_sqrt(%d) == %d\n", 
-        i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To compile and link the previous code you may need to use the 
<SAMP>`-Ipath'</SAMP>
-or <SAMP>`-lnana'</SAMP> flags with the compiler. For example:
-
-</P>
-
-<PRE>
-% gcc toy.c -lnana
-</PRE>
-
-<P>
-If the nana headers have been installed in a strange location you may
-need to do something like:
-
-</P>
-
-<PRE>
-% gcc -I&#60;strange location&#62; toy.c -lnana
-</PRE>
-
-<P>
-The next example uses the debugger versions of <SAMP>`L'</SAMP> and 
<SAMP>`I'</SAMP>.
-If the code is run under the debugger these checks will occur, otherwise
-they take up a negligible amount of space and time.
-
-</P>
-
-<PRE>
-#include &#60;nana.h&#62; /* this includes the other nana .h files */
-
-int floor_sqrt(int i){
-  int answer;
-  DI(i &#62;= 0); /* assert(i &#62;= 0) if i -ve then exit */
-  ...; /* code to calculate sqrt(i) */
-  DL("floor_sqrt(%d) == %d\n", i, answer);  /* logs a printf style message */
-}
-</PRE>
-
-<P>
-To generate the debugger commands from the C source we just run the
-<SAMP>`nana'</SAMP> filter over the program and then execute the commands
-under gdb using the <SAMP>`source'</SAMP> command.  
-
-</P>
-
-<PRE>
-% nana sqrt.c &#62;sqrt.gdb
-% gdb a.out
-(gdb) source sqrt.gdb
-breakpoint insert: ...
-(gdb) run
-...
-(gdb) quit
-</PRE>
-
-<P>
-Note that any C preprocessor flags which you use must be passed off to 
-the <SAMP>`nana'</SAMP> command. The best way to do this of course is in a
-Makefile. Something like the following works for GNU Make:
-
-</P>
-
-<PRE>
-%.nana: %.c 
-        nana $(CFLAGS) $&#60; &#62;$@
-</PRE>
-
-<P>
-The <SAMP>`nana'</SAMP> filter can also be run over multiple source files in a
-single run if thats more convenient. 
-
-</P>
-<P>
-For convenience a number of other simple scripts are provided, in
-particular to: 
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>nana-run</CODE>
-<DD>
-<A NAME="IDX18"></A>
-Run a program under the debugger without prompting, etc.
-For example:
-
-
-<PRE>
-% nana-run a.out -x main.gdb
-output from program
-</PRE>
-
-<DT><CODE>nana-clg</CODE>
-<DD>
-<A NAME="IDX19"></A>
-Compiles the program, generates the debugger commands and the runs the
-program using <SAMP>`nana-run'</SAMP>. For example:
-
-
-<PRE>
-% nana-clg -O3 main.c
-output from program
-</PRE>
-
-You can change the compiler invoked by <SAMP>`nana-clg'</SAMP> by redefining 
-the <SAMP>`NANACC'</SAMP> environment variable. For example:
-
-
-<PRE>
-% NANACC=g++ nana-clg -O3 main.cc
-</PRE>
-
-The installation also <SAMP>`nana-c++lg'</SAMP> which compiles your code
-using a GNU C++ compiler.
-
-<DT><CODE>nana-trace</CODE>
-<DD>
-<A NAME="IDX20"></A>
-Generates a line by line trace of the execution of a program 
-using GDB. For example:
-
-
-<PRE>
-% nana-trace a.out
-54           printf("main()\n");
-55           x = distance(5,-5);
-distance (i=5, j=-5) at test.c:47
-47           i = -i;
-48           j = -j;
-...
-</PRE>
-
-The arguments to <SAMP>`nana-trace'</SAMP> are passed directly to GDB. If you
-wish display variables or call procedures on each line then could use
-something like:
-
-
-<PRE>
-% nana-trace -x mycommands.gdb a.out
-</PRE>
-
-Where the <SAMP>`mycommands.gdb'</SAMP> contains the GDB commands such as 
-<SAMP>`display x'</SAMP> which causes <SAMP>`x'</SAMP> to be printed every 
time the
-debugger gets control of the program.
-
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_14.html">previous</A>, <A HREF="nana_16.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_38.html
===================================================================
RCS file: nana/manual/html_node/nana_38.html
diff -N nana/manual/html_node/nana_38.html
--- nana/manual/html_node/nana_38.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,22 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - A 
database</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_37.html">previous</A>, <A HREF="nana_39.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC38" HREF="nana_toc.html#TOC38">A database</A></H2>
-<P>
-Ah databases, business boffins using assertions. It would nice
-to get a real example for this one! 
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_37.html">previous</A>, <A HREF="nana_39.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_36.html
===================================================================
RCS file: nana/manual/html_node/nana_36.html
diff -N nana/manual/html_node/nana_36.html
--- nana/manual/html_node/nana_36.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,31 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Embedded Systems</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_35.html">previous</A>, <A HREF="nana_37.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC36" HREF="nana_toc.html#TOC36">Embedded Systems: testing 
non-deterministic systems.</A></H2>
-<P>
-One of the uses (in fact the original use) for nana is in the 
-testing of non-deterministic systems. These systems behave in a 
-different way each time they are run because of timing or measurement
-noise. Thus you can't just <SAMP>`diff'</SAMP> the results against a known 
good run
-since they run differently each time. 
-
-</P>
-<P>
-Instead you can use a series of programs which execute over a 
-the results of the program and check that the behaviour meets the
-specification automatically. 
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_35.html">previous</A>, <A HREF="nana_37.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_42.html
===================================================================
RCS file: nana/manual/html_node/nana_42.html
diff -N nana/manual/html_node/nana_42.html
--- nana/manual/html_node/nana_42.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,270 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Index</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_41.html">previous</A>, next, last section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC42" HREF="nana_toc.html#TOC42">Index</A></H1>
-<P>
-Jump to:
-<A HREF="#cindex_0">0</A>
--
-<A HREF="#cindex_1">1</A>
--
-<A HREF="#cindex_2">2</A>
--
-<A HREF="#cindex_a">a</A>
--
-<A HREF="#cindex_c">c</A>
--
-<A HREF="#cindex_d">d</A>
--
-<A HREF="#cindex_e">e</A>
--
-<A HREF="#cindex_f">f</A>
--
-<A HREF="#cindex_g">g</A>
--
-<A HREF="#cindex_i">i</A>
--
-<A HREF="#cindex_l">l</A>
--
-<A HREF="#cindex_n">n</A>
--
-<A HREF="#cindex_p">p</A>
--
-<A HREF="#cindex_q">q</A>
--
-<A HREF="#cindex_r">r</A>
--
-<A HREF="#cindex_s">s</A>
--
-<A HREF="#cindex_t">t</A>
--
-<A HREF="#cindex_v">v</A>
-<P>
-<H2><A NAME="cindex_0">0</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX30">0</A>, <A HREF="nana_20.html#IDX62">0</A>, <A 
HREF="nana_21.html#IDX108">0</A>, <A HREF="nana_24.html#IDX148">0</A>
-</DIR>
-<H2><A NAME="cindex_1">1</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX31">1</A>, <A HREF="nana_20.html#IDX63">1</A>, <A 
HREF="nana_21.html#IDX107">1</A>, <A HREF="nana_24.html#IDX147">1</A>
-</DIR>
-<H2><A NAME="cindex_2">2</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX32">2</A>, <A HREF="nana_20.html#IDX64">2</A>, <A 
HREF="nana_21.html#IDX106">2</A>, <A HREF="nana_24.html#IDX146">2</A>
-</DIR>
-<H2><A NAME="cindex_a">a</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX1">A</A>, <A HREF="nana_26.html#IDX155">A</A>
-<LI><A HREF="nana_9.html#IDX15">abort()</A>
-<LI><A HREF="nana_9.html#IDX17">ALWAYS_INCLUDE_MALLOC</A>
-<LI><A HREF="nana_27.html#IDX161">AO</A>
-<LI><A HREF="nana_9.html#IDX13">asm("hlt")</A>
-<LI><A HREF="nana_9.html#IDX14">asm("stp")</A>
-</DIR>
-<H2><A NAME="cindex_c">c</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX4">C</A>, <A HREF="nana_26.html#IDX157">C</A>
-<LI><A HREF="nana_31.html#IDX182">calls_add</A>
-<LI><A HREF="nana_31.html#IDX184">calls_delete</A>
-<LI><A HREF="nana_31.html#IDX183">calls_exec</A>
-<LI><A HREF="nana_29.html#IDX179">CHECK</A>
-<LI><A HREF="nana_29.html#IDX175">CHECK_ALL</A>
-<LI><A HREF="nana_29.html#IDX172">CHECK_ENSURE</A>
-<LI><A HREF="nana_29.html#IDX173">CHECK_INVARIANT</A>
-<LI><A HREF="nana_29.html#IDX174">CHECK_LOOP</A>
-<LI><A HREF="nana_29.html#IDX170">CHECK_NO</A>
-<LI><A HREF="nana_29.html#IDX171">CHECK_REQUIRE</A>
-<LI><A HREF="nana_27.html#IDX164">CO</A>
-</DIR>
-<H2><A NAME="cindex_d">d</A></H2>
-<DIR>
-<LI><A HREF="nana_20.html#IDX59">DI</A>, <A HREF="nana_20.html#IDX73">DI</A>
-<LI><A HREF="nana_17.html#IDX22">DI.h</A>
-<LI><A HREF="nana_20.html#IDX65">DI_DEFAULT_GUARD</A>
-<LI><A HREF="nana_20.html#IDX67">DI_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_20.html#IDX66">DI_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_20.html#IDX61">DI_LEVEL</A>
-<LI><A HREF="nana_9.html#IDX10">DI_MAKE_VALID_BREAKPOINT</A>, <A 
HREF="nana_20.html#IDX72">DI_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana_20.html#IDX74">DIG</A>
-<LI><A HREF="nana_20.html#IDX77">DIGH</A>
-<LI><A HREF="nana_20.html#IDX80">DIGHP</A>
-<LI><A HREF="nana_20.html#IDX78">DIGP</A>
-<LI><A HREF="nana_20.html#IDX75">DIH</A>
-<LI><A HREF="nana_20.html#IDX79">DIHP</A>
-<LI><A HREF="nana_20.html#IDX76">DIP</A>
-<LI><A HREF="nana_24.html#IDX131">DL</A>
-<LI><A HREF="nana_17.html#IDX24">DL.h</A>
-<LI><A HREF="nana_24.html#IDX150">DL_DEFAULT_GUARD</A>
-<LI><A HREF="nana_24.html#IDX149">DL_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_24.html#IDX151">DL_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_24.html#IDX145">DL_LEVEL</A>
-<LI><A HREF="nana_9.html#IDX11">DL_MAKE_VALID_BREAKPOINT</A>
-<LI><A HREF="nana_24.html#IDX152">DL_SHOW_TIME</A>
-<LI><A HREF="nana_24.html#IDX132">DLG</A>
-<LI><A HREF="nana_24.html#IDX137">DLGHP</A>
-<LI><A HREF="nana_24.html#IDX135">DLGP</A>
-<LI><A HREF="nana_24.html#IDX133">DLH</A>
-<LI><A HREF="nana_24.html#IDX136">DLHP</A>
-<LI><A HREF="nana_24.html#IDX134">DLP</A>
-<LI><A HREF="nana_20.html#IDX60">DN</A>, <A HREF="nana_20.html#IDX81">DN</A>
-<LI><A HREF="nana_20.html#IDX82">DNG</A>
-<LI><A HREF="nana_20.html#IDX85">DNGH</A>
-<LI><A HREF="nana_20.html#IDX88">DNGHP</A>
-<LI><A HREF="nana_20.html#IDX86">DNGP</A>
-<LI><A HREF="nana_20.html#IDX83">DNH</A>
-<LI><A HREF="nana_20.html#IDX87">DNHP</A>
-<LI><A HREF="nana_20.html#IDX84">DNP</A>
-<LI><A HREF="nana_20.html#IDX89">DS</A>
-<LI><A HREF="nana_20.html#IDX90">DSG</A>
-</DIR>
-<H2><A NAME="cindex_e">e</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX2">E</A>, <A HREF="nana_26.html#IDX156">E</A>
-<LI><A HREF="nana_1.html#IDX3">E1</A>, <A HREF="nana_26.html#IDX158">E1</A>
-<LI><A HREF="nana_27.html#IDX163">E1O</A>
-<LI><A HREF="nana_29.html#IDX177">ENSURE</A>
-<LI><A HREF="nana_27.html#IDX162">EO</A>
-<LI><A HREF="nana_19.html#IDX36">exprn</A>, <A 
HREF="nana_20.html#IDX68">exprn</A>
-</DIR>
-<H2><A NAME="cindex_f">f</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX37">file</A>, <A 
HREF="nana_20.html#IDX69">file</A>
-</DIR>
-<H2><A NAME="cindex_g">g</A></H2>
-<DIR>
-<LI><A HREF="nana_6.html#IDX7">gcc-2.7.2</A>
-<LI><A HREF="nana_25.html#IDX153">GDB</A>
-<LI><A HREF="nana_6.html#IDX8">gdb-4.16</A>
-<LI><A HREF="nana_17.html#IDX26">GDB.h</A>
-<LI><A HREF="nana_25.html#IDX154">GDBCALL</A>
-<LI><A HREF="nana_6.html#IDX9">gmake</A>
-</DIR>
-<H2><A NAME="cindex_i">i</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX27">I</A>, <A HREF="nana_19.html#IDX40">I</A>
-<LI><A HREF="nana_17.html#IDX21">I.h</A>
-<LI><A HREF="nana_19.html#IDX33">I_DEFAULT_GUARD</A>
-<LI><A HREF="nana_9.html#IDX12">I_DEFAULT_HANDLER</A>, <A 
HREF="nana_19.html#IDX35">I_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_19.html#IDX34">I_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_19.html#IDX29">I_LEVEL</A>
-<LI><A HREF="nana_19.html#IDX56">ID</A>
-<LI><A HREF="nana_19.html#IDX41">IG</A>
-<LI><A HREF="nana_19.html#IDX44">IGH</A>
-<LI><A HREF="nana_19.html#IDX47">IGHP</A>
-<LI><A HREF="nana_19.html#IDX45">IGP</A>
-<LI><A HREF="nana_19.html#IDX42">IH</A>
-<LI><A HREF="nana_19.html#IDX46">IHP</A>
-<LI><A HREF="nana_29.html#IDX178">INVARIANT</A>
-<LI><A HREF="nana_19.html#IDX43">IP</A>
-<LI><A HREF="nana_19.html#IDX57">IS</A>
-<LI><A HREF="nana_19.html#IDX58">ISG</A>
-</DIR>
-<H2><A NAME="cindex_l">l</A></H2>
-<DIR>
-<LI><A HREF="nana_21.html#IDX91">L</A>
-<LI><A HREF="nana_17.html#IDX23">L.h</A>
-<LI><A HREF="nana_22.html#IDX115">L_BUFFER</A>
-<LI><A HREF="nana_22.html#IDX122">L_buffer_clear</A>
-<LI><A HREF="nana_22.html#IDX116">L_buffer_create</A>
-<LI><A HREF="nana_22.html#IDX117">L_buffer_delete</A>
-<LI><A HREF="nana_22.html#IDX123">L_buffer_dump</A>
-<LI><A HREF="nana_22.html#IDX119">L_buffer_printf</A>
-<LI><A HREF="nana_22.html#IDX121">L_buffer_putchar</A>
-<LI><A HREF="nana_22.html#IDX120">L_buffer_puts</A>
-<LI><A HREF="nana_22.html#IDX118">L_buffer_wraparound</A>
-<LI><A HREF="nana_21.html#IDX110">L_DEFAULT_GUARD</A>
-<LI><A HREF="nana_21.html#IDX109">L_DEFAULT_HANDLER</A>
-<LI><A HREF="nana_21.html#IDX111">L_DEFAULT_PARAMS</A>
-<LI><A HREF="nana_21.html#IDX105">L_LEVEL</A>
-<LI><A HREF="nana_21.html#IDX112">L_SHOW_TIME</A>
-<LI><A HREF="nana_21.html#IDX113">L_SHOW_TIME_FORMAT</A>
-<LI><A HREF="nana_21.html#IDX114">L_SHOW_TIME_NOW</A>
-<LI><A HREF="nana_23.html#IDX124">L_TIMES</A>
-<LI><A HREF="nana_23.html#IDX128">L_times_add</A>
-<LI><A HREF="nana_23.html#IDX130">L_times_clear</A>
-<LI><A HREF="nana_23.html#IDX125">L_times_create</A>
-<LI><A HREF="nana_23.html#IDX126">L_times_delete</A>
-<LI><A HREF="nana_23.html#IDX129">L_times_dump</A>
-<LI><A HREF="nana_23.html#IDX127">L_times_wraparound</A>
-<LI><A HREF="nana_21.html#IDX92">LG</A>
-<LI><A HREF="nana_21.html#IDX97">LGHP</A>
-<LI><A HREF="nana_21.html#IDX95">LGP</A>
-<LI><A HREF="nana_21.html#IDX93">LH</A>
-<LI><A HREF="nana_21.html#IDX96">LHP</A>
-<LI><A HREF="nana_19.html#IDX38">line</A>, <A 
HREF="nana_20.html#IDX70">line</A>
-<LI><A HREF="nana_21.html#IDX94">LP</A>
-</DIR>
-<H2><A NAME="cindex_n">n</A></H2>
-<DIR>
-<LI><A HREF="nana_19.html#IDX28">N</A>, <A HREF="nana_19.html#IDX48">N</A>
-<LI><A HREF="nana_15.html#IDX19">nana-clg</A>
-<LI><A HREF="nana_15.html#IDX18">nana-run</A>
-<LI><A HREF="nana_15.html#IDX20">nana-trace</A>
-<LI><A HREF="nana_19.html#IDX49">NG</A>
-<LI><A HREF="nana_19.html#IDX52">NGH</A>
-<LI><A HREF="nana_19.html#IDX55">NGHP</A>
-<LI><A HREF="nana_19.html#IDX53">NGP</A>
-<LI><A HREF="nana_19.html#IDX50">NH</A>
-<LI><A HREF="nana_19.html#IDX54">NHP</A>
-<LI><A HREF="nana_28.html#IDX167">now</A>
-<LI><A HREF="nana_28.html#IDX169">now_delta</A>
-<LI><A HREF="nana_28.html#IDX168">now_reset</A>
-<LI><A HREF="nana_19.html#IDX51">NP</A>
-</DIR>
-<H2><A NAME="cindex_p">p</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX6">P</A>, <A HREF="nana_26.html#IDX160">P</A>
-<LI><A HREF="nana_19.html#IDX39">param</A>, <A 
HREF="nana_20.html#IDX71">param</A>
-<LI><A HREF="nana_27.html#IDX166">PO</A>
-</DIR>
-<H2><A NAME="cindex_q">q</A></H2>
-<DIR>
-<LI><A HREF="nana_17.html#IDX25">Q.h</A>
-</DIR>
-<H2><A NAME="cindex_r">r</A></H2>
-<DIR>
-<LI><A HREF="nana_29.html#IDX176">REQUIRE</A>
-<LI><A HREF="nana_9.html#IDX16">restart()</A>
-</DIR>
-<H2><A NAME="cindex_s">s</A></H2>
-<DIR>
-<LI><A HREF="nana_1.html#IDX5">S</A>, <A HREF="nana_26.html#IDX159">S</A>
-<LI><A HREF="nana_27.html#IDX165">SO</A>
-<LI><A HREF="nana_31.html#IDX181">struct</A>
-</DIR>
-<H2><A NAME="cindex_t">t</A></H2>
-<DIR>
-<LI><A HREF="nana_31.html#IDX180">typedef</A>
-</DIR>
-<H2><A NAME="cindex_v">v</A></H2>
-<DIR>
-<LI><A HREF="nana_24.html#IDX138">VDL</A>
-<LI><A HREF="nana_24.html#IDX139">VDLG</A>
-<LI><A HREF="nana_24.html#IDX144">VDLGHP</A>
-<LI><A HREF="nana_24.html#IDX142">VDLGP</A>
-<LI><A HREF="nana_24.html#IDX140">VDLH</A>
-<LI><A HREF="nana_24.html#IDX143">VDLHP</A>
-<LI><A HREF="nana_24.html#IDX141">VDLP</A>
-<LI><A HREF="nana_21.html#IDX98">VL</A>
-<LI><A HREF="nana_21.html#IDX99">VLG</A>
-<LI><A HREF="nana_21.html#IDX104">VLGHP</A>
-<LI><A HREF="nana_21.html#IDX102">VLGP</A>
-<LI><A HREF="nana_21.html#IDX100">VLH</A>
-<LI><A HREF="nana_21.html#IDX103">VLHP</A>
-<LI><A HREF="nana_21.html#IDX101">VLP</A>
-</DIR>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_41.html">previous</A>, next, last section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_17.html
===================================================================
RCS file: nana/manual/html_node/nana_17.html
diff -N nana/manual/html_node/nana_17.html
--- nana/manual/html_node/nana_17.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,45 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
nana.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_16.html">previous</A>, <A HREF="nana_18.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC17" HREF="nana_toc.html#TOC17">nana.h: the main header 
file</A></H2>
-<P>
-The <SAMP>`nana.h'</SAMP> file includes most of the other files in the
-library. In particular it <SAMP>`#include's'</SAMP> the following
-files:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>I.h</CODE>
-<DD>
-<A NAME="IDX21"></A>
-<DT><CODE>DI.h</CODE>
-<DD>
-<A NAME="IDX22"></A>
-<DT><CODE>L.h</CODE>
-<DD>
-<A NAME="IDX23"></A>
-<DT><CODE>DL.h</CODE>
-<DD>
-<A NAME="IDX24"></A>
-<DT><CODE>Q.h</CODE>
-<DD>
-<A NAME="IDX25"></A>
-<DT><CODE>GDB.h</CODE>
-<DD>
-<A NAME="IDX26"></A>
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_16.html">previous</A>, <A HREF="nana_18.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_31.html
===================================================================
RCS file: nana/manual/html_node/nana_31.html
diff -N nana/manual/html_node/nana_31.html
--- nana/manual/html_node/nana_31.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,136 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
calls.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_30.html">previous</A>, <A HREF="nana_32.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC31" HREF="nana_toc.html#TOC31">calls.h: checking/printing many 
objects/facts.</A></H2>
-<P>
-The <SAMP>`calls'</SAMP> module implements a simple list of functions which 
can be 
-modified and executed at run-time. It is similar in spirit to the 
-ANSI C <SAMP>`atexit'</SAMP> function. It is intended to be used for: 
-
-</P>
-
-<UL>
-<LI>Checking the consistency of the components in your system.
-
-For example each module could register a self checking function which
-uses the rest of the nana library. All of these functions would then be
-called using <SAMP>`calls.h'</SAMP> to check that the entire system is 
consistent.
-
-<LI>Printing out the state of your program in a readable format.
-
-</UL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>typedef</B> <I>FUNC</I>
-<DD><A NAME="IDX180"></A>
-A pointer to a <SAMP>`void'</SAMP> function which takes a single 
<SAMP>`void*'</SAMP>
-argument. The <SAMP>`void *'</SAMP> argument is intended to be used to pass
-information such as arguments or pointers to objects (e.g. <SAMP>`this'</SAMP>
-in C++). All of the checking/printing functions must be of this type, e.g.
-
-</P>
-
-<PRE>
-void print_object(void *f) {
-  ...;
-}
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Type:</U> <B>struct</B> <I>CALL</I>
-<DD><A NAME="IDX181"></A>
-This structure represents a single call to a function, i.e. a function 
-pointer (<SAMP>`FUNC'</SAMP>) and the <SAMP>`void*'</SAMP> argument. 
-
-</P>
-
-<PRE>
-       CALL *head = 0;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_add</B> <I>(CALL **head, FUNC fp, *arg)</I>
-<DD><A NAME="IDX182"></A>
-Adds a call to function <SAMP>`fp'</SAMP> with argument <SAMP>`arg'</SAMP> to
-the list pointed to by <SAMP>`head'</SAMP>. 
-
-</P>
-
-<PRE>
-       CALL *global_checks = 0;
-
-       calls_add(&#38;global_checks,complex_ok,(void *)x); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_exec</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX183"></A>
-Execute all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_exec'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_exec(&#38;l,0,0); /* execute all functions in l  */
-calls_exec(&#38;l,complex_print,0); /* calls complex_print(*) in l */
-calls_exec(&#38;l,0,(void*) &#38;b); /* calls *(&#38;b) in l */
-calls_exec(&#38;l,f,(void*) &#38;b); /* calls f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>calls_delete</B> <I>(CALL **head, FUNC fp, void 
*arg)</I>
-<DD><A NAME="IDX184"></A>
-Delete all/some of the calls in the list given by <SAMP>`head'</SAMP>.
-The arguments <SAMP>`fp'</SAMP> and <SAMP>`arg'</SAMP> must both
-match for each individual call. The null pointer (<SAMP>`0'</SAMP>) matches 
-anything whilst any other value requires an exact match between
-the <SAMP>`CALL'</SAMP> and the arguments to <SAMP>`calls_delete'</SAMP>. 
-For example:
-
-</P>
-
-<PRE>
-calls_delete(&#38;l,0,0); /* delete all functions in l  */
-calls_delete(&#38;l,complex_print,0); /* delete complex_print(*) in l */
-calls_delete(&#38;l,0,(void*) &#38;b); /* delete *(&#38;b) in l */
-calls_delete(&#38;l,f,(void*) &#38;b); /* delete f(&#38;b) in l */
-</PRE>
-
-</DL>
-
-<P>
-<STRONG>Note:</STRONG> that calls are added to the head of the list rather 
than the 
-tail. This means that the most recently added call will be 
-executed first (as in a stack).
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_30.html">previous</A>, <A HREF="nana_32.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_6.html
===================================================================
RCS file: nana/manual/html_node/nana_6.html
diff -N nana/manual/html_node/nana_6.html
--- nana/manual/html_node/nana_6.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,53 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Required Software</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_5.html">previous</A>, 
<A HREF="nana_7.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC6" HREF="nana_toc.html#TOC6">Required Software</A></H2>
-<P>
-The following software is possibly required to run nana.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>gcc-2.7.2</CODE>
-<DD>
-<A NAME="IDX7"></A>
-Nana makes use of two GNU extensions in its library so you really should
-be using <SAMP>`gcc'</SAMP>. Some of the code can be used with any C compiler,
-though it may not be worth the bother. The dependencies on gcc are in 
-<SAMP>`Q.h'</SAMP> which uses the statement value extension and in 
<SAMP>`L.h'</SAMP>
-which uses the variable number of arguments extension to <SAMP>`cpp'</SAMP>.
-<DT><CODE>gdb-4.16</CODE>
-<DD>
-<A NAME="IDX8"></A>
-A recent version of <SAMP>`gdb'</SAMP> is worthwhile, some early 4.?? versions
-had problems setting a large number of breakpoints.
-<DT><CODE>gmake</CODE>
-<DD>
-<A NAME="IDX9"></A>
-The <SAMP>`configure'</SAMP> script and <SAMP>`Makefiles'</SAMP> are generated 
using the
-<SAMP>`automake'</SAMP> and <SAMP>`autoconf'</SAMP> programs. They should be 
reasonably
-portable but if you have problems try using GNU make. For example on
-some old DEC boxes we have had strange behaviour using the system make.
-</DL>
-
-<P>
-For a listing of porting results including software versions see:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_5.html">previous</A>, 
<A HREF="nana_7.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_29.html
===================================================================
RCS file: nana/manual/html_node/nana_29.html
diff -N nana/manual/html_node/nana_29.html
--- nana/manual/html_node/nana_29.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,150 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
eiffel.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_28.html">previous</A>, <A HREF="nana_30.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC29" HREF="nana_toc.html#TOC29">eiffel.h: eiffel type 
assertions</A></H2>
-<P>
-Eiffel is a very nice language which provides the assertion checking
-facilities of nana inside the language itself.  The <SAMP>`eiffel.h'</SAMP>
-library is intended to provide a similar setup to Eiffel in the C++
-language. It is a pretty poor emulation, but it is hopefully
-better than nothing.
-
-</P>
-<P>
-Assertion checking is controlled by the <VAR>EIFFEL_CHECK</VAR> variable
-which can take on any of the following values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>CHECK_NO</CODE>
-<DD>
-<A NAME="IDX170"></A>
-Disable all checking.
-<DT><CODE>CHECK_REQUIRE</CODE>
-<DD>
-<A NAME="IDX171"></A>
-Check the preconditions for each method.
-<DT><CODE>CHECK_ENSURE</CODE>
-<DD>
-<A NAME="IDX172"></A>
-And also check the postconditions.
-<DT><CODE>CHECK_INVARIANT</CODE>
-<DD>
-<A NAME="IDX173"></A>
-And also check the class invariant before and after each method is
-called. The programmer should provide a class method called
-<SAMP>`invariant'</SAMP> which returns <SAMP>`true'</SAMP> if the object is 
consistent, 
-<SAMP>`false'</SAMP> otherwise.
-<DT><CODE>CHECK_LOOP</CODE>
-<DD>
-<A NAME="IDX174"></A>
-And also check the loop invariants.
-<DT><CODE>CHECK_ALL</CODE>
-<DD>
-<A NAME="IDX175"></A>
-And also check any assertions using the <SAMP>`CHECK'</SAMP> instruction.
-</DL>
-
-<P>
-A typical compile flag to the compile might be:
-
-</P>
-
-<PRE>
-% g++ -c -DEIFFEL_CHECK=CHECK_ALL play.cc
-</PRE>
-
-<P>
-And then we have the actual assertion macros.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>REQUIRE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX176"></A>
-Called at the beginning of each method.
-This checks the precondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>ENSURE</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX177"></A>
-Called at the end of each method.
-This checks the postcondition to a method and the class invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>INVARIANT</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX178"></A>
-Used to check a loop invariant.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>CHECK</B> <I>(<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX179"></A>
-Used for any other inline assertions.
-</DL>
-
-</P>
-<P>
-And finally a small example:
-
-</P>
-
-<PRE>
-#include &#60;eiffel.h&#62;
-
-class example {
-  int nobjects;
-  map&#60;location,string,locationlt&#62; layer;
-public:
-  bool invariant();
-  void changeit(location l);
-};
-
-bool example::invariant() {
-  return AO(i,layer,valid_location((*i).first)) &#38;&#38; 
-         nobjects &#62;= 0;
-}
-
-void example::changeit(string n, location l) {
-  REQUIRE(E1O(i,layer,(*i).second == n));
-  ...;
-  while(..) {
-    INVARIANT(...);
-    ...
-    INVARIANT(...);
-  }
-  ...
-  CHECK(x == 5);
-  ...
-  ENSURE(layer[l] == n);
-}
-</PRE>
-
-<P>
-Note that the invariant checking macro <SAMP>`example::invariant'</SAMP>
-is called automatically on function entry/exit using the 
-<SAMP>`REQUIRE'</SAMP> and <SAMP>`ENSURE'</SAMP> macros.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_28.html">previous</A>, <A HREF="nana_30.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_26.html
===================================================================
RCS file: nana/manual/html_node/nana_26.html
diff -N nana/manual/html_node/nana_26.html
--- nana/manual/html_node/nana_26.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,197 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Q.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_25.html">previous</A>, <A HREF="nana_27.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC26" HREF="nana_toc.html#TOC26">Q.h: support for 
quantifiers</A></H2>
-<P>
-<SAMP>`Q.h'</SAMP> provides support for the quantifiers of predicate logic.  
For
-example to check that all elements in a data structure have some
-property we would use universal (forall, upside down A) quantification.
-To check that one or more values in a data structure have some property
-we would use existential (exists, back the front E) quantification.  For
-example:
-
-</P>
-
-<PRE>
-  /* all values in a[] must be between 0 and 10 */
-  I(A(int i = 0, i &#60; n_array, i++, 0 &#60;= a[i] &#38;&#38; a[i] &#60;= 
10));
-
-  /* there exists a value in linked list l which is smaller than 10 */
-  I(E(node *p = l, p != NULL, p = p-&#62;next, p-&#62;data &#60;= 10));
-</PRE>
-
-<P>
-The first three arguments to <SAMP>`A'</SAMP> and <SAMP>`E'</SAMP> are similar 
-to a C <SAMP>`for'</SAMP> loop which iterates over the values we wish to
-check. The final argument is the expression that must be true.
-
-</P>
-<P>
-The only minor difference from the C <SAMP>`for'</SAMP> loop is that variables
-may be declared at the start of the loop, even if you are using C rather
-than C++ which already supports this.<A NAME="DOCF8" 
HREF="nana_foot.html#FOOT8">(8)</A>
-
-</P>
-<P>
-The <SAMP>`Q.h'</SAMP> macros can also be nested and used anywhere a boolean 
-value is required. For example:
-
-</P>
-
-<PRE>
-  if(A(int i = 0, i &#60; MAXX, i++,
-       A(int j = 0, j &#60; MAXY, j++,
-         m[i][j] == (i == j ? 1 : 0)))) { 
-        /* identity matrix, i.e. all 0's except for 1's on */
-        /* the diagonal */
-        ...
-  } else {
-        /* not an identity matrix */
-        ...
-  }
-</PRE>
-
-<P>
-The results from these 
-macros can also be combined using boolean operations, e.g.
-
-</P>
-
-<PRE>
-  /* the values in a[i]  are either ALL positive or ALL negative */
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)
-    ||
-    A(int i = 0, i &#60; MAX, i++, a[i] &#60; 0));
-</PRE>
-
-<P>
-<STRONG>Portability:</STRONG> note the macros in this file require the GNU
-CC/C++ statement expression extension of GCC to work. If your not using GNU CC
-then for now you are out of luck. At some time in the future we may
-implement a method which will work for standard C++, standard C is a bit of
-a challenge.
-
-</P>
-<P>
-<STRONG>Portability:</STRONG> unfortunately these macros do not for the 
-<SAMP>`DI'</SAMP> and <SAMP>`DL'</SAMP> macros since the statement expression 
extension has 
-not been implemented in GDB.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>A</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX155"></A>
-For all values generated by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> the 
<VAR>exprn</VAR> must be
-true. 
-
-<PRE>
-  I(A(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); /* all a[i] are +ve */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX156"></A>
-There exists at least one value for <VAR>exprn</VAR> generated by
- <SAMP>`for (<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> 
which is true.
-
-</P>
-
-<PRE>
-  /* one or more a[i] &#62;= 0 */
-  I(E(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> long <B>C</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX157"></A>
-Returns the number of times the <VAR>exprn</VAR> is true over the values
-generated by 
<SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-
-</P>
-
-<PRE>
-  /* 3 elements of a[] are +ve */
-  I(C(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0) == 3); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX158"></A>
-There exists only one value generated by 
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP> for 
which the <VAR>exprn</VAR>
-is true.
-
-</P>
-
-<PRE>
-  /* a single elements of a[] is +ve */
-  I(E1(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>S</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX159"></A>
-Sum the values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>. The 
type of the value
-returned  is given by the type of the <VAR>exprn</VAR>.<A NAME="DOCF9" 
HREF="nana_foot.html#FOOT9">(9)</A>
-
-</P>
-
-<PRE>
-  /* sum of a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i]) == 10);
-
-  /* sum of all +ve numbers in a[] is 10 */
-  I(S(int i = 0, i &#60; MAX, i++, a[i] &#62;= 0 ? a[i] : 0) == 10);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>P</B> 
<I>(<VAR>init</VAR>,<VAR>condition</VAR>,<VAR>next</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX160"></A>
-Returns the product of the 
-values generated by <VAR>exprn</VAR> for all values given by
- <SAMP>`for(<VAR>int</VAR>;<VAR>condition</VAR>;<VAR>next</VAR>)'</SAMP>.
-The type returned is the type of the expression.
-
-</P>
-
-<PRE>
-  /* product of all the values in a[] is 10 */
-  I(P(int i = 0, i &#60; MAX, i++, a[i]) == 10); 
-
-  /* a = x^y i.e. x*x..*x y times */
-  I(P(int i = 0, i &#60; y, i++, x) == a);
-</PRE>
-
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_25.html">previous</A>, <A HREF="nana_27.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_10.html
===================================================================
RCS file: nana/manual/html_node/nana_10.html
diff -N nana/manual/html_node/nana_10.html
--- nana/manual/html_node/nana_10.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,58 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Supported Platforms</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_9.html">previous</A>, 
<A HREF="nana_11.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC10" HREF="nana_toc.html#TOC10">Supported Platforms</A></H2>
-<P>
-Nana has been tested on the following platforms:
-
-</P>
-
-<OL>
-<LI>i386-unknown-linux, gcc-2.7.0, gdb-4.16
-
-<LI>sparc-sun-sunos4.1.4, gcc-2.7.2.f.1, gdb-4.16
-
-<LI>sparc-sun-solaris2.3, gcc-2.7.2, gdb-4.16
-
-<LI>alpha-dec-osf3.2, gcc-2.7.2, gdb-4.16
-
-<LI>mips-sgi-irix5.3, gcc-2.7.0, gdb-4.16
-
-<LI>powerpc-ibm-aix3.2.5, gcc-2.6.3, gdb-4.16
-
-</OL>
-
-<P>
-The <SAMP>`alpha-dec-osf3.2'</SAMP>, <SAMP>`mips-sgi-irix5.3'</SAMP> and
-<SAMP>`powerpc-ibm-aix3.2.5'</SAMP> implementations have problems when you
-compile with <SAMP>`-O2'</SAMP> or <SAMP>`-O3'</SAMP> optimisation. This 
causes some
-errors in the the debugger based assertion and logging code since
-variables can be removed or changed by optimisation. At <SAMP>`-O'</SAMP>
-everything passes. Regardless of optimisation the C based checking code
-passes all tests on these platforms.
-
-</P>
-<P>
-If you use nana on a new platform please send the <SAMP>`check.log'</SAMP> file
-to <SAMP>address@hidden'</SAMP> via the <SAMP>`make check-mail'</SAMP>
-command. A machine generated list of this information is available 
-at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/homepages/pjm/nana-bug/'</SAMP>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_9.html">previous</A>, 
<A HREF="nana_11.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_23.html
===================================================================
RCS file: nana/manual/html_node/nana_23.html
diff -N nana/manual/html_node/nana_23.html
--- nana/manual/html_node/nana_23.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,91 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
L_times.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_22.html">previous</A>, <A HREF="nana_24.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC23" HREF="nana_toc.html#TOC23">L_times.h: recording events and 
times.</A></H2>
-<P>
-This component is used to record events and times with a lower time 
-and space overhead than the <SAMP>`L_buffer.h'</SAMP> component. Instead
-of using a <SAMP>`printf'</SAMP> style string we simply record the time
-and a pointer to a string identifying the event in a circular buffer.
-
-</P>
-<P>
-<STRONG>Note 0:</STRONG> the string arguments should not be modified after
-a call since we record pointers to the strings rather
-than the strings themselves.
-
-</P>
-<P>
-<STRONG>Note 1:</STRONG> there is no <VAR>printf</VAR> style formatting, e.g.
-<SAMP>`%d'</SAMP> in this package.
-
-</P>
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_TIMES</B>
-<DD><A NAME="IDX124"></A>
-Used to define buffers, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_times_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_TIMES* <B>L_times_create</B> <I>(int 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX125"></A>
-<DT><U>Function:</U> L_TIMES* <B>L_times_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX126"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-messages.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_wraparound</B> <I>(L_TIMES <VAR>*b</VAR>, 
int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX127"></A>
-A buffer created by <SAMP>`L_times_create'</SAMP> is set up so that the new
-messages will overwrite the oldest messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first few messages
-messages you could use <SAMP>`L_times_wraparound(b,0)'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_add</B> <I>(L_BUFFER <VAR>*b</VAR>, char 
<VAR>*m</VAR>, NANA_TIME <VAR>t</VAR>)</I>
-<DD><A NAME="IDX128"></A>
-Add an event identified by message <VAR>m</VAR> at time <VAR>t</VAR> to 
<VAR>b</VAR>.  
-The type <VAR>NANA_TIME</VAR> defaults to <SAMP>`double'</SAMP>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_dump</B> <I>(L_TIMES <VAR>*b</VAR>, FILE 
<VAR>*fd</VAR>)</I>
-<DD><A NAME="IDX129"></A>
-Dump the contents of the buffer out.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_times_clear</B> <I>(L_TIMES <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX130"></A>
-Clear all the messages from <VAR>b</VAR>.
-</DL>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_22.html">previous</A>, <A HREF="nana_24.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_25.html
===================================================================
RCS file: nana/manual/html_node/nana_25.html
diff -N nana/manual/html_node/nana_25.html
--- nana/manual/html_node/nana_25.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,86 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
GDB.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_24.html">previous</A>, <A HREF="nana_26.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC25" HREF="nana_toc.html#TOC25">GDB.h: sending plain gdb 
commands to the debugger</A></H2>
-<P>
-<SAMP>`GDB.h'</SAMP> provides macros for generating user specified commands in
-the output of the <SAMP>`nana'</SAMP> command.
-They are not included by default in the <SAMP>`nana.h'</SAMP> file.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDB</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX153"></A>
-Emit a single line command when running this file through <SAMP>`nana'</SAMP>. 
-Note that each line must be passed off separately to the <SAMP>`GDB'</SAMP>
-macro. 
-
-</P>
-<P>
-This could be used to set debugger options or to define procedures
-inside <SAMP>`gdb'</SAMP>, e.g.
-
-</P>
-
-<PRE>
-  GDB(define checkstack);
-  GDB(  if 0 &#60;= n &#38;&#38; n &#60;= 10);
-  GDB(    print "stack ok");
-  GDB(  else);
-  GDB(    print "stack corrupted");
-  GDB(  end);
-  GDB(end);
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>GDBCALL</B> <I>(<VAR>command</VAR>)</I>
-<DD><A NAME="IDX154"></A>
-Causes a single gdb <VAR>command</VAR> to be executed whenever control
-passes through this line of code. After the users command is executed
-control automatically returns to the program.
-
-</P>
-
-<PRE>
-  GDBCALL(set memory_check = 1)
-</PRE>
-
-</DL>
-
-<P>
-These macros could used for instrumenting code or setting up test
-harnesses, e.g.
-
-</P>
-
-<PRE>
-
-GDB(set $siocall = 0);
-GDB(set $sioerr = 0);
-
-void sio_driver() {
-  GDBCALL(set $siocall++)
-  if(SIO_REQ &#38; 0x010) {
-    GDBCALL(set $sioerr++); 
-    ...
-  }
-}
-</PRE>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_24.html">previous</A>, <A HREF="nana_26.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_14.html
===================================================================
RCS file: nana/manual/html_node/nana_14.html
diff -N nana/manual/html_node/nana_14.html
--- nana/manual/html_node/nana_14.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,48 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
New Versions</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_13.html">previous</A>, <A HREF="nana_15.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC14" HREF="nana_toc.html#TOC14">New Versions</A></H2>
-<P>
-New versions of nana will be made available at:
-
-</P>
-<P>
-<SAMP>`ftp://ftp.cs.ntu.edu.au/pub/nana/'</SAMP> 
-
-</P>
-<P>
-If you wish to be informed about new
-releases of nana then subscribe to the nana mailing list. 
-Send a message containing <SAMP>`subscribe'</SAMP> &#60;your e-mail 
address&#62; to:
-
-</P>
-<P>
-<SAMP>`mailto:address@hidden'</SAMP>. 
-
-</P>
-<P>
-A hypermail archive of this list is kept at:
-
-</P>
-<P>
-<SAMP>`http://www.cs.ntu.edu.au/hypermail/nana-archive'</SAMP>
-
-</P>
-<P>
-If you wish to send a message to the list send it to
-<SAMP>`mailto:address@hidden'</SAMP>.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_13.html">previous</A>, <A HREF="nana_15.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_37.html
===================================================================
RCS file: nana/manual/html_node/nana_37.html
diff -N nana/manual/html_node/nana_37.html
--- nana/manual/html_node/nana_37.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,24 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Realtime</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_36.html">previous</A>, <A HREF="nana_38.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC37" HREF="nana_toc.html#TOC37">Realtime Systems</A></H2>
-<P>
-Assertions for the timing behaviour of you system can be done in nana
-nicely. You might also consider using an instruction level simulator
-such as PSIM and use the <SAMP>`cycles'</SAMP> variable to test realtime
-constraints.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_36.html">previous</A>, <A HREF="nana_38.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_16.html
===================================================================
RCS file: nana/manual/html_node/nana_16.html
diff -N nana/manual/html_node/nana_16.html
--- nana/manual/html_node/nana_16.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,37 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Interface</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_15.html">previous</A>, <A HREF="nana_17.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC16" HREF="nana_toc.html#TOC16">Interface</A></H1>
-<P>
-This section describes the details of the interface to nana library.
-
-</P>
-<P>
-All of the files can be included multiple times without
-ill--effect since they use the C preprocessor to make sure the header
-declarations are only seen the first by the compiler.
-Each of the files can also be included individually.
-
-</P>
-
-<P>
-If any of the following routines have an internal problem (e.g. malloc
-fails due to lack of memory) they will call the <SAMP>`nana_error'</SAMP> 
function
-defined in <SAMP>`nana_error.c'</SAMP>. By default this function prints a 
message
-and dumps core using <SAMP>`abort'</SAMP>. If you wish to override this 
behaviour
-you should define your own handler before linking in the nana library.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_15.html">previous</A>, <A HREF="nana_17.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_27.html
===================================================================
RCS file: nana/manual/html_node/nana_27.html
diff -N nana/manual/html_node/nana_27.html
--- nana/manual/html_node/nana_27.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,151 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Qstl.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_26.html">previous</A>, <A HREF="nana_28.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC27" HREF="nana_toc.html#TOC27">Qstl.h: quantifiers for STL 
containers.</A></H2>
-<P>
-The Standard Template Library (STL) is a library for C++ that makes
-extensive use of templates to implement the standard container
-classes and much more. Each of the container classes provides an
-interface to iterate over all the objects in the container, e.g.
-
-</P>
-
-<PRE>
-// MAP is an associate array from location(lat,long) onto the name.
-typedef map&#60;location,string,locationlt&#62; MAP;
-
-void print_map_names(MAP&#38; m) { // print out all the names in the map
-  for(MAP::iterator i = m.begin(); i != m.end(); ++i) {
-    cout &#60;&#60; (*i).second &#60;&#60; "\n";
-  }
-}
-</PRE>
-
-<P>
-<SAMP>`Qstl.h'</SAMP> provides the same facilities as <SAMP>`Q.h'</SAMP> but 
uses the
-standard STL iterator protocol shown above. The names in <SAMP>`Qstl.h'</SAMP>
-are generated by appending a <SAMP>`O'</SAMP> (O not zero!) to the names in
-<SAMP>`Q.h'</SAMP>. In particular:
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>AO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX161"></A>
-For all values in the <VAR>container</VAR> class the <VAR>predicate</VAR> must
-be true. The <VAR>predicate</VAR> refers to individual values using
-<VAR>name</VAR>. See the STL documentation for more details. 
-Another way of putting this is forall <VAR>name</VAR> in
-<VAR>container</VAR> the <VAR>predicate</VAR> must be true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char *,ltint&#62; m;
-  // all keys (or indexes) into m are positive 
-  I(AO(i, m, (*i).first &#62;= 0)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>EO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX162"></A>
-There exists one or more values in the <VAR>container</VAR> class for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one or more characters in m are '$'
-  I(EO(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>E1O</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX163"></A>
-There exists one value in the <VAR>container</VAR> for which
-the <VAR>predicate</VAR> is true. 
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-
-  // one characters in m is a '$'
-  I(E1O(i, m, (*i).second == '$')); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>CO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>predicate</VAR>)</I>
-<DD><A NAME="IDX164"></A>
-Returns the number of times the <VAR>predicate</VAR> was true for all
-values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,char,ltint&#62; m;
-  int nalpha; 
-  // count the number of alphabetic chars in the map
-  nalpha = CO(i, m, isalpha((*i).second)); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>SO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX165"></A>
-Sum the <VAR>exprn</VAR> for all values in the <VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float sum;
-  // sum all the values in m
-  sum = SO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> typeof(<VAR>exprn</VAR>) <B>PO</B> 
<I>(<VAR>name</VAR>,<VAR>container</VAR>,<VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX166"></A>
-Take the product of the <VAR>exprn</VAR> for all values in the 
<VAR>container</VAR>.
-
-</P>
-
-<PRE>
-  map&#60;int,float,ltint&#62; m;
-  float product;
-  // multiply all the values in m
-  product = PO(i, m, (*i).second); 
-</PRE>
-
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_26.html">previous</A>, <A HREF="nana_28.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_24.html
===================================================================
RCS file: nana/manual/html_node/nana_24.html
diff -N nana/manual/html_node/nana_24.html
--- nana/manual/html_node/nana_24.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,170 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
DL.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_23.html">previous</A>, <A HREF="nana_25.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC24" HREF="nana_toc.html#TOC24">DL.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DL</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX131"></A>
-Used to log a message.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DLG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX132"></A>
-<DT><U>Macro:</U> void <B>DLH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX133"></A>
-<DT><U>Macro:</U> void <B>DLP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX134"></A>
-<DT><U>Macro:</U> void <B>DLGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX135"></A>
-<DT><U>Macro:</U> void <B>DLHP</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX136"></A>
-<DT><U>Macro:</U> void <B>DLGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX137"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`DL'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`DL'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VDL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX138"></A>
-<DT><U>Macro:</U> void <B>VDLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX139"></A>
-<DT><U>Macro:</U> void <B>VDLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX140"></A>
-<DT><U>Macro:</U> void <B>VDLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX141"></A>
-<DT><U>Macro:</U> void <B>VDLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX142"></A>
-<DT><U>Macro:</U> void <B>VDLHP</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX143"></A>
-<DT><U>Macro:</U> void <B>VDLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX144"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VDL'</SAMP> is equivelant to a call to 
<SAMP>`DL'</SAMP>.
-If <SAMP>`WITHOUT_NANA'</SAMP> is defined then the call too <SAMP>`VDL'</SAMP> 
is 
-equivelant to <SAMP>`/* empty */'</SAMP>.
-
-</P>
-<P>
-Thus you can have debugging under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VDL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DL_LEVEL</B>
-<DD><A NAME="IDX145"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX146"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX147"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX148"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX149"></A>
-The default handler for printing which is simply the name of the
-printing function. 
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DL_DEFAULT_GUARD</B>
-<DD><A NAME="IDX150"></A>
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DL_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX151"></A>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> flag <B>DL_SHOW_TIME</B>
-<DD><A NAME="IDX152"></A>
-Each message can be given an individual time stamp by defining 
-<CODE>DL_SHOW_TIME</CODE>. This causes the <CODE>_L_gettime</CODE> routine to 
be
-called before each message which generates the timestamp. A default
-version is provided by the nana library.
-</DL>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_23.html">previous</A>, <A HREF="nana_25.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_11.html
===================================================================
RCS file: nana/manual/html_node/nana_11.html
diff -N nana/manual/html_node/nana_11.html
--- nana/manual/html_node/nana_11.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,58 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Supported Debuggers</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_10.html">previous</A>, <A HREF="nana_12.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC11" HREF="nana_toc.html#TOC11">Supported Debuggers</A></H2>
-
-<P>
-Currently Nana works with the GNU GDB debugger which is available on a
-wide range of platforms including embedded systems and even provides
-support for remote debugging. 
-Porting to any reasonable debugger with conditional
-breakpoints and commands is not very difficult. 
-
-</P>
-<P>
-As an example of an unreasonable debugger, Nana has been ported to
-work with the MicroSoft Codeview debugger. The port is small (60 lines of
-code) but suffers from a problem with variable scoping in Codeview. If
-a breakpoint is set at a point in the code the expressions are not
-evaluated from that particular scope. For example setting a breakpoint
-in the function <CODE>f</CODE> cannot access a variable local to <CODE>f</CODE>
-directly. Codeview has a unique (expletive deleted) scope operator
-which you must use to set the scope <SAMP>`{...}'</SAMP>.  This makes the
-interface somewhat less than beautiful.
-
-</P>
-<P>
-Another good thing about CodeView is to try a debug command which prints a
-message which contains a single open <SAMP>`{'</SAMP>. This of course causes it
-to hang and was the main problem during the porting to CodeView which
-took a whole day<A NAME="DOCF2" HREF="nana_foot.html#FOOT2">(2)</A>. 
-
-</P>
-<P>
-If anyone is interested I may release the CodeView implementation,
-please contact me if you are interested. Of course a better bet is probably 
-to move to the <SAMP>`gdbserver'</SAMP> system. I think <SAMP>`gdb'</SAMP> has 
been released
-as a native even for some MicroSoft operating systems.
-
-</P>
-<P>
-Other debuggers like DBX don't seem to be worth the trouble since gdb
-works on those machines. A redesign of the nana internals may also be useful
-if we decide portability between debuggers is actually useful.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_10.html">previous</A>, <A HREF="nana_12.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_3.html
===================================================================
RCS file: nana/manual/html_node/nana_3.html
diff -N nana/manual/html_node/nana_3.html
--- nana/manual/html_node/nana_3.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Assert</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_2.html">previous</A>, 
<A HREF="nana_4.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC3" HREF="nana_toc.html#TOC3">Assert.h considered 
harmful</A></H2>
-<P>
-Most C programmers become familiar with assertions from the the
-<CODE>assert.h</CODE> header. As such its a very good thing and has a nice
-simple implementation. However it is also inefficient and leads some
-people to the conclusion that assertion checking is an expensive luxury.
-
-</P>
-<P>
-The implementation of <CODE>assert.h</CODE> as distributed with 
<CODE>gcc</CODE>
-looks like the following (after a bit of editing):
-
-</P>
-
-<PRE>
-# ifndef NDEBUG
-# define _assert(ex)   {if (!(ex)) \
-                         {(void)fprintf(stderr, \
-                           "Assertion failed: file \"%s\", line %d\n", \
-                           __FILE__, __LINE__);exit(1);}}
-# define assert(ex)    _assert(ex)
-# else
-# define _assert(ex)
-# define assert(ex)
-# endif
-</PRE>
-
-<P>
-There are are two main problems with this:
-
-</P>
-
-<OL>
-<LI>Code space overhead: each call to <SAMP>`assert'</SAMP> generates 2 
function
-
-calls with 4 and 1 arguments plus strings for error messages. 
-If <CODE>assert.h</CODE> had library code support we could make the 
implementation
-much more space efficient, e.g. by calling a single function on error
-detection.   
-<LI>The default behaviour simply prints a message and dies, ideally
-
-you like to be able to use a debugger to determine why the assertion
-failed. Even if you run this under the debugger you can't observe the
-failures of variables are an assert failure because the process exits
-rather than aborting back to the debugger.
-</OL>
-
-<P>
-Of course everyone merely rewrites their own <SAMP>`assert'</SAMP> macro so
-these are not significant objections. The only problem is if the author
-uses the libraries without modification.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_2.html">previous</A>, 
<A HREF="nana_4.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_28.html
===================================================================
RCS file: nana/manual/html_node/nana_28.html
diff -N nana/manual/html_node/nana_28.html
--- nana/manual/html_node/nana_28.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,71 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
now.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_27.html">previous</A>, <A HREF="nana_29.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC28" HREF="nana_toc.html#TOC28">now.h: measuring time</A></H2>
-<P>
-The <SAMP>`now.h'</SAMP> file provides some simple time measurement routines.
-It is not included in <SAMP>`nana.h'</SAMP> so you must include this file 
-separately.  
-
-</P>
-<P>
-It uses the <SAMP>`gettimeofday'</SAMP> system call and has an accuracy of
-between 1us and 10ms depending on the operating system and hardware
-configuration.
-
-</P>
-<P>
-See the IPM package if you require better measurement tools.<A NAME="DOCF10" 
HREF="nana_foot.html#FOOT10">(10)</A>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now</B> <I>()</I>
-<DD><A NAME="IDX167"></A>
-Returns the time in seconds since the beginning of time as defined by
-your system. If you call <SAMP>`now_reset'</SAMP> the time will start again at
-0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_reset</B> <I>()</I>
-<DD><A NAME="IDX168"></A>
-Reset the times returned by <SAMP>`now'</SAMP> to 0.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> double <B>now_delta</B> <I>(double *<VAR>dp</VAR>)</I>
-<DD><A NAME="IDX169"></A>
-Returns the elapsed time between <VAR>*dp</VAR> and <VAR>now()</VAR>. It then 
sets
-<VAR>*dp</VAR> to <VAR>now</VAR>, thus giving a delta time between particular
-events. 
-
-</P>
-
-<PRE>
-  t = now();
-  for(;;) {
-    ...; /* code that must finish in 50ms */
-    I(now_delta(&#38;t) &#60;= 0.050);
-  }
-</PRE>
-
-</DL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_27.html">previous</A>, <A HREF="nana_29.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_8.html
===================================================================
RCS file: nana/manual/html_node/nana_8.html
diff -N nana/manual/html_node/nana_8.html
--- nana/manual/html_node/nana_8.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,135 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Configure</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_7.html">previous</A>, 
<A HREF="nana_9.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC8" HREF="nana_toc.html#TOC8">Configure</A></H2>
-<P>
-Nana uses a standard GNU <CODE>autoconf</CODE> generated <CODE>configure</CODE>
-script. The <CODE>configure</CODE> script checks the setup on your machine and
-then generates the appropriate Makefiles. Some of the things checked by
-configure include:
-
-</P>
-
-<OL>
-<LI>Which compiler, compiler flags and libraries to use, e.g. you
-
-might need to include a <CODE>-lposix</CODE> flag to the linker to build 
programs
-on your machine.
-<LI>Which header (.h) files are available on this machine, e.g. is
-
- <CODE>unistd.h</CODE> available on this machine.
-<LI>Where to install programs, header file, man pages, etc.
-
-</OL>
-
-<P>
-In addition <SAMP>`configure'</SAMP> uses the host architecture and operating 
system
-to generate the <SAMP>`nana-config.h'</SAMP> file. This file contains some 
macro
-definitions which define how nana works on particular operating systems
-and hardware architectures. 
-
-</P>
-<P>
-For example on <SAMP>`i386'</SAMP> machines we would use the 
<SAMP>`asm("hlt")'</SAMP>
-instruction whenever an assertion fails, on a <SAMP>`sparc'</SAMP> we would use
-<SAMP>`asm("stp")'</SAMP>. Otherwise we would default to a plain C call to
-<SAMP>`abort()'</SAMP> If <SAMP>`configure'</SAMP> does not recognise your 
machine it
-uses plain C code.
-
-</P>
-<P>
-You may wish to change these defaults on installation, one method is to edit 
-a local copy of the <SAMP>`nana-config.h'</SAMP> file. Alternately you can 
define 
-the code yourself in the call to <SAMP>`configure'</SAMP>. For example
-to redefine the action we take when an error is detected by the <CODE>I</CODE>
-macro we can use: 
-
-</P>
-
-<PRE>
-I_DEFAULT_HANDLER="restart_system()" ./configure
-</PRE>
-
-<P>
-As well as simple calls to routines various other bits of information
-are passed off to the <SAMP>`I_DEFAULT_HANDLER'</SAMP> such as the expression
-that failure and a failure code. For example:
-
-</P>
-
-<PRE>
-% I_DEFAULT_HANDLER="restart(line,file,param)" ./configure
-</PRE>
-
-<P>
-The default for <SAMP>`I_DEFAULT_HANDLER'</SAMP> calls a function which prints 
a
-message and then dumps core.  Different behaviour on failure can be
-organised by setting the <SAMP>`I_DEFAULT'</SAMP> to <SAMP>`fast'</SAMP>, i.e. 
plain
-core dump or <SAMP>`verbose'</SAMP> which prints an error messsage and then 
does
-the core dump.
-
-</P>
-
-<PRE>
-% I_DEFAULT=fast ./configure   
-</PRE>
-
-<P>
- 
-For nana the following examples may be useful:
-
-</P>
-
-<OL>
-<LI><CODE>./configure</CODE>
-
-Accept the default values for everything. In particular the files will
-be installed in:
-
-<SAMP>`/usr/local/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --prefix=~project/tools</CODE>
-
-Install the files into:
-
-<SAMP>`~project/tools/{bin,include,lib,man,info}'</SAMP>
-
-<LI><CODE>./configure --bindir=~project/bin --libdir=~/project/lib \<BR>
-
---includedir=~/project/headers --infodir=/usr/local/info \<BR>
---mandir=~/project/doc</CODE>
-
-The install directory for program (<SAMP>`bin'</SAMP>), etc can all be set with
-command line arguments to<SAMP>`configure'</SAMP>.
-
-<LI><CODE>CC=xacc LIBS=-lposix ./configure sun3</CODE>
-
-If the defaults chosen by <SAMP>`configure'</SAMP> are not correct you can
-override them by setting variables such as <CODE>CC</CODE> before calling
- <SAMP>`configure'</SAMP>. The <SAMP>`sun3'</SAMP> argument is used to 
identify the
-machine we are running on and may be necessary on some machines.
-
-<LI><CODE>./configure --help</CODE>
-
-And of course when in doubt ask for help.
-</OL>
-
-<P>
-For even more details see the file <SAMP>`INSTALL.con'</SAMP> which contains 
the
-generic instructions for use with <SAMP>`autoconf'</SAMP> generated
-<SAMP>`configure'</SAMP> scripts.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_7.html">previous</A>, 
<A HREF="nana_9.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_32.html
===================================================================
RCS file: nana/manual/html_node/nana_32.html
diff -N nana/manual/html_node/nana_32.html
--- nana/manual/html_node/nana_32.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,28 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Usage</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_31.html">previous</A>, <A HREF="nana_33.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC32" HREF="nana_toc.html#TOC32">Using Nana</A></H1>
-<P>
-This chapter is intended to provide some hopefully useful examples of
-Nana. If any of the users of this library would be so kind as
-to contribute a section on their usage I would be obliged. 
-
-</P>
-<P>
-<STRONG>This section is under development</STRONG>
-
-</P>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_31.html">previous</A>, <A HREF="nana_33.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_39.html
===================================================================
RCS file: nana/manual/html_node/nana_39.html
diff -N nana/manual/html_node/nana_39.html
--- nana/manual/html_node/nana_39.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,28 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Visualisation</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_38.html">previous</A>, <A HREF="nana_40.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC39" HREF="nana_toc.html#TOC39">Program Visualisation: pretty 
pictures</A></H2>
-<P>
-One nice way to use <SAMP>`L'</SAMP>, <SAMP>`DL'</SAMP>, etc is to punt off 
the messages
-off to a program which displays the information. You would use the
-<SAMP>`L_DEFAULT_PARAM'</SAMP> argument to send commands off to a pipe with
-gnuplot or TCL/TK interpreter running at the end. 
-
-</P>
-<P>
-For a small example of this, see <SAMP>`tcl/status.c'</SAMP>. 
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_38.html">previous</A>, <A HREF="nana_40.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_34.html
===================================================================
RCS file: nana/manual/html_node/nana_34.html
diff -N nana/manual/html_node/nana_34.html
--- nana/manual/html_node/nana_34.html  7 Feb 2007 02:37:39 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,89 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Syslog</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_33.html">previous</A>, <A HREF="nana_35.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC34" HREF="nana_toc.html#TOC34">Syslog</A></H2>
-<P>
-<SAMP>`syslog'</SAMP> is a comprehensive logging system written by Eric Allman
-which is available on most Unix systems. It provides facilities for
-sorting messages by source or severity and mechanisms for sending
-messages off to files, terminals or other machines. See chapter 12 of
-the "Unix System Administration Handbook (2nd Edition)" 
-by Nemeth, Snyder, Seebass and Hein for an excellent tutorial on
-<SAMP>`syslog'</SAMP>.
-
-</P>
-<P>
-The rules used by <SAMP>`syslog'</SAMP> are normally defined in
-<SAMP>`/etc/syslog.conf'</SAMP>. Each line specifies the destination for
-messages with particular sources and priorities.  For example:
-
-</P>
-
-<PRE>
-# log mail messages at priority info to mailinfo
-mail.info /var/log/mailinfo
-# log all ftp information to syslog on a remote machine
-ftp.* @remote-machine.cs.ntu.edu.au
-# all critical errors to console
-*.crit   /dev/console
-</PRE>
-
-<P>
-To use <SAMP>`syslog'</SAMP> we merely redefine the default handlers and
-parameter values for <SAMP>`nana'</SAMP>. For example:
-
-</P>
-
-<PRE>
-#include &#60;syslog.h&#62;
-#define L_DEFAULT_HANDLER syslog /* replaces fprintf(3) by syslog(3) */
-#define L_DEFAULT_PARAMS LOG_USER /* default priority for syslog info */
-#include &#60;nana.h&#62;
-
-int main() {
-     openlog("nana", /* identifier for these log messages */
-        LOG_PID, /* also log the process id */
-        LOG_DAEMON /* facility */
-     );
-
-     L("temperature is falling to %d", 35); /* logged at LOG_USER priority */
-     LP(LOG_CRIT, "the snow is falling in Darwin"); /* LOG_CRIT message */
-        
-     closelog();
-     return 0;
-}
-</PRE>
-
-<P>
-This program results in the following addition to 
<SAMP>`/var/adm/messages'</SAMP>:
-
-</P>
-
-<PRE>
-Jun 12 16:04:46 chingiz nana[2671]: the temperature is falling to 35
-Jun 12 16:04:46 chingiz nana[2671]: the snow is falling in Darwin
-</PRE>
-
-<P>
-In addition the <SAMP>`LOG_CRIT'</SAMP> message about snow falling in Darwin is
-sent to the console for immediate action. 
-
-</P>
-<P>
-<STRONG>Note:</STRONG> <SAMP>`syslog'</SAMP> normally uses <SAMP>`UDP'</SAMP> 
for its network
-communications and that <SAMP>`UDP'</SAMP> does not guarantee delivery. 
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_33.html">previous</A>, <A HREF="nana_35.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_18.html
===================================================================
RCS file: nana/manual/html_node/nana_18.html
diff -N nana/manual/html_node/nana_18.html
--- nana/manual/html_node/nana_18.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,41 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
WITHOUT_NANA</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_17.html">previous</A>, <A HREF="nana_19.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC18" HREF="nana_toc.html#TOC18">WITHOUT_NANA: disabling all 
nana code for portability.</A></H2>
-<P>
-If you wish to disable all nana code you can <SAMP>`#define'</SAMP> the
-<SAMP>`WITHOUT_NANA'</SAMP> macro. This selects versions of the 
-macros defined in <SAMP>`I.h'</SAMP>,<SAMP>`L.h'</SAMP>, etc which map to 
-<SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-So if you are using nana for your development but don't wish to 
-force  your customers to use it you can add an option to your
-<SAMP>`configure'</SAMP> script to define/undefine 
<SAMP>`WITHOUT_NANA'</SAMP>. 
-In addition you will need to distribute copies of the nana header
-files with your package to get the stubs.
-
-</P>
-<P>
-Note that the <SAMP>`L.h'</SAMP> and <SAMP>`DL.h'</SAMP> macros use the 
-macro variable number of arguments extension provided by 
-GNU C. If you wish your code to be portable you should use
-the macros <SAMP>`VL((..))'</SAMP>, etc rather than <SAMP>`L(..)'</SAMP> to
-avoid problems with non GNU C preprocessors which only take a fixed
-number of arguments.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_17.html">previous</A>, <A HREF="nana_19.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_7.html
===================================================================
RCS file: nana/manual/html_node/nana_7.html
diff -N nana/manual/html_node/nana_7.html
--- nana/manual/html_node/nana_7.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,33 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Optional Software</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_6.html">previous</A>, 
<A HREF="nana_8.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC7" HREF="nana_toc.html#TOC7">Optional Software</A></H2>
-
-<P>
-In addition to the required software you might also be interested
-in:
-
-</P>
-
-<UL>
-<LI><SAMP>`http://www.cs.tu-bs.de/softech/ddd/'</SAMP> -- a smart frontend for
-
-gdb which can display dynamic data structures such as linked lists, etc.
-<LI><SAMP>`ftp://ftp.ci.com.au/pub/psim/'</SAMP> -- a cycle level simulator
-
-for the PowerPC. A fine piece of work.
-</UL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_6.html">previous</A>, 
<A HREF="nana_8.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_41.html
===================================================================
RCS file: nana/manual/html_node/nana_41.html
diff -N nana/manual/html_node/nana_41.html
--- nana/manual/html_node/nana_41.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,69 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Future</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_40.html">previous</A>, <A HREF="nana_42.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC41" HREF="nana_toc.html#TOC41">Future work</A></H1>
-<P>
-As usual, there is more work to be done than time to do it in.
-Workers or test pilots are invited to apply for the following
-tasks which may get down in the fullness of time minister. 
-I'm particularly interested in which projects people think 
-are worthwhile (or rubbish).
-
-</P>
-
-<OL>
-<LI>Ada support - pre 1.00 versions of nana provided support for
-
-        Ada. Adding a full version of nana into the GNATS compiler 
-        would probably be useful, particularly the real time part.
-<LI>FORTRAN support.
-
-<LI>Message browsing (<SAMP>`emacs/fess.el'</SAMP>) - a very prototypical mode 
for
-
-browsing message logs is distributed with nana. Features include hiding/showing
-lines by regular expression or predicate. If someone who knows what they
-are doing rewrites this that would be a good thing. Or perhaps a modified
-version of <SAMP>`less'</SAMP> would be useful.
-<LI>Program Visualisation (<SAMP>`tcl/status.c'</SAMP>) - another prototype
-
-which uses a small TCL/TK library and nana logging to generate some 
-nice pictures showing the behaviour of the program. For example
-the history of variables over time can be recorded, graphs drawn and
-long message logs kept. A new version of this has been created
-and may be released shortly. 
-<LI>Eiffel shortform program - the shortform of an Eiffel program
-
-contains the function signatures (arguments, etc) together with the
-assertions (pre/post conditions). 
-An extension could perhaps be put in a
-program such as <SAMP>`DOC++'</SAMP> or <SAMP>`cxref'</SAMP> which extracts 
the 
-nana assertions.
-<LI>Automated Testing - combine nana logs with a workbench
-
-that lets you verify properties of the logs using programs <SAMP>`gawk'</SAMP>
-or the <SAMP>`PRECC'</SAMP> (LL infinity version of YACC). This technique has
-been used on industrial strength products quite successfully. 
-<LI>GNU standards - perhaps it would be worthwhile to set up
-
-a prototype for checking and logging in GNU tools. 
-<LI>Extend GDB(1) so that we can support <SAMP>`Q.h'</SAMP> style quantifiers
-
-in <SAMP>`DI.h'</SAMP> expressions. Basically we need to add a restricted form 
-of the statement value expression to GDB.
-<LI>Support for other (particularly ANSI only) compilers.
-
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_40.html">previous</A>, <A HREF="nana_42.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_21.html
===================================================================
RCS file: nana/manual/html_node/nana_21.html
diff -N nana/manual/html_node/nana_21.html
--- nana/manual/html_node/nana_21.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,190 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
L.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_20.html">previous</A>, <A HREF="nana_22.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC21" HREF="nana_toc.html#TOC21">L.h: support for printf style 
logging</A></H2>
-<P>
-These routines are used to provide logging functions. Messages can be
-divided into classes and separately enabled and disabled.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L</B> <I>(<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX91"></A>
-Used to log a message in a similar way to printf.
-
-</P>
-<P>
-Defaults to a using <CODE>fprintf</CODE> on <CODE>stderr</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>LG</B> <I>(bool <VAR>guard</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX92"></A>
-<DT><U>Macro:</U> void <B>LH</B> <I>(function <VAR>handler</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX93"></A>
-<DT><U>Macro:</U> void <B>LP</B> <I>(text <VAR>param</VAR>, 
<VAR>args</VAR>...)</I>
-<DD><A NAME="IDX94"></A>
-<DT><U>Macro:</U> void <B>LGP</B> <I>(bool <VAR>guard</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX95"></A>
-<DT><U>Macro:</U> void <B>LHP</B> <I>(function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX96"></A>
-<DT><U>Macro:</U> void <B>LGHP</B> <I>(bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...)</I>
-<DD><A NAME="IDX97"></A>
-And all of the special functions.
-
-</P>
-</DL>
-
-<P>
-The macros such as <SAMP>`L'</SAMP> depend on the GNU CC variable number of 
arguments 
-to macros extension. If you wish to compile your code on other systems
-you might wish to use the following variations on <SAMP>`L'</SAMP>, etc.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>VL</B> <I>((<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX98"></A>
-<DT><U>Macro:</U> void <B>VLG</B> <I>((bool <VAR>guard</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX99"></A>
-<DT><U>Macro:</U> void <B>VLH</B> <I>((function <VAR>handler</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX100"></A>
-<DT><U>Macro:</U> void <B>VLP</B> <I>((text <VAR>param</VAR>, 
<VAR>args</VAR>...))</I>
-<DD><A NAME="IDX101"></A>
-<DT><U>Macro:</U> void <B>VLGP</B> <I>((bool <VAR>guard</VAR>, <VAR>text 
param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX102"></A>
-<DT><U>Macro:</U> void <B>VLHP</B> <I>((function <VAR>handler</VAR>, text 
<VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX103"></A>
-<DT><U>Macro:</U> void <B>VLGHP</B> <I>((bool <VAR>guard</VAR>, function 
<VAR>handler</VAR>, text <VAR>param</VAR>, <VAR>args</VAR>...))</I>
-<DD><A NAME="IDX104"></A>
-Each of these macros calls the corresponding function from the previous
-group, i.e. by default <SAMP>`VLG'</SAMP> is the same as a call to 
<SAMP>`LG'</SAMP>.
-If you define <SAMP>`WITHOUT_NANA'</SAMP> all these macros are translated
-to <SAMP>`/* empty */'</SAMP>. 
-
-</P>
-<P>
-Thus you can have nana under GCC whilst the code is still portable
-to other compilers. However debugging information will not be available
-on other platforms.
-
-</P>
-<P>
-<STRONG>Note:</STRONG> the argument list is surrounded by <STRONG>two</STRONG> 
sets of 
-brackets. For example:
-
-</P>
-
-<PRE>
-   VL(("haze in darwin = %d\n", 3.4));
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_LEVEL</B>
-<DD><A NAME="IDX105"></A>
-Used to enable and disable logging independently of guard expressions.
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX106"></A>
-Always print message
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX107"></A>
-Print message only if the guard expression is true.
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX108"></A>
-Never print any messages.
-</DL>
-
-<P>
-Defaults to <CODE>1</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_HANDLER</B>
-<DD><A NAME="IDX109"></A>
-The default handler for printing which is simply the name of the
-logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>fprintf</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>L_DEFAULT_GUARD</B>
-<DD><A NAME="IDX110"></A>
-The default guard condition for logging. 
-
-</P>
-<P>
-Defaults to <CODE>TRUE</CODE>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>L_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX111"></A>
-The default parameter passed off to the logging function or macro.
-
-</P>
-<P>
-Defaults to <CODE>stderr</CODE>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>L_SHOW_TIME</B>
-<DD><A NAME="IDX112"></A>
-If defined then display the time in front of each message.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> char* <B>L_SHOW_TIME_FORMAT</B>
-<DD><A NAME="IDX113"></A>
-A format string for the time stamp in the log. By default it prints the
-time out in seconds.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> value <B>L_SHOW_TIME_NOW</B>
-<DD><A NAME="IDX114"></A>
-The name of a function that returns the time for the time stamp. This
-defaults to the <SAMP>`now'</SAMP> function from <SAMP>`now.h'</SAMP>.
-</DL>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_20.html">previous</A>, <A HREF="nana_22.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_22.html
===================================================================
RCS file: nana/manual/html_node/nana_22.html
diff -N nana/manual/html_node/nana_22.html
--- nana/manual/html_node/nana_22.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,202 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
L_buffer.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_21.html">previous</A>, <A HREF="nana_23.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC22" HREF="nana_toc.html#TOC22">L_buffer.h: a circular buffer 
for logging.</A></H2>
-<P>
-A traditional embedded systems trick is to log messages to a circular
-buffer in core. This has the following benefits:
-
-</P>
-
-<OL>
-<LI>Speed -- writing to a in core buffer is much faster than spitting
-
-out messages to a file on disk. It is often fast enough to leave at least
-most of the messages in the final product.
-<LI>Field debugging -- what the ... was the user doing before the
-
-system crashed. Oh lets ask them, I'm sure they'll give us a good
-problem report. 
-</OL>
-
-<P>
-<DL>
-<DT><U>Type:</U> struct <B>L_BUFFER</B>
-<DD><A NAME="IDX115"></A>
-Used to define buffer variables, it is similar to <SAMP>`FILE*'</SAMP> type in 
-<SAMP>`stdio.h'</SAMP>. To create an instance use 
<SAMP>`L_buffer_create'</SAMP>.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_create</B> <I>(size_t 
<VAR>size</VAR>)</I>
-<DD><A NAME="IDX116"></A>
-<DT><U>Function:</U> L_BUFFER* <B>L_buffer_delete</B> <I>(L_BUFFER 
<VAR>*b</VAR>)</I>
-<DD><A NAME="IDX117"></A>
-These are used to create or delete a buffer which can contain <VAR>size</VAR>
-characters. 
-
-</P>
-
-<PRE>
-  L_BUFFER *lbuffer;
-
-  lbuffer = L_buffer_create(32*1024); /* create a 32K buffer */
-  ...;
-  L_buffer_delete(lbuffer); /* and delete it after use */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_wraparound</B> <I>(L_BUFFER 
<VAR>*b</VAR>, int <VAR>w</VAR>)</I>
-<DD><A NAME="IDX118"></A>
-A buffer created by <SAMP>`L_buffer_create'</SAMP> is set up so that the new
-messages will overwrite the older messages in the buffer. If you wish 
-to disable this overwriting, e.g. to keep the first 32K bytes
-of your system startup messages you should use 
<SAMP>`L_buffer_wraparound'</SAMP>.
-For example:
-
-</P>
-
-<PRE>
-  L_BUFFER *lb = L_buffer_create(32*1024);
-  L_buffer_wraparound(lb, 0); /* disable wraparound */
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_printf</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*fmt</VAR>, ...)</I>
-<DD><A NAME="IDX119"></A>
-<DT><U>Function:</U> void <B>L_buffer_puts</B> <I>(L_BUFFER <VAR>*b</VAR>, 
const char <VAR>*str</VAR>)</I>
-<DD><A NAME="IDX120"></A>
-<DT><U>Function:</U> void <B>L_buffer_putchar</B> <I>(L_BUFFER <VAR>*b</VAR>, 
char <VAR>ch</VAR>)</I>
-<DD><A NAME="IDX121"></A>
-These are the routines which do that actual printing to the buffer.
-
-</P>
-
-<PRE>
-  L_buffer_printf(lbuffer, "U: user input %c\n", c);
-  L_buffer_puts(lbuffer, "warning: its too hot");
-  L_buffer_putchar(lbuffer, '*');
-</PRE>
-
-<P>
-Note: a null pointer passed to the <SAMP>`L_buffer_puts'</SAMP> function prints
-as <SAMP>`(null)'</SAMP>. <A NAME="DOCF7" HREF="nana_foot.html#FOOT7">(7)</A>
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_clear</B> <I>(L_BUFFER <VAR>*b</VAR>)</I>
-<DD><A NAME="IDX122"></A>
-Clear the log, i.e. remove all messages and start again.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Function:</U> void <B>L_buffer_dump</B> <I>(L_BUFFER <VAR>*b</VAR>, 
FILE *<VAR>fp</VAR>)</I>
-<DD><A NAME="IDX123"></A>
-Dump the contents of the log <VAR>*b</VAR> to the file descriptor 
<VAR>*fp</VAR>. 
-Typically <VAR>*fp</VAR> would be <SAMP>`stderr'</SAMP>. 
-
-</P>
-<P>
-Note that this does not change the contents of the buffer.  This is
-important since we may have a hardware or software problem part of the
-way through the dump operation and you don't want to loose anything.
-
-</P>
-<P>
-To reset the buffer after a successful dump use <SAMP>`L_buffer_clear'</SAMP>.
-
-</P>
-<P>
-The output of <SAMP>`L_buffer_dump'</SAMP> consists of a starting message
-followed by the contents of the log. If a character in the log is not
-printable we print it out in hex on a line by itself.
-
-</P>
-
-<PRE>
-* L_buffer_dump =
-log message
-and another
-* non-printable character 0x1
-more log messages
-* end of dump
-</PRE>
-
-</DL>
-
-<P>
-You also need to be able to integrate these functions into your
-design. See <SAMP>`examples/ott.c'</SAMP> for a complicated example. Here we
-will provide a simplified version which implements a new logging macro
-called <SAMP>`LFAST'</SAMP> which does a <SAMP>`printf'</SAMP> to the 
<SAMP>`log_buffer'</SAMP>.
-If you want to have all messages going to a <SAMP>`L_BUFFER'</SAMP> then you 
can
-redefine <SAMP>`L_DEFAULT_HANDLER'</SAMP>.
-
-</P>
-
-<PRE>
-/* project.h - the project wide include file */
-
-#include &#60;nana.h&#62;
-#include &#60;L_buffer.h&#62;
-
-/* LFAST(char *, ...) - log a message to the log_buffer */
-/*     ##f translates as the rest of the arguments to LFAST */
-
-#define LFAST(f...) LHP(L_buffer_printf,log_buffer,##f)
-
-extern L_BUFFER *log_buffer; /* the log buffer */
-</PRE>
-
-<P>
-The main program merely creates the <VAR>log_buffer</VAR> and eventually
-calls <SAMP>`L_buffer_dump'</SAMP> to print out the buffer when the system 
dies.
-
-<PRE>
-/* main.c - initialise the system and start things */
-
-#include &#60;project.h&#62;
-
-L_BUFFER *log_buffer;
-
-main() {
-  log_buffer = L_buffer_create(16000); 
-  if(log_buffer == NULL) { /* not enough store */
-    ...
-  }
-  LFAST("system starting at %f\n", now());
-  ...;
-}
-
-void fatal_error() { /* called on fatal errors */
-  FILE *f = fopen("project.errors","w");
-  L_buffer_dump(b, stderr); /* print log to stderr */
-  L_buffer_dump(b, f); /* print log to file */
-}
-</PRE>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_21.html">previous</A>, <A HREF="nana_23.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_foot.html
===================================================================
RCS file: nana/manual/html_node/nana_foot.html
diff -N nana/manual/html_node/nana_foot.html
--- nana/manual/html_node/nana_foot.html        28 Oct 2003 20:27:24 -0000      
1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,61 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Footnotes</TITLE>
-</HEAD>
-<BODY>
-<H1>GNU Nana</H1>
-<H2>Improved support for assertions and logging in C and C++</H2>
-<H2>last updated 27 February 1998 for version 1.14</H2>
-<ADDRESS>P.J.Maker (<A 
HREF="mailto:address@hidden";>address@hidden</A>)</ADDRESS>
-<P>
-<P><HR><P>
-<H3><A NAME="FOOT1" HREF="nana_1.html#DOCF1">(1)</A></H3>
-<P>Which is unfortunately quite uncommon in
-the authors experience.
-<H3><A NAME="FOOT2" HREF="nana_11.html#DOCF2">(2)</A></H3>
-<P>And about 60 reset cycles where the machine
-went off into hyperspace
-<H3><A NAME="FOOT3" HREF="nana_12.html#DOCF3">(3)</A></H3>
-<P>This allows variable number of arguments to
-C preprocessor macros.
-<H3><A NAME="FOOT4" HREF="nana_19.html#DOCF4">(4)</A></H3>
-<P>If you don't want a core dump then look at stopping the core
-dumps with <CODE>ulimit</CODE> rather than changing the handler.
-<H3><A NAME="FOOT5" HREF="nana_19.html#DOCF5">(5)</A></H3>
-<P>Side-effects
-include such operations as input/output or assignments, e.g. <SAMP>`x++'</SAMP>
-<H3><A NAME="FOOT6" HREF="nana_20.html#DOCF6">(6)</A></H3>
-<P>Side-effects
-include operations like input/output or assignments.
-<H3><A NAME="FOOT7" HREF="nana_22.html#DOCF7">(7)</A></H3>
-<P>This was suggested by Phil Blecker.
-<H3><A NAME="FOOT8" HREF="nana_26.html#DOCF8">(8)</A></H3>
-<P>ANSI C does not allow
-variable declarations at the beginning of loops unlike C++. The
- <SAMP>`Q.h'</SAMP> macros get around this by starting each loop with a new
-scope.
-<H3><A NAME="FOOT9" HREF="nana_26.html#DOCF9">(9)</A></H3>
-<P>This uses yet
-another GNU CC extension, however since we are already using statement 
-expressions we might as well use <SAMP>`typeof'</SAMP> as well.
-<H3><A NAME="FOOT10" HREF="nana_28.html#DOCF10">(10)</A></H3>
-<P>In
-the fullness of time, we may integrate these routines in here.
-<H3><A NAME="FOOT11" HREF="nana_33.html#DOCF11">(11)</A></H3>
-<P>Of course you also need to use the gdb commands
-generated by the <SAMP>`nana'</SAMP> command, perhaps using 
<SAMP>`nana-clg'</SAMP>
-<H3><A NAME="FOOT12" HREF="nana_35.html#DOCF12">(12)</A></H3>
-<P>Gordon Matzigkeit contributed some of the 
-ideas presented here and raised this problem.
-<H3><A NAME="FOOT13" HREF="nana_35.html#DOCF13">(13)</A></H3>
-<P>Or add a <SAMP>`--with-nana'</SAMP> flag
-to configure that does the opposite.
-<P><HR><P>
-This document was generated on 6 November 1998 using the
-<A HREF="http://wwwinfo.cern.ch/dis/texi2html/";>texi2html</A>
-translator version 1.52.</P>
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_20.html
===================================================================
RCS file: nana/manual/html_node/nana_20.html
diff -N nana/manual/html_node/nana_20.html
--- nana/manual/html_node/nana_20.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,242 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
DI.h</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_19.html">previous</A>, <A HREF="nana_21.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC20" HREF="nana_toc.html#TOC20">DI.h: debugger based invariant 
checking</A></H2>
-<P>
-This implements the debugger based invariant checking code.
-The first two macros are the normal
-user interface; the remainder are used for configuring the behaviour on
-failure, etc. Note that these macros have no effect unless you run your 
-program under the debugger and read in the commands generated by the
-<SAMP>`nana'</SAMP> command.
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX59"></A>
-The <VAR>exprn</VAR> should always be true if the program is working. 
-If it is true then nothing happens otherwise the code given by
-<SAMP>`DI_DEFAULT_HANDLER'</SAMP> will be called which by default prints 
-a message and dies just like <SAMP>`assert.h'</SAMP>.  
-
-</P>
-<P>
-The checking using <VAR>DI</VAR> can be enabled and disabled by using the
-<VAR>DI_LEVEL</VAR> and <VAR>DI_DEFAULT_GUARD</VAR> macros. See the definitions
-below for these macros for further details.
-
-</P>
-<P>
-Note that <VAR>exprn</VAR> should have no side-effects<A NAME="DOCF6" 
HREF="nana_foot.html#FOOT6">(6)</A> since 
-disabling the checking shouldn't change your programs behaviour.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>exprn</VAR>)</I>
-<DD><A NAME="IDX60"></A>
-The opposite of <SAMP>`DI'</SAMP>, i.e. the expression must never ever be true 
if
-the program is working properly. It is equivelant to <CODE>I(!(e))</CODE> and
-exists as piece of syntactic sugar which is helpful for complicated
-boolean expressions.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> int <B>DI_LEVEL</B>
-<DD><A NAME="IDX61"></A>
-The <SAMP>`DI_LEVEL'</SAMP> macro is used to globally enable and disable
-checking, in particular it can take on one of three values:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>0</CODE>
-<DD>
-<A NAME="IDX62"></A>
-Disable all checking. Regardless of anything else no code will be
-generated for <CODE>DI</CODE>, <CODE>DN</CODE>, etc.
-<DT><CODE>1</CODE>
-<DD>
-<A NAME="IDX63"></A>
-Enable checking only if the corresponding guard condition is true. The
-guard condition can be used to enable and disable checking at compile
-and run time.
-<DT><CODE>2</CODE>
-<DD>
-<A NAME="IDX64"></A>
-Enable all checking regardless of guard conditions, etc.
-</DL>
-
-<P>
-<CODE>DI_LEVEL</CODE> defaults to <CODE>1</CODE>. 
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> bool <B>DI_DEFAULT_GUARD</B>
-<DD><A NAME="IDX65"></A>
-The <CODE>DI_DEFAULT_GUARD</CODE> is used to selectively enable or disable
-checking at compile or run time. 
-
-</P>
-<P>
-<CODE>DI_DEFAULT_GUARD</CODE> defaults to <CODE>TRUE</CODE>, i.e. always 
enabled.
-
-</P>
-<P>
-A user would typically define <CODE>DI_DEFAULT_GUARD</CODE> to be global or 
local
-variable which is used to turn checking on or off at run--time. For
-example:
-
-</P>
-
-<PRE>
-#define DI_DEFAULT_GUARD (i_guard)
-
-extern int i_guard;
-</PRE>
-
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> text <B>DI_DEFAULT_PARAMS</B>
-<DD><A NAME="IDX66"></A>
-This is passed off to the <CODE>DI_DEFAULT_HANDLER</CODE> and defaults to
-nothing, it is just some text and is intended to pass failure codes
-(e.g. <CODE>IEH303</CODE>) or requests (e.g. <CODE>HW_DEAD</CODE>) information 
off
-to the handler.
-
-</P>
-<P>
-<CODE>DI_DEFAULT_PARAMS</CODE> defaults to nothing.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_DEFAULT_HANDLER</B> <I>(char *<VAR>exprn</VAR>, 
char *<VAR>file</VAR>, int <VAR>line</VAR>, <VAR>param</VAR>)</I>
-<DD><A NAME="IDX67"></A>
-
-</P>
-<P>
-When an error is detected the <CODE>DI_DEFAULT_HANDLER</CODE> will be called to
-handle the error. The arguments are:
-
-</P>
-<DL COMPACT>
-
-<DT><CODE>exprn</CODE>
-<DD>
-<A NAME="IDX68"></A>
-A string representation of the expression that has failed, e.g. 
<CODE>"I(i&#62;=0)"</CODE>.
-<DT><CODE>file</CODE>
-<DD>
-<A NAME="IDX69"></A>
-The file that this error occurred in, i.e. <CODE>__FILE__</CODE>.
-<DT><CODE>line</CODE>
-<DD>
-<A NAME="IDX70"></A>
-The line number for the error, i.e. <CODE>__LINE__</CODE>.
-<DT><CODE>param</CODE>
-<DD>
-<A NAME="IDX71"></A>
-An optional parameter which can be passed across which defaults to
-<CODE>DI_DEFAULT_PARAMS</CODE>. This can be used to pass failure codes or other
-information from the checking code to the handler.
-</DL>
-</DL>
-
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI_MAKE_VALID_BREAKPOINT</B> <I>(exprn 
<VAR>e</VAR>)</I>
-<DD><A NAME="IDX72"></A>
-This macro is used to ensure that a breakpoint can be set at the
-location we are checking using <CODE>DI</CODE>, etc. It defaults to
-<CODE>asm("nop")</CODE> and can be redefined by the user.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DI</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX73"></A>
-<DT><U>Macro:</U> void <B>DIG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX74"></A>
-<DT><U>Macro:</U> void <B>DIH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX75"></A>
-<DT><U>Macro:</U> void <B>DIP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX76"></A>
-<DT><U>Macro:</U> void <B>DIGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX77"></A>
-<DT><U>Macro:</U> void <B>DIGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX78"></A>
-<DT><U>Macro:</U> void <B>DIHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX79"></A>
-<DT><U>Macro:</U> void <B>DIGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX80"></A>
-<DT><U>Macro:</U> void <B>DN</B> <I>(bool <VAR>e</VAR>)</I>
-<DD><A NAME="IDX81"></A>
-<DT><U>Macro:</U> void <B>DNG</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>)</I>
-<DD><A NAME="IDX82"></A>
-<DT><U>Macro:</U> void <B>DNH</B> <I>(bool <VAR>e</VAR>, Macro 
<VAR>h</VAR>)</I>
-<DD><A NAME="IDX83"></A>
-<DT><U>Macro:</U> void <B>DNP</B> <I>(bool <VAR>e</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX84"></A>
-<DT><U>Macro:</U> void <B>DNGH</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>)</I>
-<DD><A NAME="IDX85"></A>
-<DT><U>Macro:</U> void <B>DNGP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX86"></A>
-<DT><U>Macro:</U> void <B>DNHP</B> <I>(bool <VAR>e</VAR>, Macro <VAR>h</VAR>, 
Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX87"></A>
-<DT><U>Macro:</U> void <B>DNGHP</B> <I>(bool <VAR>e</VAR>, bool <VAR>g</VAR>, 
Macro <VAR>h</VAR>, Text <VAR>p</VAR>)</I>
-<DD><A NAME="IDX88"></A>
-
-</P>
-<P>
-All of these macros are used to individually override the
-default values defined above. Normally these macros
-would be used in a system wide header file to define macros appropriate 
-for the application.
-</DL>
-
-</P>
-<P>
-<DL>
-<DT><U>Macro:</U> void <B>DS</B> <I>(<VAR>e</VAR>)</I>
-<DD><A NAME="IDX89"></A>
-<DT><U>Macro:</U> void <B>DSG</B> <I>(<VAR>e</VAR>, <VAR>g</VAR>)</I>
-<DD><A NAME="IDX90"></A>
-These macros are used to assign values to convenience variables in the
-debugger. Convenience variables are dynamically typed, global in scope
-and initialised to 0. They start with a single <CODE>$</CODE> and can be used 
be
-used for saving the state of program or for counting events. The
-<SAMP>`DS'</SAMP> macro executes <VAR>e</VAR> under the same rules as 
<CODE>DI</CODE>.
-The <SAMP>`DSG'</SAMP> macro executes <VAR>e</VAR> only if the the expression
-<VAR>g</VAR> is true.
-
-</P>
-<P>
-Note that <SAMP>`DS'</SAMP> and <SAMP>`DSG'</SAMP> can also be used for 
modifying
-C variables and calling functions.
-</DL>
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_19.html">previous</A>, <A HREF="nana_21.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_35.html
===================================================================
RCS file: nana/manual/html_node/nana_35.html
diff -N nana/manual/html_node/nana_35.html
--- nana/manual/html_node/nana_35.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,40 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
GNU</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_34.html">previous</A>, <A HREF="nana_36.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC35" HREF="nana_toc.html#TOC35">GNU Programs: how to avoid nana 
sometimes</A></H2>
-<P>
-Imagine you<A NAME="DOCF12" HREF="nana_foot.html#FOOT12">(12)</A> are building 
a GNU program.
-Ideally it should run on systems without any other software including
-GCC, GDB and even Nana. 
-
-</P>
-<P>
-To achieve this noble goal you can provide your configure script
-with a <SAMP>`--without-nana'</SAMP><A NAME="DOCF13" 
HREF="nana_foot.html#FOOT13">(13)</A> flag which then <SAMP>`#define's'</SAMP>
-<SAMP>`WITHOUT_NANA'</SAMP>. You should also use the <SAMP>`VL'</SAMP> macro 
rather than
-<SAMP>`L'</SAMP> macro since <SAMP>`L'</SAMP> takes a variable number of 
arguments and
-will break non GNU C preprocessors. 
-
-</P>
-
-<PRE>
-int half(int n) {
-  /* Don't use L(...) since it takes a variable number of args! */
-  VL(("hello world = %d\n", 10)); /* Note the doubled (( */
-  ...;
-}
-</PRE>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_34.html">previous</A>, <A HREF="nana_36.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_33.html
===================================================================
RCS file: nana/manual/html_node/nana_33.html
diff -N nana/manual/html_node/nana_33.html
--- nana/manual/html_node/nana_33.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,35 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Simplest</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_32.html">previous</A>, <A HREF="nana_34.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC33" HREF="nana_toc.html#TOC33">Simplest example</A></H2>
-<P>
-As a nice simple, indeed trivial example consider the following:
-
-</P>
-
-<OL>
-<LI>Include <SAMP>`nana.h'</SAMP> in your project wide include file.
-
-<LI>Use <SAMP>`I'</SAMP> to check invariants in your code. In particular
-
-all functions or methods should be required to check their pre and post
-conditions.
-<LI>Use <SAMP>`DL'</SAMP> to print debugging messages in your code. This means
-
-that debugging messages only occur when you run the program under the
-debugger.<A NAME="DOCF11" HREF="nana_foot.html#FOOT11">(11)</A>
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_32.html">previous</A>, <A HREF="nana_34.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_40.html
===================================================================
RCS file: nana/manual/html_node/nana_40.html
diff -N nana/manual/html_node/nana_40.html
--- nana/manual/html_node/nana_40.html  28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,52 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
FAQ</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_39.html">previous</A>, <A HREF="nana_41.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-
-<H1><A NAME="SEC40" HREF="nana_toc.html#TOC40">FAQ</A></H1>
-<P>
-This chapter is intended to answer some general questions about the
-usage of Nana. Most of the material (perhaps) has been presented elsewhere,
-my apologies for repeating myself.
-
-</P>
-
-<OL>
-<LI>Can I use GNU Nana in a commercial product?
-
-See the license details in the file <SAMP>`COPYING'</SAMP>. In summary GNU Nana
-is Free software which has been released under a license that allows
-commercial use provided the copyright is maintained. It is not under
-the GPL. 
-
-<LI>How do you completely disable assertion checking?
-
-Set the <SAMP>`I_LEVEL'</SAMP> command to <SAMP>`0'</SAMP> using 
<SAMP>`-D'</SAMP> or 
-<SAMP>`#define'</SAMP> before including <SAMP>`nana.h'</SAMP>. 
-
-<LI>How do I find out about future releases?
-
-Subscribe to the nana mailing list by using the <SAMP>`make subscribe'</SAMP>
-target in the nana root directory. 
-
-<LI>Where do I send bug reports, suggestions, etc?
-
-<SAMP>address@hidden'</SAMP> -- bug archive
-
-<SAMP>address@hidden'</SAMP> -- mailing list
-
-<SAMP>address@hidden'</SAMP> -- the author
-
-</OL>
-
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A 
HREF="nana_39.html">previous</A>, <A HREF="nana_41.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_1.html
===================================================================
RCS file: nana/manual/html_node/nana_1.html
diff -N nana/manual/html_node/nana_1.html
--- nana/manual/html_node/nana_1.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,236 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Introduction</TITLE>
-</HEAD>
-<BODY>
-Go to the first, previous, <A HREF="nana_2.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-<P><HR><P>
-
-<P>
-Copyright (C) 1996, 1997, P.J.Maker
-
-</P>
-<P>
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-</P>
-
-
-
-<H1><A NAME="SEC1" HREF="nana_toc.html#TOC1">Introduction</A></H1>
-
-<P>
-Nana is a library that provides support for assertion checking
-and logging in a space and time efficient manner. The aim is to put
-common good practise<A NAME="DOCF1" HREF="nana_foot.html#FOOT1">(1)</A> into a 
library that can be reused rather than
-writing this stuff every time you begin a new project.
-
-</P>
-<P>
-In addition assertion checking and logging code can be implemented using
-a debugger rather than as inline code with a large saving in code space.
-
-</P>
-<P>
-Nana aims to solve the following problems:
-
-</P>
-
-<OL>
-<LI>Avoid the two executables problem (one with asserts in and another
-
-without any).
-
-The code space and time costs of having assertion checking and detailed
-logging code in a program can be high. Normally people construct two
-versions of the program, one with checking code for testing and one
-without checking code for production use.
-
-With nana one version of the executable can be
-built for both testing and release since debugger based checking has 
-negligible space and time impact.
-
-<LI>Configurable: the nana library is designed to be reconfigured by
-
-the user according to their needs. For example we can:
-
-<UL>
-<LI>Modify the behaviour on assertion failure, e.g. to attempt
-
-a system restart rather than just shutting down.
-<LI>Selectively enable and disable assertion checking and
-
-logging both at compile and run time.
-<LI>Send the logging information off to various locations, e.g.
-
-
-<UL>
-<LI>Users terminal
-
-<LI>A file for later checking.
-
-<LI>Another process, e.g. a plotting program or a
-
-program that verifies that the system is behaving itself.
-<LI>A circular buffer in memory.
-
-This is an old embedded systems trick and is very useful
-for production systems. The time cost of logging into 
-memory is not large and when your production system in
-the field has problems you can then see what was happening 
-in the minutes before its unfortunate demise rather than
-asking some user what was happening before it died.
-</UL>
-
-</UL>
-
-<LI>Time and space efficient.
-
-For example the GNU <SAMP>`assert.h'</SAMP> implementation uses 53 bytes for 
-<SAMP>`assert(i&#62;=0)'</SAMP> on a i386. The nana version using the i386 
<SAMP>`stp'</SAMP>
-instruction on assert fail uses 10 bytes. If your willing to accept the
-time penalty this can be reduced to 0 or 1 byte by using debugger based
-assertions.
-
-<LI>Support for formal methods.
-
-
-<UL>
-<LI>Before and after state (e.g. x,x' in the Z notation).
-
-Specifications are often written in terms of the state of
-variables before and after an operation. For example the
-<SAMP>`isempty'</SAMP> operation on a stack should leave the stack
-unchanged. To verify this in nana we could use:
-      
-
-<PRE>
-bool isempty(){ /* true iff stack is empty */
-  DS($s = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  DI($s == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-        
-These <SAMP>`$..'</SAMP> variables are called convenience variables 
-and are implemented by gdb. They have a global scope and are 
-dynamically typed and initialised automatically to 0.
-
-In addition a C only version of before and after state is provided.
-For example:
-
-
-<PRE>
-bool isempty() { /* true iff stack is empty */
-  ID(int olds); /* declare variable to hold old value */
-  IS(olds = s); /* copy s into $s in the debugger */
-  ...; /* code to do the operation */
-  I(olds == s); /* verify that s hasn't been changed */
-}
-</PRE>
-
-<LI>Support for Predicate Calculus.
-
-Nana provides some support for universal (forall) and
-existential  (exists one or more) quantification. For example to specify
-that the string v contains only lower case letters we could use:
-
-
-<PRE>
-  I(A(char *p = v, *p != '\0', p++, islower(*p)));
-</PRE>
-
-These macros can be nested and used as normal boolean values in
-control constructs as well as assertions. Unfortunately they
-depend on the GNU CC statement value extensions and so are not 
-portable. The following macros are defined in <SAMP>`Q.h'</SAMP>:
-
-<DL COMPACT>
-
-<DT><CODE>A</CODE>
-<DD>
-<A NAME="IDX1"></A>
-For all values the expression must be true.
-<DT><CODE>E</CODE>
-<DD>
-<A NAME="IDX2"></A>
-There exists one or more values for which the expression is
-true.
-<DT><CODE>E1</CODE>
-<DD>
-<A NAME="IDX3"></A>
-There exists a single value for which the expression is true.
-<DT><CODE>C</CODE>
-<DD>
-<A NAME="IDX4"></A>
-Returns the number of times the expression is true.
-<DT><CODE>S</CODE>
-<DD>
-<A NAME="IDX5"></A>
-Returns the sum of the expressions.
-<DT><CODE>P</CODE>
-<DD>
-<A NAME="IDX6"></A>
-Returns the product of the expressions.
-</DL>
-
-<LI>Verifying timing.
-
-As well as using nana to verify timings with assertions using a
-hardware supported timer you can also a simulator (e.g. the
-PSIM power pc simulator by Cagney) with gdb. These simulators can
-model time and provide a register called <SAMP>`$cycles'</SAMP> which
-represents the current cycle count of the program. This can be 
-used to check that timing constraints are being meet.
-
-
-<PRE>
-void process_events() {
-  for(;;){ 
-    DS($start = $cycles); 
-    switch(get_event()){
-      case TOO_HOT:
-        ...;
-        DI($start - $cycles &#60;= 120);
-        break;
-      case TOO_COLD:
-        ...;
-        DI($start - $cycles &#60;= 240);
-        break;
-    }
-  }
-}
-</PRE>
-
-</UL>
-
-</OL>
-
-<P>
-The intended audience for Nana includes:
-
-</P>
-
-<UL>
-<LI>Software Engineers.
-
-<LI>Formal methods community.
-
-<LI>Real time programmers.
-
-<LI>System testers.
-
-<LI>People teaching programming.
-
-</UL>
-
-<P><HR><P>
-Go to the first, previous, <A HREF="nana_2.html">next</A>, <A 
HREF="nana_42.html">last</A> section, <A HREF="nana_toc.html">table of 
contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/html_node/nana_2.html
===================================================================
RCS file: nana/manual/html_node/nana_2.html
diff -N nana/manual/html_node/nana_2.html
--- nana/manual/html_node/nana_2.html   28 Oct 2003 20:27:24 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,102 +0,0 @@
-<HTML>
-<HEAD>
-<!-- This HTML file has been created by texi2html 1.52
-     from ../texi/nana.texi on 6 November 1998 -->
-
-<TITLE>GNU Nana: improved support for assertions and logging in C and C++ - 
Related work</TITLE>
-</HEAD>
-<BODY>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_1.html">previous</A>, 
<A HREF="nana_3.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-<P><HR><P>
-
-
-<H2><A NAME="SEC2" HREF="nana_toc.html#TOC2">Related work</A></H2>
-<P>
-The Nana project was inspired by some other projects, in particular:
-
-</P>
-
-<UL>
-<LI>Anna - Anna stands for "Annotated Ada" where the programmer inserts
-
-various assertions into the code which can be automatically validated. 
-To quote from the WWW Virtual Library entry on Anna:
-
-
-<BLOCKQUOTE>
-<P>
-Anna is a language for formally specifying the intended behaviour of Ada
-programs. It extends Ada with various different kinds of specification
-constructs from ones as simple as assertions, to as complex as algebraic
-specifications. A tool set has been implemented at Stanford for
-Anna, including: 
-
-</P>
-
-<OL>
-<LI>standard DIANA extension packages, parsers, pretty-printers;
-
-<LI>a semantic checker;
-
-<LI>a specification analyser;
-
-<LI>an annotation transformer; and
-
-<LI>a special debugger that allows program debugging based on formal 
specifications
-
-</OL>
-
-<P>
-All tools have been developed in Ada and are therefore extremely
-portable. Anna has thus been ported to many platforms. For more
-information send e-mail to "address@hidden". Before
-down loading the huge Anna release, you may wish to copy and read some
-Anna LaTeX reports.
-
-</P>
-</BLOCKQUOTE>
-
-Anna is available from: <CODE>ftp://anna.stanford.edu/pub/anna</CODE>
-
-<LI>Eiffel - the Eiffel programming language provides support in the language
-
-flexible assertion checking. To quote from the Eiffel page in WWW
-Virtual library:
-
-
-<BLOCKQUOTE>
-
-<P>
-Eiffel is a pure object-oriented language featuring multiple
-inheritance, polymorphism, static typing and dynamic binding, genericity
-(constrained and unconstrained), a disciplined exception mechanism,
-systematic use of assertions to promote programming by contract, and
-deferred classes for high-level design and analysis.
-</BLOCKQUOTE>
-
-<LI>APP - Annotation PreProcessor.
-
-The APP was written by David S. Rosenblum and provides assertion checking
-functions for C and C++. It is implemented using a preprocessor wrapper
-around the C preprocessor and supports quantifiers and before/after state.
- 
-See "A Practical Approach to Programming with Assertions" in
-Vol 21, No. 1, January 1995 of IEEE Transactions on Software Engineering
-for an interesting paper describing APP. Unfortunately the APP tool
-doesn't seem to be freely available (I'm willing to be corrected on this). 
-Note that any similarity between my examples and David's are due
-to morphic resonance.
-</UL>
-
-<P>
-Nana is essentially a poor mans implementation of some of these ideas
-which works for C and C++. Ideally in the best of all possible worlds
-you might want to look at Eiffel or in the military world Ada and Anna.
-If you use TCL/TK you might also be interested in Jon Cook's 
-<SAMP>`AsserTCL'</SAMP> package.
-
-</P>
-<P><HR><P>
-Go to the <A HREF="nana_1.html">first</A>, <A HREF="nana_1.html">previous</A>, 
<A HREF="nana_3.html">next</A>, <A HREF="nana_42.html">last</A> section, <A 
HREF="nana_toc.html">table of contents</A>.
-</BODY>
-</HTML>

Index: nana/manual/info/nana-info.tar.gz
===================================================================
RCS file: nana/manual/info/nana-info.tar.gz
diff -N nana/manual/info/nana-info.tar.gz
Binary files /tmp/cvsg05hle and /dev/null differ

Index: patch/.symlinks
===================================================================
RCS file: patch/.symlinks
diff -N patch/.symlinks
--- patch/.symlinks     7 Feb 2008 11:31:39 -0000       1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-patch.html index.html

Index: patch/patch.html
===================================================================
RCS file: patch/patch.html
diff -N patch/patch.html
--- patch/patch.html    24 Oct 2011 19:40:56 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,68 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<HTML>
-<HEAD>
-<TITLE>patch - GNU Project - Free Software Foundation (FSF)</TITLE>
-<LINK REV="made" HREF="mailto:address@hidden";>
-<META NAME="keywords" CONTENT="patch">
-</HEAD>
-<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" 
VLINK="#9900DD">
-<H3>patch</H3>
-<A HREF="/graphics/gnu-head-sm.jpg"><IMG SRC="/graphics/gnu-head-sm.jpg"
-ALT=" [image of the Head of a GNU] "
-WIDTH="129" HEIGHT="122"></A>
-<CENTER>
-  <A HREF="#introduction" NAME="TOCintroduction">Introduction</A>
-| <A HREF="#downloading" NAME="TOCdownloading">Get the Software</A>
-</CENTER>
-<P>
-<HR>
-
-<H4><A HREF="#TOCintroduction" NAME="introduction">Introduction to 
Patch</A></H4>
-<P>
-
-<P>
-`patch' takes a patch file containing a difference listing produced
-by <A HREF="/software/diffutils/diffutils.html">diff</A>
-and applies those differences to one or more original files,
-producing patched versions.
-
-
-<H4><A HREF="#TOCdownloading" NAME="downloading">Downloading Patch</A></H4>
-<P>
-
-Patch can be found on in the subdirectory <CODE>/gnu/patch/</CODE> on your 
favorite
-<A HREF="/prep/ftp.html">GNU mirror</A>. For other ways to 
-obtain Patch, please read
-<A HREF="/software/software.html#HowToGetSoftware">How to get GNU Software</A>
-
-<HR>
-
-Return to <A HREF="/home.html">GNU's home page</A>.
-
-<P>
-Please send FSF &amp; GNU inquiries &amp; questions to
-
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-There are also <A HREF="/home.html#ContactInfo">other ways to contact</A> the 
FSF.
-
-<P>
-Please send comments on these web pages to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>,
-send other questions to
-<A HREF="mailto:address@hidden";><EM>address@hidden</EM></A>.
-
-<P>
-Copyright (C) 1998 Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA  02111,  USA
-
-<P>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-<P>
-Updated:
-<!-- hhmts start -->
-27 Jun 2000 bkuhn
-<!-- hhmts end -->
-<HR>
-</BODY>
-</HTML>

Index: rcs/.symlinks
===================================================================
RCS file: rcs/.symlinks
diff -N rcs/.symlinks
--- rcs/.symlinks       17 Dec 2006 23:42:13 -0000      1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-rcs.html index.html

Index: rcs/rcs.html
===================================================================
RCS file: rcs/rcs.html
diff -N rcs/rcs.html
--- rcs/rcs.html        24 Oct 2011 19:41:57 -0000      1.10
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,230 +0,0 @@
-<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
-<html>
-<head>
-<title>RCS - GNU Project - Free Software Foundation (FSF)</title>
-<link REV="made" HREF="mailto:address@hidden";>
-<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;
-charset=iso-8859-1">
-<meta NAME="keywords" CONTENT="rcs">
-</head>
-<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000"
-VLINK="#9900DD">
-<h3><acronym TITLE="Revision Control System">RCS</acronym></h3>
-
-<p>
-<!-- If you replace this graphic, make sure you change the link
-     to also point to the correct HTML page.
-     If you make a new graphic for this page, make sure it has
-     a corresponding entry in /graphics/graphics.html .
-     -->
-<a HREF="/graphics/agnuhead.html"><img SRC="/graphics/gnu-head-sm.jpg"
-   ALT=" [image of the Head of a GNU] "
-   WIDTH="129" HEIGHT="122"></a>
-
-<hr>
-
-[
-
-<!-- Please keep this list alphabetical -->
-<!-- PLEASE UPDATE THE LIST AT THE BOTTOM (OR TOP) OF THE PAGE TOO! -->
-<!-- -->
-  <a TITLE="English version of this document"
-  HREF="rcs.html">English</a>
-<!-- | <A TITLE="Language version of this document" -->
-<!-- HREF="rcs.LG.html">Language</A>  -->
-]
-
-<hr>
-
-<p>
-<h4>Introduction to RCS</h4>
-
-<p>The Revision Control System (RCS) manages multiple revisions of
-files.  RCS automates the storing, retrieval, logging, identification,
-and merging of revisions.  RCS is useful for text that is revised
-frequently, including source code, programs, documentation, graphics,
-papers, and form letters.</p>
-
-<p>RCS was first developed by Walter Tichy at Purdue University in the
-early 1980s.  RCS design was an improvement from its predecessor Source
-Code Control System (SCCS) (see <a TITLE="The GNU CSSC web site, the GNU
-replacement for SCCS" HREF="http://cssc.sourceforge.net/";>GNU CSSC</a>).
-The improvements include an easier user interface and improved storage
-of versions for faster retrieval.  RCS improves performance by storing
-an entire copy of the most recent version and then stores
-<em>reverse</em> differences (called "deltas").  RCS uses <a TITLE="The
-GNU Diffutils software page"
-HREF="http://www.gnu.org/software/diffutils/";>GNU Diffutils</a> to find
-the differences between versions.</p>
-
-<h4>Downloading RCS</h4>
-
-<p>The latest RCS source distributions for Unix and GNU systems and the
-latest Windows and DOS binaries can be found at the <a TITLE="Official
-RCS Web Page hosted at Purdue University"
-HREF="http://www.cs.purdue.edu/homes/trinkle/RCS/";>Purdue RCS
-Homepage</a>.  Files can alternately be downloaded from the Purdue
-<acronym TITLE="File Transfer Protocol">FTP</acronym> site <a
-TITLE="Repository of downloads of RCS from Purdue University"
-HREF="ftp://ftp.cs.purdue.edu/pub/RCS/";>ftp://ftp.cs.purdue.edu/pub/RCS/</a>.</p>
-
-<p>RCS can also be found in the subdirectory <code>/gnu/rcs/</code> on
-your favorite <a TITLE="Mirror list of GNU Software"
-HREF="/prep/ftp.html">GNU mirror</a>.
-For other ways to obtain RCS, please read <a TITLE="How to Get GNU
-Software"
-HREF="/software/software.html#HowToGetSoftware">How to Get GNU
-Software</a></p>
-
-
-<h4>Documentation</h4>
-
-<p>There is no official manual for RCS, although the RCS distribution
-comes with the original <code>troff</code> file for Tichy's paper <a
-TITLE="Full Versions of and Citations of the Paper RCS: A System for
-Version Control (1991)"
-HREF="http://overcite.lcs.mit.edu/tichy91rcs.html";>RCS: A System for
-Version Control (1991)</a>. Additional sources of RCS documentation can
-be found at the <a TITLE="Purdue RCS Homepage"
-HREF="http://www.cs.purdue.edu/homes/trinkle/RCS/";>Purdue RCS
-Homepage</a>.</p>
-
-<p>You may also find more information about RCS by looking at 
-man pages (<em>man foo</em> at the shell prompt) on your system,
-including:</p>
-
-<dl>
- <dd><code>man rcsintro</code></dd>
- <dd><code>man rcs</code></dd>
- <dd><code>man rcsfile</code></dd>
- <dd><code>man ci</code></dd>
- <dd><code>man co</code></dd>
-
- <dd><code>man rcsdiff</code></dd>
- <dd><code>man rlog</code></dd>
- <dd><code>man rcsmerge</code></dd>
- <dd><code>man rcsclean</code></dd>
- <dd><code>man rcsfreeze</code></dd>
-</dl>
-
-<h4>Mailing Lists/Newsgroups</h4>
-
-<p>RCS has two mailing lists:  <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a> and <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a>.</p>
-
-<p>The main discussion list is <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a>, and is
-used
-to discuss all aspects of RCS, including questions and help.</p>
-
-<p>To subscribe to any RCS mailing list, please send an empty mail with
-a Subject: header line of just "subscribe" to the relevant -request
-list.  For example, to subscribe yourself to the help list, you would
-send mail to <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a>
-
-with no body and a Subject: header line of just "subscribe".</p>
-
-<p>There exist web archives and web interfaces for subscription to
-these mailing lists.</p>
-
-<ul>
- <li><a HREF="http://mail.gnu.org/mailman/listinfo/bug-rcs";>Bug-rcs -- Bug 
reports for the GNU Revision Control System</a></li>
- <li><a HREF="http://mail.gnu.org/mailman/listinfo/help-rcs";>Help-rcs
- -- Users list for the GNU Revision Control System</a></li>
-</ul>
-
-<p>There is one newsgroup related to RCS - <a
-HREF="news:comp.software.config-mgmt";>comp.software.config-mgmt</a>
-(<a
-TITLE="Web Archives to the Newsgroupo comp.software.config-mgmt"
-HREF="http://groups.google.com/groups?group=comp.software.config-mgmt";>Group
-Archives</a>).</p>
-
-<h4>Request an Enhancement</h4>
-
-<p>As recently reported in the <code>NEWS</code> file contained in the
-source distribution, RCS now conforms to GNU configuration standards and
-to Posix 1003.1b-1993.  If you would like any new feature to be included
-in future versions of RCS, please send a request to <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a>.</p>
-
-<p>Please remember that development of RCS is a volunteer effort, and
-you can also contribute to its development. For information about
-contributing to the GNU Project, please read <a TITLE="Page on how to
-help the GNU Project" HREF="/help/help.html">How to help GNU</a>.</p>
-
-
-<h4>Report a Bug</h4>
-
-<p>If you think you have found a bug in RCS, then you should send as
-complete a report as possible to <a
-HREF="mailto:address@hidden";>&lt;address@hidden&gt;</a>. For usage
-problems, please send a <em>recipe</em> that duplicates the error.  A
-<em>recipe</em> is the sequence of shell commands executed that
-duplicates
-the behavior.</p>
-
-<p>For compilation and portability issues, you should ideally include
-the output you get from running <em>config.guess</em>, the text you see
-when you run and <em>configure</em> the software, and any patches made
-with <em>diff
--u5</em> which fix the problem.</p>
-
-
-<h4>Maintainer</h4>
-
-<p>RCS is currently being maintained by Paul Eggert.</p>
-
-<!--
-  * If needed, change the copyright block at the bottom. In general,
-  all pages
-    on the GNU web server should have the section about verbatim
-  copying. Please
-    do NOT remove this without talking with the webmasters first.
--->
-
-<hr>
-
-[
-<!-- Please keep this list alphabetical -->
-<!-- PLEASE UPDATE THE LIST AT THE BOTTOM (OR TOP) OF THE PAGE TOO! -->
-<!-- -->
-  <a HREF="rcs.html">English</a>
-<!-- | A HREF="rcs.html" LANGUAGE /A  -->
-]
-
-<hr>
-
-<p>
-Return to <a HREF="/">GNU's home page</a>.
-
-<p>
-
-Please send FSF &amp; GNU inquiries &amp; questions to 
-
-<a HREF="mailto:address@hidden";><em>address@hidden</em></a>.
-There are also <a HREF="http://www.fsf.org/about/contact.html";>other ways to
-contact</a> the FSF.
-<p>
-
-Please send comments on these web pages to
-
-<a HREF="mailto:address@hidden";><em>address@hidden</em></a>,
-send other questions to
-
-<a HREF="mailto:address@hidden";><em>address@hidden</em></a>.
-<p>
-Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,  USA
-<p>
-Verbatim copying and distribution of this entire article is
-permitted in any medium, provided this notice is preserved.
-<p>
-Updated:
-<!-- timestamp start -->
-$Date: 2011/10/24 19:41:57 $ $Author: jturner $
-<!-- timestamp end --><hr>
-</body>
-</html>

Index: texmacs/index.html
===================================================================
RCS file: texmacs/index.html
diff -N texmacs/index.html
--- texmacs/index.html  14 Nov 2008 00:44:11 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-<meta http-equiv="refresh" content="0; url=http://texmacs.org/";>

Index: vmslib/index.html
===================================================================
RCS file: vmslib/index.html
diff -N vmslib/index.html
--- vmslib/index.html   8 Sep 2007 18:35:11 -0000       1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,110 +0,0 @@
-<!--#include virtual="/server/header.html" -->
-<title>vmslib - GNU Documentation System - GNU Project - Free Software 
Foundation (FSF)</title>
-<!--#include virtual="/server/banner.html" -->
-<h2>GNU vmslib</h2>
-
-<!-- This document uses XHTML 1.0 Strict, but may be served as -->
-<!-- text/html.  Please ensure that markup style considers -->
-<!-- appendix C of the XHTML 1.0 standard. See validator.w3.org. -->
-
-<!-- Please ensure links are consistent with Apache's MultiView. -->
-<!-- Change include statements to be consistent with the relevant -->
-<!-- language, where necessary. -->
-
-<p>vmslib is looking for a maintainer.  If you have time and inclination
-to work on vmslib, please write address@hidden
-
-<p>vmslib helps people port GNU software to VMS.
-
-<p>vmslib is a bunch of files and small routines that can help people to
-port GNU programs to VMS.  It consists of a C function library, with
-routines that are missing in the current system C libraries that have
-been seen so far, maybe with the exception of GNU libc.  In vmslib,
-there are also a bunch of scripts (in VMS terminology, they are called
-`command procedures') which help a lot in writing makefiles, and other
-scripts.  There is more, please read the README file in each directory
-for further instruction.</p>
-
-<p>vmslib is different from the package you usually use by not really being a
-program that you can use in itself.  Rather, you will tend to copy a few,
-or maybe all of the files to whatever other GNU program you wish to port.
-There is one program (really a script) that can be used directly, and that
-is gen_descrip.com.  It is a command procedure that takes an input file
-and generates a makefile, which you can use to automagically copy the right
-files to the right other GNU packages.</p>
-
-<p><a href="vmslib-1996.tar.gz">Here are the current vmslib files</a>
-(circa 1996), as copied from <a
-href="http://www.ctrl-c.liu.se/ftp/GNU-VMS/SOFTWARE/SNAPSHOTS/VMSLIB/";>liu.se</a>
-in September 2007.</p>
-
-<p>Thanks to Richard Levitte for creating vmslib, and maintaining it for
-many years.  Since Richard no longer uses VMS, it's in need of a new
-maintainer.</p>
-
-<!-- If needed, change the copyright block at the bottom. In general, -->
-<!-- all pages on the GNU web server should have the section about    -->
-<!-- verbatim copying.  Please do NOT remove this without talking     -->
-<!-- with the webmasters first. --> 
-<!-- Please make sure the copyright date is consistent with the document -->
-<!-- and that it is like this "2001, 2002" not this "2001-2002." -->
-</div><!-- for id="content", starts in the include above -->
-<!--#include virtual="/server/footer.html" -->
-<div id="footer">
-
-<p>
-Please send FSF &amp; GNU inquiries to 
-<a href="mailto:address@hidden";><em>address@hidden</em></a>.
-There are also <a href="/contact/">other ways to contact</a> 
-the FSF.
-</p>
-
-<p>
-Please see the 
-<a href="/server/standards/README.translations.html">Translations
-README</a> for information on coordinating and submitting
-translations of this article.
-</p>
-
-<p>
-Copyright &copy; 2007 Free Software Foundation, Inc.,
-</p>
-<address>51 Franklin St, Fifth Floor, Boston, MA 02110, USA</address>
-<p>Verbatim copying and distribution of this entire article are
-permitted worldwide, without royalty, in any medium, provided this
-notice, and the copyright notice, are preserved.
-</p>
-
-<p>
-Updated:
-<!-- timestamp start -->
-$Date: 2007/09/08 18:35:11 $
-<!-- timestamp end -->
-</p>
-</div>
-
-<div id="translations">
-<h4>Translations of this page</h4>
-
-<!-- Please keep this list alphabetical. -->
-<!-- Comment what the language is for each type, i.e. de is German. -->
-<!-- Write the language name in its own language (Deutsch) in the text. -->
-<!-- If you add a new language here, please -->
-<!-- advise address@hidden and add it to -->
-<!--  - /home/www/bin/nightly-vars either TAGSLANG or WEBLANG -->
-<!--  - /home/www/html/server/standards/README.translations.html -->
-<!--  - one of the lists under the section "Translations Underway" -->
-<!--  - if there is a translation team, you also have to add an alias -->
-<!--  to mail.gnu.org:/com/mailer/aliases -->
-<!-- Please also check you have the 2 letter language code right, cf. -->
-<!-- <URL:http://www.w3.org/WAI/ER/IG/ert/iso639.htm> -->
-<!-- Please use W3C normative character entities. -->
-
-<ul class="translations-list">
-<!-- English -->
-<li><a href="/server/standards/boilerplate.html">English</a>&nbsp;[en]</li>
-</ul>
-</div>
-</div>
-</body>
-</html>

Index: vmslib/vmslib-1996.tar.gz
===================================================================
RCS file: vmslib/vmslib-1996.tar.gz
diff -N vmslib/vmslib-1996.tar.gz
Binary files /tmp/cvsFSa0Cj and /dev/null differ



reply via email to

[Prev in Thread] Current Thread [Next in Thread]