A contribution/recomendation to the IJBSWA group for a generic doubly
authoriwanttokeepanon <iwanttokeepanon@users.sourceforge.net>
Fri, 7 Dec 2001 01:54:50 +0000 (01:54 +0000)
committeriwanttokeepanon <iwanttokeepanon@users.sourceforge.net>
Fri, 7 Dec 2001 01:54:50 +0000 (01:54 +0000)
linked list.  This file is a home brew "bash tar" (I cannot create a
contrib directory and I cannot upload a tarball ... it gets
corrupted).  This script will expand all files needed to create the
linked list modules and an example program.  Please see the README.
Feed back is welcomed.  Enjoy.

contrib.sh [new file with mode: 0755]

diff --git a/contrib.sh b/contrib.sh
new file mode 100755 (executable)
index 0000000..e57821f
--- /dev/null
@@ -0,0 +1,3848 @@
+#!/bin/bash
+
+echo "This script will create the gen_list contrib files in the current"
+echo "directory.  Do you wish to continue? [y/n]"
+
+typeset ans="n"
+read ans
+
+if [[ ${ans} != [Yy]* ]]; then
+       echo "Goodbye."
+       exit 1
+fi
+
+
+typeset fileList="Makefile README addr_clean.pl gen_list.c gen_list.h isa.c
+isa.h main.c malloc_police.c malloc_police.h rec_char.c rec_char.h
+rec_charptr.c rec_charptr.h rec_double.c rec_double.h rec_long.c
+rec_long.h rec_malloc_police.c rec_malloc_police.h"
+
+
+for i in ${fileList}; do
+
+       echo "creating ${i}"
+
+       ####################################
+       ##  sed explained:
+       ##
+       ##              -e "s/^\(#${i}:\)\(.*\)/\2/"
+       ##                      Find lines belonging to
+       ##                      this file and remove the
+       ##                      filename prefix.
+       ##
+       ##              -e "t print"
+       ##                      Jump to label print if the
+       ##                      above s command matched
+       ##
+       ##              -e "d"
+       ##                      This command is skipped
+       ##                      when the s command fails.
+       ##                      This will remove any
+       ##                      non-matching data.
+       ##
+       ##              -e ":print"
+       ##                      The last thing sed does
+       ##                      is print the data.  So,
+       ##                      by now, we only print
+       ##                      lines belonging to the file.
+       ##
+       ####################################
+
+       sed     -e "s/^\(#${i}:\)\(.*\)/\2/" \
+                       -e "t print" \
+                       -e "d" \
+                       -e ":print" \
+                       ${0} > ${i}
+
+done
+
+echo "done."
+
+exit 0
+
+#Makefile:PROGRAM      = test_list
+#Makefile:CFLAGS       = -g
+#Makefile:SRC          = main.c isa.c gen_list.c rec_char.c rec_charptr.c rec_double.c rec_long.c rec_malloc_police.c malloc_police.c
+#Makefile:OBJS         = main.o isa.o gen_list.o rec_char.o rec_charptr.o rec_double.o rec_long.o rec_malloc_police.o malloc_police.o
+#Makefile:
+#Makefile:all : $(PROGRAM)
+#Makefile:
+#Makefile:$(PROGRAM) : $(OBJS)
+#Makefile:     gcc $(CFLAGS) -o $(PROGRAM) $(OBJS)
+#Makefile:
+#Makefile:clean:
+#Makefile:     rm -f $(OBJS)
+#Makefile:
+#Makefile:clobber: clean
+#Makefile:     rm -f $(PROGRAM)
+
+
+#README:This list supports:
+#README:       copy construction,
+#README:       "virtual" destruction,
+#README:       streaming,
+#README:       comparison (equal comparison currently supported).
+#README:
+#README:With the "object oriented" nature of the list, nodes, and records; it is
+#README:easily concievable that sorted lists and hash tables could be implemented
+#README:with little extra effort.
+#README:
+#README:
+#README:Philosophical point:
+#README:
+#README:I am sure there is room for improvement with this design.  I am
+#README:submitting this as a generic doubly linked list recomendation for IJB.
+#README:Whatever the "collective" decides is fine with me.
+#README:
+#README:This implementation uses the "naming space" of gen_list, derived_rec,
+#README:construct, copy construct, stream, destruct, etc...  These are open to
+#README:argument.  I just used what was familiar to me and others in the "OO"
+#README:community.  If these need changed to be adopted ... "so be it".
+#README:
+#README:
+#README:Implementation point:
+#README:
+#README:I assume this is too late for a "3.0" release.  As I work for an
+#README:airline, the whole past summer has been hectic (not to mention the
+#README:last 4 months); but things have begun to settle down and I am
+#README:following the IJB lists a bit more closely.  And I would like to say
+#README:"HOLY CRAP!" .. you guys have accompolished a lot!  Way to go.
+#README:
+#README:But, the adoption of a better linked list package should at least be
+#README:high on the next release list (if not the current one).  If you choose
+#README:this submission or not, so be it.  But as a "data structure" man, I
+#README:think IJB's linked lists need addressing.
+#README:
+#README:
+#README:List/Enlist note:
+#README:
+#README:I have noticed the list.c file.  If this generic list is adopted, I
+#README:think all existing functionallity could be duplicated with the
+#README:"copy_contruct", "equal", and "destruct" `virtuals'.  This would also
+#README:eliminate and/or enhance the other manually maintained lists in IJB.
+#README:
+#README:
+#README:Debug note:
+#README:
+#README:Since the generic list defined a "stream" virtual, it could be programmed
+#README:that the list could print itself whenever a FATAL error occurs.  A user (or
+#README:programmer) could read the list and hopefully determine the cause of the
+#README:abend.
+#README:
+#README:
+#README:Potential note:
+#README:
+#README:Think of the possibilites of a linked list, sorted list, and/or a hash
+#README:list.  Think of a request to a web site that has been referenced
+#README:before.  If a hash list keep track of all block requests and regexp
+#README:change commands, then a site could be blocked and/or modified without
+#README:ever consulting the actions lists again.  What a speed up!
+#README:
+#README:What if some of the current lists were kept in sorted lists?  Then a
+#README:search for a particular record could be a binary search instead of a
+#README:linear search.
+#README:
+#README:The actions file(s) and regexp files(s) could be inserted into the
+#README:list from front to back order (or visa versa) and the processing would
+#README:take place in actual file order (which is more natural); rather than
+#README:in reverse order (as it is today).
+#README:
+#README:
+#README:Thank you for you time and attention to this contribution.  If it is
+#README:"blessed" by the group, I am available to give time to integrating
+#README:this into IJB.
+#README:
+#README:Let me know what y'all think about this package.
+#README:
+#README:-- 
+#README:Rodney
+
+
+#addr_clean.pl:#!/usr/bin/perl
+#addr_clean.pl:
+#addr_clean.pl:##      *********************************************************************
+#addr_clean.pl:##      *
+#addr_clean.pl:##      * File                  :       $Source: addr_clean.pl,v $
+#addr_clean.pl:##      *
+#addr_clean.pl:##      * Purpose               :       Cleans addresses out of ./test_list and replaces
+#addr_clean.pl:##      *                                               them with "english" replacements.
+#addr_clean.pl:##      *
+#addr_clean.pl:##      * Usage                 :       ./test_list | ./addr_clean.pl
+#addr_clean.pl:##      *
+#addr_clean.pl:##      * Copyright             :       This program is free software; you can redistribute it 
+#addr_clean.pl:##      *                                               and/or modify it under the terms of the GNU General
+#addr_clean.pl:##      *                                               Public License as published by the Free Software
+#addr_clean.pl:##      *                                               Foundation; either version 2 of the License, or (at
+#addr_clean.pl:##      *                                               your option) any later version.
+#addr_clean.pl:##      *
+#addr_clean.pl:##      *                                               This program is distributed in the hope that it will
+#addr_clean.pl:##      *                                               be useful, but WITHOUT ANY WARRANTY; without even the
+#addr_clean.pl:##      *                                               implied warranty of MERCHANTABILITY or FITNESS FOR A
+#addr_clean.pl:##      *                                               PARTICULAR PURPOSE.     See the GNU General Public
+#addr_clean.pl:##      *                                               License for more details.
+#addr_clean.pl:##      *
+#addr_clean.pl:##      *                                               The GNU General Public License should be included with
+#addr_clean.pl:##      *                                               this file.      If not, you can view it at
+#addr_clean.pl:##      *                                               http://www.gnu.org/copyleft/gpl.html
+#addr_clean.pl:##      *                                               or write to the Free Software Foundation, Inc., 59
+#addr_clean.pl:##      *                                               Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#addr_clean.pl:##      *
+#addr_clean.pl:##      **********************************************************************/
+#addr_clean.pl:
+#addr_clean.pl:use strict;
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:my $nMaxList = 0;
+#addr_clean.pl:my $nMaxNode = 0;
+#addr_clean.pl:my $nMaxRec = 0;
+#addr_clean.pl:my %aaTranslation;
+#addr_clean.pl:my $strLine;
+#addr_clean.pl:
+#addr_clean.pl:while ( $strLine = <STDIN> )
+#addr_clean.pl:{
+#addr_clean.pl:        if ( $strLine =~ m!(list.*=\s*)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $2;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(list.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:        if ( $strLine =~ m!(node.*=\s*)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $2;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(node.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:        if ( $strLine =~ m!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $3;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:        ## Catch the copy constuct syntax
+#addr_clean.pl:
+#addr_clean.pl:        if ( $strLine =~ m!(list.*=>\s*)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $2;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(list.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:        if ( $strLine =~ m!(node.*=>\s*)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $2;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(node.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:
+#addr_clean.pl:        if ( $strLine =~ m!(rec.*=>\s*)(0x[0-9a-f]+)! )
+#addr_clean.pl:        {
+#addr_clean.pl:                my $str1 = $1;
+#addr_clean.pl:                my $str2 = $2;
+#addr_clean.pl:
+#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
+#addr_clean.pl:                {
+#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
+#addr_clean.pl:                }
+#addr_clean.pl:                $strLine =~ s!(rec.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
+#addr_clean.pl:        }
+#addr_clean.pl:
+#addr_clean.pl:        print( $strLine );
+#addr_clean.pl:
+#addr_clean.pl:}
+
+
+#gen_list.c:const char gen_list_rcs[] = "$Id: gen_list.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#gen_list.c: *
+#gen_list.c: * Purpose     :  To create some functions to do generic doubly linked
+#gen_list.c: *                                         list management.
+#gen_list.c: *
+#gen_list.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#gen_list.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#gen_list.c: *
+#gen_list.c: *                This program is free software; you can redistribute it
+#gen_list.c: *                and/or modify it under the terms of the GNU General
+#gen_list.c: *                Public License as published by the Free Software
+#gen_list.c: *                Foundation; either version 2 of the License, or (at
+#gen_list.c: *                your option) any later version.
+#gen_list.c: *
+#gen_list.c: *                This program is distributed in the hope that it will
+#gen_list.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#gen_list.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#gen_list.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#gen_list.c: *                License for more details.
+#gen_list.c: *
+#gen_list.c: *                The GNU General Public License should be included with
+#gen_list.c: *                this file.  If not, you can view it at
+#gen_list.c: *                http://www.gnu.org/copyleft/gpl.html
+#gen_list.c: *                or write to the Free Software Foundation, Inc., 59
+#gen_list.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#gen_list.c: *
+#gen_list.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#gen_list.c: *                                         and edit IJB, correctly.
+#gen_list.c: *
+#gen_list.c: * Revisions   :
+#gen_list.c: *    $Log: gen_list.c,v $
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:\f
+#gen_list.c:
+#gen_list.c:#include <malloc.h>
+#gen_list.c:#include <stdio.h>
+#gen_list.c:#include <stdlib.h>
+#gen_list.c:#include <string.h>
+#gen_list.c:
+#gen_list.c:#include "gen_list.h"
+#gen_list.c:#include "malloc_police.h"
+#gen_list.c:
+#gen_list.c:const char gen_list_h_rcs[] = GEN_LIST_H_VERSION;
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/* This is used (for the moment) to cut out all the        */
+#gen_list.c:/* extra verbige of the malloc_police module.  After       */
+#gen_list.c:/* all, we do not want to see construct/destruct of a      */
+#gen_list.c:/* class that is supposed to be "in the background".       */
+#gen_list.c:
+#gen_list.c:/* But it could lead to broader usage.                                             */
+#gen_list.c:
+#gen_list.c:int list_is_quiet = 0;
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:#define CALL_VT_REC_COPY_CONSTRUCT(rec)    (((rec_copy_construct)(rec)->vtable[ VT_REC_COPY_CONSTRUCT ])( rec ))
+#gen_list.c:#define CALL_VT_REC_DESTRUCT(rec)                  (((rec_destruct)(rec)->vtable[ VT_REC_DESTRUCT ])( rec ))
+#gen_list.c:#define CALL_VT_REC_STREAM(rec)                            (((rec_stream)(rec)->vtable[ VT_REC_STREAM ])( rec ))
+#gen_list.c:#define CALL_VT_REC_EQUAL(rec,eq_rec)              (((rec_equal)((rec)->vtable[ VT_REC_EQUAL ]))( rec, eq_rec ))
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_rec_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Called from a derived list record class ONLY.
+#gen_list.c: *                                         This function "construct" a classs: malloc_ed,
+#gen_list.c: *                                         vtable, isa, and sizeof_rec "attributes".
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The record.  If NULL, malloc is called.
+#gen_list.c: *                         2       :       isa (prounced "is a") ... type of the record.
+#gen_list.c: *                         3       :       Memory image size of this record.
+#gen_list.c: *                  ...    :       The "virtuals" for this record.  NOTE: this list
+#gen_list.c: *                                         may increase if more "virtuals" are added.
+#gen_list.c: *
+#gen_list.c: * Returns     :  A pointer to the record (either the orig record
+#gen_list.c: *                                         or the malloc_ed copy.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_rec *this_rec = (struct gen_list_rec *)MALLOC( sizeof_rec );
+#gen_list.c:   this_rec->vtable                = _vtable;
+#gen_list.c:   this_rec->isa                   = isa;
+#gen_list.c:   this_rec->sizeof_rec    = sizeof_rec;
+#gen_list.c:
+#gen_list.c:   return( this_rec );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_rec_copy_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Makes a copy of the current existing record.  All
+#gen_list.c: *                                         inherited properties (isa, vtable, malloc_ed, ...)
+#gen_list.c: *                                         are kept in tact after the copy.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  Existing record.
+#gen_list.c: *                         2       :  New record.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The newly constructed copy record.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_rec_copy_construct( const struct gen_list_rec *this_rec )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_rec *copy_rec = (struct gen_list_rec *)MALLOC( this_rec->sizeof_rec );
+#gen_list.c:   copy_rec->vtable                = this_rec->vtable;
+#gen_list.c:   copy_rec->isa                   = this_rec->isa;
+#gen_list.c:   copy_rec->sizeof_rec    = this_rec->sizeof_rec;
+#gen_list.c:
+#gen_list.c:   return( copy_rec );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_rec_destruct
+#gen_list.c: *
+#gen_list.c: * Description :  Destruct the record.  Including free_ing the memory
+#gen_list.c: *                                         if applicable.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The record.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_rec_destruct( struct gen_list_rec *this_rec )
+#gen_list.c:{
+#gen_list.c:   FREE( this_rec );
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_rec_stream
+#gen_list.c: *
+#gen_list.c: * Description :  Displays all attributes on the STDOUT stream.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The record.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The record.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:const struct gen_list_rec *gen_list_rec_stream( const struct gen_list_rec *this_rec )
+#gen_list.c:{
+#gen_list.c:   LIST_SHOW( printf( "\t\tstream rec isa = %s\n", isa_ra[ this_rec->isa ] ) );
+#gen_list.c:   return( this_rec );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_rec_equal
+#gen_list.c: *
+#gen_list.c: * Description :  Compares two records to see if they are equal.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  A record.
+#gen_list.c: *          2  :  Another record.
+#gen_list.c: *
+#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:int gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec )
+#gen_list.c:{
+#gen_list.c:   if ( NULL == this_rec && NULL == eq_rec )
+#gen_list.c:   {
+#gen_list.c:           return( 1 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if (    ( NULL == this_rec && NULL != eq_rec )  ||
+#gen_list.c:                   ( NULL != this_rec && NULL == eq_rec ) )
+#gen_list.c:   {
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if (    ( this_rec->isa != eq_rec->isa ) ||
+#gen_list.c:                   ( this_rec->sizeof_rec != eq_rec->sizeof_rec ) )
+#gen_list.c:   {
+#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different rec types is unsupported at this time.\n" ) );
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( 1 );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*\f*********************************************************************/
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:struct gen_list_node
+#gen_list.c:{
+#gen_list.c:   /* private: */
+#gen_list.c:   struct gen_list_node    *next;
+#gen_list.c:   struct gen_list_node    *prev;
+#gen_list.c:
+#gen_list.c:   struct gen_list_rec     *rec;
+#gen_list.c:};
+#gen_list.c:/* public: */
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_construct( struct gen_list_rec *_rec );
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_copy_construct( const struct gen_list_node *this_node );
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_destruct( struct gen_list_node *this_node );
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_remove( struct gen_list_node *this_node );
+#gen_list.c:
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next );
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev );
+#gen_list.c:
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_next( const struct gen_list_node *this_node );
+#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_prev( const struct gen_list_node *this_node );
+#gen_list.c:
+#gen_list.c:extern const struct gen_list_rec   *       gen_list_node_stream( const struct gen_list_node *this_node );
+#gen_list.c:extern int                                                                 gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node );
+#gen_list.c:
+#gen_list.c:/* struct/class COMPLETE */
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Constructs a generic list node and sets its record.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.  If NULL, malloc is called.
+#gen_list.c: *          2  :  The nodes record contents.
+#gen_list.c: *
+#gen_list.c: * Returns     :  A pointer to the node (either the orig node
+#gen_list.c: *                                         or the malloc_ed copy.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_construct( struct gen_list_rec *_rec )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *this_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:\tconstruct new node\t\t= %p
+#gen_list.c:\tconstruct new node->rec\t= %p\n\n", (const void *)this_node, (const void *)_rec ) );
+#gen_list.c:
+#gen_list.c:   this_node->rec          = _rec;
+#gen_list.c:   this_node->next = NULL;
+#gen_list.c:   this_node->prev = NULL;
+#gen_list.c:
+#gen_list.c:   return( this_node );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_copy_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Makes a copy of the current node.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  Existing node.
+#gen_list.c: *                         2       :  New node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The newly constructed copy node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_copy_construct( const struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *copy_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\tcopy construct new node = %p => %p\n\n", (const void *)this_node, (const void *)copy_node ) );
+#gen_list.c:
+#gen_list.c:   copy_node->rec          = CALL_VT_REC_COPY_CONSTRUCT( this_node->rec );
+#gen_list.c:   copy_node->next = NULL;
+#gen_list.c:   copy_node->prev = NULL;
+#gen_list.c:
+#gen_list.c:   return( copy_node );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_destruct
+#gen_list.c: *
+#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
+#gen_list.c: *                                         if applicable.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_destruct( struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:\tdestruct this_node\t\t\t= %p
+#gen_list.c:\tdestruct this_node->rec\t\t= %p
+#gen_list.c:\tdestruct this_node->next\t= %p
+#gen_list.c:\tdestruct this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
+#gen_list.c:
+#gen_list.c:   if ( NULL != this_node->rec )
+#gen_list.c:   {
+#gen_list.c:           CALL_VT_REC_DESTRUCT( this_node->rec );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   FREE( this_node );
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_remove
+#gen_list.c: *
+#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
+#gen_list.c: *                                         if applicable.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_remove( struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:\tremove this_node\t\t\t= %p
+#gen_list.c:\tremove this_node->rec\t= %p
+#gen_list.c:\tremove this_node->next\t= %p
+#gen_list.c:\tremove this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
+#gen_list.c:
+#gen_list.c:   FREE( this_node );
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_set_next
+#gen_list.c: *
+#gen_list.c: * Description :  Sets the next node in the list series.  Used mainly
+#gen_list.c: *                                         when constructing and adding/removing nodes.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *          2  :  The next node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next )
+#gen_list.c:{
+#gen_list.c:   this_node->next = _next;
+#gen_list.c:   return( this_node );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_set_prev
+#gen_list.c: *
+#gen_list.c: * Description :  Sets the previous node in the list series.  Used mainly
+#gen_list.c: *                                         when constructing and adding/removing nodes.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *          2  :  The previous node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev )
+#gen_list.c:{
+#gen_list.c:   this_node->prev = _prev;
+#gen_list.c:   return( this_node );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_get_next
+#gen_list.c: *
+#gen_list.c: * Description :  Gets the next node in the list series.  Used mainly
+#gen_list.c: *                                         for traversing a list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The next node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_get_next( const struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   return( this_node->next );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_get_prev
+#gen_list.c: *
+#gen_list.c: * Description :  Gets the previous node in the list series.  Used mainly
+#gen_list.c: *                                         for traversing a list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The previous node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_node *gen_list_node_get_prev( const struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   return( this_node->prev );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_stream
+#gen_list.c: *
+#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
+#gen_list.c: *                                         including the contents of the nodes record.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The record.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The result of streaming the nodes record.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:const struct gen_list_rec *gen_list_node_stream( const struct gen_list_node *this_node )
+#gen_list.c:{
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:\tstream this_node\t\t\t= %p
+#gen_list.c:\tstream this_node->rec\t= %p
+#gen_list.c:\tstream this_node->next\t= %p
+#gen_list.c:\tstream this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
+#gen_list.c:
+#gen_list.c:   return( CALL_VT_REC_STREAM( this_node->rec ) );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_node_equal
+#gen_list.c: *
+#gen_list.c: * Description :  Compares two nodes (and their records) to see if they are equal.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  A node.
+#gen_list.c: *          2  :  Another node.
+#gen_list.c: *
+#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:int gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node )
+#gen_list.c:{
+#gen_list.c:   if ( NULL == this_node && NULL == eq_node )
+#gen_list.c:   {
+#gen_list.c:           return( 1 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if (    ( NULL == this_node && NULL != eq_node ) ||
+#gen_list.c:                   ( NULL != this_node && NULL == eq_node ) )
+#gen_list.c:   {
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( gen_list_rec_equal( this_node->rec, eq_node->rec ) );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*\f*********************************************************************/
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/* private: */
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_insert_node
+#gen_list.c: *
+#gen_list.c: * Description :  Inserts a node (not a record!) into a list.  This
+#gen_list.c: *                                         is (currently) only used in copy construction.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  A new node to insert into the list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:const struct gen_list_node *gen_list_insert_node( struct gen_list *this_list, struct gen_list_node *node )
+#gen_list.c:{
+#gen_list.c:   gen_list_node_set_next( node, NULL );
+#gen_list.c:
+#gen_list.c:   if ( NULL == this_list->first )
+#gen_list.c:   {
+#gen_list.c:           this_list->first = node;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if ( NULL == this_list->last )
+#gen_list.c:   {
+#gen_list.c:           this_list->last = node;
+#gen_list.c:   }
+#gen_list.c:   else
+#gen_list.c:   {
+#gen_list.c:           gen_list_node_set_next( this_list->last, node );
+#gen_list.c:           gen_list_node_set_prev( node, this_list->last );
+#gen_list.c:           this_list->last = node;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   this_list->last = node;
+#gen_list.c:
+#gen_list.c:   return( node );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Constructs a generic list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :   None
+#gen_list.c: *
+#gen_list.c: * Returns     :  A pointer to the list (either the orig list
+#gen_list.c: *                                         or the malloc_ed copy.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list *gen_list_construct()
+#gen_list.c:{
+#gen_list.c:   struct gen_list *this_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
+#gen_list.c:   LIST_SHOW( printf( "construct new list = %p\n\n", (const void *)this_list ) );
+#gen_list.c:
+#gen_list.c:   this_list->first        = NULL;
+#gen_list.c:   this_list->last = NULL;
+#gen_list.c:
+#gen_list.c:   return( this_list );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_copy_construct
+#gen_list.c: *
+#gen_list.c: * Description :  Makes a copy of the current list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  Existing list.
+#gen_list.c: *                         2       :  New list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The newly constructed copy list.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list *gen_list_copy_construct( const struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *curr = this_list->first;
+#gen_list.c:   struct gen_list *copy_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "copy construct new list = %p => %p\n\n", (const void *)this_list, (const void *)copy_list ) );
+#gen_list.c:
+#gen_list.c:   copy_list->first        = NULL;
+#gen_list.c:   copy_list->last = NULL;
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           struct gen_list_node *copy_node = gen_list_node_copy_construct( curr );
+#gen_list.c:           gen_list_insert_node( copy_list, copy_node );
+#gen_list.c:           curr = gen_list_node_get_next( curr );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( copy_list );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_destruct
+#gen_list.c: *
+#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
+#gen_list.c: *                                         if applicable.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list *gen_list_destruct( struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *curr = this_list->first;
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:destruct this_list\t\t\t= %p
+#gen_list.c:destruct this_list->first\t= %p
+#gen_list.c:destruct this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
+#gen_list.c:           gen_list_node_destruct( curr );
+#gen_list.c:           curr = next;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   FREE( this_list );
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_remove_all
+#gen_list.c: *
+#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
+#gen_list.c: *                                         if applicable.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list *gen_list_remove_all( struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *curr = this_list->first;
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:remove_all this_list\t\t\t\t= %p
+#gen_list.c:remove_all this_list->first\t= %p
+#gen_list.c:remove_all this_list->last\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
+#gen_list.c:           gen_list_node_remove( curr );
+#gen_list.c:           curr = next;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   this_list->first = this_list->last = NULL;
+#gen_list.c:   return( this_list );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_remove
+#gen_list.c: *
+#gen_list.c: * Description :  A record from the list and return it if found.  This
+#gen_list.c: *                                         will allow a futher call to rec_destruct.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  The record to be removed.
+#gen_list.c: *
+#gen_list.c: * Returns     :  rec if found and removed, NULL otherwise.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_remove( struct gen_list *this_list, struct gen_list_rec *rec )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node    *curr = this_list->first;
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:remove this_list\t\t\t= %p
+#gen_list.c:remove this_list->first\t= %p
+#gen_list.c:remove this_list->last\t= %p
+#gen_list.c:remove rec\t\t\t\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last, rec ) );
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           /* Grab these values before the are destroyed. */
+#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
+#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
+#gen_list.c:
+#gen_list.c:           /* Access to rec, next, prev of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:           if ( curr->rec == rec )
+#gen_list.c:           {
+#gen_list.c:                   /* Destruct the node, but not the record. */
+#gen_list.c:                   gen_list_node_remove( curr );
+#gen_list.c:
+#gen_list.c:                   if ( NULL == prev )
+#gen_list.c:                   {
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           /* This is the first node in the list.                          */
+#gen_list.c:                           /*      Picture:                                                                                                */
+#gen_list.c:                           /* [first] ---------------------> [next]                        */
+#gen_list.c:                           /* [NULL] <---------------------- [next->prev]  */
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           this_list->first = next;
+#gen_list.c:
+#gen_list.c:                           if ( NULL == next )
+#gen_list.c:                           {
+#gen_list.c:                                   /* Since next is NULL, then this is an empty list. */
+#gen_list.c:                                   this_list->last = NULL;
+#gen_list.c:                           }
+#gen_list.c:                           else
+#gen_list.c:                           {
+#gen_list.c:                                   /* Since next is not NULL, then there is another node to make first. */
+#gen_list.c:                                   gen_list_node_set_prev( next, NULL );
+#gen_list.c:                           }
+#gen_list.c:                   }
+#gen_list.c:                   else if ( NULL == next )
+#gen_list.c:                   {
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           /* This is the last node in the list.                           */
+#gen_list.c:                           /*      Picture:                                                                                                */
+#gen_list.c:                           /* [last] ----------------------> [prev]                        */
+#gen_list.c:                           /* [prev->next] ----------------> [NULL]                        */
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           this_list->last = prev;
+#gen_list.c:
+#gen_list.c:                           if ( NULL == prev )
+#gen_list.c:                           {
+#gen_list.c:                                   /* Since prev is NULL, then this is an empty list. */
+#gen_list.c:                                   this_list->first = NULL;
+#gen_list.c:                           }
+#gen_list.c:                           else
+#gen_list.c:                           {
+#gen_list.c:                                   /* Since prev is NULL, then there is another node to make last. */
+#gen_list.c:                                   gen_list_node_set_next( prev, NULL );
+#gen_list.c:                           }
+#gen_list.c:                   }
+#gen_list.c:                   else
+#gen_list.c:                   {
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           /* This is a middle node in the list.                           */
+#gen_list.c:                           /*      Picture:                                                                                                */
+#gen_list.c:                           /* [prev->next] ----------------> [next]                        */
+#gen_list.c:                           /*                                      [removing middle]                                               */
+#gen_list.c:                           /* [prev] <---------------------- [next->prev]  */
+#gen_list.c:                           /************************************************/
+#gen_list.c:                           gen_list_node_set_next( prev, next );
+#gen_list.c:                           gen_list_node_set_prev( next, prev );
+#gen_list.c:                   }
+#gen_list.c:
+#gen_list.c:                   return( rec );
+#gen_list.c:           }
+#gen_list.c:           curr = next;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_get_first
+#gen_list.c: *
+#gen_list.c: * Description :  Gets the first record in the list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The first node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_get_first( const struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   if ( NULL == this_list->first )
+#gen_list.c:   {
+#gen_list.c:           return( NULL );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:   return( this_list->first->rec );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_get_last
+#gen_list.c: *
+#gen_list.c: * Description :  Gets the last record in the list.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The last node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_get_last( const struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   if ( NULL == this_list->last )
+#gen_list.c:   {
+#gen_list.c:           return( NULL );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:   return( this_list->last->rec );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_insert
+#gen_list.c: *
+#gen_list.c: * Description :  Inserts a record into the list.  This is the
+#gen_list.c: *                                         primary API interface for inserting a record.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  A new record to insert into the list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The node.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:const struct gen_list_node *gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec )
+#gen_list.c:{
+#gen_list.c:   return( gen_list_insert_node( this_list, gen_list_node_construct( _rec ) ) );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_stream
+#gen_list.c: *
+#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
+#gen_list.c: *                                         including the contents of the nodes.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  The list.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:const struct gen_list *gen_list_stream( const struct gen_list *this_list )
+#gen_list.c:{
+#gen_list.c:   const struct gen_list_node *curr = this_list->first;
+#gen_list.c:
+#gen_list.c:   LIST_SHOW( printf( "\
+#gen_list.c:stream this_list\t\t\t= %p
+#gen_list.c:stream this_list->first\t= %p
+#gen_list.c:stream this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
+#gen_list.c:           gen_list_node_stream( curr );
+#gen_list.c:           curr = next;
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( this_list );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_equal
+#gen_list.c: *
+#gen_list.c: * Description :  Compares two lists (and their nodes) to see if they are equal.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  A list.
+#gen_list.c: *          2  :  Another list.
+#gen_list.c: *
+#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:int gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *c1 = this_list->first;
+#gen_list.c:   struct gen_list_node *c2 = eq_list->first;
+#gen_list.c:   int eq = 1;
+#gen_list.c:
+#gen_list.c:   if ( ( NULL == c1 && NULL != c2 ) || ( NULL != c1 && NULL == c2 ) )
+#gen_list.c:   {
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   while ( ( eq ) && ( NULL != c1 ) && ( NULL != c2 ) )
+#gen_list.c:   {
+#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:           eq = CALL_VT_REC_EQUAL( c1->rec, c2->rec );
+#gen_list.c:           if ( NULL != c1 )
+#gen_list.c:           {
+#gen_list.c:                   c1 = gen_list_node_get_next( c1 );
+#gen_list.c:           }
+#gen_list.c:
+#gen_list.c:           if ( NULL != c2 )
+#gen_list.c:           {
+#gen_list.c:                   c2 = gen_list_node_get_next( c2 );
+#gen_list.c:           }
+#gen_list.c:
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if ( NULL == c1 && NULL == c2 )
+#gen_list.c:   {
+#gen_list.c:           return( 1 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( eq );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_find
+#gen_list.c: *
+#gen_list.c: * Description :  Find a record that matches the one passed to this
+#gen_list.c: *                                         function.
+#gen_list.c: *                                         NOTE: this function receives a RECORD and not a NODE.
+#gen_list.c: *                                         Some implementation issues might be easier addressed
+#gen_list.c: *                                         if a node was passed ... but for the time being, I
+#gen_list.c: *                                         would like to keep the use/programmer isolated from
+#gen_list.c: *                                         the node structure/class.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  The record to find.
+#gen_list.c: *
+#gen_list.c: * Returns     :  NULL => none found, anything else is a pointer to the record.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec )
+#gen_list.c:{
+#gen_list.c:   const struct gen_list_node *curr = this_list->first;
+#gen_list.c:   int eq = 0;
+#gen_list.c:
+#gen_list.c:   if ( NULL == curr && NULL == rec )
+#gen_list.c:   {
+#gen_list.c:           return( (struct gen_list_rec *)1 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if (    ( NULL == curr && NULL != rec ) ||
+#gen_list.c:                   ( NULL != curr && NULL == rec ) )
+#gen_list.c:   {
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:   if ( curr->rec->isa != rec->isa )
+#gen_list.c:   {
+#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different list types is unsupported at this time.\n" ) );
+#gen_list.c:           return( 0 );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   if ( NULL == curr )
+#gen_list.c:   {
+#gen_list.c:           return( NULL );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:   while ( ( !eq ) && ( NULL != curr ) )
+#gen_list.c:   {
+#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
+#gen_list.c:
+#gen_list.c:           eq = CALL_VT_REC_EQUAL( curr->rec, rec );
+#gen_list.c:
+#gen_list.c:           if ( eq )
+#gen_list.c:           {
+#gen_list.c:                   return( curr->rec );
+#gen_list.c:           }
+#gen_list.c:
+#gen_list.c:           curr = next;
+#gen_list.c:
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_iterate
+#gen_list.c: *
+#gen_list.c: * Description :  Pass over the list, calling "iter" for every record.
+#gen_list.c: *                                         If the "iter" function returns a non-NULL value,
+#gen_list.c: *                                         return it and stop iterating.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  The iterator function.
+#gen_list.c: *
+#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
+#gen_list.c: *                                         list was processed.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_iterate( struct gen_list *this_list, rec_iterate iter )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *curr = this_list->first;
+#gen_list.c:
+#gen_list.c:   if ( NULL == curr )
+#gen_list.c:   {
+#gen_list.c:           return( NULL );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
+#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
+#gen_list.c:
+#gen_list.c:           if ( NULL != r )
+#gen_list.c:           {
+#gen_list.c:                   return( r );
+#gen_list.c:           }
+#gen_list.c:
+#gen_list.c:           curr = next;
+#gen_list.c:
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+#gen_list.c:
+#gen_list.c:
+#gen_list.c:/*********************************************************************
+#gen_list.c: *
+#gen_list.c: * Function    :  gen_list_iterate
+#gen_list.c: *
+#gen_list.c: * Description :  Pass over the list (in reverse order), calling "iter"
+#gen_list.c: *                                         for every record.  If the "iter" function returns
+#gen_list.c: *                                         a non-NULL value, return it and stop iterating.
+#gen_list.c: *
+#gen_list.c: * Parameters  :
+#gen_list.c: *          1  :  The list.
+#gen_list.c: *          2  :  The iterator function.
+#gen_list.c: *
+#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
+#gen_list.c: *                                         list was processed.
+#gen_list.c: *
+#gen_list.c: *********************************************************************/
+#gen_list.c:struct gen_list_rec *gen_list_iterate_reverse( struct gen_list *this_list, rec_iterate iter )
+#gen_list.c:{
+#gen_list.c:   struct gen_list_node *curr = this_list->last;
+#gen_list.c:
+#gen_list.c:   if ( NULL == curr )
+#gen_list.c:   {
+#gen_list.c:           return( NULL );
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   while ( NULL != curr )
+#gen_list.c:   {
+#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
+#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
+#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
+#gen_list.c:
+#gen_list.c:           if ( NULL != r )
+#gen_list.c:           {
+#gen_list.c:                   return( r );
+#gen_list.c:           }
+#gen_list.c:
+#gen_list.c:           curr = prev;
+#gen_list.c:
+#gen_list.c:   }
+#gen_list.c:
+#gen_list.c:   return( NULL );
+#gen_list.c:
+#gen_list.c:}
+
+
+#gen_list.h:#ifndef GEN_LIST_H_INCLUDED
+#gen_list.h:#define GEN_LIST_H_INCLUDED
+#gen_list.h:#define GEN_LIST_H_VERSION "$Id: gen_list.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#gen_list.h:/*********************************************************************
+#gen_list.h: *
+#gen_list.h: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.h,v $
+#gen_list.h: *
+#gen_list.h: * Purpose     :  To create some functions to do generic doubly linked
+#gen_list.h: *                                         list management.
+#gen_list.h: *
+#gen_list.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#gen_list.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#gen_list.h: *
+#gen_list.h: *                This program is free software; you can redistribute it
+#gen_list.h: *                and/or modify it under the terms of the GNU General
+#gen_list.h: *                Public License as published by the Free Software
+#gen_list.h: *                Foundation; either version 2 of the License, or (at
+#gen_list.h: *                your option) any later version.
+#gen_list.h: *
+#gen_list.h: *                This program is distributed in the hope that it will
+#gen_list.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#gen_list.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#gen_list.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#gen_list.h: *                License for more details.
+#gen_list.h: *
+#gen_list.h: *                The GNU General Public License should be included with
+#gen_list.h: *                this file.  If not, you can view it at
+#gen_list.h: *                http://www.gnu.org/copyleft/gpl.html
+#gen_list.h: *                or write to the Free Software Foundation, Inc., 59
+#gen_list.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#gen_list.h: *
+#gen_list.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#gen_list.h: *                                         and edit IJB, correctly.
+#gen_list.h: *
+#gen_list.h: * Revisions   :
+#gen_list.h: *    $Log: gen_list.h,v $
+#gen_list.h: *
+#gen_list.h: *********************************************************************/
+#gen_list.h:\f
+#gen_list.h:
+#gen_list.h:#ifdef __cplusplus
+#gen_list.h:extern "C" {
+#gen_list.h:#endif
+#gen_list.h:
+#gen_list.h:#include "isa.h"
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:extern int list_is_quiet;
+#gen_list.h:
+#gen_list.h:#define LIST_SHOW(stmt)  if ( ! list_is_quiet ) { stmt; }
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:struct gen_list_rec;
+#gen_list.h:typedef struct gen_list_rec *                      (*rec_copy_construct)( struct gen_list_rec *copy_rec );
+#gen_list.h:typedef struct gen_list_rec *                      (*rec_destruct)( struct gen_list_rec *this_rec );
+#gen_list.h:typedef const struct gen_list_rec *        (*rec_stream)( const struct gen_list_rec *this_rec );
+#gen_list.h:typedef int                                                                        (*rec_equal)( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
+#gen_list.h:typedef struct gen_list_rec *                      (*rec_iterate)( struct gen_list_rec *this_rec );
+#gen_list.h:
+#gen_list.h:typedef void * (*rec_method)( void *this_rec, ... );
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:enum VT_ENTRIES
+#gen_list.h:{
+#gen_list.h:   VT_REC_COPY_CONSTRUCT,
+#gen_list.h:   VT_REC_DESTRUCT,
+#gen_list.h:   VT_REC_STREAM,
+#gen_list.h:   VT_REC_EQUAL,
+#gen_list.h:   VT_REC_MAX
+#gen_list.h:};
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:typedef const rec_method *t_vtable;
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:struct gen_list_rec
+#gen_list.h:{
+#gen_list.h:   /* private: */
+#gen_list.h:   t_vtable vtable;
+#gen_list.h:   enum GEN_LIST_ISA isa;
+#gen_list.h:   int sizeof_rec;
+#gen_list.h:   /* contents HERE */
+#gen_list.h:};
+#gen_list.h:/* public: */
+#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_copy_construct( const struct gen_list_rec *this_rec );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_destruct( struct gen_list_rec *this_rec );
+#gen_list.h:extern const struct gen_list_rec * gen_list_rec_stream( const struct gen_list_rec *this_rec );
+#gen_list.h:extern int                                                                 gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
+#gen_list.h:
+#gen_list.h:/* struct/class COMPLETE */
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:/*\f*********************************************************************/
+#gen_list.h:
+#gen_list.h:/* private: to gen_list */
+#gen_list.h:struct gen_list_node;
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:struct gen_list
+#gen_list.h:{
+#gen_list.h:   /* private: */
+#gen_list.h:   struct gen_list_node *first;
+#gen_list.h:   struct gen_list_node *last;
+#gen_list.h:};
+#gen_list.h:/* gen_list_insert_node */
+#gen_list.h:
+#gen_list.h:/* public: */
+#gen_list.h:extern struct gen_list *                           gen_list_construct();
+#gen_list.h:extern struct gen_list *                           gen_list_copy_construct( const struct gen_list *this_list );
+#gen_list.h:extern struct gen_list *                           gen_list_destruct( struct gen_list *this_list );
+#gen_list.h:extern struct gen_list *                           gen_list_remove_all( struct gen_list *this_list );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_remove( struct gen_list *this_list, struct gen_list_rec *_rec );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_get_first( const struct gen_list *this_list );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_get_last( const struct gen_list *this_list );
+#gen_list.h:extern const struct gen_list_node *        gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec );
+#gen_list.h:extern const struct gen_list *             gen_list_stream( const struct gen_list *this_list );
+#gen_list.h:extern int                                                                 gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec );
+#gen_list.h:extern struct gen_list_rec *                       gen_list_iterate( struct gen_list *this_list, rec_iterate iter );
+#gen_list.h:/* struct/class COMPLETE */
+#gen_list.h:
+#gen_list.h:
+#gen_list.h:#ifdef __cplusplus
+#gen_list.h:} /* extern "C" */
+#gen_list.h:#endif
+#gen_list.h:
+#gen_list.h:#endif /* ndef GEN_LIST_H_INCLUDED */
+#gen_list.h:
+#gen_list.h:/*
+#gen_list.h:  Local Variables:
+#gen_list.h:  tab-width: 3
+#gen_list.h:  end:
+#gen_list.h:*/
+
+
+#isa.c:const char isa_rcs[] = "$Id: isa.c,v 1.1 2001/11/30 21:55:51 rodney Exp $";
+#isa.c:/*********************************************************************
+#isa.c: *
+#isa.c: * File        :  $Source: /home/rodney/devl/ijb_beta/contrib/isa.c,v $
+#isa.c: *
+#isa.c: * Purpose     :  Pronounced "is a".  To create "english" translations
+#isa.c: *                                              for all linked "classes".
+#isa.c: *
+#isa.c: *                                              NOTE:   this header file must appear once and only once
+#isa.c: *                                                              per project.
+#isa.c: *
+#isa.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#isa.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#isa.c: *
+#isa.c: *                This program is free software; you can redistribute it
+#isa.c: *                and/or modify it under the terms of the GNU General
+#isa.c: *                Public License as published by the Free Software
+#isa.c: *                Foundation; either version 2 of the License, or (at
+#isa.c: *                your option) any later version.
+#isa.c: *
+#isa.c: *                This program is distributed in the hope that it will
+#isa.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#isa.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#isa.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#isa.c: *                License for more details.
+#isa.c: *
+#isa.c: *                The GNU General Public License should be included with
+#isa.c: *                this file.  If not, you can view it at
+#isa.c: *                http://www.gnu.org/copyleft/gpl.html
+#isa.c: *                or write to the Free Software Foundation, Inc., 59
+#isa.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#isa.c: *
+#isa.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#isa.c: *                                              and edit IJB, correctly.
+#isa.c: *
+#isa.c: * Revisions   :
+#isa.c: *    $Log: isa.c,v $
+#isa.c: *    Revision 1.1  2001/11/30 21:55:51  rodney
+#isa.c: *    Initial revision
+#isa.c: *
+#isa.c: *
+#isa.c: *********************************************************************/
+#isa.c:\f
+#isa.c:
+#isa.c:#include <malloc.h>
+#isa.c:#include <stdio.h>
+#isa.c:#include <stdlib.h>
+#isa.c:#include <string.h>
+#isa.c:
+#isa.c:#include "gen_list.h"
+#isa.c:#include "isa.h"
+#isa.c:
+#isa.c:const char isa_h_rcs[] = ISA_H_VERSION;
+#isa.c:
+#isa.c:
+#isa.c:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
+#isa.c:char *isa_ra[] =
+#isa.c:{
+#isa.c:        "GEN_LIST_REC",
+#isa.c:        "REC_MALLOC_POLICE",
+#isa.c:        "REC_CHAR",
+#isa.c:        "REC_CHARPTR",
+#isa.c:        "REC_DOUBLE",
+#isa.c:        "REC_LONG",
+#isa.c:        NULL
+#isa.c:};
+
+
+#isa.h:#ifndef ISA_H_INCLUDED
+#isa.h:#define ISA_H_INCLUDED
+#isa.h:#define ISA_H_VERSION "$Id: isa.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#isa.h:/*********************************************************************
+#isa.h: *
+#isa.h: * File        :  $Source: /cvsroot/ijbswa/current/isa.h,v $
+#isa.h: *
+#isa.h: * Purpose     :  Pronounced "is a".  To create "english" translations
+#isa.h: *                                              for all linked "classes".
+#isa.h: *
+#isa.h: *                                              NOTE:   this header file must appear once and only once
+#isa.h: *                                                              per project.
+#isa.h: *
+#isa.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#isa.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#isa.h: *
+#isa.h: *                This program is free software; you can redistribute it
+#isa.h: *                and/or modify it under the terms of the GNU General
+#isa.h: *                Public License as published by the Free Software
+#isa.h: *                Foundation; either version 2 of the License, or (at
+#isa.h: *                your option) any later version.
+#isa.h: *
+#isa.h: *                This program is distributed in the hope that it will
+#isa.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#isa.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#isa.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#isa.h: *                License for more details.
+#isa.h: *
+#isa.h: *                The GNU General Public License should be included with
+#isa.h: *                this file.  If not, you can view it at
+#isa.h: *                http://www.gnu.org/copyleft/gpl.html
+#isa.h: *                or write to the Free Software Foundation, Inc., 59
+#isa.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#isa.h: *
+#isa.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#isa.h: *                                              and edit IJB, correctly.
+#isa.h: *
+#isa.h: * Revisions   :
+#isa.h: *    $Log: isa.h,v $
+#isa.h: *
+#isa.h: *********************************************************************/
+#isa.h:\f
+#isa.h:
+#isa.h:#ifdef __cplusplus
+#isa.h:extern "C" {
+#isa.h:#endif
+#isa.h:
+#isa.h:
+#isa.h:enum GEN_LIST_ISA
+#isa.h:{
+#isa.h:        ISA_GEN_LIST_REC,
+#isa.h:        ISA_MALLOC_POLICE,
+#isa.h:        ISA_CHAR,
+#isa.h:        ISA_CHARPTR,
+#isa.h:        ISA_DOUBLE,
+#isa.h:        ISA_LONG,
+#isa.h:        ISA_MAX
+#isa.h:};
+#isa.h:
+#isa.h:
+#isa.h:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
+#isa.h:extern char *isa_ra[];
+#isa.h:
+#isa.h:
+#isa.h:#ifdef __cplusplus
+#isa.h:} /* extern "C" */
+#isa.h:#endif
+#isa.h:
+#isa.h:#endif /* ndef ISA_H_INCLUDED */
+#isa.h:
+#isa.h:/*
+#isa.h:  Local Variables:
+#isa.h:  tab-width: 3
+#isa.h:  end:
+#isa.h:*/
+
+
+#main.c:const char main_rcs[] = "$Id: main.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#main.c:/*********************************************************************
+#main.c: *
+#main.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#main.c: *
+#main.c: * Purpose     :  To test "generic list" creation and manipulation.
+#main.c: *
+#main.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#main.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#main.c: *
+#main.c: *                This program is free software; you can redistribute it
+#main.c: *                and/or modify it under the terms of the GNU General
+#main.c: *                Public License as published by the Free Software
+#main.c: *                Foundation; either version 2 of the License, or (at
+#main.c: *                your option) any later version.
+#main.c: *
+#main.c: *                This program is distributed in the hope that it will
+#main.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#main.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#main.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#main.c: *                License for more details.
+#main.c: *
+#main.c: *                The GNU General Public License should be included with
+#main.c: *                this file.  If not, you can view it at
+#main.c: *                http://www.gnu.org/copyleft/gpl.html
+#main.c: *                or write to the Free Software Foundation, Inc., 59
+#main.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#main.c: *
+#main.c: * VI users            :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#main.c: *                                             and edit IJB, correctly.
+#main.c: *
+#main.c: * Note                        :       This output assumes (per IJB standards) that tabs are
+#main.c: *                                             set to 3 characters.  If you run this in a terminal,
+#main.c: *                                             you may want to run this as so:
+#main.c: *                                                     >./test_list 2>&1 | expand -t3 | ./addr_clean.pl
+#main.c: *                                             This will expand the tab to 3 columns and then replace
+#main.c: *                                             "0x" style addresses with more human readable ones.
+#main.c: *
+#main.c: * Revisions   :
+#main.c: *    $Log: main.c,v $
+#main.c: *
+#main.c: *********************************************************************/
+#main.c:\f
+#main.c:
+#main.c:#include <malloc.h>
+#main.c:#include <stdio.h>
+#main.c:#include <stdlib.h>
+#main.c:#include <string.h>
+#main.c:
+#main.c:#include "gen_list.h"
+#main.c:#include "rec_char.h"
+#main.c:#include "rec_charptr.h"
+#main.c:#include "rec_double.h"
+#main.c:#include "rec_long.h"
+#main.c:#include "malloc_police.h"
+#main.c:
+#main.c:
+#main.c:extern const char isa_rcs[];
+#main.c:extern const char isa_h_rcs[];
+#main.c:extern const char gen_list_rcs[];
+#main.c:extern const char gen_list_h_rcs[];
+#main.c:extern const char malloc_police_rcs[];
+#main.c:extern const char malloc_police_h_rcs[];
+#main.c:extern const char rec_charptr_rcs[];
+#main.c:extern const char rec_charptr_h_rcs[];
+#main.c:extern const char rec_long_rcs[];
+#main.c:extern const char rec_long_h_rcs[];
+#main.c:extern const char rec_double_rcs[];
+#main.c:extern const char rec_double_h_rcs[];
+#main.c:extern const char rec_char_rcs[];
+#main.c:extern const char rec_char_h_rcs[];
+#main.c:extern const char rec_malloc_police_rcs[];
+#main.c:extern const char rec_malloc_police_h_rcs[];
+#main.c:extern const char main_rcs[];
+#main.c:
+#main.c:
+#main.c:/*********************************************************************
+#main.c: *
+#main.c: * Function    :  my_custom_charptr_iterator_1
+#main.c: *
+#main.c: * Description :  This funtion is called once for every record in a
+#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
+#main.c: *                                             this function always returns NULL, thus it will
+#main.c: *                                             iterate over the entire list.
+#main.c: *
+#main.c: * Parameters  :
+#main.c: *          1  :  The record.
+#main.c: *
+#main.c: * Returns     :  NULL
+#main.c: *
+#main.c: *********************************************************************/
+#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_1( struct derived_rec_charptr *this_rec )
+#main.c:{
+#main.c:       printf( "\
+#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_1 ... %p
+#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_1 ... %s\n\n", (const void *)this_rec, this_rec->contents );
+#main.c:       return( NULL );
+#main.c:
+#main.c:}
+#main.c:
+#main.c:
+#main.c:/*********************************************************************
+#main.c: *
+#main.c: * Function    :  my_custom_charptr_iterator_2
+#main.c: *
+#main.c: * Description :  This funtion is called once for every record in a
+#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
+#main.c: *                                             this function always returns non-NULL, thus it will
+#main.c: *                                             iterate over only 1 record.
+#main.c: *
+#main.c: * Parameters  :
+#main.c: *          1  :  The record.
+#main.c: *
+#main.c: * Returns     :  The record.
+#main.c: *
+#main.c: *********************************************************************/
+#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_2( struct derived_rec_charptr *this_rec )
+#main.c:{
+#main.c:       printf( "\
+#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_2 ... %p
+#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_2 ... %s\n\n", (const void *)this_rec, this_rec->contents );
+#main.c:       return( this_rec );
+#main.c:
+#main.c:}
+#main.c:
+#main.c:
+#main.c:/*********************************************************************
+#main.c: *
+#main.c: * Function    :  main
+#main.c: *
+#main.c: * Description :  Test the doubly linked list as it is so far.
+#main.c: *
+#main.c: * Parameters  :  None
+#main.c: *
+#main.c: * Returns     :  N/A
+#main.c: *
+#main.c: *********************************************************************/
+#main.c:int main( int argc, const char **argv )
+#main.c:{
+#main.c:       struct gen_list *lcharptr;
+#main.c:       struct gen_list *llong;
+#main.c:       struct gen_list *ldouble;
+#main.c:       struct gen_list *lchar;
+#main.c:
+#main.c:       struct gen_list *lcharptr_c;
+#main.c:       struct gen_list *llong_c;
+#main.c:       struct gen_list *ldouble_c;
+#main.c:       struct gen_list *lchar_c;
+#main.c:
+#main.c:       struct gen_list_rec *f_rec;
+#main.c:
+#main.c:       struct gen_list *no_own_list;
+#main.c:       struct gen_list_rec *no_own_rec1;
+#main.c:       struct gen_list_rec *no_own_rec2;
+#main.c:       struct gen_list_rec *no_own_rec3;
+#main.c:
+#main.c:       printf( "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n",
+#main.c:                         gen_list_rcs,
+#main.c:                         gen_list_h_rcs,
+#main.c:                         isa_rcs,
+#main.c:                         isa_h_rcs,
+#main.c:                         malloc_police_rcs,
+#main.c:                         malloc_police_h_rcs,
+#main.c:                         rec_char_rcs,
+#main.c:                         rec_char_h_rcs,
+#main.c:                         rec_charptr_rcs,
+#main.c:                         rec_charptr_h_rcs,
+#main.c:                         rec_long_rcs,
+#main.c:                         rec_long_h_rcs,
+#main.c:                         rec_double_rcs,
+#main.c:                         rec_double_h_rcs,
+#main.c:                         rec_malloc_police_rcs,
+#main.c:                         rec_malloc_police_h_rcs,
+#main.c:                         main_rcs );
+#main.c:
+#main.c:
+#main.c:       /* Force a memory leak to test the strdup/malloc/free police. */
+#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
+#main.c:       strcpy( MALLOC( 60 ), "Force a memory leak to test the strdup/malloc/free police." );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_construct to constuct a charptr list -- **\n" );
+#main.c:       lcharptr = gen_list_construct();
+#main.c:
+#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "Rodney Stromlund" ) );
+#main.c:       gen_list_insert( lcharptr, f_rec = (struct gen_list_rec *)derived_rec_charptr_construct( "RJS" ) );
+#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "jammin!" ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to test streaming a charptr list -- **\n" );
+#main.c:       gen_list_stream( lcharptr );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_find to find the 2nd charptr record -- **\n" );
+#main.c:       f_rec = gen_list_find( lcharptr, f_rec );
+#main.c:       printf( "Found rec = %p\n", f_rec );
+#main.c:       derived_rec_charptr_stream( (const struct derived_rec_charptr *)f_rec );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the charptr list -- **\n" );
+#main.c:       lcharptr_c = gen_list_copy_construct( lcharptr );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig -- **
+#main.c:** -- NOTE: they will NOT be because the charptr copy constructor changes the string contents -- **\n" );
+#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, lcharptr_c ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to stream a copied charptr list -- **\n" );
+#main.c:       gen_list_stream( lcharptr_c );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_construct to constuct a long list -- **\n" );
+#main.c:       llong = gen_list_construct();
+#main.c:
+#main.c:
+#main.c:       gen_list_insert( llong, no_own_rec1 = (struct gen_list_rec *)derived_rec_long_construct( 1 ) );
+#main.c:       gen_list_insert( llong, no_own_rec2 = (struct gen_list_rec *)derived_rec_long_construct( 100 ) );
+#main.c:       gen_list_insert( llong, no_own_rec3 = (struct gen_list_rec *)derived_rec_long_construct( 200 ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to test streaming a long list -- **\n" );
+#main.c:       gen_list_stream( llong );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the long list -- **\n" );
+#main.c:       llong_c = gen_list_copy_construct( llong );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to stream a copied long list -- **\n" );
+#main.c:       gen_list_stream( llong_c );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_construct to test a no-owner long list -- **\n" );
+#main.c:       no_own_list = gen_list_construct();
+#main.c:       gen_list_insert( no_own_list, no_own_rec1 );
+#main.c:       gen_list_insert( no_own_list, no_own_rec2 );
+#main.c:       gen_list_insert( no_own_list, no_own_rec3 );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to stream a no-owner list -- **\n" );
+#main.c:       gen_list_stream( no_own_list );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_equal to see if list and no-owner list are equal  NOTE: they should be. -- **\n" );
+#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( llong, no_own_list ) );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_construct to constuct a double list -- **\n" );
+#main.c:       ldouble = gen_list_construct();
+#main.c:
+#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.0 ) );
+#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.1 ) );
+#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.14 ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to test streaming a double list -- **\n" );
+#main.c:       gen_list_stream( ldouble );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the double list -- **\n" );
+#main.c:       ldouble_c = gen_list_copy_construct( ldouble );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to stream a copied double list -- **\n" );
+#main.c:       gen_list_stream( ldouble_c );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_construct to constuct a char list -- **\n" );
+#main.c:       lchar = gen_list_construct();
+#main.c:
+#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( '1' ) );
+#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'A' ) );
+#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'a' ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to test streaming a char list -- **\n" );
+#main.c:       gen_list_stream( lchar );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the char list -- **\n" );
+#main.c:       lchar_c = gen_list_copy_construct( lchar );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig  NOTE: they should be. -- **\n" );
+#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lchar, lchar_c ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_stream to stream a copied char list -- **\n" );
+#main.c:       gen_list_stream( lchar_c );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_iterate to iterate a charptr list -- **
+#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
+#main.c:       gen_list_iterate( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_iterate to iterate a copied charptr list -- **
+#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
+#main.c:       gen_list_iterate( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a charptr list -- **
+#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
+#main.c:       gen_list_iterate_reverse( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a copied charptr list -- **
+#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
+#main.c:       gen_list_iterate_reverse( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_equal to see if 2 different typed lists are equal  NOTE: they should not be. -- **\n" );
+#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, llong ) );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove_all to erase a no-owner list -- **\n" );
+#main.c:       no_own_list = gen_list_remove_all( no_own_list );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct a no-owner list -- **\n" );
+#main.c:       no_own_list = gen_list_destruct( no_own_list );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove to remove the first record of a copied charptr list -- **\n" );
+#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr_c, gen_list_get_first( lcharptr_c ) ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove to remove the last record of a copied long list -- **\n" );
+#main.c:       derived_rec_long_destruct( (struct derived_rec_long *)gen_list_remove( llong_c, gen_list_get_last( llong_c ) ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove to remove the middle record of an original charptr list -- **\n" );
+#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr, f_rec ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of a copied char list (first to last) -- **\n" );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of the original char list (last to first) -- **\n" );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
+#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
+#main.c:
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original charptr list (less the middle record) -- **\n" );
+#main.c:       lcharptr = gen_list_destruct( lcharptr );
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied charptr list (less the first record) -- **\n" );
+#main.c:       lcharptr_c = gen_list_destruct( lcharptr_c );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original long list -- **\n" );
+#main.c:       llong = gen_list_destruct( llong );
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied long list (less the last record) -- **\n" );
+#main.c:       llong_c = gen_list_destruct( llong_c );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original double list -- **\n" );
+#main.c:       ldouble = gen_list_destruct( ldouble );
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied double list -- **\n" );
+#main.c:       ldouble_c = gen_list_destruct( ldouble_c );
+#main.c:
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original char list (less all records last to first) -- **\n" );
+#main.c:       lchar = gen_list_destruct( lchar );
+#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied char list (less all records first to last) -- **\n" );
+#main.c:       lchar_c = gen_list_destruct( lchar_c );
+#main.c:
+#main.c:
+#main.c:       /* Force another memory leak to test the strdup/malloc/free police. */
+#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
+#main.c:       STRDUP( "Force another memory leak to test the strdup/malloc/free police." );
+#main.c:
+#main.c:       /* Force a memory leak in a list and also in 2 nodes. */
+#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
+#main.c:       gen_list_construct();
+#main.c:
+#main.c:       /* NOTE: this should trigger 1 NON check (for the node) */
+#main.c:       /* followed by 1 alphanum check for the charptr string. */
+#main.c:       derived_rec_charptr_construct( "Leaky charptr node." );
+#main.c:
+#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
+#main.c:       derived_rec_char_construct( 'Z' );
+#main.c:
+#main.c:
+#main.c:       printf( "\ndone" );
+#main.c:       return( 0 );
+#main.c:
+#main.c:}
+#main.c:
+#main.c:
+#main.c:/*
+#main.c:  Local Variables:
+#main.c:  tab-width: 3
+#main.c:  end:
+#main.c:*/
+
+
+#malloc_police.c:const char malloc_police_rcs[] = "$Id: malloc_police.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#malloc_police.c: *
+#malloc_police.c: * Purpose     :  This module uses the rec_malloc_police to build a
+#malloc_police.c: *                                            list of allocated and freed memory.  When the
+#malloc_police.c: *                                            program exits, we will print a list of all memory
+#malloc_police.c: *                                            that was allocated, but never freed.  This could
+#malloc_police.c: *                                            be most helpful to developers and debugers.
+#malloc_police.c: *
+#malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#malloc_police.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#malloc_police.c: *
+#malloc_police.c: *                This program is free software; you can redistribute it
+#malloc_police.c: *                and/or modify it under the terms of the GNU General
+#malloc_police.c: *                Public License as published by the Free Software
+#malloc_police.c: *                Foundation; either version 2 of the License, or (at
+#malloc_police.c: *                your option) any later version.
+#malloc_police.c: *
+#malloc_police.c: *                This program is distributed in the hope that it will
+#malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#malloc_police.c: *                License for more details.
+#malloc_police.c: *
+#malloc_police.c: *                The GNU General Public License should be included with
+#malloc_police.c: *                this file.  If not, you can view it at
+#malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
+#malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
+#malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#malloc_police.c: *
+#malloc_police.c: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#malloc_police.c: *                                            and edit IJB, correctly.
+#malloc_police.c: *
+#malloc_police.c: * Revisions   :
+#malloc_police.c: *    $Log: malloc_police.c,v $
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:\f
+#malloc_police.c:
+#malloc_police.c:#include <ctype.h>
+#malloc_police.c:#include <malloc.h>
+#malloc_police.c:#include <stdio.h>
+#malloc_police.c:#include <stdlib.h>
+#malloc_police.c:#include <string.h>
+#malloc_police.c:
+#malloc_police.c:#include "gen_list.h"
+#malloc_police.c:#include "malloc_police.h"
+#malloc_police.c:#include "rec_malloc_police.h"
+#malloc_police.c:
+#malloc_police.c:const char malloc_police_h_rcs[] = MALLOC_POLICE_H_VERSION;
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/* When we need to allocate malloc_police records, we */
+#malloc_police.c:/* will do recursion infinately.  This variable will */
+#malloc_police.c:/* stop the STRDUP, MALLOC, and FREE replacements from */
+#malloc_police.c:/* trying to log these allocations. */
+#malloc_police.c:
+#malloc_police.c:char recursion_protect = 0;
+#malloc_police.c:
+#malloc_police.c:struct gen_list *get_police_list();
+#malloc_police.c:static char called_once = 0;
+#malloc_police.c:static const char *leak_report_header = "%s****************************** MEMORY LEAK REPORT %s ******************************%s";
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  police_list_release_iterator
+#malloc_police.c: *
+#malloc_police.c: * Description :  Iterator for the police list.  We will report
+#malloc_police.c: *                                            "leaked" memory for the developer to correct.
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :
+#malloc_police.c: *          1  :  The record.
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  NULL
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:struct derived_rec_malloc_police *police_list_release_iterator( struct derived_rec_malloc_police *this_rec )
+#malloc_police.c:{
+#malloc_police.c:      if ( ! called_once )
+#malloc_police.c:      {
+#malloc_police.c:              called_once = 1;
+#malloc_police.c:              fprintf( stderr, leak_report_header, "\n\n", "BEGIN", "\n\n" );
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      fprintf( stderr, "\
+#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec\t\t\t\t\t= %p
+#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->alloced_addr\t= %p
+#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->source_where\t= %s
+#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->sz\t\t\t\t= %ld\n",
+#malloc_police.c:                              (const void *)this_rec,
+#malloc_police.c:                              this_rec->alloced_addr,
+#malloc_police.c:                              this_rec->source_where,
+#malloc_police.c:                              this_rec->sz
+#malloc_police.c:      );
+#malloc_police.c:
+#malloc_police.c:      if (
+#malloc_police.c:              this_rec->sz >= 3 &&
+#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 0 ] ) &&
+#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 1 ] ) &&
+#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 2 ] ) )
+#malloc_police.c:      {
+#malloc_police.c:              /* If the memory starts with 3 alpha-numerics,
+#malloc_police.c:               * assume a string was allocated.  This might be
+#malloc_police.c:               * a little dangerous for production code, but I
+#malloc_police.c:               * will take the risk for development payoff
+#malloc_police.c:               * (at least for now ...) */
+#malloc_police.c:                      
+#malloc_police.c:              fprintf( stderr, "\
+#malloc_police.c:\t\tAlpha numeric found, assuming a string was allocated\t\t\t= %s\n",
+#malloc_police.c:                                      this_rec->alloced_addr
+#malloc_police.c:              );
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      fprintf( stderr, "\n" );
+#malloc_police.c:
+#malloc_police.c:      return( NULL );
+#malloc_police.c:
+#malloc_police.c:}
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  release_police_list
+#malloc_police.c: *
+#malloc_police.c: * Description :  Iterates the police_list and reports "leaked" memory.
+#malloc_police.c: *                                            It will then free the list itself.
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :      None
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  None.
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:void release_police_list()
+#malloc_police.c:{
+#malloc_police.c:      struct gen_list *police_list = get_police_list();
+#malloc_police.c:      fflush( stdout );
+#malloc_police.c:      gen_list_iterate( police_list, (rec_iterate)police_list_release_iterator );
+#malloc_police.c:
+#malloc_police.c:      if ( called_once )
+#malloc_police.c:      {
+#malloc_police.c:              called_once = 0;
+#malloc_police.c:              fprintf( stderr, leak_report_header, "", "END", "\n" );
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:}
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  get_police_list
+#malloc_police.c: *
+#malloc_police.c: * Description :  Get the police malloc/strdup/free list.  Generate
+#malloc_police.c: *                                            a new one if it does not yet exist.
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :      None
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  The police list.
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:struct gen_list *get_police_list()
+#malloc_police.c:{
+#malloc_police.c:      static struct gen_list *police_list = NULL;
+#malloc_police.c:
+#malloc_police.c:      if ( NULL == police_list )
+#malloc_police.c:      {
+#malloc_police.c:              recursion_protect ++;
+#malloc_police.c:              list_is_quiet ++;
+#malloc_police.c:
+#malloc_police.c:              police_list = gen_list_construct();
+#malloc_police.c:              atexit( release_police_list );
+#malloc_police.c:
+#malloc_police.c:              recursion_protect --;
+#malloc_police.c:              list_is_quiet --;
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      return( police_list );
+#malloc_police.c:
+#malloc_police.c:}
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  police_strdup
+#malloc_police.c: *
+#malloc_police.c: * Description :  Save the results of the strdup into our linked list.
+#malloc_police.c: *                                            This will be checked against latter free(s).
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :
+#malloc_police.c: *          1  :  The string to be duplicated.
+#malloc_police.c: *          2  :  Filename where the strdup occured.
+#malloc_police.c: *          3  :  Line# of where the strdup occured.
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  Pointer to newly allocated memory.
+#malloc_police.c: *
+#malloc_police.c: * NOTE                       :       This could replace the custom strdup for __MINGW32__
+#malloc_police.c: *                                            systems.  We only need to copy the conditionally
+#malloc_police.c: *                                            compiled code here and eliminate the strdup copy.
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:char *police_strdup( const char *s, const char *filename, long lineno )
+#malloc_police.c:{
+#malloc_police.c:      char *ret = strdup( s );
+#malloc_police.c:
+#malloc_police.c:      if ( 0 == recursion_protect )
+#malloc_police.c:      {
+#malloc_police.c:              char buffer[ 255 ];
+#malloc_police.c:              sprintf( buffer, "strdup : %s @ %ld for %ld (%s)", filename, lineno, strlen( s ) + 1, s );
+#malloc_police.c:
+#malloc_police.c:              recursion_protect ++;
+#malloc_police.c:              list_is_quiet ++;
+#malloc_police.c:
+#malloc_police.c:              gen_list_insert(
+#malloc_police.c:                      get_police_list(),
+#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, strlen( s ) + 1 )
+#malloc_police.c:              );
+#malloc_police.c:
+#malloc_police.c:              recursion_protect --;
+#malloc_police.c:              list_is_quiet --;
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      return( ret );
+#malloc_police.c:
+#malloc_police.c:}
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  police_malloc
+#malloc_police.c: *
+#malloc_police.c: * Description :  Save the results of the malloc into our linked list.
+#malloc_police.c: *                                            This will be checked against latter free(s).
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :
+#malloc_police.c: *          1  :  The size of the memory to be malloc(ed).
+#malloc_police.c: *          2  :  Filename where the malloc occured.
+#malloc_police.c: *          3  :  Line# of where the malloc occured.
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:void *police_malloc( size_t sz, const char *filename, long lineno )
+#malloc_police.c:{
+#malloc_police.c:      void *ret = malloc( sz );
+#malloc_police.c:
+#malloc_police.c:      if ( 0 == recursion_protect )
+#malloc_police.c:      {
+#malloc_police.c:              char buffer[ 255 ];
+#malloc_police.c:              sprintf( buffer, "malloc : %s @ %ld for %ld", filename, lineno, sz );
+#malloc_police.c:
+#malloc_police.c:              recursion_protect ++;
+#malloc_police.c:              list_is_quiet ++;
+#malloc_police.c:
+#malloc_police.c:              gen_list_insert(
+#malloc_police.c:                      get_police_list(),
+#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, sz )
+#malloc_police.c:              );
+#malloc_police.c:
+#malloc_police.c:              recursion_protect --;
+#malloc_police.c:              list_is_quiet --;
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      return( ret );
+#malloc_police.c:
+#malloc_police.c:}
+#malloc_police.c:
+#malloc_police.c:
+#malloc_police.c:/*********************************************************************
+#malloc_police.c: *
+#malloc_police.c: * Function    :  police_free
+#malloc_police.c: *
+#malloc_police.c: * Description :  Frees the memory allocation and removes the address
+#malloc_police.c: *                                            from the linked list.  Anything left in this list
+#malloc_police.c: *                                            is "leaked" memory.
+#malloc_police.c: *
+#malloc_police.c: * Parameters  :
+#malloc_police.c: *          1  :  Pointer to the memory to be freed.
+#malloc_police.c: *          2  :  Filename where the free occured.
+#malloc_police.c: *          3  :  Line# of where the free occured.
+#malloc_police.c: *
+#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#malloc_police.c: *
+#malloc_police.c: *********************************************************************/
+#malloc_police.c:void police_free( void *ptr, const char *filename, long lineno )
+#malloc_police.c:{
+#malloc_police.c:      if ( 0 == recursion_protect )
+#malloc_police.c:      {
+#malloc_police.c:              struct derived_rec_malloc_police *rec;
+#malloc_police.c:              struct gen_list_rec *fRec;
+#malloc_police.c:              struct gen_list *l = get_police_list();
+#malloc_police.c:
+#malloc_police.c:              recursion_protect ++;
+#malloc_police.c:              list_is_quiet ++;
+#malloc_police.c:
+#malloc_police.c:              rec = derived_rec_malloc_police_construct( ptr, "FREEING POLICE RECORD.", 23 );
+#malloc_police.c:              fRec = gen_list_find( l, (struct gen_list_rec *)rec );
+#malloc_police.c:              derived_rec_malloc_police_destruct( rec );
+#malloc_police.c:
+#malloc_police.c:              if ( NULL == fRec )
+#malloc_police.c:              {
+#malloc_police.c:                      fprintf( stderr, "\nERROR: free failed to find corresponding strdup/malloc : %s @ %ld\n", filename, lineno );
+#malloc_police.c:              }
+#malloc_police.c:              else
+#malloc_police.c:              {
+#malloc_police.c:                      derived_rec_malloc_police_destruct( (struct derived_rec_malloc_police *)gen_list_remove( l, fRec ) );
+#malloc_police.c:              }
+#malloc_police.c:
+#malloc_police.c:              recursion_protect --;
+#malloc_police.c:              list_is_quiet --;
+#malloc_police.c:      }
+#malloc_police.c:
+#malloc_police.c:      free( ptr );
+#malloc_police.c:
+#malloc_police.c:}
+
+
+#malloc_police.h:#ifndef MALLOC_POLICE_H_INCLUDED
+#malloc_police.h:#define MALLOC_POLICE_H_INCLUDED
+#malloc_police.h:#define MALLOC_POLICE_H_VERSION "$Id: malloc_police.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#malloc_police.h:/*********************************************************************
+#malloc_police.h: *
+#malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_char.h,v $
+#malloc_police.h: *
+#malloc_police.h: * Purpose     :  This module uses the rec_malloc_police to build a
+#malloc_police.h: *                                            list of allocated and freed memory.  When the
+#malloc_police.h: *                                            program exits, we will print a list of all memory
+#malloc_police.h: *                                            that was allocated, but never freed.  This could
+#malloc_police.h: *                                            be most helpful to developers and debugers.
+#malloc_police.h: *
+#malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#malloc_police.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#malloc_police.h: *
+#malloc_police.h: *                This program is free software; you can redistribute it
+#malloc_police.h: *                and/or modify it under the terms of the GNU General
+#malloc_police.h: *                Public License as published by the Free Software
+#malloc_police.h: *                Foundation; either version 2 of the License, or (at
+#malloc_police.h: *                your option) any later version.
+#malloc_police.h: *
+#malloc_police.h: *                This program is distributed in the hope that it will
+#malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#malloc_police.h: *                License for more details.
+#malloc_police.h: *
+#malloc_police.h: *                The GNU General Public License should be included with
+#malloc_police.h: *                this file.  If not, you can view it at
+#malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
+#malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
+#malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#malloc_police.h: *
+#malloc_police.h: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#malloc_police.h: *                                            and edit IJB, correctly.
+#malloc_police.h: *
+#malloc_police.h: * Revisions   :
+#malloc_police.h: *    $Log: malloc_police.h,v $
+#malloc_police.h: *
+#malloc_police.h: *********************************************************************/
+#malloc_police.h:\f
+#malloc_police.h:
+#malloc_police.h:#ifdef __cplusplus
+#malloc_police.h:extern "C" {
+#malloc_police.h:#endif
+#malloc_police.h:
+#malloc_police.h:
+#malloc_police.h:char *police_strdup( const char *s, const char *filename, long lineno );
+#malloc_police.h:void *police_malloc( size_t sz, const char *filename, long lineno );
+#malloc_police.h:void police_free( void *ptr, const char *filename, long lineno );
+#malloc_police.h:
+#malloc_police.h:#define STRDUP(s)                     police_strdup( s, __FILE__, __LINE__ )
+#malloc_police.h:#define MALLOC(sz)            police_malloc( sz, __FILE__, __LINE__ )
+#malloc_police.h:#define FREE(ptr)                     police_free( ptr, __FILE__, __LINE__ )
+#malloc_police.h:
+#malloc_police.h:
+#malloc_police.h:#ifdef __cplusplus
+#malloc_police.h:} /* extern "C" */
+#malloc_police.h:#endif
+#malloc_police.h:
+#malloc_police.h:#endif /* ndef MALLOC_POLICE_H_INCLUDED */
+#malloc_police.h:
+#malloc_police.h:/*
+#malloc_police.h:  Local Variables:
+#malloc_police.h:  tab-width: 3
+#malloc_police.h:  end:
+#malloc_police.h:*/
+
+
+#rec_char.c:const char rec_char_rcs[] = "$Id: rec_char.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#rec_char.c: *
+#rec_char.c: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_char.c: *
+#rec_char.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_char.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_char.c: *
+#rec_char.c: *                This program is free software; you can redistribute it
+#rec_char.c: *                and/or modify it under the terms of the GNU General
+#rec_char.c: *                Public License as published by the Free Software
+#rec_char.c: *                Foundation; either version 2 of the License, or (at
+#rec_char.c: *                your option) any later version.
+#rec_char.c: *
+#rec_char.c: *                This program is distributed in the hope that it will
+#rec_char.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_char.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_char.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_char.c: *                License for more details.
+#rec_char.c: *
+#rec_char.c: *                The GNU General Public License should be included with
+#rec_char.c: *                this file.  If not, you can view it at
+#rec_char.c: *                http://www.gnu.org/copyleft/gpl.html
+#rec_char.c: *                or write to the Free Software Foundation, Inc., 59
+#rec_char.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_char.c: *
+#rec_char.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_char.c: *                                         and edit IJB, correctly.
+#rec_char.c: *
+#rec_char.c: * Revisions   :
+#rec_char.c: *    $Log: rec_char.c,v $
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:\f
+#rec_char.c:
+#rec_char.c:#include <malloc.h>
+#rec_char.c:#include <stdio.h>
+#rec_char.c:#include <stdlib.h>
+#rec_char.c:#include <string.h>
+#rec_char.c:
+#rec_char.c:#include "gen_list.h"
+#rec_char.c:#include "rec_char.h"
+#rec_char.c:
+#rec_char.c:const char rec_char_h_rcs[] = REC_CHAR_H_VERSION;
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:static const rec_method rec_char_vtable[] =
+#rec_char.c:{
+#rec_char.c:   (rec_method)derived_rec_char_copy_construct,
+#rec_char.c:   (rec_method)derived_rec_char_destruct,
+#rec_char.c:   (rec_method)derived_rec_char_stream,
+#rec_char.c:   (rec_method)derived_rec_char_equal
+#rec_char.c:};
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * Function    :  derived_rec_char_construct
+#rec_char.c: *
+#rec_char.c: * Description :  A simple derived record class that contains 1 string.
+#rec_char.c: *
+#rec_char.c: * Parameters  :
+#rec_char.c: *          1  :  The record
+#rec_char.c: *          2  :  The string to contain.
+#rec_char.c: *
+#rec_char.c: * Returns     :  A pointer to the constructed record.
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:struct derived_rec_char *derived_rec_char_construct( const char _contents )
+#rec_char.c:{
+#rec_char.c:   struct derived_rec_char *this_rec = (struct derived_rec_char *)gen_list_rec_construct(
+#rec_char.c:           ISA_CHAR,
+#rec_char.c:           sizeof( struct derived_rec_char ),
+#rec_char.c:           rec_char_vtable
+#rec_char.c:   );
+#rec_char.c:
+#rec_char.c:   this_rec->contents = _contents;
+#rec_char.c:
+#rec_char.c:   LIST_SHOW( printf( "\
+#rec_char.c:\t\tchar construct new rec\t\t\t\t= %p
+#rec_char.c:\t\tchar construct new rec contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_char.c:
+#rec_char.c:   return( this_rec );
+#rec_char.c:
+#rec_char.c:}
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * Function    :  derived_rec_char_copy_construct
+#rec_char.c: *
+#rec_char.c: * Description :  Copies one char record to another.
+#rec_char.c: *
+#rec_char.c: * Parameters  :
+#rec_char.c: *          1  :  Existing record.
+#rec_char.c: *                         2       :  Copy record.
+#rec_char.c: *
+#rec_char.c: * Returns     :  The newly constructed copy record.
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:struct derived_rec_char *derived_rec_char_copy_construct( const struct derived_rec_char *this_rec )
+#rec_char.c:{
+#rec_char.c:   struct derived_rec_char *copy_rec = (struct derived_rec_char *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
+#rec_char.c:   copy_rec->contents = this_rec->contents;
+#rec_char.c:
+#rec_char.c:   LIST_SHOW( printf( "\
+#rec_char.c:\t\tchar copy construct new gen rec\t\t\t\t= %p => %p
+#rec_char.c:\t\tchar copy construct new gen rec contents\t= %c\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
+#rec_char.c:
+#rec_char.c:   return( copy_rec );
+#rec_char.c:
+#rec_char.c:}
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * Function    :  derived_rec_char_destruct        
+#rec_char.c: *
+#rec_char.c: * Description :  Destruct the char record.
+#rec_char.c: *
+#rec_char.c: * Parameters  :
+#rec_char.c: *          1  :  The record.
+#rec_char.c: *
+#rec_char.c: * Returns     :  NULL
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:struct derived_rec_char *derived_rec_char_destruct( struct derived_rec_char *this_rec )
+#rec_char.c:{
+#rec_char.c:   LIST_SHOW( printf( "\
+#rec_char.c:\t\tchar destruct this_rec\t\t\t\t= %p
+#rec_char.c:\t\tchar destruct this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_char.c:
+#rec_char.c:   this_rec->contents = '!';
+#rec_char.c:   return( (struct derived_rec_char *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
+#rec_char.c:
+#rec_char.c:}
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * Function    :  derived_rec_char_stream
+#rec_char.c: *
+#rec_char.c: * Description :  Displays all char attributes on the STDOUT stream.
+#rec_char.c: *
+#rec_char.c: * Parameters  :
+#rec_char.c: *          1  :  The record.
+#rec_char.c: *
+#rec_char.c: * Returns     :  The record.
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec )
+#rec_char.c:{
+#rec_char.c:   this_rec = (struct derived_rec_char *)gen_list_rec_stream(
+#rec_char.c:           (struct gen_list_rec *)this_rec
+#rec_char.c:   );
+#rec_char.c:   LIST_SHOW( printf( "\
+#rec_char.c:\t\tchar stream this_rec\t\t\t\t\t= %p
+#rec_char.c:\t\tchar stream this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_char.c:
+#rec_char.c:   return( this_rec );
+#rec_char.c:
+#rec_char.c:}
+#rec_char.c:
+#rec_char.c:
+#rec_char.c:/*********************************************************************
+#rec_char.c: *
+#rec_char.c: * Function    :  derived_rec_char_equal
+#rec_char.c: *
+#rec_char.c: * Description :  Compares two char records to see if they are equal.
+#rec_char.c: *
+#rec_char.c: * Parameters  :
+#rec_char.c: *          1  :  A record.
+#rec_char.c: *          2  :  Another record.
+#rec_char.c: *
+#rec_char.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#rec_char.c: *
+#rec_char.c: *********************************************************************/
+#rec_char.c:int derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec )
+#rec_char.c:{
+#rec_char.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
+#rec_char.c:   {
+#rec_char.c:           return( 0 );
+#rec_char.c:   }
+#rec_char.c:   return( this_rec->contents == eq_rec->contents );
+#rec_char.c:
+#rec_char.c:}
+
+
+#rec_char.h:#ifndef REC_CHAR_H_INCLUDED
+#rec_char.h:#define REC_CHAR_H_INCLUDED
+#rec_char.h:#define REC_CHAR_H_VERSION "$Id: rec_char.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#rec_char.h:/*********************************************************************
+#rec_char.h: *
+#rec_char.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_char.h,v $
+#rec_char.h: *
+#rec_char.h: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_char.h: *
+#rec_char.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_char.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_char.h: *
+#rec_char.h: *                This program is free software; you can redistribute it
+#rec_char.h: *                and/or modify it under the terms of the GNU General
+#rec_char.h: *                Public License as published by the Free Software
+#rec_char.h: *                Foundation; either version 2 of the License, or (at
+#rec_char.h: *                your option) any later version.
+#rec_char.h: *
+#rec_char.h: *                This program is distributed in the hope that it will
+#rec_char.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_char.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_char.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_char.h: *                License for more details.
+#rec_char.h: *
+#rec_char.h: *                The GNU General Public License should be included with
+#rec_char.h: *                this file.  If not, you can view it at
+#rec_char.h: *                http://www.gnu.org/copyleft/gpl.html
+#rec_char.h: *                or write to the Free Software Foundation, Inc., 59
+#rec_char.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_char.h: *
+#rec_char.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_char.h: *                                         and edit IJB, correctly.
+#rec_char.h: *
+#rec_char.h: * Revisions   :
+#rec_char.h: *    $Log: rec_char.h,v $
+#rec_char.h: *
+#rec_char.h: *********************************************************************/
+#rec_char.h:\f
+#rec_char.h:
+#rec_char.h:#ifdef __cplusplus
+#rec_char.h:extern "C" {
+#rec_char.h:#endif
+#rec_char.h:
+#rec_char.h:
+#rec_char.h:struct derived_rec_char
+#rec_char.h:{
+#rec_char.h:   /* private: */
+#rec_char.h:   struct gen_list_rec parent_rec;
+#rec_char.h:   char contents;
+#rec_char.h:};
+#rec_char.h:
+#rec_char.h:/* public: */
+#rec_char.h:extern struct derived_rec_char *   derived_rec_char_construct( const char _contents );
+#rec_char.h:extern struct derived_rec_char *   derived_rec_char_copy_construct( const struct derived_rec_char *this_rec );
+#rec_char.h:extern struct derived_rec_char *   derived_rec_char_destruct( struct derived_rec_char *this_rec );
+#rec_char.h:extern const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec );
+#rec_char.h:extern int                                                         derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec );
+#rec_char.h:
+#rec_char.h:/* struct/class COMPLETE */
+#rec_char.h:
+#rec_char.h:
+#rec_char.h:#ifdef __cplusplus
+#rec_char.h:} /* extern "C" */
+#rec_char.h:#endif
+#rec_char.h:
+#rec_char.h:#endif /* ndef REC_CHAR_H_INCLUDED */
+#rec_char.h:
+#rec_char.h:/*
+#rec_char.h:  Local Variables:
+#rec_char.h:  tab-width: 3
+#rec_char.h:  end:
+#rec_char.h:*/
+
+
+#rec_charptr.c:const char rec_charptr_rcs[] = "$Id: rec_charptr.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#rec_charptr.c: *
+#rec_charptr.c: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_charptr.c: *
+#rec_charptr.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_charptr.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_charptr.c: *
+#rec_charptr.c: *                This program is free software; you can redistribute it
+#rec_charptr.c: *                and/or modify it under the terms of the GNU General
+#rec_charptr.c: *                Public License as published by the Free Software
+#rec_charptr.c: *                Foundation; either version 2 of the License, or (at
+#rec_charptr.c: *                your option) any later version.
+#rec_charptr.c: *
+#rec_charptr.c: *                This program is distributed in the hope that it will
+#rec_charptr.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_charptr.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_charptr.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_charptr.c: *                License for more details.
+#rec_charptr.c: *
+#rec_charptr.c: *                The GNU General Public License should be included with
+#rec_charptr.c: *                this file.  If not, you can view it at
+#rec_charptr.c: *                http://www.gnu.org/copyleft/gpl.html
+#rec_charptr.c: *                or write to the Free Software Foundation, Inc., 59
+#rec_charptr.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_charptr.c: *
+#rec_charptr.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_charptr.c: *                                              and edit IJB, correctly.
+#rec_charptr.c: *
+#rec_charptr.c: * Revisions   :
+#rec_charptr.c: *    $Log: rec_charptr.c,v $
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:\f
+#rec_charptr.c:
+#rec_charptr.c:#include <malloc.h>
+#rec_charptr.c:#include <stdio.h>
+#rec_charptr.c:#include <stdlib.h>
+#rec_charptr.c:#include <string.h>
+#rec_charptr.c:
+#rec_charptr.c:#include "gen_list.h"
+#rec_charptr.c:#include "rec_charptr.h"
+#rec_charptr.c:#include "malloc_police.h"
+#rec_charptr.c:
+#rec_charptr.c:const char rec_charptr_h_rcs[] = REC_CHARPTR_H_VERSION;
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:static const rec_method rec_charptr_vtable[] =
+#rec_charptr.c:{
+#rec_charptr.c:        (rec_method)derived_rec_charptr_copy_construct,
+#rec_charptr.c:        (rec_method)derived_rec_charptr_destruct,
+#rec_charptr.c:        (rec_method)derived_rec_charptr_stream,
+#rec_charptr.c:        (rec_method)derived_rec_charptr_equal
+#rec_charptr.c:};
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * Function    :  derived_rec_charptr_construct
+#rec_charptr.c: *
+#rec_charptr.c: * Description :  A simple derived record class that contains 1 string.
+#rec_charptr.c: *
+#rec_charptr.c: * Parameters  :
+#rec_charptr.c: *          1  :  The record
+#rec_charptr.c: *          2  :  The string to contain.
+#rec_charptr.c: *
+#rec_charptr.c: * Returns     :  A pointer to the constructed record.
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_construct( const char *_contents )
+#rec_charptr.c:{
+#rec_charptr.c:        struct derived_rec_charptr *this_rec = (struct derived_rec_charptr *)gen_list_rec_construct(
+#rec_charptr.c:                ISA_CHARPTR,
+#rec_charptr.c:                sizeof( struct derived_rec_charptr ),
+#rec_charptr.c:                rec_charptr_vtable
+#rec_charptr.c:        );
+#rec_charptr.c:
+#rec_charptr.c:        this_rec->contents = STRDUP( _contents );
+#rec_charptr.c:
+#rec_charptr.c:        LIST_SHOW( printf( "\
+#rec_charptr.c:\t\tcharptr construct new rec\t\t\t\t= %p
+#rec_charptr.c:\t\tcharptr construct new rec contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_charptr.c:
+#rec_charptr.c:        return( this_rec );
+#rec_charptr.c:
+#rec_charptr.c:}
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * Function    :  derived_rec_charptr_copy_construct
+#rec_charptr.c: *
+#rec_charptr.c: * Description :  Copies one charptr record to another.
+#rec_charptr.c: *
+#rec_charptr.c: * Parameters  :
+#rec_charptr.c: *          1  :  Existing record.
+#rec_charptr.c: *                              2       :  Copy record.
+#rec_charptr.c: *
+#rec_charptr.c: * Returns     :  The newly constructed copy record.
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec )
+#rec_charptr.c:{
+#rec_charptr.c:        int len;
+#rec_charptr.c:        char *new_contents;
+#rec_charptr.c:
+#rec_charptr.c:        struct derived_rec_charptr *copy_rec = (struct derived_rec_charptr *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
+#rec_charptr.c:
+#rec_charptr.c:        len = strlen( this_rec->contents );
+#rec_charptr.c:        len += sizeof( "COPY " );
+#rec_charptr.c:
+#rec_charptr.c:        copy_rec->contents = (char *)MALLOC( len );
+#rec_charptr.c:        strcpy( copy_rec->contents, "COPY " );
+#rec_charptr.c:        strcat( copy_rec->contents, this_rec->contents );
+#rec_charptr.c:
+#rec_charptr.c:        LIST_SHOW( printf( "\
+#rec_charptr.c:\t\tcharptr copy construct new gen rec\t\t\t\t= %p => %p
+#rec_charptr.c:\t\tcharptr copy construct new gen rec contents\t= %s\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:        return( copy_rec );
+#rec_charptr.c:
+#rec_charptr.c:}
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * Function    :  derived_rec_charptr_destruct  
+#rec_charptr.c: *
+#rec_charptr.c: * Description :  Destruct the charptr record.
+#rec_charptr.c: *
+#rec_charptr.c: * Parameters  :
+#rec_charptr.c: *          1  :  The record.
+#rec_charptr.c: *
+#rec_charptr.c: * Returns     :  NULL
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec )
+#rec_charptr.c:{
+#rec_charptr.c:        LIST_SHOW( printf( "\
+#rec_charptr.c:\t\tcharptr destruct this_rec\t\t\t\t= %p
+#rec_charptr.c:\t\tcharptr destruct this_rec->contents\t= %s\n\n", (const void *)this_rec, (const void *)this_rec->contents ) );
+#rec_charptr.c:
+#rec_charptr.c:        memset( this_rec->contents, '!', strlen( this_rec->contents ) );
+#rec_charptr.c:        FREE( this_rec->contents );
+#rec_charptr.c:        return( (struct derived_rec_charptr *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
+#rec_charptr.c:
+#rec_charptr.c:}
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * Function    :  derived_rec_charptr_stream
+#rec_charptr.c: *
+#rec_charptr.c: * Description :  Displays all charptr attributes on the STDOUT stream.
+#rec_charptr.c: *
+#rec_charptr.c: * Parameters  :
+#rec_charptr.c: *          1  :  The record.
+#rec_charptr.c: *
+#rec_charptr.c: * Returns     :  The record.
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec )
+#rec_charptr.c:{
+#rec_charptr.c:        this_rec = (struct derived_rec_charptr *)gen_list_rec_stream(
+#rec_charptr.c:                (struct gen_list_rec *)this_rec
+#rec_charptr.c:        );
+#rec_charptr.c:        LIST_SHOW( printf( "\
+#rec_charptr.c:\t\tcharptr stream this_rec\t\t\t\t\t= %p
+#rec_charptr.c:\t\tcharptr stream this_rec->contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_charptr.c:
+#rec_charptr.c:        return( this_rec );
+#rec_charptr.c:
+#rec_charptr.c:}
+#rec_charptr.c:
+#rec_charptr.c:
+#rec_charptr.c:/*********************************************************************
+#rec_charptr.c: *
+#rec_charptr.c: * Function    :  derived_rec_charptr_equal
+#rec_charptr.c: *
+#rec_charptr.c: * Description :  Compares two charptr records to see if they are equal.
+#rec_charptr.c: *
+#rec_charptr.c: * Parameters  :
+#rec_charptr.c: *          1  :  A record.
+#rec_charptr.c: *          2  :  Another record.
+#rec_charptr.c: *
+#rec_charptr.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#rec_charptr.c: *
+#rec_charptr.c: *********************************************************************/
+#rec_charptr.c:int derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec )
+#rec_charptr.c:{
+#rec_charptr.c:        if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
+#rec_charptr.c:        {
+#rec_charptr.c:                return( 0 );
+#rec_charptr.c:        }
+#rec_charptr.c:        return( 0 == strcmp( this_rec->contents, eq_rec->contents ) );
+#rec_charptr.c:
+#rec_charptr.c:}
+
+
+#rec_charptr.h:#ifndef REC_CHARPTR_H_INCLUDED
+#rec_charptr.h:#define REC_CHARPTR_H_INCLUDED
+#rec_charptr.h:#define REC_CHARPTR_H_VERSION "$Id: rec_charptr.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#rec_charptr.h:/*********************************************************************
+#rec_charptr.h: *
+#rec_charptr.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_char.h,v $
+#rec_charptr.h: *
+#rec_charptr.h: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_charptr.h: *
+#rec_charptr.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_charptr.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_charptr.h: *
+#rec_charptr.h: *                This program is free software; you can redistribute it
+#rec_charptr.h: *                and/or modify it under the terms of the GNU General
+#rec_charptr.h: *                Public License as published by the Free Software
+#rec_charptr.h: *                Foundation; either version 2 of the License, or (at
+#rec_charptr.h: *                your option) any later version.
+#rec_charptr.h: *
+#rec_charptr.h: *                This program is distributed in the hope that it will
+#rec_charptr.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_charptr.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_charptr.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_charptr.h: *                License for more details.
+#rec_charptr.h: *
+#rec_charptr.h: *                The GNU General Public License should be included with
+#rec_charptr.h: *                this file.  If not, you can view it at
+#rec_charptr.h: *                http://www.gnu.org/copyleft/gpl.html
+#rec_charptr.h: *                or write to the Free Software Foundation, Inc., 59
+#rec_charptr.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_charptr.h: *
+#rec_charptr.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_charptr.h: *                                              and edit IJB, correctly.
+#rec_charptr.h: *
+#rec_charptr.h: * Revisions   :
+#rec_charptr.h: *    $Log: rec_charptr.h,v $
+#rec_charptr.h: *
+#rec_charptr.h: *********************************************************************/
+#rec_charptr.h:\f
+#rec_charptr.h:
+#rec_charptr.h:#ifdef __cplusplus
+#rec_charptr.h:extern "C" {
+#rec_charptr.h:#endif
+#rec_charptr.h:
+#rec_charptr.h:
+#rec_charptr.h:struct derived_rec_charptr
+#rec_charptr.h:{
+#rec_charptr.h:        /* private: */
+#rec_charptr.h:        struct gen_list_rec parent_rec;
+#rec_charptr.h:        char *contents;
+#rec_charptr.h:};
+#rec_charptr.h:
+#rec_charptr.h:/* public: */
+#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_construct( const char *_contents );
+#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec );
+#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec );
+#rec_charptr.h:extern const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec );
+#rec_charptr.h:extern int                                                                      derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec );
+#rec_charptr.h:
+#rec_charptr.h:/* struct/class COMPLETE */
+#rec_charptr.h:
+#rec_charptr.h:
+#rec_charptr.h:#ifdef __cplusplus
+#rec_charptr.h:} /* extern "C" */
+#rec_charptr.h:#endif
+#rec_charptr.h:
+#rec_charptr.h:#endif /* ndef REC_CHARPTR_H_INCLUDED */
+#rec_charptr.h:
+#rec_charptr.h:/*
+#rec_charptr.h:  Local Variables:
+#rec_charptr.h:  tab-width: 3
+#rec_charptr.h:  end:
+#rec_charptr.h:*/
+
+
+#rec_double.c:const char rec_double_rcs[] = "$Id: rec_double.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#rec_double.c: *
+#rec_double.c: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_double.c: *
+#rec_double.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_double.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_double.c: *
+#rec_double.c: *                This program is free software; you can redistribute it
+#rec_double.c: *                and/or modify it under the terms of the GNU General
+#rec_double.c: *                Public License as published by the Free Software
+#rec_double.c: *                Foundation; either version 2 of the License, or (at
+#rec_double.c: *                your option) any later version.
+#rec_double.c: *
+#rec_double.c: *                This program is distributed in the hope that it will
+#rec_double.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_double.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_double.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_double.c: *                License for more details.
+#rec_double.c: *
+#rec_double.c: *                The GNU General Public License should be included with
+#rec_double.c: *                this file.  If not, you can view it at
+#rec_double.c: *                http://www.gnu.org/copyleft/gpl.html
+#rec_double.c: *                or write to the Free Software Foundation, Inc., 59
+#rec_double.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_double.c: *
+#rec_double.c: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_double.c: *                                               and edit IJB, correctly.
+#rec_double.c: *
+#rec_double.c: * Revisions   :
+#rec_double.c: *    $Log: rec_double.c,v $
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:\f
+#rec_double.c:
+#rec_double.c:#include <malloc.h>
+#rec_double.c:#include <stdio.h>
+#rec_double.c:#include <stdlib.h>
+#rec_double.c:#include <string.h>
+#rec_double.c:
+#rec_double.c:#include "gen_list.h"
+#rec_double.c:#include "rec_double.h"
+#rec_double.c:
+#rec_double.c:const char rec_double_h_rcs[] = REC_DOUBLE_H_VERSION;
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:static const rec_method rec_double_vtable[] =
+#rec_double.c:{
+#rec_double.c: (rec_method)derived_rec_double_copy_construct,
+#rec_double.c: (rec_method)derived_rec_double_destruct,
+#rec_double.c: (rec_method)derived_rec_double_stream,
+#rec_double.c: (rec_method)derived_rec_double_equal
+#rec_double.c:};
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * Function    :  derived_rec_double_construct
+#rec_double.c: *
+#rec_double.c: * Description :  A simple derived record class that contains 1 string.
+#rec_double.c: *
+#rec_double.c: * Parameters  :
+#rec_double.c: *          1  :  The record
+#rec_double.c: *          2  :  The string to contain.
+#rec_double.c: *
+#rec_double.c: * Returns     :  A pointer to the constructed record.
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:struct derived_rec_double *derived_rec_double_construct( const double _contents )
+#rec_double.c:{
+#rec_double.c: struct derived_rec_double *this_rec = (struct derived_rec_double *)gen_list_rec_construct(
+#rec_double.c:         ISA_DOUBLE,
+#rec_double.c:         sizeof( struct derived_rec_double ),
+#rec_double.c:         rec_double_vtable
+#rec_double.c: );
+#rec_double.c:
+#rec_double.c: this_rec->contents = _contents;
+#rec_double.c:
+#rec_double.c: LIST_SHOW( printf( "\
+#rec_double.c:\t\tdouble construct new rec\t\t\t\t= %p
+#rec_double.c:\t\tdouble construct new rec contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_double.c:
+#rec_double.c: return( this_rec );
+#rec_double.c:
+#rec_double.c:}
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * Function    :  derived_rec_double_copy_construct
+#rec_double.c: *
+#rec_double.c: * Description :  Copies one double record to another.
+#rec_double.c: *
+#rec_double.c: * Parameters  :
+#rec_double.c: *          1  :  Existing record.
+#rec_double.c: *                               2       :  Copy record.
+#rec_double.c: *
+#rec_double.c: * Returns     :  The newly constructed copy record.
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:struct derived_rec_double *derived_rec_double_copy_construct( const struct derived_rec_double *this_rec )
+#rec_double.c:{
+#rec_double.c: struct derived_rec_double *copy_rec = (struct derived_rec_double *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
+#rec_double.c: copy_rec->contents = - this_rec->contents;
+#rec_double.c:
+#rec_double.c: LIST_SHOW( printf( "\
+#rec_double.c:\t\tdouble copy construct new gen rec\t\t\t\t= %p => %p
+#rec_double.c:\t\tdouble copy construct new gen rec contents\t= %8.2lf\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
+#rec_double.c:
+#rec_double.c: return( copy_rec );
+#rec_double.c:
+#rec_double.c:}
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * Function    :  derived_rec_double_destruct    
+#rec_double.c: *
+#rec_double.c: * Description :  Destruct the double record.
+#rec_double.c: *
+#rec_double.c: * Parameters  :
+#rec_double.c: *          1  :  The record.
+#rec_double.c: *
+#rec_double.c: * Returns     :  NULL
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:struct derived_rec_double *derived_rec_double_destruct( struct derived_rec_double *this_rec )
+#rec_double.c:{
+#rec_double.c: LIST_SHOW( printf( "\
+#rec_double.c:\t\tdouble destruct this_rec\t\t\t\t= %p
+#rec_double.c:\t\tdouble destruct this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_double.c:
+#rec_double.c: this_rec->contents = -1.1111;
+#rec_double.c: return( (struct derived_rec_double *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
+#rec_double.c:
+#rec_double.c:}
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * Function    :  derived_rec_double_stream
+#rec_double.c: *
+#rec_double.c: * Description :  Displays all double attributes on the STDOUT stream.
+#rec_double.c: *
+#rec_double.c: * Parameters  :
+#rec_double.c: *          1  :  The record.
+#rec_double.c: *
+#rec_double.c: * Returns     :  The record.
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec )
+#rec_double.c:{
+#rec_double.c: this_rec = (struct derived_rec_double *)gen_list_rec_stream(
+#rec_double.c:         (struct gen_list_rec *)this_rec
+#rec_double.c: );
+#rec_double.c: LIST_SHOW( printf( "\
+#rec_double.c:\t\tdouble stream this_rec\t\t\t\t= %p
+#rec_double.c:\t\tdouble stream this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_double.c:
+#rec_double.c: return( this_rec );
+#rec_double.c:
+#rec_double.c:}
+#rec_double.c:
+#rec_double.c:
+#rec_double.c:/*********************************************************************
+#rec_double.c: *
+#rec_double.c: * Function    :  derived_rec_double_equal
+#rec_double.c: *
+#rec_double.c: * Description :  Compares two double records to see if they are equal.
+#rec_double.c: *
+#rec_double.c: * Parameters  :
+#rec_double.c: *          1  :  A record.
+#rec_double.c: *          2  :  Another record.
+#rec_double.c: *
+#rec_double.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#rec_double.c: *
+#rec_double.c: *********************************************************************/
+#rec_double.c:int derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec )
+#rec_double.c:{
+#rec_double.c: if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
+#rec_double.c: {
+#rec_double.c:         return( 0 );
+#rec_double.c: }
+#rec_double.c: return( this_rec->contents == eq_rec->contents );
+#rec_double.c:
+#rec_double.c:}
+
+
+#rec_double.h:#ifndef REC_DOUBLE_H_INCLUDED
+#rec_double.h:#define REC_DOUBLE_H_INCLUDED
+#rec_double.h:#define REC_DOUBLE_H_VERSION "$Id: rec_double.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#rec_double.h:/*********************************************************************
+#rec_double.h: *
+#rec_double.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_double.h,v $
+#rec_double.h: *
+#rec_double.h: * Purpose     :  gen_A "derived class" of gen_list_rec.
+#rec_double.h: *
+#rec_double.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_double.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_double.h: *
+#rec_double.h: *                This program is free software; you can redistribute it
+#rec_double.h: *                and/or modify it under the terms of the GNU General
+#rec_double.h: *                Public License as published by the Free Software
+#rec_double.h: *                Foundation; either version 2 of the License, or (at
+#rec_double.h: *                your option) any later version.
+#rec_double.h: *
+#rec_double.h: *                This program is distributed in the hope that it will
+#rec_double.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_double.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_double.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_double.h: *                License for more details.
+#rec_double.h: *
+#rec_double.h: *                The GNU General Public License should be included with
+#rec_double.h: *                this file.  If not, you can view it at
+#rec_double.h: *                http://www.gnu.org/copyleft/gpl.html
+#rec_double.h: *                or write to the Free Software Foundation, Inc., 59
+#rec_double.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_double.h: *
+#rec_double.h: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_double.h: *                                               and edit IJB, correctly.
+#rec_double.h: *
+#rec_double.h: * Revisions   :
+#rec_double.h: *    $Log: rec_double.h,v $
+#rec_double.h: *
+#rec_double.h: *********************************************************************/
+#rec_double.h:\f
+#rec_double.h:
+#rec_double.h:#ifdef __cplusplus
+#rec_double.h:extern "C" {
+#rec_double.h:#endif
+#rec_double.h:
+#rec_double.h:
+#rec_double.h:struct derived_rec_double
+#rec_double.h:{
+#rec_double.h: /* private: */
+#rec_double.h: struct gen_list_rec parent_rec;
+#rec_double.h: double contents;
+#rec_double.h:};
+#rec_double.h:
+#rec_double.h:/* public: */
+#rec_double.h:extern struct derived_rec_double *       derived_rec_double_construct( const double _contents );
+#rec_double.h:extern struct derived_rec_double *       derived_rec_double_copy_construct( const struct derived_rec_double *this_rec );
+#rec_double.h:extern struct derived_rec_double *       derived_rec_double_destruct( struct derived_rec_double *this_rec );
+#rec_double.h:extern const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec );
+#rec_double.h:extern int                                                               derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec );
+#rec_double.h:
+#rec_double.h:/* struct/class COMPLETE */
+#rec_double.h:
+#rec_double.h:
+#rec_double.h:#ifdef __cplusplus
+#rec_double.h:} /* extern "C" */
+#rec_double.h:#endif
+#rec_double.h:
+#rec_double.h:#endif /* ndef REC_DOUBLE_H_INCLUDED */
+#rec_double.h:
+#rec_double.h:/*
+#rec_double.h:  Local Variables:
+#rec_double.h:  tab-width: 3
+#rec_double.h:  end:
+#rec_double.h:*/
+
+
+#rec_long.c:const char rec_long_rcs[] = "$Id: rec_long.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#rec_long.c: *
+#rec_long.c: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_long.c: *
+#rec_long.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_long.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_long.c: *
+#rec_long.c: *                This program is free software; you can redistribute it
+#rec_long.c: *                and/or modify it under the terms of the GNU General
+#rec_long.c: *                Public License as published by the Free Software
+#rec_long.c: *                Foundation; either version 2 of the License, or (at
+#rec_long.c: *                your option) any later version.
+#rec_long.c: *
+#rec_long.c: *                This program is distributed in the hope that it will
+#rec_long.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_long.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_long.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_long.c: *                License for more details.
+#rec_long.c: *
+#rec_long.c: *                The GNU General Public License should be included with
+#rec_long.c: *                this file.  If not, you can view it at
+#rec_long.c: *                http://www.gnu.org/copyleft/gpl.html
+#rec_long.c: *                or write to the Free Software Foundation, Inc., 59
+#rec_long.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_long.c: *
+#rec_long.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_long.c: *                                         and edit IJB, correctly.
+#rec_long.c: *
+#rec_long.c: * Revisions   :
+#rec_long.c: *    $Log: rec_long.c,v $
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:\f
+#rec_long.c:
+#rec_long.c:#include <malloc.h>
+#rec_long.c:#include <stdio.h>
+#rec_long.c:#include <stdlib.h>
+#rec_long.c:#include <string.h>
+#rec_long.c:
+#rec_long.c:#include "gen_list.h"
+#rec_long.c:#include "rec_long.h"
+#rec_long.c:
+#rec_long.c:const char rec_long_h_rcs[] = REC_LONG_H_VERSION;
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:static const rec_method rec_long_vtable[] =
+#rec_long.c:{
+#rec_long.c:   (rec_method)derived_rec_long_copy_construct,
+#rec_long.c:   (rec_method)derived_rec_long_destruct,
+#rec_long.c:   (rec_method)derived_rec_long_stream,
+#rec_long.c:   (rec_method)derived_rec_long_equal
+#rec_long.c:};
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * Function    :  derived_rec_long_construct
+#rec_long.c: *
+#rec_long.c: * Description :  A simple derived record class that contains 1 string.
+#rec_long.c: *
+#rec_long.c: * Parameters  :
+#rec_long.c: *          1  :  The record
+#rec_long.c: *          2  :  The string to contain.
+#rec_long.c: *
+#rec_long.c: * Returns     :  A pointer to the constructed record.
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:struct derived_rec_long *derived_rec_long_construct( const long _contents )
+#rec_long.c:{
+#rec_long.c:   struct derived_rec_long *this_rec = (struct derived_rec_long *)gen_list_rec_construct(
+#rec_long.c:           ISA_LONG,
+#rec_long.c:           sizeof( struct derived_rec_long ),
+#rec_long.c:           rec_long_vtable
+#rec_long.c:   );
+#rec_long.c:
+#rec_long.c:   this_rec->contents = _contents;
+#rec_long.c:
+#rec_long.c:   LIST_SHOW( printf( "\
+#rec_long.c:\t\tlong construct new rec\t\t\t\t= %p
+#rec_long.c:\t\tlong construct new rec contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_long.c:
+#rec_long.c:   return( this_rec );
+#rec_long.c:
+#rec_long.c:}
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * Function    :  derived_rec_long_copy_construct
+#rec_long.c: *
+#rec_long.c: * Description :  Copies one long record to another.
+#rec_long.c: *
+#rec_long.c: * Parameters  :
+#rec_long.c: *          1  :  Existing record.
+#rec_long.c: *                         2       :  Copy record.
+#rec_long.c: *
+#rec_long.c: * Returns     :  The newly constructed copy record.
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:struct derived_rec_long *derived_rec_long_copy_construct( const struct derived_rec_long *this_rec )
+#rec_long.c:{
+#rec_long.c:   struct derived_rec_long *copy_rec = (struct derived_rec_long *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
+#rec_long.c:   copy_rec->contents = - this_rec->contents;
+#rec_long.c:
+#rec_long.c:   LIST_SHOW( printf( "\
+#rec_long.c:\t\tlong copy construct new gen rec\t\t\t\t= %p => %p
+#rec_long.c:\t\tlong copy construct new gen rec contents\t= %d\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
+#rec_long.c:
+#rec_long.c:   return( copy_rec );
+#rec_long.c:
+#rec_long.c:}
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * Function    :  derived_rec_long_destruct        
+#rec_long.c: *
+#rec_long.c: * Description :  Destruct the long record.
+#rec_long.c: *
+#rec_long.c: * Parameters  :
+#rec_long.c: *          1  :  The record.
+#rec_long.c: *
+#rec_long.c: * Returns     :  NULL
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:struct derived_rec_long *derived_rec_long_destruct( struct derived_rec_long *this_rec )
+#rec_long.c:{
+#rec_long.c:   LIST_SHOW( printf( "\
+#rec_long.c:\t\tlong destruct this_rec\t\t\t\t= %p
+#rec_long.c:\t\tlong destruct this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_long.c:
+#rec_long.c:   this_rec->contents = -1;
+#rec_long.c:   return( (struct derived_rec_long *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
+#rec_long.c:
+#rec_long.c:}
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * Function    :  derived_rec_long_stream
+#rec_long.c: *
+#rec_long.c: * Description :  Displays all long attributes on the STDOUT stream.
+#rec_long.c: *
+#rec_long.c: * Parameters  :
+#rec_long.c: *          1  :  The record.
+#rec_long.c: *
+#rec_long.c: * Returns     :  The record.
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec )
+#rec_long.c:{
+#rec_long.c:   this_rec = (struct derived_rec_long *)gen_list_rec_stream(
+#rec_long.c:           (struct gen_list_rec *)this_rec
+#rec_long.c:   );
+#rec_long.c:   LIST_SHOW( printf( "\
+#rec_long.c:\t\tlong stream this_rec\t\t\t\t\t= %p
+#rec_long.c:\t\tlong stream this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
+#rec_long.c:
+#rec_long.c:   return( this_rec );
+#rec_long.c:
+#rec_long.c:}
+#rec_long.c:
+#rec_long.c:
+#rec_long.c:/*********************************************************************
+#rec_long.c: *
+#rec_long.c: * Function    :  derived_rec_long_equal
+#rec_long.c: *
+#rec_long.c: * Description :  Compares two long records to see if they are equal.
+#rec_long.c: *
+#rec_long.c: * Parameters  :
+#rec_long.c: *          1  :  A record.
+#rec_long.c: *          2  :  Another record.
+#rec_long.c: *
+#rec_long.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#rec_long.c: *
+#rec_long.c: *********************************************************************/
+#rec_long.c:int derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec )
+#rec_long.c:{
+#rec_long.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
+#rec_long.c:   {
+#rec_long.c:           return( 0 );
+#rec_long.c:   }
+#rec_long.c:   return( this_rec->contents == eq_rec->contents );
+#rec_long.c:
+#rec_long.c:}
+
+
+#rec_long.h:#ifndef REC_LONG_H_INCLUDED
+#rec_long.h:#define REC_LONG_H_INCLUDED
+#rec_long.h:#define REC_LONG_H_VERSION "$Id: rec_long.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#rec_long.h:/*********************************************************************
+#rec_long.h: *
+#rec_long.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_long.h,v $
+#rec_long.h: *
+#rec_long.h: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_long.h: *
+#rec_long.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_long.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_long.h: *
+#rec_long.h: *                This program is free software; you can redistribute it
+#rec_long.h: *                and/or modify it under the terms of the GNU General
+#rec_long.h: *                Public License as published by the Free Software
+#rec_long.h: *                Foundation; either version 2 of the License, or (at
+#rec_long.h: *                your option) any later version.
+#rec_long.h: *
+#rec_long.h: *                This program is distributed in the hope that it will
+#rec_long.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_long.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_long.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_long.h: *                License for more details.
+#rec_long.h: *
+#rec_long.h: *                The GNU General Public License should be included with
+#rec_long.h: *                this file.  If not, you can view it at
+#rec_long.h: *                http://www.gnu.org/copyleft/gpl.html
+#rec_long.h: *                or write to the Free Software Foundation, Inc., 59
+#rec_long.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_long.h: *
+#rec_long.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_long.h: *                                         and edit IJB, correctly.
+#rec_long.h: *
+#rec_long.h: * Revisions   :
+#rec_long.h: *    $Log: rec_long.h,v $
+#rec_long.h: *
+#rec_long.h: *********************************************************************/
+#rec_long.h:\f
+#rec_long.h:
+#rec_long.h:#ifdef __cplusplus
+#rec_long.h:extern "C" {
+#rec_long.h:#endif
+#rec_long.h:
+#rec_long.h:
+#rec_long.h:struct derived_rec_long
+#rec_long.h:{
+#rec_long.h:   /* private: */
+#rec_long.h:   struct gen_list_rec parent_rec;
+#rec_long.h:   long contents;
+#rec_long.h:};
+#rec_long.h:
+#rec_long.h:/* public: */
+#rec_long.h:extern struct derived_rec_long *   derived_rec_long_construct( const long _contents );
+#rec_long.h:extern struct derived_rec_long *   derived_rec_long_copy_construct( const struct derived_rec_long *this_rec );
+#rec_long.h:extern struct derived_rec_long *   derived_rec_long_destruct( struct derived_rec_long *this_rec );
+#rec_long.h:extern const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec );
+#rec_long.h:extern int                                                         derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec );
+#rec_long.h:
+#rec_long.h:/* struct/class COMPLETE */
+#rec_long.h:
+#rec_long.h:
+#rec_long.h:#ifdef __cplusplus
+#rec_long.h:} /* extern "C" */
+#rec_long.h:#endif
+#rec_long.h:
+#rec_long.h:#endif /* ndef REC_LONG_H_INCLUDED */
+#rec_long.h:
+#rec_long.h:/*
+#rec_long.h:  Local Variables:
+#rec_long.h:  tab-width: 3
+#rec_long.h:  end:
+#rec_long.h:*/
+
+
+#rec_malloc_police.c:const char rec_malloc_police_rcs[] = "$Id: rec_malloc_police.c,v 1.1 2001/10/25 03:40:48 rodney.stromlund Exp $";
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/gen_list.c,v $
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_malloc_police.c: *                                                This class helps to build a list of allocated and
+#rec_malloc_police.c: *                                                freed memory.  When the program exits, we will print
+#rec_malloc_police.c: *                                                a list of all memory that was allocated, but never
+#rec_malloc_police.c: *                                                freed.  This could be most helpful to developers
+#rec_malloc_police.c: *                                                and debugers.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_malloc_police.c: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *                This program is free software; you can redistribute it
+#rec_malloc_police.c: *                and/or modify it under the terms of the GNU General
+#rec_malloc_police.c: *                Public License as published by the Free Software
+#rec_malloc_police.c: *                Foundation; either version 2 of the License, or (at
+#rec_malloc_police.c: *                your option) any later version.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *                This program is distributed in the hope that it will
+#rec_malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_malloc_police.c: *                License for more details.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *                The GNU General Public License should be included with
+#rec_malloc_police.c: *                this file.  If not, you can view it at
+#rec_malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
+#rec_malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
+#rec_malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_malloc_police.c: *                                                and edit IJB, correctly.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Revisions   :
+#rec_malloc_police.c: *    $Log: rec_malloc_police.c,v $
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:\f
+#rec_malloc_police.c:
+#rec_malloc_police.c:#include <stdio.h>
+#rec_malloc_police.c:
+#rec_malloc_police.c:#include "gen_list.h"
+#rec_malloc_police.c:#include "malloc_police.h"
+#rec_malloc_police.c:#include "rec_malloc_police.h"
+#rec_malloc_police.c:
+#rec_malloc_police.c:const char rec_malloc_police_h_rcs[] = REC_MALLOC_POLICE_H_VERSION;
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:static const rec_method rec_malloc_police_vtable[] =
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_copy_construct,
+#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_destruct,
+#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_stream,
+#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_equal
+#rec_malloc_police.c:};
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_construct
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Description :  A simple derived record class that contains 1 string.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Parameters  :
+#rec_malloc_police.c: *          1  :  The record
+#rec_malloc_police.c: *          2  :  The string to contain.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Returns     :  A pointer to the constructed record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz )
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  struct derived_rec_malloc_police *this_rec;
+#rec_malloc_police.c:  list_is_quiet ++;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_construct(
+#rec_malloc_police.c:          ISA_MALLOC_POLICE,
+#rec_malloc_police.c:          sizeof( struct derived_rec_malloc_police ),
+#rec_malloc_police.c:          rec_malloc_police_vtable
+#rec_malloc_police.c:  );
+#rec_malloc_police.c:
+#rec_malloc_police.c:  this_rec->alloced_addr  = _alloced_addr;
+#rec_malloc_police.c:  this_rec->source_where  = STRDUP( _source_where );
+#rec_malloc_police.c:  this_rec->sz                            = _sz;
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
+#rec_malloc_police.c:/* \t\tmalloc_police construct new rec\t\t\t\t\t= %p */
+#rec_malloc_police.c:/* \t\tmalloc_police construct new rec alloced_addr = %p */
+#rec_malloc_police.c:/* \t\tmalloc_police construct new rec source_where = %s */
+#rec_malloc_police.c:/* \t\tmalloc_police construct new rec sz\t\t\t\t\t= %ld\n\n", */
+#rec_malloc_police.c:/*                          (const void *)this_rec, */
+#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
+#rec_malloc_police.c:/*                          this_rec->source_where, */
+#rec_malloc_police.c:/*                          this_rec->sz */
+#rec_malloc_police.c:/*        ) ); */
+#rec_malloc_police.c:
+#rec_malloc_police.c:  list_is_quiet --;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  return( this_rec );
+#rec_malloc_police.c:
+#rec_malloc_police.c:}
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_copy_construct
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Description :  Copies one malloc_police record to another.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Parameters  :
+#rec_malloc_police.c: *          1  :  Existing record.
+#rec_malloc_police.c: *                                2       :  Copy record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Returns     :  The newly constructed copy record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec )
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  int len;
+#rec_malloc_police.c:  char *new_contents;
+#rec_malloc_police.c:  struct derived_rec_malloc_police *copy_rec;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  list_is_quiet ++;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  copy_rec = (struct derived_rec_malloc_police *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
+#rec_malloc_police.c:
+#rec_malloc_police.c:  copy_rec->alloced_addr  = this_rec->alloced_addr;
+#rec_malloc_police.c:  copy_rec->source_where  = STRDUP( this_rec->source_where );
+#rec_malloc_police.c:  copy_rec->sz                            = this_rec->sz;
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
+#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec = %p => %p */
+#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec alloced_addr = %p */
+#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec source_where = %s */
+#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec sz\t\t\t\t\t= %ld\n\n", */
+#rec_malloc_police.c:/*                          (const void *)this_rec, (const void *)copy_rec, */
+#rec_malloc_police.c:/*                          copy_rec->alloced_addr, */
+#rec_malloc_police.c:/*                          copy_rec->source_where, */
+#rec_malloc_police.c:/*                          copy_rec->sz */
+#rec_malloc_police.c:/*        ) ); */
+#rec_malloc_police.c:
+#rec_malloc_police.c:  list_is_quiet --;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  return( copy_rec );
+#rec_malloc_police.c:
+#rec_malloc_police.c:}
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_destruct      
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Description :  Destruct the malloc_police record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Parameters  :
+#rec_malloc_police.c: *          1  :  The record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Returns     :  NULL
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec )
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  struct derived_rec_malloc_police *d;
+#rec_malloc_police.c:  list_is_quiet ++;
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
+#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec\t\t\t\t\t\t= %p */
+#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->alloced_addr\t= %p */
+#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->source_where\t= %s, */
+#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->sz\t\t\t\t\t= %ld\n\n", */
+#rec_malloc_police.c:/*                          (const void *)this_rec, */
+#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
+#rec_malloc_police.c:/*                          this_rec->source_where, */
+#rec_malloc_police.c:/*                          this_rec->sz */
+#rec_malloc_police.c:/*        ) ); */
+#rec_malloc_police.c:
+#rec_malloc_police.c:  memset( this_rec->source_where, '!', strlen( this_rec->source_where ) );
+#rec_malloc_police.c:  FREE( this_rec->source_where );
+#rec_malloc_police.c:
+#rec_malloc_police.c:  d = (struct derived_rec_malloc_police *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec );
+#rec_malloc_police.c:  list_is_quiet --;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  return( d );
+#rec_malloc_police.c:
+#rec_malloc_police.c:}
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_stream
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Description :  Displays all malloc_police attributes on the STDOUT stream.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Parameters  :
+#rec_malloc_police.c: *          1  :  The record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Returns     :  The record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec )
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  list_is_quiet ++;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_stream(
+#rec_malloc_police.c:          (struct gen_list_rec *)this_rec
+#rec_malloc_police.c:  );
+#rec_malloc_police.c:  LIST_SHOW( printf( "\
+#rec_malloc_police.c:\t\tmalloc_police stream this_rec\t\t\t\t\t= %p
+#rec_malloc_police.c:\t\tmalloc_police stream this_rec->alloced_addr\t= %p
+#rec_malloc_police.c:\t\tmalloc_police stream this_rec->source_where\t= %s
+#rec_malloc_police.c:\t\tmalloc_police stream this_rec->sz\t\t\t\t= %ld\n\n",
+#rec_malloc_police.c:                                                   (const void *)this_rec,
+#rec_malloc_police.c:                                                   this_rec->alloced_addr,
+#rec_malloc_police.c:                                                   this_rec->source_where,
+#rec_malloc_police.c:                                                   this_rec->sz
+#rec_malloc_police.c:  ) );
+#rec_malloc_police.c:
+#rec_malloc_police.c:  list_is_quiet --;
+#rec_malloc_police.c:  return( this_rec );
+#rec_malloc_police.c:
+#rec_malloc_police.c:}
+#rec_malloc_police.c:
+#rec_malloc_police.c:
+#rec_malloc_police.c:/*********************************************************************
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_equal
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Description :  Compares two malloc_police records to see if they are equal.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Parameters  :
+#rec_malloc_police.c: *          1  :  A record.
+#rec_malloc_police.c: *          2  :  Another record.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
+#rec_malloc_police.c: *
+#rec_malloc_police.c: *********************************************************************/
+#rec_malloc_police.c:int derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec )
+#rec_malloc_police.c:{
+#rec_malloc_police.c:  list_is_quiet ++;
+#rec_malloc_police.c:
+#rec_malloc_police.c:  if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
+#rec_malloc_police.c:  {
+#rec_malloc_police.c:          return( 0 );
+#rec_malloc_police.c:  }
+#rec_malloc_police.c:
+#rec_malloc_police.c:  list_is_quiet --;
+#rec_malloc_police.c:  return( this_rec->alloced_addr == eq_rec->alloced_addr );
+#rec_malloc_police.c:
+#rec_malloc_police.c:}
+
+
+#rec_malloc_police.h:#ifndef REC_MALLOC_POLICE_H_INCLUDED
+#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_INCLUDED
+#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_VERSION "$Id: rec_malloc_police.h,v 1.1 2001/07/29 18:50:04 rodney.stromlund Exp $"
+#rec_malloc_police.h:/*********************************************************************
+#rec_malloc_police.h: *
+#rec_malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/rec_char.h,v $
+#rec_malloc_police.h: *
+#rec_malloc_police.h: * Purpose     :  A "derived class" of gen_list_rec.
+#rec_malloc_police.h: *                                                This class helps to build a list of allocated and
+#rec_malloc_police.h: *                                                freed memory.  When the program exits, we will print
+#rec_malloc_police.h: *                                                a list of all memory that was allocated, but never
+#rec_malloc_police.h: *                                                freed.  This could be most helpful to developers
+#rec_malloc_police.h: *                                                and debugers.
+#rec_malloc_police.h: *
+#rec_malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#rec_malloc_police.h: *                IJBSWA team.  http://ijbswa.sourceforge.net
+#rec_malloc_police.h: *
+#rec_malloc_police.h: *                This program is free software; you can redistribute it
+#rec_malloc_police.h: *                and/or modify it under the terms of the GNU General
+#rec_malloc_police.h: *                Public License as published by the Free Software
+#rec_malloc_police.h: *                Foundation; either version 2 of the License, or (at
+#rec_malloc_police.h: *                your option) any later version.
+#rec_malloc_police.h: *
+#rec_malloc_police.h: *                This program is distributed in the hope that it will
+#rec_malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
+#rec_malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+#rec_malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
+#rec_malloc_police.h: *                License for more details.
+#rec_malloc_police.h: *
+#rec_malloc_police.h: *                The GNU General Public License should be included with
+#rec_malloc_police.h: *                this file.  If not, you can view it at
+#rec_malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
+#rec_malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
+#rec_malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#rec_malloc_police.h: *
+#rec_malloc_police.h: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
+#rec_malloc_police.h: *                                                and edit IJB, correctly.
+#rec_malloc_police.h: *
+#rec_malloc_police.h: * Revisions   :
+#rec_malloc_police.h: *    $Log: rec_malloc_police.h,v $
+#rec_malloc_police.h: *
+#rec_malloc_police.h: *********************************************************************/
+#rec_malloc_police.h:\f
+#rec_malloc_police.h:
+#rec_malloc_police.h:#ifdef __cplusplus
+#rec_malloc_police.h:extern "C" {
+#rec_malloc_police.h:#endif
+#rec_malloc_police.h:
+#rec_malloc_police.h:
+#rec_malloc_police.h:struct derived_rec_malloc_police
+#rec_malloc_police.h:{
+#rec_malloc_police.h:  /* private: */
+#rec_malloc_police.h:  struct  gen_list_rec parent_rec;
+#rec_malloc_police.h:  void            *alloced_addr;
+#rec_malloc_police.h:  char            *source_where;
+#rec_malloc_police.h:  size_t  sz;
+#rec_malloc_police.h:};
+#rec_malloc_police.h:
+#rec_malloc_police.h:/* public: */
+#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz );
+#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec );
+#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec );
+#rec_malloc_police.h:extern const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec );
+#rec_malloc_police.h:extern int                                                                                        derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec );
+#rec_malloc_police.h:
+#rec_malloc_police.h:/* struct/class COMPLETE */
+#rec_malloc_police.h:
+#rec_malloc_police.h:
+#rec_malloc_police.h:#ifdef __cplusplus
+#rec_malloc_police.h:} /* extern "C" */
+#rec_malloc_police.h:#endif
+#rec_malloc_police.h:
+#rec_malloc_police.h:
+#rec_malloc_police.h:#endif /* ndef REC_MALLOC_POLICE_H_INCLUDED */
+#rec_malloc_police.h:
+#rec_malloc_police.h:/*
+#rec_malloc_police.h:  Local Variables:
+#rec_malloc_police.h:  tab-width: 3
+#rec_malloc_police.h:  end:
+#rec_malloc_police.h:*/
+
+
+###########################################################################
+##  Description:                       makeInsertableFile
+##             Use this function to make a file suitable for insertion into this
+##             script.  This file (x), will contain all of the files listed.
+##
+##  Inputs :
+##             None
+##
+##  Outputs :
+##             Return status:  (0) - Everything is Okay, anything else is an error
+###########################################################################
+
+function makeInsertableFile {
+
+       rm -f x
+
+       for i in ${fileList}; do
+               sed -e "s/^/#${i}:/" ${i} >> x
+               echo "" >> x
+               echo "" >> x
+       done
+
+       return 0
+
+}
+
+
+#
+#Local Variables:
+#tab-width: 3
+#end:
+#