diff --git a/tests/fct.h b/tests/fct.h
index f6c1251..c49abda 100644
--- a/tests/fct.h
+++ b/tests/fct.h
@@ -1,1688 +1,3959 @@
-/*
-====================================================================
-Copyright (c) 2008 Ian Blumel.  All rights reserved.
-
-FCT (Fast C Test) Unit Testing Framework
-
-Copyright (c) 2008, Ian Blumel (ian.blumel@gmail.com)
-All rights reserved.
-
-This license is based on the BSD License.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-    
-    * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-
-    * Neither the name of, Ian Blumel, nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-====================================================================
-
-File: fct.h
-*/
-
-#if !defined(FCT_INCLUDED__IMB)
-#define FCT_INCLUDED__IMB
-
-#define FCT_VERSION_STR   "1.0.2"
-#define FCT_VERSION_MAJOR 1
-#define FCT_VERSION_MINOR 0
-#define FCT_VERSION_MICRO 2
-
-/* Define this to remove unneeded WIN32 warnings. We will undefine this at
-the end of the file so as not to interfere with your build. */
-#if defined(WIN32) && !defined(_CRT_SECURE_NO_WARNINGS)
-#  define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#include <string.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-#include <float.h>
-#include <math.h>
-
-#define FCT_MAX_NAME           256
-#define FCT_MAX_LOG_LINE       256
-
-#define nbool_t int
-#define FCT_TRUE   1
-#define FCT_FALSE  0
-
-/* Forward declarations. The following forward declarations are required
-because there is a inter-relationship between certain objects that 
-just can not be untwined. */
-typedef struct _fct_logger_i fct_logger_i;
-typedef struct _fct_standard_logger_t fct_standard_logger_t;
-typedef struct _fct_minimal_logger_t fct_minimal_logger_t;
-typedef struct _fctchk_t fctchk_t;
-typedef struct _fct_test_t fct_test_t;
-typedef struct _fct_ts_t fct_ts_t;
-typedef struct _fctkern_t fctkern_t;
-
-/* Forward declare some functions used throughout. */
-static fct_standard_logger_t *
-fct_standard_logger__new(void);
-
-static void
-fct_logger__del(fct_logger_i *logger);
-
-static void
-fct_logger__on_cndtn(fct_logger_i *self, fctchk_t const *chk);
-
-static void
-fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test);
-
-static void
-fct_logger__on_test_end(fct_logger_i *logger, fct_test_t const *test);
-
-static void
-fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts);
-
-static void
-fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts);
-
-static void
-fct_logger__on_fct_start(fct_logger_i *logger, fctkern_t const *kern);
-
-static void
-fct_logger__on_fct_end(fct_logger_i *logger, fctkern_t const *kern);
-
-
-
-/* Explicitly indicate a no-op */
-#define fct_pass()    
-
-#define fct_unused(x)   ((void) (x));
-
-/* This is just a little trick to let me put comments inside of macros. I
-really only want to bother with this when we are "unwinding" the macros
-for debugging purposes. */
-#if defined(FCT_CONF_UNWIND)
-#	define _fct_cmt(string)		{char*_=string;} 
-#else
-#	define _fct_cmt(string)
-#endif
-
-/* 
--------------------------------------------------------- 
-UTILITIES
--------------------------------------------------------- 
-*/
-
-/* Utility for truncated, safe string copies. */
-static void
-fct_safe_str_cpy(char *dst, char const *src, size_t num)
-{
-   assert( dst != NULL );
-   assert( src != NULL );
-   assert( num > 0 );
-   strncpy(dst, src, num);
-   dst[num-1] = '\0';
-}
-
-/* Isolate the snprintf implemenation. */
-int 
-fct_snprintf(char *buffer, size_t buffer_len, char *format, ...)
-{
-   int count =0;
-   va_list args;
-   va_start(args, format);
-   count =vsnprintf(buffer, buffer_len, format, args);
-   va_end(args);
-   return count;
-}
-
-/* A very, very simple "filter". This just compares the supplied prefix 
-against the test_str, to see if they both have the same starting 
-characters. If they do we return true, otherwise we return false. If the
-prefix is a blank string or NULL, then it will return FCT_TRUE.*/
-static nbool_t
-fct_filter_pass(char const *prefix, char const *test_str)
-{
-   nbool_t is_match = FCT_FALSE;
-   char const *prefix_p;
-   char const *test_str_p;
-
-   /* If you got nothing to test against, why test? */
-   assert( test_str != NULL );
-
-   /* When the prefix is NULL or blank, we always return FCT_TRUE. */
-   if ( prefix == NULL  || prefix[0] == '\0' ) 
-   { 
-      return FCT_TRUE;
-   }
-     
-   /* Iterate through both character arrays at the same time. We are
-   going to play a game and see if we can beat the house. */
-   for ( prefix_p = prefix, test_str_p = test_str; 
-         *prefix_p != '\0' && *test_str_p != '\0'; 
-         ++prefix_p, ++test_str_p )
-   {
-      is_match = *prefix_p == *test_str_p;
-      if ( !is_match ) 
-      {
-         break;   /* Quit the first time we don't match. */
-      }
-   }
-   
-   /* If the iterator for the test_str is pointing at the null char, and
-   the iterator for the prefix string is not, then the prefix string is 
-   larger than the actual test string, and therefore we failed to pass the
-   filter. */
-   if ( *test_str_p == '\0' && *prefix_p != '\0' )
-   {
-      return FCT_FALSE;
-   }
-
-   /* is_match will be set to the either FCT_TRUE if we kicked of the loop
-   early because our filter ran out of characters or FCT_FALSE if we 
-   encountered a mismatch before our filter ran out of characters. */
-   return is_match;
-}
-
-/* Returns true if two reals are equal. */
-nbool_t 
-fct_real_eq(double v1, double v2)
-{
-   return (nbool_t)(fabs(v1 - v2) < DBL_EPSILON);
-}
-
-/* 
--------------------------------------------------------- 
-TIMER
--------------------------------------------------------- 
-*/
-
-typedef struct _fct_timer_t fct_timer_t;
-struct _fct_timer_t {
-    clock_t start;
-    clock_t stop;
-    double duration;
-};
-
-
-static void
-fct_timer__init(fct_timer_t *timer) {
-    assert(timer != NULL);
-    memset(timer, 0, sizeof(fct_timer_t));
-}
-
-
-static void
-fct_timer__start(fct_timer_t *timer) {
-    assert(timer != NULL);
-    timer->start = clock();
-}
-
-
-static void
-fct_timer__stop(fct_timer_t *timer) {
-    assert(timer != NULL);
-    timer->stop = clock();
-    timer->duration = (double) (timer->stop - timer->start) / CLOCKS_PER_SEC;
-}
-
-
-/* Returns the time in seconds. */
-static double
-fct_timer__duration(fct_timer_t *timer) {
-    assert( timer != NULL );
-    return timer->duration;   
-}
-
-
-/* 
--------------------------------------------------------- 
-GENERIC LIST
--------------------------------------------------------- 
-*/
-
-/* For now we will just keep it at a linear growth rate. */
-#define FCT_LIST_GROWTH_FACTOR   2
-
-/* Starting size for the list, to keep it simple we will start
-at a reasonable size. */
-#define FCT_LIST_START_SIZE      2
-
-/* Helper macros for quickly iterating through a list. You should be able
-to do something like,
-
-  NLIST_FOREACH_BGN(fct_logger_i*, logger, my_list)
-  {
-     fct_logger__on_blah(logger);
-  }
-  NLIST_FOREACH_END();
-
-*/
-#define NLIST_FOREACH_BGN(Type, Var, List)\
-{\
-   if ( List != NULL ) {\
-      size_t item_i##Var;\
-      size_t num_items##Var = nlist__size(List);\
-      for( item_i##Var =0; item_i##Var != num_items##Var; ++item_i##Var )\
-      {\
-         Type Var = (Type) nlist__at((List), item_i##Var);
-
-#define NLIST_FOREACH_END() }}}
-
-/* Used to manage a list of loggers. This works mostly like
-the STL vector, where the array grows as more items are 
-appended. */
-typedef struct _nlist_t nlist_t;
-struct _nlist_t
-{ 
-   /* Item's are stored as pointers to void. */
-   void **itm_list;
-   
-   /* Indicates the number of element's in the array. */
-   size_t avail_itm_num;
-
-   /* Indicates the number of actually elements in the array. */
-   size_t used_itm_num;
-};
-
-static nlist_t *
-nlist_new(void)
-{
-   nlist_t *list = (nlist_t*)calloc(1, sizeof(nlist_t));
-   assert( list != NULL && "memory check");
-
-   list->itm_list = (void**)malloc(sizeof(void*)*FCT_LIST_START_SIZE);
-   assert( list->itm_list != NULL && "memory check");
-
-   list->avail_itm_num =FCT_LIST_START_SIZE;
-   list->used_itm_num =0;
-   return list;
-}
-
-typedef void (*on_del_t)(void*);
-
-/* Cleans up list, and applies `on_del` to each item in the list. 
-If on_del is NULL, it will not be applied. If `list` is NULL this
-function does nothing. */
-static void
-nlist__del(nlist_t *list, on_del_t on_del)
-{
-   size_t itm_i =0;
-
-   if ( list == NULL ) { return; }
-
-   /* Walk through the list applying the destroy function, if it was 
-   defined. */
-   if ( on_del != NULL )
-   {
-      for ( itm_i =0; itm_i != list->used_itm_num; ++itm_i )
-      {
-         on_del(list->itm_list[itm_i]);
-      }
-   }
-
-   free(list->itm_list);
-   free(list);
-}
-
-
-/* Returns the number of elements within the list. */
-static size_t
-nlist__size(nlist_t const *list)
-{
-   assert( list != NULL );
-   return list->used_itm_num;
-}
-
-
-/* Returns the item at idx, asserts otherwise. */
-static void*
-nlist__at(nlist_t const *list, size_t idx)
-{
-   assert( list != NULL );
-   assert( idx < list->used_itm_num );
-   return list->itm_list[idx];
-}
-
-
-static void
-nlist__append(nlist_t *list, void *itm)
-{
-   assert( list != NULL );
-   assert( list->itm_list != NULL );
-   assert( list->avail_itm_num != 0 );
-
-   /* If we ran out of room, then the last increment should be equal to the
-   available space, in this case we need to grow a little more. */
-   if ( list->used_itm_num == list->avail_itm_num )
-   {
-      list->avail_itm_num = list->avail_itm_num*FCT_LIST_GROWTH_FACTOR;
-      list->itm_list = (void**)realloc(
-         list->itm_list, sizeof(void*)*list->avail_itm_num
-         );
-      assert( list->itm_list != NULL && "memory check");
-   }
-
-   list->itm_list[list->used_itm_num] = itm;
-   ++(list->used_itm_num);
-}
-
-
-
-/*
------------------------------------------------------------
-A SINGLE CHECK
------------------------------------------------------------
-This defines a single check. It indicates what the check was,
-and where it occurred. A "Test" object will have-a bunch
-of "checks".
-*/
-
-struct _fctchk_t {
-   /* This string that represents the condition. */
-   char cndtn[FCT_MAX_LOG_LINE];
-
-   /* These indicate where the condition occurred. */
-   char file[FCT_MAX_LOG_LINE];
-
-   int lineno;
-
-   nbool_t is_pass;
-};
-
-#define fctchk__is_pass(_CHK_) ((_CHK_)->is_pass)
-#define fctchk__file(_CHK_)    ((_CHK_)->file)
-#define fctchk__lineno(_CHK_)  ((_CHK_)->lineno)
-#define fctchk__cndtn(_CHK_)   ((_CHK_)->cndtn)
-
-
-static fctchk_t*
-fctchk_new(char const *cndtn, char const *file, int lineno, nbool_t is_pass)
-{
-   fctchk_t *chk = NULL;
-
-   assert( cndtn != NULL );
-   assert( file != NULL );
-   assert( lineno > 0 );
-   
-   chk = (fctchk_t*)calloc(1, sizeof(fctchk_t));
-   assert( chk != NULL && "out of memory");
-   if ( chk == NULL ) { return NULL; }
-
-   fct_safe_str_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE);
-   fct_safe_str_cpy(chk->file, file, FCT_MAX_LOG_LINE);
-   chk->lineno = lineno;
-
-   chk->is_pass =is_pass;
-
-   return chk;
-}
-
-
-/* Cleans up a "check" object. If the `chk` is NULL, this function does 
-nothing. */
-static void
-fctchk__del(fctchk_t *chk)
-{
-   if ( chk == NULL ) { return; }
-   free( chk );
-}
-
-
-/*
------------------------------------------------------------
-A TEST
------------------------------------------------------------
-A suite will have-a list of tests. Where each test will have-a
-list of failed and passed checks.
-*/
-
-struct _fct_test_t {
-   /* List of failed and passed "checks" (fctchk_t). Two seperate
-   lists make it faster to determine how many checks passed and how
-   many checks failed. */
-   nlist_t *failed_chks;
-   nlist_t *passed_chks;
-
-   /* The name of the test case. */
-   char name[FCT_MAX_NAME];
-};
-
-#define fct_test__name(_TEST_) ((_TEST_)->name)
-
-static fct_test_t*
-fct_test_new(char const *name) {
-   fct_test_t *test =NULL;
-
-   test = (fct_test_t*)malloc(sizeof(fct_test_t));
-   assert( test != NULL && "out of memory");
-   
-   fct_safe_str_cpy(test->name, name, FCT_MAX_NAME);
-     
-   test->failed_chks = nlist_new();
-   test->passed_chks = nlist_new();
-   assert( test->failed_chks != NULL && "out of memory");
-   assert( test->passed_chks != NULL && "out of memory");
-
-   return test;
-}
-
-
-static nbool_t
-fct_test__is_pass(fct_test_t const *test)
-{
-   assert( test != NULL );
-   return nlist__size(test->failed_chks) == 0;   
-}
-
-
-static void
-fct_test__add(fct_test_t *test, fctchk_t *chk)
-{
-
-   assert( test != NULL );
-   assert( chk != NULL );
-
-   if ( fctchk__is_pass(chk) )
-   {
-      nlist__append(test->passed_chks, (void*)chk);
-   }
-   else
-   {
-      nlist__append(test->failed_chks, (void*)chk);
-   }
-}
-
-/* Returns the number of checks made throughout the test. */
-static int
-fct_test__chk_cnt(fct_test_t const *test)
-{
-   assert( test != NULL );
-   return nlist__size(test->failed_chks) + nlist__size(test->passed_chks);
-}
-
-
-static void
-fct_test__del(fct_test_t *test)
-{
-   if (test == NULL ) { return; }
-   nlist__del(test->passed_chks, (on_del_t)fctchk__del);
-   nlist__del(test->failed_chks, (on_del_t)fctchk__del);
-   free(test);
-}
-
-
-/* 
------------------------------------------------------------
-TEST SUITE (TS)
------------------------------------------------------------
-*/
-
-
-/* The different types of 'modes' that a test suite can be in.
-
-While the test suite is iterating through all the tests, its "State"
-can change from "setup mode", to "test mode" to "tear down" mode. 
-These help to indicate what mode are currently in. Think of it as a 
-basic FSM.
-
-            if the count was 0                               end
-           +--------->---------------------> ending_mode-----+
-           |                                       ^
-           ^                                       |
-start      |                              [if no more tests]
-  |        |                                       |      
-  +-count_mode -> setup_mode -> test_mode -> teardown_mode
-                      ^                           |                         
-                      +-----------<---------------+ 
-*/    
-enum ts_mode {
-   ts_mode_cnt,         /* To setup when done counting. */
-   ts_mode_setup,       /* To test when done setup. */
-   ts_mode_teardown,    /* To ending mode, when no more tests. */
-   ts_mode_test,        /* To tear down mode. */
-   ts_mode_ending,      /* To ... */
-   ts_mode_end          /* .. The End. */
-};
-
-/* Types of modes the test could be in. */
-typedef enum {
-   fct_test_status_SUCCESS,
-   fct_test_status_FAILURE
-} fct_test_status;
-
-
-struct _fct_ts_t {
-   /* For counting our 'current' test number, and the total number of 
-   tests. */
-   int  curr_test_num;
-   int  total_test_num;
-
-   /* Keeps track of the current state of the object while it is walking
-   through its "FSM" */
-   enum ts_mode mode;
-
-   /* The name of the test suite. */
-   char name[FCT_MAX_NAME];
-
-   /* List of tests that where executed within the test suite. */
-   nlist_t *test_list;
-};
-
-
-#define fct_ts__is_setup_mode(ts)     ((ts)->mode == ts_mode_setup)
-#define fct_ts__is_teardown_mode(ts)  ((ts)->mode == ts_mode_teardown)
-#define fct_ts__is_test_mode(ts)      ((ts)->mode == ts_mode_test)
-#define fct_ts__is_ending_mode(ts)    ((ts)->mode == ts_mode_ending)
-#define fct_ts__is_end(ts)            ((ts)->mode == ts_mode_end)
-#define fct_ts__is_cnt_mode(ts)       ((ts)->mode == ts_mode_cnt)
-#define fct_ts__name(ts)              ((ts)->name)
-
-
-static fct_ts_t *
-fct_ts_new(char const *name) {
-   fct_ts_t *ts =NULL;
-   ts = (fct_ts_t*)calloc(1, sizeof(fct_ts_t));
-   assert( ts != NULL );
-
-   fct_safe_str_cpy(ts->name, name, FCT_MAX_NAME);
-   ts->mode = ts_mode_cnt;
-
-   ts->test_list = nlist_new();
-   assert( ts->test_list != NULL && "no memory");
-
-   return ts;
-}
-
-static void
-fct_ts__del(fct_ts_t *ts) {
-   if ( ts == NULL ) { return; }
-   free(ts);
-}
-
-/* Flag a test suite as complete. It will no longer accept any more tests. */
-#define fct_ts__end(_TS_)  ((_TS_)->mode == ts_mode_end)
-
-
-static nbool_t
-fct_ts__is_more_tests(fct_ts_t const *ts) {
-   assert( ts != NULL );
-   assert( !fct_ts__is_end(ts) );
-   return ts->curr_test_num < ts->total_test_num;
-}
-
-
-/* Indicates that we have started a test case. */
-static void
-fct_ts__test_begin(fct_ts_t *ts) {
-   assert( !fct_ts__is_end(ts) );
-   ++(ts->curr_test_num);
-}
-
-
-/* Takes OWNERSHIP of a test object, and warehouses it for later stat
-generation. */
-static void
-fct_ts__add_test(fct_ts_t *ts, fct_test_t *test) {
-   assert( ts != NULL && "invalid arg");
-   assert( test != NULL && "invalid arg");
-   assert( !fct_ts__is_end(ts) );
-   nlist__append(ts->test_list, test);
-}
-
-
-static void
-fct_ts__test_end(fct_ts_t *ts) {
-   assert( ts != NULL );
-   assert( fct_ts__is_test_mode(ts) && "not in test mode, can't end!" );
-
-   /* After a test has completed, move to teardown mode. */
-   ts->mode = ts_mode_teardown;
-}
-
-
-/* Increments the internal count by 1. */
-static void
-fct_ts__inc_total_test_num(fct_ts_t *ts)
-{
-   assert( ts != NULL );
-   assert( fct_ts__is_cnt_mode(ts) );
-   assert( !fct_ts__is_end(ts) );
-   ++(ts->total_test_num);
-}
-
-
-/* Flags the end of the setup, which implies we are going to move into
-setup mode. You must be already in setup mode for this to work! */
-static void
-fct_ts__setup_end(fct_ts_t *ts)
-{
-   assert( fct_ts__is_setup_mode(ts) );
-   assert( !fct_ts__is_end(ts) );
-   ts->mode = ts_mode_test;
-}
-
-
-/* This cndtn is set when we have iterated through all the tests, and
-there was nothing more to do. */
-static void
-fct_ts__ending(fct_ts_t *ts)
-{
-   // We can only go from 'test-mode' to 'end-down' mode.
-   assert( fct_ts__is_test_mode(ts) );
-   assert( !fct_ts__is_end(ts) );
-   ts->mode = ts_mode_ending;
-}
-
-
-/* Flags the end of the teardown, which implies we are going to move
-into setup mode (for the next 'iteration'). */
-static void
-fct_ts__teardown_end(fct_ts_t *ts)
-{
-    assert( fct_ts__is_teardown_mode(ts) );
-    assert( !fct_ts__is_end(ts) );
-    /* We have to decide if we should keep on testing by moving into tear down 
-    mode or if we have reached the real end and should be moving into the 
-    ending mode. */
-    if ( fct_ts__is_more_tests(ts) ) {
-        ts->mode = ts_mode_setup;
-    }
-    else {
-        ts->mode = ts_mode_ending;
-    }
-}
-
-
-/* Flags the end of the counting, and proceeding to the first setup. 
-Consider the special case when a test suite has NO tests in it, in
-that case we will have a current count that is zero, in which case
-we can skip right to 'ending'. */
-static void
-fct_ts__cnt_end(fct_ts_t *ts)
-{
-   assert( ts != NULL );
-   assert( fct_ts__is_cnt_mode(ts) );
-   assert( !fct_ts__is_end(ts) );
-   if (ts->total_test_num == 0  ) {
-      ts->mode = ts_mode_ending;
-   }
-   else {
-      ts->mode = ts_mode_setup;
-   }
-}
-
-
-static nbool_t
-fct_ts__is_test_cnt(fct_ts_t const *ts, int test_num)
-{
-   assert( ts != NULL );
-   assert( 0 <= test_num );
-   assert( test_num < ts->total_test_num );
-   assert( !fct_ts__is_end(ts) );
-
-   /* As we roll through the tests we increment the count. With this
-   count we can decide if we need to execute a test or not. */
-   return test_num == ts->curr_test_num;
-}
-
-
-/* Returns the # of tests on the FCT TS object. This is the actual
-# of tests executed. */
-static int
-fct_ts__tst_cnt(fct_ts_t const *ts)
-{
-   assert( ts != NULL );
-   assert( !fct_ts__is_end(ts) );
-   return nlist__size(ts->test_list);
-}
-
-
-/* Returns the # of tests in the TS object that passed. */
-static int
-fct_ts__tst_cnt_passed(fct_ts_t const *ts)
-{
-   int tally =0;
-
-   assert( ts != NULL );
-   assert( !fct_ts__is_end(ts) );
-
-   NLIST_FOREACH_BGN(fct_test_t*, test, ts->test_list)
-   {
-      if ( fct_test__is_pass(test) )
-      {
-         tally += 1;
-      }
-   }
-   NLIST_FOREACH_END();
-   return tally;
-}
-
-
-/* Returns the # of checks made throughout a test suite. */
-static int
-fct_ts__chk_cnt(fct_ts_t const *ts)
-{
-   int tally =0;
-
-   assert( ts != NULL );
-   
-   NLIST_FOREACH_BGN(fct_test_t *, test, ts->test_list)
-   {
-      tally += fct_test__chk_cnt(test);
-   }
-   NLIST_FOREACH_END();
-   return tally;
-}
-
-
-/* 
--------------------------------------------------------- 
-FCT KERNAL
--------------------------------------------------------- 
-
-The "fctkern" is a singleton that is defined throughout the 
-system. 
-*/
-
-struct _fctkern_t {
-   /* This is an list of loggers that can be used in the fct system. 
-   You/ can attach _MAX_LOGGERS to any framework. */
-   nlist_t *logger_list;
-
-   /* This is a list of prefix's that can be used to determine if a 
-   test is should be run or not. */
-   nlist_t *prefix_list;
-
-   /* This is a list of test suites that where generated throughout the
-   testing process. */
-   nlist_t *ts_list;
-};
-
-
-/* Returns the number of filters defined for the fct kernal. */
-#define fctkern__filter_cnt(_NK_) (nlist__size((_NK_)->prefix_list))
-
-
-static void
-fctkern__add_logger(fctkern_t *fct, fct_logger_i *logger_owns)
-{
-   assert(fct != NULL && "invalid arg");
-   assert(logger_owns != NULL && "invalid arg");
-   nlist__append(fct->logger_list, logger_owns);
-   assert( fct->logger_list != NULL && "memory check");
-}
-
-/* Appends a prefix filter that is used to determine if a test can
-be executed or not. If the test starts with the same characters as
-the prefix, then it should be "runnable". The prefix filter must be
-a non-NULL, non-Blank string. */
-static void
-fctkern__add_prefix_filter(fctkern_t const *fct, char const *prefix_filter)
-{
-   char *filter =NULL;
-   int filter_len =0;
-
-   assert( fct != NULL && "invalid arg" );
-   assert( prefix_filter != NULL && "invalid arg" );
-   assert( strlen(prefix_filter) > 0 && "invalid arg" );
-
-   /* First we make a copy of the prefix, then we store it away
-   in our little list. */
-   filter_len = strlen(prefix_filter);
-   filter = (char*)malloc(sizeof(char)*(filter_len+1));
-   strncpy(filter, prefix_filter, filter_len);
-   filter[filter_len] = '\0';
-
-   nlist__append(fct->prefix_list, (void*)filter);
-}
-
-
-/* Parses the command line and sets up the framework. The argc and argv 
-should be directly from the program's  main. */
-static void
-fctkern_init(fctkern_t *nk, int argc, char *argv[])
-{
-   fct_logger_i *standard_logger = NULL;
-   int arg_i =0;
-
-   assert( nk != NULL );
-
-   memset(nk, 0, sizeof(fctkern_t));
-
-   nk->logger_list = nlist_new();
-   nk->prefix_list = nlist_new();
-   nk->ts_list = nlist_new();
-
-   /* Low-budget memory check for now. */
-   assert( nk->logger_list != NULL );
-   assert( nk->prefix_list != NULL );
-   assert( nk->ts_list != NULL );
-
-   standard_logger = (fct_logger_i*) fct_standard_logger__new();
-   assert( standard_logger != NULL && "no memory!");
-
-   fctkern__add_logger(nk, standard_logger);   
-   standard_logger = NULL;   /* Owned by the nk list. */
-
-   /* Our basic parser. For now we just take each 'argv' and assume
-   that it is a prefix filter. Notice we start at argument 1, since
-   we don't care about the *name* of the program. */
-   for ( arg_i =1; arg_i < argc; ++arg_i )
-   {
-      fctkern__add_prefix_filter(nk, argv[arg_i]);
-   }
-}
-
-
-/* Takes OWNERSHIP of the test suite after we have finished executing
-its contents. This way we can build up all kinds of summaries at the end
-of a run. */
-static void
-fctkern__add_ts(fctkern_t *nk, fct_ts_t *ts) {
-   assert( nk != NULL );
-   assert( ts != NULL );
-   nlist__append(nk->ts_list, ts);
-}
-
-
-
-/* Returns FCT_TRUE if the supplied test_name passes the filters set on
-this test suite. If there are no filters, we return FCT_TRUE always. */
-static nbool_t
-fctkern__pass_filter(fctkern_t *nk, char const *test_name) {
-   int prefix_i =0;
-   int prefix_list_size =0;
-
-   assert( nk != NULL && "invalid arg");
-   assert( test_name != NULL );
-   assert( strlen(test_name) > 0 );
-
-   prefix_list_size = fctkern__filter_cnt(nk);
-   
-   /* If there is no filter list, then we return FCT_TRUE always. */
-   if ( prefix_list_size == 0 ) {
-      return FCT_TRUE;
-   }   
-
-   /* Iterate through the prefix filter list, and see if we have
-   anything that does not pass. All we require is ONE item that
-   passes the test in order for us to succeed here. */
-   for ( prefix_i = 0; prefix_i != prefix_list_size; ++prefix_i ) {
-      char const *prefix = (char const*)nlist__at(nk->prefix_list, prefix_i);
-      nbool_t pass = fct_filter_pass(prefix, test_name);
-      if ( pass ) {
-         return FCT_TRUE;
-      }
-   }
-
-   /* Otherwise, we never managed to find a prefix that satisfied the 
-   supplied test name. Therefore we have failed to pass to the filter 
-   list test. */
-   return FCT_FALSE;
-}
-
-
-/* Returns the number of tests that were performed. */
-static int
-fctkern__tst_cnt(fctkern_t const *nk)
-{
-   int tally =0;
-   assert( nk != NULL );
-
-   NLIST_FOREACH_BGN(fct_ts_t *, ts, nk->ts_list)
-   {
-      tally += fct_ts__tst_cnt(ts);
-   }
-   NLIST_FOREACH_END();
-   return tally;
-}
-
-/* Returns the number of tests that passed. */
-static int
-fctkern__tst_cnt_passed(fctkern_t const *nk)
-{
-   int tally =0;
-   assert( nk != NULL );
-
-   NLIST_FOREACH_BGN(fct_ts_t*, ts, nk->ts_list)
-   {
-      tally += fct_ts__tst_cnt_passed(ts);
-   }
-   NLIST_FOREACH_END();
-
-   return tally;
-}
-
-
-/* Returns the number of tests that failed. */
-static int
-fctkern__tst_cnt_failed(fctkern_t const *nk)
-{
-   /* Keep it simple for now and just do a little math. */
-   int total =0;
-   int passed =0;
-   int failed =0;
-
-   assert( nk != NULL );
-
-   total = fctkern__tst_cnt(nk);
-   passed = fctkern__tst_cnt_passed(nk);
-
-   failed = total - passed;
-
-   return failed;
-}
-
-
-/* Returns the number of checks made throughout the entire test. */
-static int
-fctkern__chk_cnt(fctkern_t const *nk)
-{
-   int tally =0;
-   assert( nk != NULL );
-
-   NLIST_FOREACH_BGN(fct_ts_t *, ts, nk->ts_list)
-   {
-      tally += fct_ts__chk_cnt(ts);
-   }
-   NLIST_FOREACH_END();
-   return tally;
-}
-
-
-/* Indicates the very end of all the tests. */
-static void
-fctkern__end(fctkern_t *fct)
-{
-   fct_unused(fct);
-}
-
-
-/* Cleans up the contents of a fctkern. NULL does nothing. */
-static void
-fctkern__final(fctkern_t *fct) 
-{
-   if ( fct == NULL ) { return; }
-
-   nlist__del(fct->logger_list, (on_del_t)fct_logger__del);
-
-   /* The prefix list is a list of malloc'd strings. */
-   nlist__del(fct->prefix_list, (on_del_t)free);
-
-   nlist__del(fct->ts_list, (on_del_t)fct_ts__del);
-}
-
-
-static void
-fctkern__log_suite_start(fctkern_t *kern, fct_ts_t const *ts)
-{
-   assert( kern != NULL );
-   assert( ts != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_test_suite_start(logger, ts);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-static void
-fctkern__log_suite_end(fctkern_t *kern, fct_ts_t const *ts)
-{
-   assert( kern != NULL );
-   assert( ts != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_test_suite_end(logger, ts);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-static void
-fctkern__log_chk(fctkern_t *kern, fctchk_t const *chk)
-{
-   assert( kern != NULL );
-   assert( chk != NULL );
-  
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_cndtn(logger, chk);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-/* Called whenever a test is started. */
-static void
-fctkern__log_test_start(fctkern_t *kern, fct_test_t const *test)
-{
-   assert( kern != NULL );
-   assert( test != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_test_start(logger, test);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-static void
-fctkern__log_test_end(fctkern_t *kern, fct_test_t const *test)
-{
-   assert( kern != NULL );
-   assert( test != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_test_end(logger, test);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-static void
-fctkern__log_start(fctkern_t *kern)
-{
-   assert( kern != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_fct_start(logger, kern);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-static void
-fctkern__log_end(fctkern_t *kern)
-{
-   assert( kern != NULL );
-   NLIST_FOREACH_BGN(fct_logger_i*, logger, kern->logger_list)
-   {
-      fct_logger__on_fct_end(logger, kern);
-   }
-   NLIST_FOREACH_END();
-}
-
-
-/*
------------------------------------------------------------
-LOGGER INTERFACE
-
-Defines an interface to a logging system. A logger 
-must define the following functions in order to hook 
-into the logging system.
-
-See the "Standard Logger" and "Minimal Logger" as examples
-of the implementation.
------------------------------------------------------------
-*/
-
-typedef void (*fct_logger_on_cndtn_fn)(fct_logger_i *self, 
-                                       fctchk_t const *chk);
-#define _fct_logger_head \
-   fct_logger_on_cndtn_fn on_cndtn;\
-   void (*on_test_start)(fct_logger_i *logger, fct_test_t const *test);\
-   void (*on_test_end)(fct_logger_i *logger, fct_test_t const *test);\
-   void (*on_test_suite_start)(fct_logger_i *logger, fct_ts_t const *ts);\
-   void (*on_test_suite_end)(fct_logger_i *logger, fct_ts_t const *ts);\
-   void (*on_fct_start)(fct_logger_i *logger, fctkern_t const *kern);\
-   void (*on_fct_end)(fct_logger_i *logger, fctkern_t const *kern);\
-   void (*on_delete)(fct_logger_i *logger)\
-
-struct _fct_logger_i {
-   _fct_logger_head;
-};
-
-
-/* Initializes the elements of a logger interface so they are at their 
-standard values. */
-static void
-fct_logger__init(fct_logger_i *logger)
-{
-   assert( logger != NULL );
-   logger->on_cndtn =NULL;
-   logger->on_test_start =NULL;
-   logger->on_test_end =NULL;
-   logger->on_test_suite_start =NULL;
-   logger->on_test_suite_end =NULL;
-   logger->on_fct_start =NULL;
-   logger->on_fct_end =NULL;
-   logger->on_delete =NULL;
-}
-
-
-static void
-fct_logger__del(fct_logger_i *logger)
-{
-   if ( logger == NULL ) { return; }
-   if ( logger->on_delete) { logger->on_delete(logger); }
-}
-
-
-static void
-fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test)
-{
-   assert( logger != NULL && "invalid arg");
-   assert( test != NULL && "invalid arg");
-
-   if ( logger->on_test_start != NULL )
-   {
-      logger->on_test_start(logger, test);
-   }
-}
-
-
-static void
-fct_logger__on_test_end(fct_logger_i *logger, fct_test_t const *test)
-{
-   assert( logger != NULL && "invalid arg");
-   assert( test != NULL && "invalid arg");
-
-   if ( logger->on_test_end != NULL )
-   {
-      logger->on_test_end(logger, test);
-   }
-}
-
-
-static void
-fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts)
-{
-   assert( logger != NULL && "invalid arg");
-   assert( ts != NULL && "invalid arg");
-
-   if ( logger->on_test_suite_start != NULL )
-   {
-      logger->on_test_suite_start(logger, ts);
-   }
-}
-
-
-static void
-fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts)
-{
-   assert( logger != NULL && "invalid arg");
-   assert( ts != NULL && "invalid arg");
-
-   if ( logger->on_test_suite_end != NULL )
-   {
-      logger->on_test_suite_end(logger, ts);
-   }
-}
-
-
-static void
-fct_logger__on_cndtn(fct_logger_i *logger, fctchk_t const *chk)
-{
-   assert( logger != NULL && "invalid arg");
-   assert( chk != NULL && "invalid arg");
-
-   if ( logger->on_cndtn ) 
-   {
-      logger->on_cndtn(logger, chk);
-   }
-}                        
-
-
-/* When we start all our tests. */
-static void
-fct_logger__on_fct_start(fct_logger_i *logger, fctkern_t const *kern)
-{
-   assert( logger != NULL );
-   assert( kern != NULL );
-
-   if ( logger->on_fct_start != NULL ) 
-   {
-      logger->on_fct_start(logger, kern);
-   }
-}
-
-
-/* When we have reached the end of ALL of our testing. */
-static void
-fct_logger__on_fct_end(fct_logger_i *logger, fctkern_t const *kern)
-{
-   assert( logger != NULL );
-   assert( kern != NULL );
-
-   if ( logger->on_fct_end )
-   {
-      logger->on_fct_end(logger, kern);
-   }
-}
-
-
-
-/*
------------------------------------------------------------
-MINIMAL LOGGER
------------------------------------------------------------
-*/
-
-/* Minimal logger, reports the minimum amount of information needed
-to determine "something is happening". */
-struct _fct_minimal_logger_t {
-   _fct_logger_head;
-};
-
-
-static void 
-fct_minimal_logger__on_cndtn(fct_logger_i *self, fctchk_t const *chk)
-{
-   fct_unused(self);   
-   printf(fctchk__is_pass(chk) ? "." : "!");
-}
-
-
-static void
-fct_minimal_logger__del(fct_logger_i *self)
-{
-   free(self);
-}
-
-
-static fct_minimal_logger_t *
-fct_minimal_logger__new(void)
-{
-   fct_minimal_logger_t *self = (fct_minimal_logger_t*)\
-				calloc(1,sizeof(fct_minimal_logger_t));
-   if ( self == NULL ) { return NULL; }
-
-   fct_logger__init((fct_logger_i*)self);
-
-   self->on_cndtn = fct_minimal_logger__on_cndtn;
-   self->on_delete = fct_minimal_logger__del;
-   return self;
-}
-
-
-/*
------------------------------------------------------------
-STANDARD LOGGER
------------------------------------------------------------
-*/
-
-struct _fct_standard_logger_t {
-   _fct_logger_head;
-
-   /* Start time. For now we use the low-accuracy time_t version. */
-   fct_timer_t timer;
-
-   /* A list of char*'s that needs to be cleaned up. */
-   nlist_t *failed_cndtns_list;
-};
-
-
-/* When a failure occurrs, we will record the details so we can display
-them when the log "finishes" up. */
-static void
-fct_standard_logger__on_cndtn(fct_logger_i *logger_, fctchk_t const *chk)
-{
-   fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
-   
-   assert( logger != NULL );
-   assert( chk != NULL );
-
-   /* Only record failures. */
-   if ( !fctchk__is_pass(chk) )
-   {
-      /* For now we will truncate the string to some set amount, later
-      we can work out a dynamic string object. */
-      char *str = (char*)malloc(sizeof(char)*FCT_MAX_LOG_LINE);
-      assert( str != NULL );
-      
-      fct_snprintf(
-         str, 
-         FCT_MAX_LOG_LINE, 
-         "%s(%d): %s", 
-         fctchk__file(chk),
-         fctchk__lineno(chk),
-         fctchk__cndtn(chk)
-         );
-
-      /* Append it to the listing ... */
-      nlist__append(logger->failed_cndtns_list, (void*)str);
-   }  
-}
-
-
-static void
-fct_standard_logger__on_test_start(fct_logger_i *logger_, 
-                                   fct_test_t const *test)
-{
-   fct_unused(logger_);
-   printf("%s ... ", fct_test__name(test));
-}
-
-
-static void
-fct_standard_logger__on_test_end(fct_logger_i *logger_, 
-                                   fct_test_t const *test)
-{
-   nbool_t is_pass;
-   fct_unused(logger_);
-
-   is_pass = fct_test__is_pass(test);
-   printf("%s\n", (is_pass) ? "PASS" : "FAIL" );
-}
-
-
-static void
-fct_standard_logger__on_test_suite_start(fct_logger_i *logger_, 
-                                         fct_ts_t const *ts)
-{
-   fct_unused(logger_);
-   fct_unused(ts);
-}
-
-
-static void
-fct_standard_logger__on_test_suite_end(fct_logger_i *logger_, 
-                                         fct_ts_t const *ts)
-{
-   fct_unused(logger_);
-   fct_unused(ts);
-}
-
-
-static void
-fct_standard_logger__on_fct_start(fct_logger_i *logger_, 
-                                  fctkern_t const *nk)
-{
-   fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
-   fct_unused(nk);
-   fct_timer__start(&(logger->timer));
-}
-
-
-static void
-fct_standard_logger__on_fct_end(fct_logger_i *logger_, fctkern_t const *nk)
-{
-   fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
-   nbool_t is_success =1;
-   double elasped_time =0;
-   int num_tests =0;
-   int num_passed =0;
-
-   fct_timer__stop(&(logger->timer));
-     
-   is_success = nlist__size(logger->failed_cndtns_list) ==0;
-
-   if (  !is_success )
-   {
-      printf("\n--------------------------------------------------------\n");
-      printf("FAILED TESTS\n\n");
-
-      NLIST_FOREACH_BGN(char *, cndtn_str, logger->failed_cndtns_list)
-      {
-         printf("%s\n", cndtn_str);
-      }
-      NLIST_FOREACH_END();
-
-      printf("\n");
-   }
-
-   printf("\n--------------------------------------------------------\n");
-
-   num_tests = fctkern__tst_cnt(nk);
-   num_passed = fctkern__tst_cnt_passed(nk);
-
-   printf(
-      "%s (%d/%d tests", 
-      (is_success) ? "PASSED" : "FAILED",
-      num_passed,
-      num_tests
-   );
-
-   elasped_time = fct_timer__duration(&(logger->timer));
-   if ( elasped_time > 0.0000001 )
-   {
-      printf(" in %.6fs)\n", elasped_time);
-   }
-   else
-   {
-      /* Don't bother displaying the time to execute. */
-      printf(")\n");
-   }
-}
-
-
-static void
-fct_standard_logger__del(fct_logger_i *logger_)
-{
-   fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
-
-   NLIST_FOREACH_BGN(char *, cndtn_str, logger->failed_cndtns_list)
-   {
-      free(cndtn_str);
-   }
-   NLIST_FOREACH_END();
-
-   free(logger);
-   logger_ =NULL;
-}
-
-
-fct_standard_logger_t *
-fct_standard_logger__new(void)
-{
-   fct_standard_logger_t *logger = (fct_standard_logger_t *)calloc(
-		   1, sizeof(fct_standard_logger_t)
-		   );
-   if ( logger == NULL ) 
-   { 
-      return NULL; 
-   }
-   fct_logger__init((fct_logger_i*)logger);
-   logger->on_cndtn = fct_standard_logger__on_cndtn;
-   logger->on_test_start = fct_standard_logger__on_test_start;
-   logger->on_test_end = fct_standard_logger__on_test_end;
-   logger->on_test_suite_start = fct_standard_logger__on_test_suite_start;
-   logger->on_test_suite_end = fct_standard_logger__on_test_suite_end;
-   logger->on_fct_start = fct_standard_logger__on_fct_start;
-   logger->on_fct_end = fct_standard_logger__on_fct_end;
-   logger->on_delete = fct_standard_logger__del;
-
-   logger->failed_cndtns_list = nlist_new();
-   assert( logger->failed_cndtns_list != NULL );
-   
-   fct_timer__init(&(logger->timer));
-
-   return logger;
-}
-
-
-
-/*
-------------------------------------------------------------
-MAGIC MACROS
-------------------------------------------------------------
-*/
-
-#define FCT_BGN() \
-int \
-main(int argc, char *argv[])\
-{\
-   fctkern_t fctkern__;\
-   fctkern_init(&fctkern__, argc, argv);\
-   fctkern__log_start(&fctkern__);
-
-
-#define FCT_END()\
-   {\
-      int num_failed__ =0;\
-      num_failed__ = fctkern__tst_cnt_failed((&fctkern__));\
-      fctkern__log_end(&fctkern__);\
-      fctkern__end(&fctkern__);\
-      fctkern__final(&fctkern__);\
-      return num_failed__;\
-   }\
-}
-
-#define FCT_FIXTURE_SUITE_BGN(_NAME_) \
-   {\
-      fct_ts_t *ts__ = fct_ts_new( #_NAME_ );\
-      fctkern__log_suite_start((&fctkern__), ts__);\
-      for (;;)\
-      {\
-         int fct_test_num__ = -1;\
-         _fct_cmt("Strict compiler warnings will complain in 'blank' suites.")\
-         _fct_cmt("so we are going to do a 'noop' to trick them.")\
-         fct_test_num__ = fct_test_num__;\
-         if ( fct_ts__is_ending_mode(ts__) )\
-         {\
-            _fct_cmt("flag the test suite as complete.");\
-            fct_ts__end(ts__);\
-            break;\
-         }
-
-
-/*  Closes off a "Fixture" test suite. */
-#define FCT_FIXTURE_SUITE_END() \
-         if ( fct_ts__is_cnt_mode(ts__) )\
-         {\
-            fct_ts__cnt_end(ts__);\
-         }\
-      }\
-      fctkern__add_ts((&fctkern__), ts__);\
-      fctkern__log_suite_end((&fctkern__), ts__);\
-      ts__ = NULL;\
-   }
-
-
-
-#define FCT_SETUP_BGN()\
-   if ( fct_ts__is_setup_mode(ts__) ) {
-
-#define FCT_SETUP_END() \
-   fct_ts__setup_end(ts__); }
-
-#define FCT_TEARDOWN_BGN() \
-   if ( fct_ts__is_teardown_mode(ts__) ) {\
-
-#define FCT_TEARDOWN_END() \
-   fct_ts__teardown_end(ts__); \
-   continue; \
-   }
-
-/* Lets you create a test suite, where maybe you don't want a fixture. We
-do it by 'stubbing' out the setup/teardown logic. */
-#define FCT_SUITE_BGN(Name) \
-   FCT_FIXTURE_SUITE_BGN(Name) {\
-   FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
-   FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
-
-#define FCT_SUITE_END() } FCT_FIXTURE_SUITE_END()
-
-/* Depending on whether or not we are counting the tests, we will have to 
-first determine if the test is the "current" count. Then we have to determine
-if we can pass the filter. Finally we will execute everything so that when a 
-check fails, we can "break" out to the end of the test. */
-#define FCT_TEST_BGN(_NAME_) \
-         {\
-            char const *test_name__ = #_NAME_;\
-            ++fct_test_num__;\
-            if ( fct_ts__is_cnt_mode(ts__) )\
-            {\
-               fct_ts__inc_total_test_num(ts__);\
-            }\
-            else if ( fct_ts__is_test_mode(ts__) \
-                      && fct_ts__is_test_cnt(ts__, fct_test_num__) )\
-            {\
-               int is_pass__;\
-               is_pass__ = FCT_FALSE;\
-               fct_ts__test_begin(ts__);\
-               if ( fctkern__pass_filter(&fctkern__,  test_name__ ) )\
-               {\
-                  fct_test_t *test__ = fct_test_new( test_name__ );\
-                  fctkern__log_test_start(&fctkern__, test__);\
-                  for (;;) \
-                  {
-
-#define FCT_TEST_END() \
-                     break;\
-                  }\
-               fct_ts__add_test(ts__, test__);\
-               fctkern__log_test_end(&fctkern__, test__);\
-               }\
-               fct_ts__test_end(ts__);\
-               continue;\
-            }\
-         }
-
-
-
-/*
----------------------------------------------------------
-CHECKING MACROS
----------------------------------------------------------- 
-
-For now we only have the one "positive" check macro. In the future I plan
-to add more macros that check for different types of common conditions.
-*/
-
-#define fct_chk(_CNDTN_) \
-   {\
-      fctchk_t *chk =NULL;\
-      is_pass__ = (_CNDTN_);\
-      chk = fctchk_new(#_CNDTN_, __FILE__, __LINE__, is_pass__);\
-      fct_test__add(test__, chk);\
-      fctkern__log_chk(&fctkern__, chk);\
-      if ( !is_pass__ ) { break; }\
-   }
-
-
-/*
----------------------------------------------------------
-GUT CHECK MACROS
----------------------------------------------------------- 
-
-The following macros are used to help check the "guts" of
-the FCT, and to confirm that it all works according to spec.
-*/
-
-/* Generates a message to STDERR and exits the application with a 
-non-zero number. */
-#define _FCT_GUTCHK(_CNDTN_) \
-   if ( !(_CNDTN_) ) {\
-      fprintf(stderr, "gutchk fail: '"  #_CNDTN_ "' was not true.\n");\
-      exit(1);\
-   }\
-   else {\
-      fprintf(stdout, "gutchk pass:  '" #_CNDTN_ "'\n");\
-   }
-      
-
-/*
----------------------------------------------------------
-CLOSING STATEMENTS
----------------------------------------------------------- 
-*/
-
-/* This is defined at the start of the file. We are undefining it
-here so it doesn't conflict with existing. */
-#if defined(WIN32)
-#   undef _CRT_SECURE_NO_WARNINGS
-#endif
-
-#endif /* !FCT_INCLUDED__IMB */
+/*
+====================================================================
+Copyright (c) 2008 Ian Blumel.  All rights reserved.
+
+FCTX (Fast C Test) Unit Testing Framework
+
+Copyright (c) 2008, Ian Blumel (ian.blumel@gmail.com)
+All rights reserved.
+
+This license is based on the BSD License.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+    * Neither the name of, Ian Blumel, nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+====================================================================
+
+File: fct.h
+*/
+
+#if !defined(FCT_INCLUDED__IMB)
+#define FCT_INCLUDED__IMB
+
+/* Configuration Values. You can over-ride these values in your own
+header, then include this header. For example, in your file, myfct.h,
+
+    #define FCT_DEFAULT_LOGGER "standard"
+    #include "fct.h"
+
+then if your unit tests included, myfct.h, you would default to work
+with a standard logger. */
+
+#if !defined(FCT_DEFAULT_LOGGER)
+#   define FCT_DEFAULT_LOGGER  "standard"
+#endif /* !FCT_DEFAULT_LOGGER */
+
+#define FCT_VERSION_MAJOR 1
+#define FCT_VERSION_MINOR 6
+#define FCT_VERSION_MICRO 1
+
+#define _FCT_QUOTEME(x) #x
+#define FCT_QUOTEME(x) _FCT_QUOTEME(x)
+
+#define FCT_VERSION_STR (FCT_QUOTEME(FCT_VERSION_MAJOR) "."\
+                         FCT_QUOTEME(FCT_VERSION_MINOR) "."\
+                         FCT_QUOTEME(FCT_VERSION_MICRO))
+
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <float.h>
+#include <math.h>
+#include <ctype.h>
+
+#define FCT_MAX_NAME           256
+#define FCT_MAX_LOG_LINE       256
+
+#define nbool_t int
+#define FCT_TRUE   1
+#define FCT_FALSE  0
+
+#define FCTMIN(x, y) ( x < y) ? (x) : (y)
+
+#ifndef __INTEL_COMPILER
+/* Use regular assertions for non-Intel compilers */
+#define FCT_ASSERT(expr) assert(expr)
+#else
+/* Silence Intel warnings on assert(expr && "str") or assert("str") */
+#define FCT_ASSERT(expr) do {             \
+    _Pragma("warning(push,disable:279)"); \
+    assert(expr);                         \
+    _Pragma("warning(pop)");              \
+    } while (0)
+#endif
+
+#if defined(__cplusplus)
+#define FCT_EXTERN_C extern "C"
+#else
+#define FCT_EXTERN_C
+#endif
+
+/* Forward declarations. The following forward declarations are required
+because there is a inter-relationship between certain objects that
+just can not be untwined. */
+typedef struct _fct_logger_evt_t fct_logger_evt_t;
+typedef struct _fct_logger_i fct_logger_i;
+typedef struct _fct_logger_types_t fct_logger_types_t;
+typedef struct _fct_standard_logger_t fct_standard_logger_t;
+typedef struct _fct_junit_logger_t fct_junit_logger_t;
+typedef struct _fct_minimal_logger_t fct_minimal_logger_t;
+typedef struct _fctchk_t fctchk_t;
+typedef struct _fct_test_t fct_test_t;
+typedef struct _fct_ts_t fct_ts_t;
+typedef struct _fctkern_t fctkern_t;
+
+/* Forward declare some functions used throughout. */
+static fct_logger_i*
+fct_standard_logger_new(void);
+
+static fct_logger_i*
+fct_minimal_logger_new(void);
+
+static fct_junit_logger_t *
+fct_junit_logger_new(void);
+
+static void
+fct_logger__del(fct_logger_i *logger);
+
+static void
+fct_logger__on_chk(fct_logger_i *self, fctchk_t const *chk);
+
+static void
+fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test);
+
+static void
+fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test);
+
+static void
+fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts);
+
+static void
+fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts);
+
+static void
+fct_logger__on_test_suite_skip(
+    fct_logger_i *logger,
+    char const *condition,
+    char const *name
+);
+
+static void
+fct_logger__on_test_skip(
+    fct_logger_i *logger,
+    char const *condition,
+    char const *name
+);
+
+
+static void
+fct_logger__on_warn(fct_logger_i *logger, char const *warn);
+
+
+
+/* Explicitly indicate a no-op */
+#define fct_pass()
+
+#define fct_unused(x)  (void)(x)
+
+/* This is just a little trick to let me put comments inside of macros. I
+really only want to bother with this when we are "unwinding" the macros
+for debugging purposes. */
+#if defined(FCT_CONF_UNWIND)
+#	define _fct_cmt(string)		{char*_=string;}
+#else
+#	define _fct_cmt(string)
+#endif
+
+/*
+--------------------------------------------------------
+UTILITIES
+--------------------------------------------------------
+*/
+
+
+/* STDIO and STDERR redirect support */
+#define FCT_PIPE_RESERVE_BYTES_DEFAULT  512
+static int fct_stdout_pipe[2];
+static int fct_stderr_pipe[2];
+static int fct_saved_stdout;
+static int fct_saved_stderr;
+
+/* Platform indepedent pipe functions. TODO: Look to figure this out in a way
+that follows the ISO C++ conformant naming convention. */
+#if defined(WIN32)
+#    include <io.h>
+#    include <fcntl.h>
+#    define _fct_pipe(_PFDS_) \
+        _pipe((_PFDS_), FCT_PIPE_RESERVE_BYTES_DEFAULT, _O_TEXT)
+#    define _fct_dup  _dup
+#    define _fct_dup2 _dup2
+#    define _fct_close _close
+#    define _fct_read  _read
+/* Until I can figure a better way to do this, rely on magic numbers. */
+#    define STDOUT_FILENO 1
+#    define STDERR_FILENO 2
+#else
+#    include <unistd.h>
+#    define _fct_pipe  pipe
+#    define _fct_dup   dup
+#    define _fct_dup2  dup2
+#    define _fct_close close
+#    define _fct_read  read
+#endif /* WIN32 */
+
+
+
+
+static void
+fct_switch_std_to_buffer(int std_pipe[2], FILE *out, int fileno_, int *save_handle)
+{
+    fflush(out);
+    *save_handle = _fct_dup(fileno_);
+    if ( _fct_pipe(std_pipe) != 0 )
+    {
+        exit(1);
+    }
+    _fct_dup2(std_pipe[1], fileno_);
+    _fct_close(std_pipe[1]);
+}
+
+
+static void
+fct_switch_std_to_std(FILE *out, int fileno_, int save_handle)
+{
+    fflush(out);
+    _fct_dup2(save_handle, fileno_);
+}
+
+
+#define FCT_SWITCH_STDOUT_TO_BUFFER() \
+    fct_switch_std_to_buffer(fct_stdout_pipe, stdout, STDOUT_FILENO, &fct_saved_stdout)
+#define FCT_SWITCH_STDOUT_TO_STDOUT() \
+    fct_switch_std_to_std(stdout, STDOUT_FILENO, fct_saved_stdout)
+#define FCT_SWITCH_STDERR_TO_BUFFER() \
+    fct_switch_std_to_buffer(fct_stderr_pipe, stderr, STDERR_FILENO, &fct_saved_stderr)
+#define FCT_SWITCH_STDERR_TO_STDERR() \
+    fct_switch_std_to_std(stderr, STDERR_FILENO, fct_saved_stderr)
+
+
+/* Utility for truncated, safe string copies. The NUM
+should be the length of DST plus the null-termintor. */
+static void
+fctstr_safe_cpy(char *dst, char const *src, size_t num)
+{
+    FCT_ASSERT( dst != NULL );
+    FCT_ASSERT( src != NULL );
+    FCT_ASSERT( num > 0 );
+#if defined(WIN32) && _MSC_VER >= 1400
+    strncpy_s(dst, num, src, _TRUNCATE);
+#else
+    strncpy(dst, src, num);
+#endif
+    dst[num-1] = '\0';
+}
+
+/* Isolate the vsnprintf implementation */
+static int
+fct_vsnprintf(char *buffer,
+              size_t buffer_len,
+              char const *format,
+              va_list args)
+{
+    int count =0;
+    /* Older microsoft compilers where not ANSI compliant with this
+    function and you had to use _vsnprintf. I will assume that newer
+    Microsoft Compilers start implementing vsnprintf. */
+#if defined(_MSC_VER) && (_MSC_VER < 1400)
+    count = _vsnprintf(buffer, buffer_len, format, args);
+#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+    count = vsnprintf_s(buffer, buffer_len, _TRUNCATE, format, args);
+#else
+    count = vsnprintf(buffer, buffer_len, format, args);
+#endif
+    return count;
+}
+
+
+/* Isolate the snprintf implemenation. */
+static int
+fct_snprintf(char *buffer, size_t buffer_len, char const *format, ...)
+{
+    int count =0;
+    va_list args;
+    va_start(args, format);
+    count =fct_vsnprintf(buffer, buffer_len, format, args);
+    va_end(args);
+    return count;
+}
+
+
+/* Helper to for cloning strings on the heap. Returns NULL for
+an out of memory condition. */
+static char*
+fctstr_clone(char const *s)
+{
+    char *k =NULL;
+    size_t klen =0;
+    FCT_ASSERT( s != NULL && "invalid arg");
+    klen = strlen(s)+1;
+    k = (char*)malloc(sizeof(char)*klen+1);
+    fctstr_safe_cpy(k, s, klen);
+    return k;
+}
+
+
+/* Clones and returns a lower case version of the original string. */
+static char*
+fctstr_clone_lower(char const *s)
+{
+    char *k =NULL;
+    size_t klen =0;
+    size_t i;
+    if ( s == NULL )
+    {
+        return NULL;
+    }
+    klen = strlen(s)+1;
+    k = (char*)malloc(sizeof(char)*klen+1);
+    for ( i=0; i != klen; ++i )
+    {
+        k[i] = (char)tolower(s[i]);
+    }
+    return k;
+}
+
+
+/* A very, very simple "filter". This just compares the supplied prefix
+against the test_str, to see if they both have the same starting
+characters. If they do we return true, otherwise we return false. If the
+prefix is a blank string or NULL, then it will return FCT_TRUE.*/
+static nbool_t
+fct_filter_pass(char const *prefix, char const *test_str)
+{
+    nbool_t is_match = FCT_FALSE;
+    char const *prefix_p;
+    char const *test_str_p;
+
+    /* If you got nothing to test against, why test? */
+    FCT_ASSERT( test_str != NULL );
+
+    /* When the prefix is NULL or blank, we always return FCT_TRUE. */
+    if ( prefix == NULL  || prefix[0] == '\0' )
+    {
+        return FCT_TRUE;
+    }
+
+    /* Iterate through both character arrays at the same time. We are
+    going to play a game and see if we can beat the house. */
+    for ( prefix_p = prefix, test_str_p = test_str;
+            *prefix_p != '\0' && *test_str_p != '\0';
+            ++prefix_p, ++test_str_p )
+    {
+        is_match = *prefix_p == *test_str_p;
+        if ( !is_match )
+        {
+            break;   /* Quit the first time we don't match. */
+        }
+    }
+
+    /* If the iterator for the test_str is pointing at the null char, and
+    the iterator for the prefix string is not, then the prefix string is
+    larger than the actual test string, and therefore we failed to pass the
+    filter. */
+    if ( *test_str_p == '\0' && *prefix_p != '\0' )
+    {
+        return FCT_FALSE;
+    }
+
+    /* is_match will be set to the either FCT_TRUE if we kicked of the loop
+    early because our filter ran out of characters or FCT_FALSE if we
+    encountered a mismatch before our filter ran out of characters. */
+    return is_match;
+}
+
+
+/* Routine checks if two strings are equal. Taken from
+http://publications.gbdirect.co.uk/c_book/chapter5/character_handling.html
+*/
+static int
+fctstr_eq(char const *s1, char const *s2)
+{
+    if ( s1 == s2 )
+    {
+        return 1;
+    }
+    if ( (s1 == NULL && s2 != NULL)
+            || (s1 != NULL && s2 == NULL) )
+    {
+        return 0;
+    }
+    while (*s1 == *s2)
+    {
+        if (*s1 == '\0')
+            return 1;
+        s1++;
+        s2++;
+    }
+    /* Difference detected! */
+    return 0;
+}
+
+
+static int
+fctstr_ieq(char const *s1, char const *s2)
+{
+    if ( s1 == s2 )
+    {
+        return 1;
+    }
+    if ( (s1 == NULL && s2 != NULL)
+            || (s1 != NULL && s2 == NULL) )
+    {
+        return 0;
+    }
+    while (tolower(*s1) == tolower(*s2))
+    {
+        if (*s1 == '\0')
+            return 1;
+        s1++;
+        s2++;
+    }
+    /* Difference detected! */
+    return 0;
+}
+
+
+/* Returns 1 if the STR contains the CHECK_INCL substring. NULL's
+are handled, and NULL always INCLUDES NULL. This check is case
+sensitive. If two strings point to the same place they are
+included. */
+static int
+fctstr_incl(char const *str, char const *check_incl)
+{
+    static char const *blank_s = "";
+    char const *found = NULL;
+    if ( str == NULL )
+    {
+        str = blank_s;
+    }
+    if ( check_incl == NULL )
+    {
+        check_incl = blank_s;
+    }
+    if ( str == check_incl )
+    {
+        return 1;
+    }
+    found = strstr(str, check_incl);
+    return found != NULL;
+}
+
+
+/* Does a case insensitive include check. */
+static int
+fctstr_iincl(char const *str, char const *check_incl)
+{
+    /* Going to do this with a memory allocation to save coding
+    time. In the future this can be rewritten. Both clone_lower
+    and _incl are NULL tolerant. */
+    char *lstr = fctstr_clone_lower(str);
+    char *lcheck_incl = fctstr_clone_lower(check_incl);
+    int found = fctstr_incl(lstr, lcheck_incl);
+    free(lstr);
+    free(lcheck_incl);
+    return found;
+}
+
+
+/* Returns true if STR starts with CHECK. NULL and NULL is consider
+true. */
+static int
+fctstr_startswith(char const *str, char const *check)
+{
+    char const *sp;
+    if ( str == NULL && check == NULL )
+    {
+        return 1;
+    }
+    else if ( ((str == NULL) && (check != NULL))
+              || ((str != NULL) && (check == NULL)) )
+    {
+        return 0;
+    }
+    sp = strstr(str, check);
+    return sp == str;
+}
+
+
+/* Case insenstive variant of fctstr_startswith. */
+static int
+fctstr_istartswith(char const *str, char const *check)
+{
+    /* Taking the lazy approach for now. */
+    char *istr = fctstr_clone_lower(str);
+    char *icheck = fctstr_clone_lower(check);
+    /* TODO: check for memory. */
+    int startswith = fctstr_startswith(istr, icheck);
+    free(istr);
+    free(icheck);
+    return startswith;
+}
+
+
+/* Returns true if the given string ends with the given
+check. Treats NULL as a blank string, and as such, will
+pass the ends with (a blank string endswith a blank string). */
+static int
+fctstr_endswith(char const *str, char const *check)
+{
+    size_t check_i;
+    size_t str_i;
+    if ( str == NULL && check == NULL )
+    {
+        return 1;
+    }
+    else if ( ((str == NULL) && (check != NULL))
+              || ((str != NULL) && (check == NULL)) )
+    {
+        return 0;
+    }
+    check_i = strlen(check);
+    str_i = strlen(str);
+    if ( str_i < check_i )
+    {
+        return 0;   /* Can't do it string is too small. */
+    }
+    for ( ; check_i != 0; --check_i, --str_i)
+    {
+        if ( str[str_i] != check[check_i] )
+        {
+            return 0; /* Found a case where they are not equal. */
+        }
+    }
+    /* Exahausted check against string, can only be true. */
+    return 1;
+}
+
+
+static int
+fctstr_iendswith(char const *str, char const *check)
+{
+    size_t check_i;
+    size_t str_i;
+    if ( str == NULL && check == NULL )
+    {
+        return 1;
+    }
+    else if ( ((str == NULL) && (check != NULL))
+              || ((str != NULL) && (check == NULL)) )
+    {
+        return 0;
+    }
+    check_i = strlen(check);
+    str_i = strlen(str);
+    if ( str_i < check_i )
+    {
+        return 0;   /* Can't do it string is too small. */
+    }
+    for ( ; check_i != 0; --check_i, --str_i)
+    {
+        if ( tolower(str[str_i]) != tolower(check[check_i]) )
+        {
+            return 0; /* Found a case where they are not equal. */
+        }
+    }
+    /* Exahausted check against string, can only be true. */
+    return 1;
+}
+
+
+/* Use this with the _end variant to get the
+
+STARTSWITH ........................................ END
+
+effect. Assumes that the line will be maxwidth in characters. The
+maxwidth can't be greater than FCT_DOTTED_MAX_LEN. */
+#define FCT_DOTTED_MAX_LEN  256
+static void
+fct_dotted_line_start(size_t maxwidth, char const *startwith)
+{
+    char line[FCT_DOTTED_MAX_LEN];
+    size_t len =0;
+    size_t line_len =0;
+
+    memset(line, '.', sizeof(char)*maxwidth);
+    len = strlen(startwith);
+    line_len = FCTMIN(maxwidth-1, len);
+    memcpy(line, startwith, sizeof(char)*line_len);
+    if ( len < maxwidth-1)
+    {
+        line[len] = ' ';
+    }
+    line[maxwidth-1] = '\0';
+    fputs(line, stdout);
+}
+
+
+static void
+fct_dotted_line_end(char const *endswith)
+{
+    printf(" %s\n", endswith);
+}
+
+
+/*
+--------------------------------------------------------
+TIMER
+--------------------------------------------------------
+This is a low-res implementation at the moment.
+
+We will improve this in the future, and isolate the
+implementation from the rest of the code.
+*/
+
+typedef struct _fct_timer_t fct_timer_t;
+struct _fct_timer_t
+{
+    clock_t start;
+    clock_t stop;
+    double duration;
+};
+
+
+static void
+fct_timer__init(fct_timer_t *timer)
+{
+    FCT_ASSERT(timer != NULL);
+    memset(timer, 0, sizeof(fct_timer_t));
+}
+
+
+static void
+fct_timer__start(fct_timer_t *timer)
+{
+    FCT_ASSERT(timer != NULL);
+    timer->start = clock();
+}
+
+
+static void
+fct_timer__stop(fct_timer_t *timer)
+{
+    FCT_ASSERT(timer != NULL);
+    timer->stop = clock();
+    timer->duration = (double) (timer->stop - timer->start) / CLOCKS_PER_SEC;
+}
+
+
+/* Returns the time in seconds. */
+static double
+fct_timer__duration(fct_timer_t const *timer)
+{
+    FCT_ASSERT( timer != NULL );
+    return timer->duration;
+}
+
+
+/*
+--------------------------------------------------------
+GENERIC LIST
+--------------------------------------------------------
+*/
+
+/* For now we will just keep it at a linear growth rate. */
+#define FCT_LIST_GROWTH_FACTOR   2
+
+/* Starting size for the list, to keep it simple we will start
+at a reasonable size. */
+#define FCT_LIST_DEFAULT_START_SZ      8
+
+/* Helper macros for quickly iterating through a list. You should be able
+to do something like,
+
+  FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, my_list)
+  {
+     fct_logger__on_blah(logger);
+  }
+  FCT_NLIST_FOREACH_END();
+
+*/
+#define FCT_NLIST_FOREACH_BGN(Type, Var, List)\
+{\
+   if ( List != NULL ) {\
+      size_t item_i##Var;\
+      size_t num_items##Var = fct_nlist__size(List);\
+      for( item_i##Var =0; item_i##Var != num_items##Var; ++item_i##Var )\
+      {\
+         Type Var = (Type) fct_nlist__at((List), item_i##Var);
+
+#define FCT_NLIST_FOREACH_END() }}}
+
+/* Used to manage a list of loggers. This works mostly like
+the STL vector, where the array grows as more items are
+appended. */
+typedef struct _fct_nlist_t fct_nlist_t;
+struct _fct_nlist_t
+{
+    /* Item's are stored as pointers to void. */
+    void **itm_list;
+
+    /* Indicates the number of element's in the array. */
+    size_t avail_itm_num;
+
+    /* Indicates the number of actually elements in the array. */
+    size_t used_itm_num;
+};
+typedef void (*fct_nlist_on_del_t)(void*);
+
+
+/* Clears the contents of the list, and sets the list count to 0. The
+actual count remains unchanged. If on_del is supplied it is executed
+against each list element. */
+static void
+fct_nlist__clear(fct_nlist_t *list, fct_nlist_on_del_t on_del)
+{
+    size_t itm_i__ =0;
+    FCT_ASSERT( list != NULL );
+    if ( on_del != NULL )
+    {
+        for ( itm_i__=0; itm_i__ != list->used_itm_num; ++itm_i__ )
+        {
+            on_del(list->itm_list[itm_i__]);
+        }
+    }
+    list->used_itm_num =0;
+}
+
+
+/* If you used init, then close with final. This is useful for
+working with structures that live on the stack. */
+static void
+fct_nlist__final(fct_nlist_t *list, fct_nlist_on_del_t on_del)
+{
+    FCT_ASSERT( list != NULL );
+    fct_nlist__clear(list, on_del);
+    free(list->itm_list);
+}
+
+
+static int
+fct_nlist__init2(fct_nlist_t *list, size_t start_sz)
+{
+    FCT_ASSERT( list != NULL );
+    if ( start_sz == 0 )
+    {
+        list->itm_list = NULL;
+    }
+    else
+    {
+        list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
+        if ( list->itm_list == NULL )
+        {
+            return 0;
+        }
+    }
+    /* If these are both 0, then they are equal and that means
+    that the first append operation will allocate memory. The beauty
+    here is that if the list remains empty, then we save a malloc.
+    Empty lists are relatively common in FCT (consider an error list). */
+    list->avail_itm_num = start_sz;
+    list->used_itm_num =0;
+    return 1;
+}
+
+
+/* Initializes a list. Useful for populating existing structures.
+Returns 0 if there was an error allocating memory. Returns 1 otherwise. */
+#define fct_nlist__init(_LIST_PTR_) \
+   (fct_nlist__init2((_LIST_PTR_), FCT_LIST_DEFAULT_START_SZ))
+
+
+/* Returns the number of elements within the list. */
+static size_t
+fct_nlist__size(fct_nlist_t const *list)
+{
+    FCT_ASSERT( list != NULL );
+    return list->used_itm_num;
+}
+
+
+/* Returns the item at idx, asserts otherwise. */
+static void*
+fct_nlist__at(fct_nlist_t const *list, size_t idx)
+{
+    FCT_ASSERT( list != NULL );
+    FCT_ASSERT( idx < list->used_itm_num );
+    return list->itm_list[idx];
+}
+
+
+static void
+fct_nlist__append(fct_nlist_t *list, void *itm)
+{
+    FCT_ASSERT( list != NULL );
+    /* If we ran out of room, then the last increment should be equal to the
+    available space, in this case we need to grow a little more. If this
+    list started as size 0, then we should encounter the same effect as
+    "running out of room." */
+    if ( list->used_itm_num == list->avail_itm_num )
+    {
+        /* Use multiple and add, since the avail_itm_num could be 0. */
+        list->avail_itm_num = list->avail_itm_num*FCT_LIST_GROWTH_FACTOR+\
+                              FCT_LIST_GROWTH_FACTOR;
+        list->itm_list = (void**)realloc(
+                             list->itm_list, sizeof(void*)*list->avail_itm_num
+                         );
+        FCT_ASSERT( list->itm_list != NULL && "memory check");
+    }
+
+    list->itm_list[list->used_itm_num] = itm;
+    ++(list->used_itm_num);
+}
+
+
+
+/*
+-----------------------------------------------------------
+A SINGLE CHECK
+-----------------------------------------------------------
+This defines a single check. It indicates what the check was,
+and where it occurred. A "Test" object will have-a bunch
+of "checks".
+*/
+
+struct _fctchk_t
+{
+    /* This string that represents the condition. */
+    char cndtn[FCT_MAX_LOG_LINE];
+
+    /* These indicate where the condition occurred. */
+    char file[FCT_MAX_LOG_LINE];
+
+    int lineno;
+
+    nbool_t is_pass;
+
+    /* This is a message that we can "format into", if
+    no format string is specified this should be
+    equivalent to the cntdn. */
+    char msg[FCT_MAX_LOG_LINE];
+};
+
+#define fctchk__is_pass(_CHK_) ((_CHK_)->is_pass)
+#define fctchk__file(_CHK_)    ((_CHK_)->file)
+#define fctchk__lineno(_CHK_)  ((_CHK_)->lineno)
+#define fctchk__cndtn(_CHK_)   ((_CHK_)->cndtn)
+#define fctchk__msg(_CHK_)     ((_CHK_)->msg)
+
+static fctchk_t*
+fctchk_new(int is_pass,
+           char const *cndtn,
+           char const *file,
+           int lineno,
+           char const *format,
+           va_list args)
+{
+    fctchk_t *chk = NULL;
+
+    FCT_ASSERT( cndtn != NULL );
+    FCT_ASSERT( file != NULL );
+    FCT_ASSERT( lineno > 0 );
+
+    chk = (fctchk_t*)calloc(1, sizeof(fctchk_t));
+    if ( chk == NULL )
+    {
+        return NULL;
+    }
+
+    fctstr_safe_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE);
+    fctstr_safe_cpy(chk->file, file, FCT_MAX_LOG_LINE);
+    chk->lineno = lineno;
+
+    chk->is_pass =is_pass;
+
+    if ( format != NULL )
+    {
+        fct_vsnprintf(chk->msg, FCT_MAX_LOG_LINE, format, args);
+    }
+    else
+    {
+        /* Default to make the condition be the message, if there was no format
+        specified. */
+        fctstr_safe_cpy(chk->msg, cndtn, FCT_MAX_LOG_LINE);
+    }
+
+    return chk;
+}
+
+
+/* Cleans up a "check" object. If the `chk` is NULL, this function does
+nothing. */
+static void
+fctchk__del(fctchk_t *chk)
+{
+    if ( chk == NULL )
+    {
+        return;
+    }
+    free( chk );
+}
+
+
+/*
+-----------------------------------------------------------
+A TEST
+-----------------------------------------------------------
+A suite will have-a list of tests. Where each test will have-a
+list of failed and passed checks.
+*/
+
+struct _fct_test_t
+{
+    /* List of failed and passed "checks" (fctchk_t). Two seperate
+    lists make it faster to determine how many checks passed and how
+    many checks failed. */
+    fct_nlist_t failed_chks;
+    fct_nlist_t passed_chks;
+
+    /* To store the test run time */
+    fct_timer_t timer;
+
+    /* The name of the test case. */
+    char name[FCT_MAX_NAME];
+};
+
+#define fct_test__name(_TEST_) ((_TEST_)->name)
+
+/* Clears the failed tests ... partly for internal testing. */
+#define fct_test__clear_failed(test) \
+    fct_nlist__clear(test->failed_chks, (fct_nlist_on_del_t)fctchk__del);\
+ 
+
+static void
+fct_test__del(fct_test_t *test)
+{
+    if (test == NULL )
+    {
+        return;
+    }
+    fct_nlist__final(&(test->passed_chks), (fct_nlist_on_del_t)fctchk__del);
+    fct_nlist__final(&(test->failed_chks), (fct_nlist_on_del_t)fctchk__del);
+    free(test);
+}
+
+
+static fct_test_t*
+fct_test_new(char const *name)
+{
+    nbool_t ok =FCT_FALSE;
+    fct_test_t *test =NULL;
+
+    test = (fct_test_t*)malloc(sizeof(fct_test_t));
+    if ( test == NULL )
+    {
+        return NULL;
+    }
+
+    fctstr_safe_cpy(test->name, name, FCT_MAX_NAME);
+
+    /* Failures are an exception, so lets not allocate up
+    the list until we need to. */
+    fct_nlist__init2(&(test->failed_chks), 0);
+    if (!fct_nlist__init(&(test->passed_chks)))
+    {
+        ok =FCT_FALSE;
+        goto finally;
+    }
+
+    fct_timer__init(&(test->timer));
+
+    ok =FCT_TRUE;
+finally:
+    if ( !ok )
+    {
+        fct_test__del(test);
+        test =NULL;
+    }
+    return test;
+}
+
+
+static void
+fct_test__start_timer(fct_test_t *test)
+{
+    FCT_ASSERT( test != NULL );
+    fct_timer__start(&(test->timer));
+}
+
+
+static void
+fct_test__stop_timer(fct_test_t *test)
+{
+    FCT_ASSERT( test != NULL );
+    fct_timer__stop(&(test->timer));
+}
+
+
+static double
+fct_test__duration(fct_test_t const *test)
+{
+    FCT_ASSERT( test != NULL );
+    return fct_timer__duration(&(test->timer));
+}
+
+
+static nbool_t
+fct_test__is_pass(fct_test_t const *test)
+{
+    FCT_ASSERT( test != NULL );
+    return fct_nlist__size(&(test->failed_chks)) == 0;
+}
+
+
+static void
+fct_test__add(fct_test_t *test, fctchk_t *chk)
+{
+
+    FCT_ASSERT( test != NULL );
+    FCT_ASSERT( chk != NULL );
+
+    if ( fctchk__is_pass(chk) )
+    {
+        fct_nlist__append(&(test->passed_chks), (void*)chk);
+    }
+    else
+    {
+        fct_nlist__append(&(test->failed_chks), (void*)chk);
+    }
+}
+
+/* Returns the number of checks made throughout the test. */
+static size_t
+fct_test__chk_cnt(fct_test_t const *test)
+{
+    FCT_ASSERT( test != NULL );
+    return fct_nlist__size(&(test->failed_chks)) \
+           + fct_nlist__size(&(test->passed_chks));
+}
+
+
+/*
+-----------------------------------------------------------
+TEST SUITE (TS)
+-----------------------------------------------------------
+*/
+
+
+/* The different types of 'modes' that a test suite can be in.
+
+While the test suite is iterating through all the tests, its "State"
+can change from "setup mode", to "test mode" to "tear down" mode.
+These help to indicate what mode are currently in. Think of it as a
+basic FSM.
+
+            if the count was 0                                 end
+           +--------->---------------------> ending_mode-----+-+
+           |                                       ^         |
+           ^                                       |         ^
+start      |                              [if no more tests] |
+  |        |                                       |         |
+  +-count_mode -> setup_mode -> test_mode -> teardown_mode->-+
+                   |  ^                           |          |
+                   |  +-----------<---------------+          |
+                   +----------->---[if fct_req fails]--------+
+
+*/
+enum ts_mode
+{
+    ts_mode_cnt,         /* To setup when done counting. */
+    ts_mode_setup,       /* To test when done setup. */
+    ts_mode_teardown,    /* To ending mode, when no more tests. */
+    ts_mode_test,        /* To tear down mode. */
+    ts_mode_ending,      /* To ... */
+    ts_mode_end,         /* .. The End. */
+    ts_mode_abort        /* Abort */
+};
+
+/* Types of states the test could be in. */
+typedef enum
+{
+    fct_test_status_SUCCESS,
+    fct_test_status_FAILURE
+} fct_test_status;
+
+
+struct _fct_ts_t
+{
+    /* For counting our 'current' test number, and the total number of
+    tests. */
+    int  curr_test_num;
+    int  total_test_num;
+
+    /* Keeps track of the current state of the object while it is walking
+    through its "FSM" */
+    enum ts_mode mode;
+
+    /* The name of the test suite. */
+    char name[FCT_MAX_NAME];
+
+    /* List of tests that where executed within the test suite. */
+    fct_nlist_t test_list;
+};
+
+
+#define fct_ts__is_setup_mode(ts)     ((ts)->mode == ts_mode_setup)
+#define fct_ts__is_teardown_mode(ts)  ((ts)->mode == ts_mode_teardown)
+#define fct_ts__is_test_mode(ts)      ((ts)->mode == ts_mode_test)
+#define fct_ts__is_ending_mode(ts)    ((ts)->mode == ts_mode_ending)
+#define fct_ts__is_end(ts)            ((ts)->mode == ts_mode_end)
+#define fct_ts__is_cnt_mode(ts)       ((ts)->mode == ts_mode_cnt)
+#define fct_ts__is_abort_mode(ts)     ((ts)->mode == ts_mode_abort)
+
+/* This cndtn is set when we have iterated through all the tests, and
+there was nothing more to do. */
+#define fct_ts__ending(ts)          ((ts)->mode = ts_mode_ending)
+
+/* Flag a test suite as complete. It will no longer accept any more tests. */
+#define fct_ts__end(ts)  ((ts)->mode = ts_mode_end)
+
+#define fct_ts__name(ts)              ((ts)->name)
+
+
+static void
+fct_ts__del(fct_ts_t *ts)
+{
+    if ( ts == NULL )
+    {
+        return;
+    }
+    fct_nlist__final(&(ts->test_list), (fct_nlist_on_del_t)fct_test__del);
+    free(ts);
+}
+
+static fct_ts_t *
+fct_ts_new(char const *name)
+{
+    fct_ts_t *ts =NULL;
+    ts = (fct_ts_t*)calloc(1, sizeof(fct_ts_t));
+    FCT_ASSERT( ts != NULL );
+
+    fctstr_safe_cpy(ts->name, name, FCT_MAX_NAME);
+    ts->mode = ts_mode_cnt;
+    fct_nlist__init(&(ts->test_list));
+    return ts;
+}
+
+
+
+static nbool_t
+fct_ts__is_more_tests(fct_ts_t const *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+    return ts->curr_test_num < ts->total_test_num;
+}
+
+
+/* Indicates that we have started a test case. */
+static void
+fct_ts__test_begin(fct_ts_t *ts)
+{
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+    ++(ts->curr_test_num);
+}
+
+
+/* Takes OWNERSHIP of a test object, and warehouses it for later stat
+generation. */
+static void
+fct_ts__add_test(fct_ts_t *ts, fct_test_t *test)
+{
+    FCT_ASSERT( ts != NULL && "invalid arg");
+    FCT_ASSERT( test != NULL && "invalid arg");
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+    fct_nlist__append(&(ts->test_list), test);
+}
+
+
+static void
+fct_ts__test_end(fct_ts_t *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    /* After a test has completed, move to teardown mode. */
+    ts->mode = ts_mode_teardown;
+}
+
+
+/* Increments the internal count by 1. */
+static void
+fct_ts__inc_total_test_num(fct_ts_t *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+    ++(ts->total_test_num);
+}
+
+
+/* Flags the end of the setup, which implies we are going to move into
+setup mode. You must be already in setup mode for this to work! */
+static void
+fct_ts__setup_end(fct_ts_t *ts)
+{
+    if ( ts->mode != ts_mode_abort )
+    {
+        ts->mode = ts_mode_test;
+    }
+}
+
+
+static fct_test_t *
+fct_ts__make_abort_test(fct_ts_t *ts)
+{
+    char setup_testname[FCT_MAX_LOG_LINE+1] = {'\0'};
+    char const *suitename = fct_ts__name(ts);
+    fct_snprintf(setup_testname, FCT_MAX_LOG_LINE, "setup_%s", suitename);
+    return fct_test_new(setup_testname);
+}
+
+/* Flags a pre-mature abort of a setup (like a failed fct_req). */
+static void
+fct_ts__setup_abort(fct_ts_t *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    ts->mode = ts_mode_abort;
+}
+
+/* Flags the end of the teardown, which implies we are going to move
+into setup mode (for the next 'iteration'). */
+static void
+fct_ts__teardown_end(fct_ts_t *ts)
+{
+    if ( ts->mode == ts_mode_abort )
+    {
+        return; /* Because we are aborting . */
+    }
+    /* We have to decide if we should keep on testing by moving into tear down
+    mode or if we have reached the real end and should be moving into the
+    ending mode. */
+    if ( fct_ts__is_more_tests(ts) )
+    {
+        ts->mode = ts_mode_setup;
+    }
+    else
+    {
+        ts->mode = ts_mode_ending;
+    }
+}
+
+
+/* Flags the end of the counting, and proceeding to the first setup.
+Consider the special case when a test suite has NO tests in it, in
+that case we will have a current count that is zero, in which case
+we can skip right to 'ending'. */
+static void
+fct_ts__cnt_end(fct_ts_t *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+    if (ts->total_test_num == 0  )
+    {
+        ts->mode = ts_mode_ending;
+    }
+    else
+    {
+        ts->mode = ts_mode_setup;
+    }
+}
+
+
+static nbool_t
+fct_ts__is_test_cnt(fct_ts_t const *ts, int test_num)
+{
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT( 0 <= test_num );
+    FCT_ASSERT( test_num < ts->total_test_num );
+    FCT_ASSERT( !fct_ts__is_end(ts) );
+
+    /* As we roll through the tests we increment the count. With this
+    count we can decide if we need to execute a test or not. */
+    return test_num == ts->curr_test_num;
+}
+
+
+/* Returns the # of tests on the FCT TS object. This is the actual
+# of tests executed. */
+static size_t
+fct_ts__tst_cnt(fct_ts_t const *ts)
+{
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT(
+        fct_ts__is_end(ts)
+        && "can't count number of tests executed until the test suite ends"
+    );
+    return fct_nlist__size(&(ts->test_list));
+}
+
+
+/* Returns the # of tests in the TS object that passed. */
+static size_t
+fct_ts__tst_cnt_passed(fct_ts_t const *ts)
+{
+    size_t tally =0;
+
+    FCT_ASSERT( ts != NULL );
+    FCT_ASSERT( fct_ts__is_end(ts) );
+
+    FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
+    {
+        if ( fct_test__is_pass(test) )
+        {
+            tally += 1;
+        }
+    }
+    FCT_NLIST_FOREACH_END();
+    return tally;
+}
+
+
+/* Returns the # of checks made throughout a test suite. */
+static size_t
+fct_ts__chk_cnt(fct_ts_t const *ts)
+{
+    size_t tally =0;
+
+    FCT_ASSERT( ts != NULL );
+
+    FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
+    {
+        tally += fct_test__chk_cnt(test);
+    }
+    FCT_NLIST_FOREACH_END();
+    return tally;
+}
+
+/* Currently the duration is simply a sum of all the tests. */
+static double
+fct_ts__duration(fct_ts_t const *ts)
+{
+    double tally =0.0;
+    FCT_ASSERT( ts != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
+    {
+        tally += fct_test__duration(test);
+    }
+    FCT_NLIST_FOREACH_END();
+    return tally;
+}
+
+
+/*
+--------------------------------------------------------
+FCT COMMAND LINE OPTION INITIALIZATION (fctcl_init)
+--------------------------------------------------------
+
+Structure used for command line initialization. To keep it clear that we do
+not delete the char*'s present on this structure.
+*/
+
+
+typedef enum
+{
+    FCTCL_STORE_UNDEFINED,
+    FCTCL_STORE_TRUE,
+    FCTCL_STORE_VALUE
+} fctcl_store_t;
+
+
+typedef struct _fctcl_init_t
+{
+    /* What to parse for this option. --long versus -s. */
+    char const *long_opt;     /* i.e. --help */
+    char const *short_opt;    /* i.e. -h */
+
+    /* What action to take when the option is activated. */
+    fctcl_store_t action;
+
+    /* The help string for the action. */
+    char const *help;
+} fctcl_init_t;
+
+
+/* Use when defining the option list. */
+#define FCTCL_INIT_NULL  \
+    {NULL, NULL, FCTCL_STORE_UNDEFINED, NULL}
+
+
+/*
+--------------------------------------------------------
+FCT COMMAND LINE OPTION (fctcl)
+--------------------------------------------------------
+
+Specifies the command line configuration options. Use this
+to help initialize the fct_clp (command line parser).
+*/
+
+
+/* Handy strings for storing "true" and "false". We can reference
+these strings throughout the parse operation and not have to
+worry about dealing with memory. */
+#define FCTCL_TRUE_STR "1"
+
+
+typedef struct _fctcl_t
+{
+    /* What to parse for this option. --long versus -s. */
+    char *long_opt;     /* i.e. --help */
+    char *short_opt;    /* i.e. -h */
+
+    /* What action to take when the option is activated. */
+    fctcl_store_t action;
+
+    /* The help string for the action. */
+    char *help;
+
+    /* The result. */
+    char *value;
+} fctcl_t;
+
+
+#define fctcl_new()  ((fctcl_t*)calloc(1, sizeof(fctcl_t)))
+
+
+static void
+fctcl__del(fctcl_t *clo)
+{
+    if ( clo == NULL )
+    {
+        return;
+    }
+    if ( clo->long_opt )
+    {
+        free(clo->long_opt);
+    }
+    if ( clo->short_opt)
+    {
+        free(clo->short_opt);
+    }
+    if ( clo->value )
+    {
+        free(clo->value);
+    }
+    if ( clo->help )
+    {
+        free(clo->help);
+    }
+    free(clo);
+}
+
+
+static fctcl_t*
+fctcl_new2(fctcl_init_t const *clo_init)
+{
+    fctcl_t *clone = NULL;
+    int ok =0;
+    clone = fctcl_new();
+    if ( clone == NULL )
+    {
+        return NULL;
+    }
+    clone->action = clo_init->action;
+    if ( clo_init->help == NULL )
+    {
+        clone->help = NULL;
+    }
+    else
+    {
+        clone->help = fctstr_clone(clo_init->help);
+        if ( clone->help == NULL )
+        {
+            ok =0;
+            goto finally;
+        }
+    }
+    if ( clo_init->long_opt == NULL )
+    {
+        clone->long_opt = NULL;
+    }
+    else
+    {
+        clone->long_opt = fctstr_clone(clo_init->long_opt);
+        if ( clone->long_opt == NULL )
+        {
+            ok = 0;
+            goto finally;
+        }
+    }
+    if ( clo_init->short_opt == NULL )
+    {
+        clone->short_opt = NULL;
+    }
+    else
+    {
+        clone->short_opt = fctstr_clone(clo_init->short_opt);
+        if ( clone->short_opt == NULL )
+        {
+            ok =0;
+            goto finally;
+        }
+    }
+    ok = 1;
+finally:
+    if ( !ok )
+    {
+        fctcl__del(clone);
+        clone = NULL;
+    }
+    return clone;
+}
+
+
+static int
+fctcl__is_option(fctcl_t const *clo, char const *option)
+{
+    FCT_ASSERT( clo != NULL );
+    if ( option == NULL )
+    {
+        return 0;
+    }
+    return ((clo->long_opt != NULL
+             && fctstr_eq(clo->long_opt, option))
+            ||
+            (clo->short_opt != NULL
+             && fctstr_eq(clo->short_opt, option))
+           );
+}
+
+
+#define fctcl__set_value(_CLO_, _VAL_) \
+    (_CLO_)->value = fctstr_clone((_VAL_));
+
+/*
+--------------------------------------------------------
+FCT COMMAND PARSER (fct_clp)
+--------------------------------------------------------
+*/
+
+#define FCT_CLP_MAX_ERR_MSG_LEN     256
+
+typedef struct _fct_clp_t
+{
+    /* List of command line options. */
+    fct_nlist_t clo_list;
+
+    /* List of parameters (not options). */
+    fct_nlist_t param_list;
+
+    char error_msg[FCT_CLP_MAX_ERR_MSG_LEN];
+    int is_error;
+} fct_clp_t;
+
+
+static void
+fct_clp__final(fct_clp_t *clp)
+{
+    fct_nlist__final(&(clp->clo_list), (fct_nlist_on_del_t)fctcl__del);
+    fct_nlist__final(&(clp->param_list), (fct_nlist_on_del_t)free);
+}
+
+
+/* Add an configuration options. */
+static int
+fct_clp__add_options(fct_clp_t *clp, fctcl_init_t const *options)
+{
+    fctcl_init_t const *pclo =NULL;
+    int ok;
+    for ( pclo = options; pclo->action != FCTCL_STORE_UNDEFINED; ++pclo )
+    {
+        fctcl_t *cpy = fctcl_new2(pclo);
+        if ( cpy == NULL )
+        {
+            ok = 0;
+            goto finally;
+        }
+        fct_nlist__append(&(clp->clo_list), (void*)cpy);
+    }
+    ok =1;
+finally:
+    return ok;
+}
+
+/* Returns false if we ran out of memory. */
+static int
+fct_clp__init(fct_clp_t *clp, fctcl_init_t const *options)
+{
+    int ok =0;
+    FCT_ASSERT( clp != NULL );
+    /* It is just much saner to manage a clone of the options. Then we know
+    who is in charge of the memory. */
+    ok = fct_nlist__init(&(clp->clo_list));
+    if ( !ok )
+    {
+        goto finally;
+    }
+    if ( options != NULL )
+    {
+        ok = fct_clp__add_options(clp, options);
+        if ( !ok )
+        {
+            goto finally;
+        }
+    }
+    ok = fct_nlist__init(&(clp->param_list));
+    if ( !ok )
+    {
+        goto finally;
+    }
+    ok =1;
+finally:
+    if ( !ok )
+    {
+        fct_clp__final(clp);
+    }
+    return ok;
+}
+
+
+/* Parses the command line arguments. Use fct_clp__is_error and
+fct_clp__get_error to figure out if something went awry. */
+static void
+fct_clp__parse(fct_clp_t *clp, int argc, char const *argv[])
+{
+    int argi =1;
+    int is_option =0;
+    char *arg =NULL;
+    char *token =NULL;
+    char *next_token =NULL;
+
+    clp->error_msg[0] = '\0';
+    clp->is_error =0;
+
+    while ( argi < argc )
+    {
+        is_option =0;
+        token =NULL;
+        next_token = NULL;
+        arg = fctstr_clone(argv[argi]);
+
+#if defined(_MSC_VER) && _MSC_VER > 1300
+        token = strtok_s(arg, "=", &next_token);
+#else
+        token = strtok(arg, "=");
+        next_token = strtok(NULL, "=");
+#endif
+
+        FCT_NLIST_FOREACH_BGN(fctcl_t*, pclo, &(clp->clo_list))
+        {
+            /* Need to reset for each search. strtok below is destructive. */
+            if ( fctcl__is_option(pclo, token) )
+            {
+                is_option =1;
+                if ( pclo->action == FCTCL_STORE_VALUE )
+                {
+                    /* If this is --xxxx=value then the next strtok should succeed.
+                    Otherwise, we need to chew up the next argument. */
+                    if ( next_token != NULL && strlen(next_token) > 0 )
+                    {
+                        fctcl__set_value(pclo, next_token);
+                    }
+                    else
+                    {
+                        ++argi; /* Chew up the next value */
+                        if ( argi >= argc )
+                        {
+                            /* error */
+                            fct_snprintf(
+                                clp->error_msg,
+                                FCT_CLP_MAX_ERR_MSG_LEN,
+                                "missing argument for %s",
+                                token
+                            );
+                            clp->is_error =1;
+                            break;
+                        }
+                        fctcl__set_value(pclo, argv[argi]);
+                    }
+                }
+                else if (pclo->action == FCTCL_STORE_TRUE)
+                {
+                    fctcl__set_value(pclo, FCTCL_TRUE_STR);
+                }
+                else
+                {
+                    FCT_ASSERT("undefined action requested");
+                }
+                break;  /* No need to parse this argument further. */
+            }
+        }
+        FCT_NLIST_FOREACH_END();
+        /* If we have an error, exit. */
+        if ( clp->is_error )
+        {
+            break;
+        }
+        /* If we walked through all the options, and didn't find
+        anything, then we must have a parameter. Forget the fact that
+        an unknown option will be treated like a parameter... */
+        if ( !is_option )
+        {
+            fct_nlist__append(&(clp->param_list), arg);
+            arg =NULL;  /* Owned by the nlist */
+        }
+        ++argi;
+        if ( arg != NULL )
+        {
+            free(arg);
+            arg =NULL;
+        }
+    }
+}
+
+
+static fctcl_t const*
+fct_clp__get_clo(fct_clp_t const *clp, char const *option)
+{
+    fctcl_t const *found =NULL;
+
+    FCT_NLIST_FOREACH_BGN(fctcl_t const*, pclo, &(clp->clo_list))
+    {
+        if ( fctcl__is_option(pclo, option) )
+        {
+            found = pclo;
+            break;
+        }
+    }
+    FCT_NLIST_FOREACH_END();
+    return found;
+}
+
+
+#define fct_clp__optval(_CLP_, _OPTION_) \
+    fct_clp__optval2((_CLP_), (_OPTION_), NULL)
+
+
+/* Returns the value parsed at the command line, and equal to OPTION.
+If the value wasn't parsed, the DEFAULT_VAL is returned instead. */
+static char const*
+fct_clp__optval2(fct_clp_t *clp, char const *option, char const *default_val)
+{
+    fctcl_t const *clo =NULL;
+    FCT_ASSERT( clp != NULL );
+    FCT_ASSERT( option != NULL );
+    clo = fct_clp__get_clo(clp, option);
+    if ( clo == NULL || clo->value == NULL)
+    {
+        return default_val;
+    }
+    return clo->value;
+}
+
+
+
+/* Mainly used for unit tests. */
+static int
+fct_clp__is_param(fct_clp_t *clp, char const *param)
+{
+    if ( clp == NULL || param == NULL )
+    {
+        return 0;
+    }
+    FCT_NLIST_FOREACH_BGN(char *, aparam, &(clp->param_list))
+    {
+        if ( fctstr_eq(aparam, param) )
+        {
+            return 1;
+        }
+    }
+    FCT_NLIST_FOREACH_END();
+    return 0;
+}
+
+
+#define fct_clp__is_error(_CLP_) ((_CLP_)->is_error)
+#define fct_clp__get_error(_CLP_) ((_CLP_)->error_msg);
+
+#define fct_clp__num_clo(_CLP_) \
+    (fct_nlist__size(&((_CLP_)->clo_list)))
+
+#define fct_clp__param_cnt(_CLP_) \
+    (fct_nlist__size(&((_CLP_)->param_list)))
+
+/* Returns a *reference* to the parameter at _IDX_. Do not modify
+its contents. */
+#define fct_clp__param_at(_CLP_, _IDX_) \
+    ((char const*)fct_nlist__at(&((_CLP_)->param_list), (_IDX_)))
+
+
+/* Returns true if the given option was on the command line.
+Use either the long or short option name to check against. */
+#define fct_clp__is(_CLP_, _OPTION_) \
+    (fct_clp__optval((_CLP_), (_OPTION_)) != NULL)
+
+
+
+/*
+--------------------------------------------------------
+FCT NAMESPACE
+--------------------------------------------------------
+
+The macros below start to pollute the watch window with
+lots of "system" variables. This NAMESPACE is an
+attempt to hide all the "system" variables in one place.
+*/
+typedef struct _fct_namespace_t
+{
+    /* The currently active test suite. */
+    fct_ts_t *ts_curr;
+    int ts_is_skip_suite;
+    char const *ts_skip_cndtn;
+
+    /* Current test name. */
+    char const* curr_test_name;
+    fct_test_t *curr_test;
+    const char *test_skip_cndtn;
+    int test_is_skip;
+
+    /* Counts the number of tests in a test suite. */
+    int test_num;
+
+    /* Set at the end of the test suites. */
+    size_t num_total_failed;
+} fct_namespace_t;
+
+
+static void
+fct_namespace_init(fct_namespace_t *ns)
+{
+    FCT_ASSERT( ns != NULL && "invalid argument!");
+    memset(ns, 0, sizeof(fct_namespace_t));
+}
+
+
+/*
+--------------------------------------------------------
+FCT KERNAL
+--------------------------------------------------------
+
+The "fctkern" is a singleton that is defined throughout the
+system.
+*/
+
+struct _fctkern_t
+{
+    /* Holds variables used throughout MACRO MAGIC. In order to reduce
+    the "noise" in the watch window during a debug trace. */
+    fct_namespace_t ns;
+
+    /* Command line parsing. */
+    fct_clp_t cl_parser;
+
+    /* Hold onto the command line arguments. */
+    int cl_argc;
+    char const **cl_argv;
+    /* Track user options. */
+    fctcl_init_t const *cl_user_opts;
+
+    /* Tracks the delay parsing. */
+    int cl_is_parsed;
+
+    /* This is an list of loggers that can be used in the fct system. */
+    fct_nlist_t logger_list;
+
+    /* Array of custom types, you have built-in system ones and you
+    have optionally supplied user ones.. */
+    fct_logger_types_t *lt_usr;
+    fct_logger_types_t *lt_sys;
+
+    /* This is a list of prefix's that can be used to determine if a
+    test is should be run or not. */
+    fct_nlist_t prefix_list;
+
+    /* This is a list of test suites that where generated throughout the
+    testing process. */
+    fct_nlist_t ts_list;
+
+    /* Records what we expect to fail. */
+    size_t num_expected_failures;
+};
+
+
+#define FCT_OPT_VERSION       "--version"
+#define FCT_OPT_VERSION_SHORT "-v"
+#define FCT_OPT_HELP          "--help"
+#define FCT_OPT_HELP_SHORT    "-h"
+#define FCT_OPT_LOGGER        "--logger"
+#define FCT_OPT_LOGGER_SHORT  "-l"
+static fctcl_init_t FCT_CLP_OPTIONS[] =
+{
+    /* Totally unsafe, since we are assuming we can clean out this data,
+    what I need to do is have an "initialization" object, full of
+    const objects. But for now, this should work. */
+    {
+        FCT_OPT_VERSION,
+        FCT_OPT_VERSION_SHORT,
+        FCTCL_STORE_TRUE,
+        "Displays the FCTX version number and exits."
+    },
+    {
+        FCT_OPT_HELP,
+        FCT_OPT_HELP_SHORT,
+        FCTCL_STORE_TRUE,
+        "Shows this help."
+    },
+    {
+        FCT_OPT_LOGGER,
+        FCT_OPT_LOGGER_SHORT,
+        FCTCL_STORE_VALUE,
+        NULL
+    },
+    FCTCL_INIT_NULL /* Sentinel */
+};
+
+typedef fct_logger_i* (*fct_logger_new_fn)(void);
+struct _fct_logger_types_t
+{
+    char const *name;
+    fct_logger_new_fn logger_new_fn;
+    char const *desc;
+};
+
+static fct_logger_types_t FCT_LOGGER_TYPES[] =
+{
+    {
+        "standard",
+        (fct_logger_new_fn)fct_standard_logger_new,
+        "the basic fctx logger"
+    },
+    {
+        "minimal",
+        (fct_logger_new_fn)fct_minimal_logger_new,
+        "the least amount of logging information."
+    },
+    {
+        "junit",
+        (fct_logger_new_fn)fct_junit_logger_new,
+        "junit compatable xml"
+    },
+    {NULL, (fct_logger_new_fn)NULL, NULL} /* Sentinel */
+};
+
+
+/* Returns the number of filters defined for the fct kernal. */
+#define fctkern__filter_cnt(_NK_) (fct_nlist__size(&((_NK_)->prefix_list)))
+
+
+static void
+fctkern__add_logger(fctkern_t *nk, fct_logger_i *logger_owns)
+{
+    FCT_ASSERT(nk != NULL && "invalid arg");
+    FCT_ASSERT(logger_owns != NULL && "invalid arg");
+    fct_nlist__append(&(nk->logger_list), logger_owns);
+}
+
+
+static void
+fctkern__write_help(fctkern_t *nk, FILE *out)
+{
+    fct_clp_t *clp = &(nk->cl_parser);
+    fprintf(out, "test.exe [options] prefix_filter ...\n\n");
+    FCT_NLIST_FOREACH_BGN(fctcl_t*, clo, &(clp->clo_list))
+    {
+        if ( clo->short_opt != NULL )
+        {
+            fprintf(out, "%s, %s\n", clo->short_opt, clo->long_opt);
+        }
+        else
+        {
+            fprintf(out, "%s\n", clo->long_opt);
+        }
+        if ( !fctstr_ieq(clo->long_opt, FCT_OPT_LOGGER) )
+        {
+            /* For now lets not get to fancy with the text wrapping. */
+            fprintf(out, "  %s\n", clo->help);
+        }
+        else
+        {
+            fct_logger_types_t *types[2];
+            int type_i;
+            fct_logger_types_t *itr;
+            types[0] = nk->lt_sys;
+            types[1] = nk->lt_usr;
+            fputs("  Sets the logger. The types of loggers currently "
+                  "available are,\n", out);
+            for (type_i =0; type_i != 2; ++type_i )
+            {
+                for ( itr=types[type_i]; itr && itr->name != NULL; ++itr )
+                {
+                    fprintf(out, "   =%s : %s\n", itr->name, itr->desc);
+                }
+            }
+            fprintf(out, "  default is '%s'.\n", FCT_DEFAULT_LOGGER);
+        }
+    }
+    FCT_NLIST_FOREACH_END();
+    fputs("\n", out);
+}
+
+
+/* Appends a prefix filter that is used to determine if a test can
+be executed or not. If the test starts with the same characters as
+the prefix, then it should be "runnable". The prefix filter must be
+a non-NULL, non-Blank string. */
+static void
+fctkern__add_prefix_filter(fctkern_t *nk, char const *prefix_filter)
+{
+    char *filter =NULL;
+    size_t filter_len =0;
+    FCT_ASSERT( nk != NULL && "invalid arg" );
+    FCT_ASSERT( prefix_filter != NULL && "invalid arg" );
+    FCT_ASSERT( strlen(prefix_filter) > 0 && "invalid arg" );
+    /* First we make a copy of the prefix, then we store it away
+    in our little list. */
+    filter_len = strlen(prefix_filter);
+    filter = (char*)malloc(sizeof(char)*(filter_len+1));
+    fctstr_safe_cpy(filter, prefix_filter, filter_len+1);
+    fct_nlist__append(&(nk->prefix_list), (void*)filter);
+}
+
+
+/* Cleans up the contents of a fctkern. NULL does nothing. */
+static void
+fctkern__final(fctkern_t *nk)
+{
+    if ( nk == NULL )
+    {
+        return;
+    }
+    fct_clp__final(&(nk->cl_parser));
+    fct_nlist__final(&(nk->logger_list), (fct_nlist_on_del_t)fct_logger__del);
+    /* The prefix list is a list of malloc'd strings. */
+    fct_nlist__final(&(nk->prefix_list), (fct_nlist_on_del_t)free);
+    fct_nlist__final(&(nk->ts_list), (fct_nlist_on_del_t)fct_ts__del);
+}
+
+
+#define fctkern__cl_is_parsed(_NK_) ((_NK_)->cl_is_parsed)
+
+
+static int
+fctkern__cl_is(fctkern_t *nk, char const *opt_str)
+{
+    FCT_ASSERT( opt_str != NULL );
+    return opt_str[0] != '\0'
+           && fct_clp__is(&(nk->cl_parser), opt_str);
+}
+
+
+/* Returns the command line value given by OPT_STR. If OPT_STR was not defined
+at the command line, DEF_STR is returned (you can use NULL for the DEF_STR).
+The result returned should not be mofidied, and MAY even be the same pointer
+to DEF_STR. */
+static char const *
+fctkern__cl_val2(fctkern_t *nk, char const *opt_str, char const *def_str)
+{
+    FCT_ASSERT( opt_str != NULL );
+    if ( nk == NULL )
+    {
+        return NULL;
+    }
+    return fct_clp__optval2(&(nk->cl_parser), opt_str, def_str);
+}
+
+
+/* Selects a logger from the list based on the selection name.
+May return NULL if the name doesn't exist in the list. */
+static fct_logger_i*
+fckern_sel_log(fct_logger_types_t *search, char const *sel_logger)
+{
+    fct_logger_types_t *iter;
+    FCT_ASSERT(search != NULL);
+    FCT_ASSERT(sel_logger != NULL);
+    FCT_ASSERT(strlen(sel_logger) > 0);
+    for ( iter = search; iter->name != NULL; ++iter)
+    {
+        if ( fctstr_ieq(iter->name, sel_logger) )
+        {
+            return iter->logger_new_fn();
+        }
+    }
+    return NULL;
+}
+
+static int
+fctkern__cl_parse_config_logger(fctkern_t *nk)
+{
+    fct_logger_i *logger =NULL;
+    char const *sel_logger =NULL;
+    char const *def_logger =FCT_DEFAULT_LOGGER;
+    sel_logger = fctkern__cl_val2(nk, FCT_OPT_LOGGER, def_logger);
+    FCT_ASSERT(sel_logger != NULL && "should never be NULL");
+    /* First search the user selected types, then search the
+    built-in types. */
+    if ( nk->lt_usr != NULL )
+    {
+        logger = fckern_sel_log(nk->lt_usr, sel_logger);
+    }
+    if ( nk->lt_sys != NULL && logger == NULL )
+    {
+        logger = fckern_sel_log(nk->lt_sys, sel_logger);
+    }
+    if ( logger == NULL )
+    {
+        /* No logger configured, you must have supplied an invalid selection. */
+        fprintf(stderr, "error: unknown logger selected - '%s'", sel_logger);
+        return 0;
+    }
+    fctkern__add_logger(nk, logger);
+    logger = NULL;  /* owned by nk. */
+    return 1;
+}
+
+
+
+/* Call this if you want to (re)parse the command line options with a new
+set of options. Returns -1 if you are to abort with EXIT_SUCCESS, returns
+0 if you are to abort with EXIT_FAILURE and returns 1 if you are to continue. */
+static int
+fctkern__cl_parse(fctkern_t *nk)
+{
+    int status =0;
+    size_t num_params =0;
+    size_t param_i =0;
+    if ( nk == NULL )
+    {
+        return 0;
+    }
+    if ( nk->cl_user_opts != NULL )
+    {
+        if ( !fct_clp__add_options(&(nk->cl_parser), nk->cl_user_opts) )
+        {
+            status =0;
+            goto finally;
+        }
+    }
+    /* You want to add the "house options" after the user defined ones. The
+    options are stored as a list so it means that any option listed after
+    the above ones won't get parsed. */
+    if ( !fct_clp__add_options(&(nk->cl_parser), FCT_CLP_OPTIONS) )
+    {
+        status =0;
+        goto finally;
+    }
+    fct_clp__parse(&(nk->cl_parser), nk->cl_argc, nk->cl_argv);
+    if ( fct_clp__is_error(&(nk->cl_parser)) )
+    {
+        char *err = fct_clp__get_error(&(nk->cl_parser));
+        fprintf(stderr, "error: %s", err);
+        status =0;
+        goto finally;
+    }
+    num_params = fct_clp__param_cnt(&(nk->cl_parser));
+    for ( param_i =0; param_i != num_params; ++param_i )
+    {
+        char const *param = fct_clp__param_at(&(nk->cl_parser), param_i);
+        fctkern__add_prefix_filter(nk, param);
+    }
+    if ( fctkern__cl_is(nk, FCT_OPT_VERSION) )
+    {
+        (void)printf("Built using FCTX version %s.\n", FCT_VERSION_STR);
+        status = -1;
+        goto finally;
+    }
+    if ( fctkern__cl_is(nk, FCT_OPT_HELP) )
+    {
+        fctkern__write_help(nk, stdout);
+        status = -1;
+        goto finally;
+    }
+    if ( !fctkern__cl_parse_config_logger(nk) )
+    {
+        status = -1;
+        goto finally;
+    }
+    status =1;
+    nk->cl_is_parsed =1;
+finally:
+    return status;
+}
+
+
+
+/* Parses the command line and sets up the framework. The argc and argv
+should be directly from the program's main. */
+static int
+fctkern__init(fctkern_t *nk, int argc, const char *argv[])
+{
+    if ( argc == 0 && argv == NULL )
+    {
+        return 0;
+    }
+    memset(nk, 0, sizeof(fctkern_t));
+    fct_clp__init(&(nk->cl_parser), NULL);
+    fct_nlist__init(&(nk->logger_list));
+    nk->lt_usr = NULL;  /* Supplied via 'install' mechanics. */
+    nk->lt_sys = FCT_LOGGER_TYPES;
+    fct_nlist__init2(&(nk->prefix_list), 0);
+    fct_nlist__init2(&(nk->ts_list), 0);
+    nk->cl_is_parsed =0;
+    /* Save a copy of the arguments. We do a delay parse of the command
+    line arguments in order to allow the client code to optionally configure
+    the command line parser.*/
+    nk->cl_argc = argc;
+    nk->cl_argv = argv;
+    fct_namespace_init(&(nk->ns));
+    return 1;
+}
+
+
+/* Takes OWNERSHIP of the test suite after we have finished executing
+its contents. This way we can build up all kinds of summaries at the end
+of a run. */
+static void
+fctkern__add_ts(fctkern_t *nk, fct_ts_t *ts)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( ts != NULL );
+    fct_nlist__append(&(nk->ts_list), ts);
+}
+
+
+/* Returns FCT_TRUE if the supplied test_name passes the filters set on
+this test suite. If there are no filters, we return FCT_TRUE always. */
+static nbool_t
+fctkern__pass_filter(fctkern_t *nk, char const *test_name)
+{
+    size_t prefix_i =0;
+    size_t prefix_list_size =0;
+    FCT_ASSERT( nk != NULL && "invalid arg");
+    FCT_ASSERT( test_name != NULL );
+    FCT_ASSERT( strlen(test_name) > 0 );
+    prefix_list_size = fctkern__filter_cnt(nk);
+    /* If there is no filter list, then we return FCT_TRUE always. */
+    if ( prefix_list_size == 0 )
+    {
+        return FCT_TRUE;
+    }
+    /* Iterate through the prefix filter list, and see if we have
+    anything that does not pass. All we require is ONE item that
+    passes the test in order for us to succeed here. */
+    for ( prefix_i = 0; prefix_i != prefix_list_size; ++prefix_i )
+    {
+        char const *prefix = (char const*)fct_nlist__at(
+                                 &(nk->prefix_list), prefix_i
+                             );
+        nbool_t pass = fct_filter_pass(prefix, test_name);
+        if ( pass )
+        {
+            return FCT_TRUE;
+        }
+    }
+    /* Otherwise, we never managed to find a prefix that satisfied the
+    supplied test name. Therefore we have failed to pass to the filter
+    list test. */
+    return FCT_FALSE;
+}
+
+
+/* Returns the number of tests that were performed. */
+static size_t
+fctkern__tst_cnt(fctkern_t const *nk)
+{
+    size_t tally =0;
+    FCT_ASSERT( nk != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
+    {
+        tally += fct_ts__tst_cnt(ts);
+    }
+    FCT_NLIST_FOREACH_END();
+    return tally;
+}
+
+
+/* Returns the number of tests that passed. */
+static size_t
+fctkern__tst_cnt_passed(fctkern_t const *nk)
+{
+    size_t tally =0;
+    FCT_ASSERT( nk != NULL );
+
+    FCT_NLIST_FOREACH_BGN(fct_ts_t*, ts, &(nk->ts_list))
+    {
+        tally += fct_ts__tst_cnt_passed(ts);
+    }
+    FCT_NLIST_FOREACH_END();
+
+    return tally;
+}
+
+
+/* Returns the number of tests that failed. */
+#define fctkern__tst_cnt_failed(nk) \
+    (fctkern__tst_cnt(nk) - fctkern__tst_cnt_passed(nk))
+
+
+/* Returns the number of checks made throughout the entire test. */
+#if defined(FCT_USE_TEST_COUNT)
+static size_t
+fctkern__chk_cnt(fctkern_t const *nk)
+{
+    size_t tally =0;
+    FCT_ASSERT( nk != NULL );
+
+    FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
+    {
+        tally += fct_ts__chk_cnt(ts);
+    }
+    FCT_NLIST_FOREACH_END();
+    return tally;
+}
+#endif /* FCT_USE_TEST_COUNT */
+
+
+/* Indicates the very end of all the tests. */
+#define fctkern__end(nk) /* unused */
+
+
+static void
+fctkern__log_suite_start(fctkern_t *nk, fct_ts_t const *ts)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( ts != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_suite_start(logger, ts);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_suite_end(fctkern_t *nk, fct_ts_t const *ts)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( ts != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_suite_end(logger, ts);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_suite_skip(fctkern_t *nk, char const *condition, char const *name)
+{
+    if ( nk == NULL )
+    {
+        return;
+    }
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_suite_skip(logger, condition, name);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_test_skip(fctkern_t *nk, char const *condition, char const *name)
+{
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_skip(logger, condition, name);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+/* Use this for displaying information about a "Check" (i.e.
+a condition). */
+static void
+fctkern__log_chk(fctkern_t *nk, fctchk_t const *chk)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( chk != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_chk(logger, chk);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+/* Use this for displaying warning messages. */
+static void
+fctkern__log_warn(fctkern_t *nk, char const *warn)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( warn != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_warn(logger, warn);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+/* Called whenever a test is started. */
+static void
+fctkern__log_test_start(fctkern_t *nk, fct_test_t const *test)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( test != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_start(logger, test);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+static void
+fctkern__log_test_end(fctkern_t *nk, fct_test_t *test)
+{
+    FCT_ASSERT( nk != NULL );
+    FCT_ASSERT( test != NULL );
+    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
+    {
+        fct_logger__on_test_end(logger, test);
+    }
+    FCT_NLIST_FOREACH_END();
+}
+
+
+#define fctkern__log_start(_NK_) \
+   {\
+       FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
+       {\
+          fct_logger__on_fctx_start(logger, (_NK_));\
+       }\
+       FCT_NLIST_FOREACH_END();\
+   }
+
+
+#define fctkern__log_end(_NK_) \
+    {\
+       FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
+       {\
+          fct_logger__on_fctx_end(logger, (_NK_));\
+       }\
+       FCT_NLIST_FOREACH_END();\
+    }
+
+
+
+
+/*
+-----------------------------------------------------------
+LOGGER INTERFACE
+
+Defines an interface to a logging system. A logger
+must define the following functions in order to hook
+into the logging system.
+
+See the "Standard Logger" and "Minimal Logger" as examples
+of the implementation.
+-----------------------------------------------------------
+*/
+
+/* Common event argument. The values of the each event may or may not be
+defined depending on the event in question. */
+struct _fct_logger_evt_t
+{
+    fctkern_t const *kern;
+    fctchk_t const *chk;
+    fct_test_t const *test;
+    fct_ts_t const *ts;
+    char const *msg;
+    char const *cndtn;
+    char const *name;
+};
+
+
+typedef struct _fct_logger_i_vtable_t
+{
+    /* 1
+     * Fired when an "fct_chk*" (check) function is completed. The event
+     * will contain a reference to the "chk" object created.
+     * */
+    void (*on_chk)(fct_logger_i *logger, fct_logger_evt_t const *e);
+
+    /* 2
+     * Fired when a test starts and before any checks are made. The
+     * event will have its "test" object set. */
+    void (*on_test_start)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 3 */
+    void (*on_test_end)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 4 */
+    void (*on_test_suite_start)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 5 */
+    void (*on_test_suite_end)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 6 */
+    void (*on_fctx_start)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 7 */
+    void (*on_fctx_end)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 8
+    Called when the logger object must "clean up". */
+    void (*on_delete)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 9 */
+    void (*on_warn)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* -- new in 1.2 -- */
+    /* 10 */
+    void (*on_test_suite_skip)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+    /* 11 */
+    void (*on_test_skip)(
+        fct_logger_i *logger,
+        fct_logger_evt_t const *e
+    );
+} fct_logger_i_vtable_t;
+
+#define _fct_logger_head \
+    fct_logger_i_vtable_t vtable; \
+    fct_logger_evt_t evt
+
+struct _fct_logger_i
+{
+    _fct_logger_head;
+};
+
+
+static void
+fct_logger__stub(fct_logger_i *l, fct_logger_evt_t const *e)
+{
+    fct_unused(l);
+    fct_unused(e);
+}
+
+
+static fct_logger_i_vtable_t fct_logger_default_vtable =
+{
+    fct_logger__stub,   /* 1.  on_chk */
+    fct_logger__stub,   /* 2.  on_test_start */
+    fct_logger__stub,   /* 3.  on_test_end */
+    fct_logger__stub,   /* 4.  on_test_suite_start */
+    fct_logger__stub,   /* 5.  on_test_suite_end */
+    fct_logger__stub,   /* 6.  on_fctx_start */
+    fct_logger__stub,   /* 7.  on_fctx_end */
+    fct_logger__stub,   /* 8.  on_delete */
+    fct_logger__stub,   /* 9.  on_warn */
+    fct_logger__stub,   /* 10. on_test_suite_skip */
+    fct_logger__stub,   /* 11. on_test_skip */
+};
+
+
+/* Initializes the elements of a logger interface so they are at their
+standard values. */
+static void
+fct_logger__init(fct_logger_i *logger)
+{
+    FCT_ASSERT( logger != NULL );
+    memcpy(
+        &(logger->vtable),
+        &fct_logger_default_vtable,
+        sizeof(fct_logger_i_vtable_t)
+    );
+    memset(&(logger->evt),0, sizeof(fct_logger_evt_t));
+}
+
+static void
+fct_logger__del(fct_logger_i *logger)
+{
+    if ( logger )
+    {
+        logger->vtable.on_delete(logger, &(logger->evt));
+    }
+}
+
+
+static void
+fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test)
+{
+    logger->evt.test = test;
+    logger->vtable.on_test_start(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test)
+{
+    logger->evt.test = test;
+    logger->vtable.on_test_end(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts)
+{
+    logger->evt.ts = ts;
+    logger->vtable.on_test_suite_start(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts)
+{
+    logger->evt.ts = ts;
+    logger->vtable.on_test_suite_end(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_suite_skip(
+    fct_logger_i *logger,
+    char const *condition,
+    char const *name
+)
+{
+    logger->evt.cndtn = condition;
+    logger->evt.name = name;
+    logger->vtable.on_test_suite_skip(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_test_skip(
+    fct_logger_i *logger,
+    char const *condition,
+    char const *name
+)
+{
+    logger->evt.cndtn = condition;
+    logger->evt.name = name;
+    logger->vtable.on_test_skip(logger, &(logger->evt));
+}
+
+
+static void
+fct_logger__on_chk(fct_logger_i *logger, fctchk_t const *chk)
+{
+    logger->evt.chk = chk;
+    logger->vtable.on_chk(logger, &(logger->evt));
+}
+
+/* When we start all our tests. */
+#define fct_logger__on_fctx_start(LOGGER, KERN) \
+   (LOGGER)->evt.kern = (KERN);\
+   (LOGGER)->vtable.on_fctx_start((LOGGER), &((LOGGER)->evt));
+
+
+/* When we have reached the end of ALL of our testing. */
+#define fct_logger__on_fctx_end(LOGGER, KERN) \
+    (LOGGER)->evt.kern = (KERN);\
+    (LOGGER)->vtable.on_fctx_end((LOGGER), &((LOGGER)->evt));
+
+
+static void
+fct_logger__on_warn(fct_logger_i *logger, char const *msg)
+{
+    logger->evt.msg = msg;
+    logger->vtable.on_warn(logger, &(logger->evt));
+}
+
+
+/* Commmon routine to record strings representing failures. The
+chk should be a failure before we call this, and the list is a list
+of char*'s that will eventually be free'd by the logger. */
+static void
+fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list)
+{
+    /* For now we will truncate the string to some set amount, later
+    we can work out a dynamic string object. */
+    char *str = (char*)malloc(sizeof(char)*FCT_MAX_LOG_LINE);
+    FCT_ASSERT( str != NULL );
+    fct_snprintf(
+        str,
+        FCT_MAX_LOG_LINE,
+        "%s(%d):\n    %s",
+        fctchk__file(chk),
+        fctchk__lineno(chk),
+        fctchk__msg(chk)
+    );
+    /* Append it to the listing ... */
+    fct_nlist__append(fail_list, (void*)str);
+}
+
+
+/* Another common routine, to print the failures at the end of a run. */
+static void
+fct_logger_print_failures(fct_nlist_t const *fail_list)
+{
+    puts(
+        "\n----------------------------------------------------------------------------\n"
+    );
+    puts("FAILED TESTS\n\n");
+    FCT_NLIST_FOREACH_BGN(char *, cndtn_str, fail_list)
+    {
+        printf("%s\n", cndtn_str);
+    }
+    FCT_NLIST_FOREACH_END();
+
+    puts("\n");
+}
+
+
+
+
+/*
+-----------------------------------------------------------
+MINIMAL LOGGER
+-----------------------------------------------------------
+
+At the moment the MINIMAL LOGGER is currently disabled. Hope
+to bring it back online soon. The only reason it is
+disabled is that we don't currently have the ability to specify
+loggers.
+*/
+
+
+/* Minimal logger, reports the minimum amount of information needed
+to determine "something is happening". */
+struct _fct_minimal_logger_t
+{
+    _fct_logger_head;
+    /* A list of char*'s that needs to be cleaned up. */
+    fct_nlist_t failed_cndtns_list;
+};
+
+
+static void
+fct_minimal_logger__on_chk(
+    fct_logger_i *self_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+    if ( fctchk__is_pass(e->chk) )
+    {
+        fputs(".", stdout);
+    }
+    else
+    {
+        fputs("x", stdout);
+        fct_logger_record_failure(e->chk, &(self->failed_cndtns_list));
+
+    }
+}
+
+static void
+fct_minimal_logger__on_fctx_end(
+    fct_logger_i *self_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+    fct_unused(e);
+    if ( fct_nlist__size(&(self->failed_cndtns_list)) >0 )
+    {
+        fct_logger_print_failures(&(self->failed_cndtns_list));
+    }
+}
+
+
+static void
+fct_minimal_logger__on_delete(
+    fct_logger_i *self_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
+    fct_unused(e);
+    fct_nlist__final(&(self->failed_cndtns_list), free);
+    free(self);
+
+}
+
+
+fct_logger_i*
+fct_minimal_logger_new(void)
+{
+    fct_minimal_logger_t *self = (fct_minimal_logger_t*)\
+                                 calloc(1,sizeof(fct_minimal_logger_t));
+    if ( self == NULL )
+    {
+        return NULL;
+    }
+    fct_logger__init((fct_logger_i*)self);
+    self->vtable.on_chk = fct_minimal_logger__on_chk;
+    self->vtable.on_fctx_end = fct_minimal_logger__on_fctx_end;
+    self->vtable.on_delete = fct_minimal_logger__on_delete;
+    fct_nlist__init2(&(self->failed_cndtns_list), 0);
+    return (fct_logger_i*)self;
+}
+
+
+/*
+-----------------------------------------------------------
+STANDARD LOGGER
+-----------------------------------------------------------
+*/
+
+struct _fct_standard_logger_t
+{
+    _fct_logger_head;
+
+    /* Start time. For now we use the low-accuracy time_t version. */
+    fct_timer_t timer;
+
+    /* A list of char*'s that needs to be cleaned up. */
+    fct_nlist_t failed_cndtns_list;
+};
+
+
+#define FCT_STANDARD_LOGGER_MAX_LINE 68
+
+
+/* When a failure occurrs, we will record the details so we can display
+them when the log "finishes" up. */
+static void
+fct_standard_logger__on_chk(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+    /* Only record failures. */
+    if ( !fctchk__is_pass(e->chk) )
+    {
+        fct_logger_record_failure(e->chk, &(logger->failed_cndtns_list));
+    }
+}
+
+
+static void
+fct_standard_logger__on_test_skip(
+    fct_logger_i* logger_,
+    fct_logger_evt_t const *e
+)
+{
+    char const *condition = e->cndtn;
+    char const *name = e->name;
+    char msg[256] = {'\0'};
+    fct_unused(logger_);
+    fct_unused(condition);
+    fct_snprintf(msg, sizeof(msg), "%s (%s)", name, condition);
+    msg[sizeof(msg)-1] = '\0';
+    fct_dotted_line_start(FCT_STANDARD_LOGGER_MAX_LINE, msg);
+    fct_dotted_line_end("- SKIP -");
+}
+
+
+static void
+fct_standard_logger__on_test_start(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_unused(logger_);
+    fct_dotted_line_start(
+        FCT_STANDARD_LOGGER_MAX_LINE,
+        fct_test__name(e->test)
+    );
+}
+
+
+static void
+fct_standard_logger__on_test_end(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    nbool_t is_pass;
+    fct_unused(logger_);
+    is_pass = fct_test__is_pass(e->test);
+    fct_dotted_line_end((is_pass) ? "PASS" : "FAIL ***" );
+}
+
+
+static void
+fct_standard_logger__on_fctx_start(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+    fct_unused(e);
+    fct_timer__start(&(logger->timer));
+}
+
+
+static void
+fct_standard_logger__on_fctx_end(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+    nbool_t is_success =1;
+    double elasped_time =0;
+    size_t num_tests =0;
+    size_t num_passed =0;
+
+    fct_timer__stop(&(logger->timer));
+
+    is_success = fct_nlist__size(&(logger->failed_cndtns_list)) ==0;
+
+    if (  !is_success )
+    {
+        fct_logger_print_failures(&(logger->failed_cndtns_list));
+    }
+    puts(
+        "\n----------------------------------------------------------------------------\n"
+    );
+    num_tests = fctkern__tst_cnt(e->kern);
+    num_passed = fctkern__tst_cnt_passed(e->kern);
+    printf(
+        "%s (%lu/%lu tests",
+        (is_success) ? "PASSED" : "FAILED",
+        (unsigned long) num_passed,
+        (unsigned long) num_tests
+    );
+    elasped_time = fct_timer__duration(&(logger->timer));
+    if ( elasped_time > 0.0000001 )
+    {
+        printf(" in %.6fs)\n", elasped_time);
+    }
+    else
+    {
+        /* Don't bother displaying the time to execute. */
+        puts(")\n");
+    }
+}
+
+
+static void
+fct_standard_logger__on_delete(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
+    fct_unused(e);
+    fct_nlist__final(&(logger->failed_cndtns_list), free);
+    free(logger);
+    logger_ =NULL;
+}
+
+
+static void
+fct_standard_logger__on_warn(
+    fct_logger_i* logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_unused(logger_);
+    (void)printf("WARNING: %s", e->msg);
+}
+
+
+fct_logger_i*
+fct_standard_logger_new(void)
+{
+    fct_standard_logger_t *logger = (fct_standard_logger_t *)calloc(
+                                        1, sizeof(fct_standard_logger_t)
+                                    );
+    if ( logger == NULL )
+    {
+        return NULL;
+    }
+    fct_logger__init((fct_logger_i*)logger);
+    logger->vtable.on_chk = fct_standard_logger__on_chk;
+    logger->vtable.on_test_start = fct_standard_logger__on_test_start;
+    logger->vtable.on_test_end = fct_standard_logger__on_test_end;
+    logger->vtable.on_fctx_start = fct_standard_logger__on_fctx_start;
+    logger->vtable.on_fctx_end = fct_standard_logger__on_fctx_end;
+    logger->vtable.on_delete = fct_standard_logger__on_delete;
+    logger->vtable.on_warn = fct_standard_logger__on_warn;
+    logger->vtable.on_test_skip = fct_standard_logger__on_test_skip;
+    fct_nlist__init2(&(logger->failed_cndtns_list), 0);
+    fct_timer__init(&(logger->timer));
+    return (fct_logger_i*)logger;
+}
+
+
+/*
+-----------------------------------------------------------
+JUNIT LOGGER
+-----------------------------------------------------------
+*/
+
+
+/* JUnit logger */
+struct _fct_junit_logger_t
+{
+    _fct_logger_head;
+};
+
+
+static void
+fct_junit_logger__on_test_suite_start(
+    fct_logger_i *l,
+    fct_logger_evt_t const *e
+)
+{
+    fct_unused(l);
+    fct_unused(e);
+    FCT_SWITCH_STDOUT_TO_BUFFER();
+    FCT_SWITCH_STDERR_TO_BUFFER();
+}
+
+
+static void
+fct_junit_logger__on_test_suite_end(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_ts_t const *ts = e->ts; /* Test Suite */
+    nbool_t is_pass;
+    double elasped_time = 0;
+    char std_buffer[1024];
+    int read_length;
+    int first_out_line;
+
+    fct_unused(logger_);
+
+    elasped_time = fct_ts__duration(ts);
+
+    FCT_SWITCH_STDOUT_TO_STDOUT();
+    FCT_SWITCH_STDERR_TO_STDERR();
+
+    /* opening testsuite tag */
+    printf("\t<testsuite errors=\"%lu\" failures=\"0\" tests=\"%lu\" "
+           "name=\"%s\" time=\"%.4f\">\n",
+           (unsigned long)   fct_ts__tst_cnt(ts)
+           - fct_ts__tst_cnt_passed(ts),
+           (unsigned long) fct_ts__tst_cnt(ts),
+           fct_ts__name(ts),
+           elasped_time);
+
+    FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
+    {
+        is_pass = fct_test__is_pass(test);
+
+        /* opening testcase tag */
+        if (is_pass)
+        {
+            printf("\t\t<testcase name=\"%s\" time=\"%.3f\"",
+                   fct_test__name(test),
+                   fct_test__duration(test)
+                  );
+        }
+        else
+        {
+            printf("\t\t<testcase name=\"%s\" time=\"%.3f\">\n",
+                   fct_test__name(test),
+                   fct_test__duration(test)
+                  );
+        }
+
+        FCT_NLIST_FOREACH_BGN(fctchk_t*, chk, &(test->failed_chks))
+        {
+            /* error tag */
+            printf("\t\t\t<error message=\"%s\" "
+                   "type=\"fctx\">", chk->msg);
+            printf("file:%s, line:%d", chk->file, chk->lineno);
+            printf("</error>\n");
+        }
+        FCT_NLIST_FOREACH_END();
+
+        /* closing testcase tag */
+        if (is_pass)
+        {
+            printf(" />\n");
+        }
+        else
+        {
+            printf("\t\t</testcase>\n");
+        }
+    }
+    FCT_NLIST_FOREACH_END();
+
+    /* print the std streams */
+    first_out_line = 1;
+    printf("\t\t<system-out>\n\t\t\t<![CDATA[");
+    while ( (read_length = _fct_read(fct_stdout_pipe[0], std_buffer, 1024)) > 0)
+    {
+        if (first_out_line)
+        {
+            printf("\n");
+            first_out_line = 0;
+        }
+        printf("%.*s", read_length, std_buffer);
+    }
+    printf("]]>\n\t\t</system-out>\n");
+
+    first_out_line = 1;
+    printf("\t\t<system-err>\n\t\t\t<![CDATA[");
+    while ((read_length = _fct_read(fct_stderr_pipe[0], std_buffer, 1024)) > 0)
+    {
+        if (first_out_line)
+        {
+            printf("\n");
+            first_out_line = 0;
+        }
+        printf("%.*s", read_length, std_buffer);
+    }
+    printf("]]>\n\t\t</system-err>\n");
+
+    /* closing testsuite tag */
+    printf("\t</testsuite>\n");
+}
+
+static void
+fct_junit_logger__on_fct_start(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_unused(logger_);
+    fct_unused(e);
+    printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+    printf("<testsuites>\n");
+}
+
+static void
+fct_junit_logger__on_fctx_end(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_unused(logger_);
+    fct_unused(e);
+    printf("</testsuites>\n");
+}
+
+static void
+fct_junit_logger__on_delete(
+    fct_logger_i *logger_,
+    fct_logger_evt_t const *e
+)
+{
+    fct_junit_logger_t *logger = (fct_junit_logger_t*)logger_;
+    fct_unused(e);
+    free(logger);
+    logger_ =NULL;
+}
+
+
+fct_junit_logger_t *
+fct_junit_logger_new(void)
+{
+    fct_junit_logger_t *logger =
+        (fct_junit_logger_t *)calloc(1, sizeof(fct_junit_logger_t));
+    if ( logger == NULL )
+    {
+        return NULL;
+    }
+    fct_logger__init((fct_logger_i*)logger);
+    logger->vtable.on_test_suite_start = fct_junit_logger__on_test_suite_start;
+    logger->vtable.on_test_suite_end = fct_junit_logger__on_test_suite_end;
+    logger->vtable.on_fctx_start = fct_junit_logger__on_fct_start;
+    logger->vtable.on_fctx_end = fct_junit_logger__on_fctx_end;
+    logger->vtable.on_delete = fct_junit_logger__on_delete;
+    return logger;
+}
+
+
+/*
+------------------------------------------------------------
+MACRO MAGIC
+------------------------------------------------------------
+This is where the show begins!
+*/
+
+/* This macro invokes a bunch of functions that need to be referenced in
+order to avoid  a "unreferenced local function has been removed" warning.
+The logical acrobatics below try and make it appear to the compiler that
+they are needed, but at runtime, only the cheap, first call is made. */
+#define FCT_REFERENCE_FUNCS() \
+    {\
+        int check = 0 && fctstr_ieq(NULL, NULL);\
+        if ( check ) {\
+            _fct_cmt("not to be executed");\
+            (void)_fct_chk_empty_str(NULL);\
+            (void)_fct_chk_full_str(NULL);\
+            (void)fct_test__start_timer(NULL);\
+            (void)fct_test__stop_timer(NULL);\
+            (void)fct_ts_new(NULL);\
+            (void)fct_ts__test_begin(NULL);\
+            (void)fct_ts__add_test(NULL, NULL);\
+            (void)fct_ts__test_end(NULL);\
+            (void)fct_ts__inc_total_test_num(NULL);\
+            (void)fct_ts__make_abort_test(NULL);\
+            (void)fct_ts__setup_abort(NULL);\
+            (void)fct_ts__setup_end(NULL);\
+            (void)fct_ts__teardown_end(NULL);\
+            (void)fct_ts__cnt_end(NULL);\
+            (void)fct_ts__is_test_cnt(NULL, 0);\
+            (void)fct_xchk_fn(0, "");\
+            (void)fct_xchk2_fn(NULL, 0, "");\
+            (void)fctkern__cl_parse(NULL);\
+            (void)fctkern__add_ts(NULL, NULL);\
+            (void)fctkern__pass_filter(NULL, NULL);\
+            (void)fctkern__log_suite_start(NULL, NULL);\
+            (void)fctkern__log_suite_end(NULL, NULL);\
+            (void)fctkern__log_test_skip(NULL, NULL, NULL);\
+            (void)fctkern__log_test_start(NULL, NULL);\
+            (void)fctkern__log_test_end(NULL, NULL);\
+            (void)fctstr_endswith(NULL,NULL);\
+            (void)fctstr_iendswith(NULL,NULL);\
+            (void)fctstr_ieq(NULL,NULL);\
+            (void)fctstr_incl(NULL, NULL);\
+            (void)fctstr_iincl(NULL, NULL);\
+            (void)fctstr_iendswith(NULL,NULL);\
+            (void)fctstr_istartswith(NULL,NULL);\
+            (void)fctstr_clone_lower(NULL);\
+            (void)fctstr_startswith(NULL,NULL);\
+            (void)fctkern__init(NULL, 0, NULL);\
+            (void)fctkern__cl_is(NULL, "");\
+            (void)fctkern__cl_val2(NULL, NULL, NULL);\
+            fctkern__log_suite_skip(NULL, NULL, NULL);\
+            (void)fct_clp__is_param(NULL,NULL);\
+	    _fct_cmt("should never construct an object");\
+            (void)fct_test_new(NULL);\
+            (void)fct_ts__chk_cnt(NULL);\
+        }\
+    }
+
+
+#define FCT_INIT(_ARGC_, _ARGV_)                                    \
+   fctkern_t  fctkern__;                                            \
+   fctkern_t* fctkern_ptr__ = &fctkern__;                           \
+   FCT_REFERENCE_FUNCS();                                           \
+   if ( !fctkern__init(fctkern_ptr__, argc, (const char **)argv) ) {\
+        (void)fprintf(                                              \
+            stderr, "FATAL ERROR: Unable to initialize FCTX Kernel."\
+        );                                                          \
+        exit(EXIT_FAILURE);                                         \
+   }                                                                \
+
+
+#define FCT_FINAL()                                                \
+   fctkern_ptr__->ns.num_total_failed = fctkern__tst_cnt_failed(   \
+            (fctkern_ptr__)                                        \
+           );                                                      \
+   fctkern__log_end(fctkern_ptr__);                                \
+   fctkern__end(fctkern_ptr__);                                    \
+   fctkern__final(fctkern_ptr__);                                  \
+   FCT_ASSERT( !((int)fctkern_ptr__->ns.num_total_failed < 0)      \
+               && "or we got truncated!");                         \
+   if ( fctkern_ptr__->ns.num_total_failed ==                      \
+        fctkern_ptr__->num_expected_failures) {                    \
+       fctkern_ptr__->ns.num_total_failed = 0;                     \
+   }                                                               \
+   
+
+
+#define FCT_NUM_FAILED()       \
+    fctkern_ptr__->ns.num_total_failed \
+    
+
+
+/* Typically used internally only, this mentions to FCTX that you EXPECT
+to _NUM_FAILS_. If you the expected matches the actual, a 0 value is returned
+from the program. */
+#define FCT_EXPECTED_FAILURES(_NUM_FAILS_) \
+    ((fctkern_ptr__->num_expected_failures = (_NUM_FAILS_)))
+
+
+#define FCT_BGN_FN(_FNNAME_)            \
+    int _FNNAME_(int argc, char* argv[])\
+    {                                   \
+        FCT_INIT(argc, argv)
+ 
+#define FCT_END_FN() FCT_END()
+
+/* This defines our start. The fctkern__ is a kernal object
+that lives throughout the lifetime of our program. The
+fctkern_ptr__ makes it easier to abstract out macros.  */
+#define FCT_BGN() FCT_BGN_FN(main)
+
+
+/* Silence Intel complaints about unspecified operand order in user's code */
+#ifndef __INTEL_COMPILER
+# define FCT_END_WARNINGFIX_BGN
+# define FCT_END_WARNINGFIX_END
+#else
+# define FCT_END_WARNINGFIX_BGN _Pragma("warning(push,disable:981)");
+# define FCT_END_WARNINGFIX_END _Pragma("warning(pop)");
+#endif
+
+/* Ends the test suite by returning the number failed. The "chk_cnt" call is
+made in order allow strict compilers to pass when it encounters unreferenced
+functions. */
+#define FCT_END()             \
+   {                          \
+      FCT_END_WARNINGFIX_BGN  \
+      FCT_FINAL();            \
+      return FCT_NUM_FAILED();\
+      FCT_END_WARNINGFIX_END  \
+   }\
+}
+
+#define fctlog_install(_CUST_LOGGER_LIST_) \
+    fctkern_ptr__->lt_usr = (_CUST_LOGGER_LIST_)
+
+/* Re-parses the command line options with the addition of user defined
+options. */
+#define fctcl_install(_CLO_INIT_) \
+    {\
+        fctkern_ptr__->cl_user_opts = (_CLO_INIT_);\
+        _fct_cmt("Delay parse in order to allow for user customization.");\
+        if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
+              int status = fctkern__cl_parse((fctkern_ptr__));\
+              _fct_cmt("Need to parse command line before we start logger.");\
+              fctkern__log_start((fctkern_ptr__));\
+              switch( status ) {\
+              case -1:\
+              case 0:\
+                  fctkern__final(fctkern_ptr__);\
+                  exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
+                  break;\
+              default:\
+                  fct_pass();\
+              }\
+          }\
+    }
+
+
+#define fctcl_is(_OPT_STR_) (fctkern__cl_is(fctkern_ptr__, (_OPT_STR_)))
+
+#define fctcl_val(_OPT_STR_) (fctcl_val2((_OPT_STR_), NULL))
+
+#define fctcl_val2(_OPT_STR_, _DEF_STR_) \
+   (fctkern__cl_val2(fctkern_ptr__, (_OPT_STR_), (_DEF_STR_)))
+
+
+/* We delay the first parse of the command line until we get the first
+test fixture. This allows the user to possibly add their own parse
+specification. */
+#define FCT_FIXTURE_SUITE_BGN(_NAME_) \
+   {\
+      fctkern_ptr__->ns.ts_curr = fct_ts_new( #_NAME_ );\
+      _fct_cmt("Delay parse in order to allow for user customization.");\
+      if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
+          int status = fctkern__cl_parse((fctkern_ptr__));\
+          _fct_cmt("Need to parse command line before we start logger.");\
+          fctkern__log_start((fctkern_ptr__));\
+          switch( status ) {\
+          case -1:\
+          case 0:\
+              fct_ts__del((fctkern_ptr__->ns.ts_curr));\
+              fctkern__final(fctkern_ptr__);\
+              exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
+              break;\
+          default:\
+              fct_pass();\
+          }\
+      }\
+      if ( fctkern_ptr__->ns.ts_curr == NULL ) {\
+         fctkern__log_warn((fctkern_ptr__), "out of memory");\
+      }\
+      else\
+      {\
+         fctkern__log_suite_start((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+         for (;;)\
+         {\
+             fctkern_ptr__->ns.test_num = -1;\
+             if ( fct_ts__is_ending_mode(fctkern_ptr__->ns.ts_curr) \
+                  || fct_ts__is_abort_mode(fctkern_ptr__->ns.ts_curr) )\
+             {\
+               _fct_cmt("flag the test suite as complete.");\
+               fct_ts__end(fctkern_ptr__->ns.ts_curr);\
+               break;\
+             }
+
+
+
+/*  Closes off a "Fixture" test suite. */
+#define FCT_FIXTURE_SUITE_END() \
+             if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
+             {\
+                fct_ts__cnt_end(fctkern_ptr__->ns.ts_curr);\
+             }\
+          }\
+          fctkern__add_ts((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+          fctkern__log_suite_end((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
+          fct_ts__end(fctkern_ptr__->ns.ts_curr);\
+          fctkern_ptr__->ns.ts_curr = NULL;\
+          }\
+      }
+
+#define FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, _NAME_) \
+    fctkern_ptr__->ns.ts_is_skip_suite = !(_CONDITION_);\
+    fctkern_ptr__->ns.ts_skip_cndtn = #_CONDITION_;\
+    if ( fctkern_ptr__->ns.ts_is_skip_suite ) {\
+       fctkern__log_suite_skip((fctkern_ptr__), #_CONDITION_, #_NAME_);\
+    }\
+    FCT_FIXTURE_SUITE_BGN(_NAME_);
+
+#define FCT_FIXTURE_SUITE_END_IF() \
+    FCT_FIXTURE_SUITE_END();\
+    fctkern_ptr__->ns.ts_is_skip_suite =0;\
+    fctkern_ptr__->ns.ts_skip_cndtn =NULL;\
+ 
+#define FCT_SETUP_BGN()\
+   if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) ) {
+
+#define FCT_SETUP_END() \
+   fct_ts__setup_end(fctkern_ptr__->ns.ts_curr); }
+
+#define FCT_TEARDOWN_BGN() \
+   if ( fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) {\
+ 
+#define FCT_TEARDOWN_END() \
+   fct_ts__teardown_end(fctkern_ptr__->ns.ts_curr); \
+   continue; \
+   }
+
+/* Lets you create a test suite, where maybe you don't want a fixture. We
+do it by 'stubbing' out the setup/teardown logic. */
+#define FCT_SUITE_BGN(Name) \
+   FCT_FIXTURE_SUITE_BGN(Name) {\
+   FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
+   FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
+ 
+#define FCT_SUITE_END() } FCT_FIXTURE_SUITE_END()
+
+#define FCT_SUITE_BGN_IF(_CONDITION_, _NAME_) \
+    FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, (_NAME_)) {\
+    FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
+    FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
+ 
+#define FCT_SUITE_END_IF() } FCT_FIXTURE_SUITE_END_IF()
+
+typedef enum
+{
+    FCT_TEST_END_FLAG_Default    = 0x0000,
+    FCT_TEST_END_FLAG_ClearFail  = 0x0001
+} FCT_TEST_END_FLAG;
+
+
+#define FCT_TEST_BGN_IF(_CONDITION_, _NAME_) { \
+    fctkern_ptr__->ns.test_is_skip = !(_CONDITION_);\
+    fctkern_ptr__->ns.test_skip_cndtn = #_CONDITION_;\
+    FCT_TEST_BGN(_NAME_) {\
+ 
+#define FCT_TEST_END_IF() \
+    } FCT_TEST_END();\
+    fctkern_ptr__->ns.test_is_skip = 0;\
+    fctkern_ptr__->ns.test_skip_cndtn = NULL;\
+    }
+
+
+/* Depending on whether or not we are counting the tests, we will have to
+first determine if the test is the "current" count. Then we have to determine
+if we can pass the filter. Finally we will execute everything so that when a
+check fails, we can "break" out to the end of the test. And in between all
+that we do a memory check and fail a test if we can't build a fct_test
+object (should be rare). */
+#define FCT_TEST_BGN(_NAME_) \
+         {\
+            fctkern_ptr__->ns.curr_test_name = #_NAME_;\
+            ++(fctkern_ptr__->ns.test_num);\
+            if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
+            {\
+               fct_ts__inc_total_test_num(fctkern_ptr__->ns.ts_curr);\
+            }\
+            else if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) \
+                      && fct_ts__is_test_cnt(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.test_num) )\
+            {\
+               fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
+               if ( fctkern__pass_filter(fctkern_ptr__,  fctkern_ptr__->ns.curr_test_name ) )\
+               {\
+                  fctkern_ptr__->ns.curr_test = fct_test_new( fctkern_ptr__->ns.curr_test_name );\
+                  if ( fctkern_ptr__->ns.curr_test  == NULL ) {\
+                    fctkern__log_warn(fctkern_ptr__, "out of memory");\
+                  } else if ( fctkern_ptr__->ns.ts_is_skip_suite \
+                              || fctkern_ptr__->ns.test_is_skip ) {\
+                       fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
+                       fctkern__log_test_skip(\
+                            fctkern_ptr__,\
+                            fctkern_ptr__->ns.curr_test_name,\
+                            (fctkern_ptr__->ns.test_is_skip) ?\
+                                (fctkern_ptr__->ns.test_skip_cndtn) :\
+                                (fctkern_ptr__->ns.ts_skip_cndtn)\
+                       );\
+                       fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
+                       continue;\
+                 } else {\
+                      fctkern__log_test_start(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
+                      fct_test__start_timer(fctkern_ptr__->ns.curr_test);\
+                      for (;;) \
+                      {
+
+
+
+
+#define FCT_TEST_END() \
+                         break;\
+                      }\
+                      fct_test__stop_timer(fctkern_ptr__->ns.curr_test);\
+                 }\
+                 fct_ts__add_test(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test);\
+                 fctkern__log_test_end(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
+               }\
+               fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
+               continue;\
+            }\
+         }\
+ 
+
+
+/*
+---------------------------------------------------------
+CHECKING MACROS
+----------------------------------------------------------
+
+The chk variants will continue on while the req variants will abort
+a test if a chk condition fails. The req variants are useful when you
+no longer want to keep checking conditions because a critical condition
+is not being met. */
+
+
+/* To support older compilers that do not have macro variable argument lists
+we have to use a function. The macro manages to store away the line/file
+location into a global before it runs this function, a trick I picked up from
+the error handling in the APR library. The unfortunate thing is that we can
+not carry forth the actual test through a "stringize" operation, but if you
+wanted to do that you should use fct_chk. */
+
+static int fct_xchk_lineno =0;
+static char const *fct_xchk_file = NULL;
+static fct_test_t *fct_xchk_test = NULL;
+static fctkern_t *fct_xchk_kern =NULL;
+
+
+static int
+_fct_xchk_fn_varg(
+    char const *condition,
+    int is_pass,
+    char const *format,
+    va_list args
+)
+{
+    fctchk_t *chk =NULL;
+    chk = fctchk_new(
+              is_pass,
+              condition,
+              fct_xchk_file,
+              fct_xchk_lineno,
+              format,
+              args
+          );
+    if ( chk == NULL )
+    {
+        fctkern__log_warn(fct_xchk_kern, "out of memory (aborting test)");
+        goto finally;
+    }
+
+    fct_test__add(fct_xchk_test, chk);
+    fctkern__log_chk(fct_xchk_kern, chk);
+finally:
+    fct_xchk_lineno =0;
+    fct_xchk_file =NULL;
+    fct_xchk_test =NULL;
+    fct_xchk_kern =NULL;
+    return is_pass;
+}
+
+
+static int
+fct_xchk2_fn(const char *condition, int is_pass, char const *format, ...)
+{
+    int r =0;
+    va_list args;
+    va_start(args, format);
+    r = _fct_xchk_fn_varg(condition, is_pass, format, args);
+    va_end(args);
+    return r;
+}
+
+
+static int
+fct_xchk_fn(int is_pass, char const *format, ...)
+{
+    int r=0;
+    va_list args;
+    va_start(args, format);
+    r = _fct_xchk_fn_varg("<none-from-xchk>", is_pass, format, args);
+    va_end(args);
+    return r;
+}
+
+
+/* Call this with the following argument list:
+
+   fct_xchk(test_condition, format_str, ...)
+
+the bulk of this macro presets some globals to allow us to support
+variable argument lists on older compilers. The idea came from the APR
+libraries error checking routines. */
+#define fct_xchk  fct_xchk_kern = fctkern_ptr__,\
+                  fct_xchk_test = fctkern_ptr__->ns.curr_test,\
+                  fct_xchk_lineno =__LINE__,\
+                  fct_xchk_file=__FILE__,\
+                  fct_xchk_fn
+
+#define fct_xchk2  fct_xchk_kern = fctkern_ptr__,\
+                   fct_xchk_test = fctkern_ptr__->ns.curr_test,\
+                   fct_xchk_lineno =__LINE__,\
+                   fct_xchk_file=__FILE__,\
+                   fct_xchk2_fn
+
+
+/* This checks the condition and reports the condition as a string
+if it fails. */
+#define fct_chk(_CNDTN_)  (fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_))
+
+#define _fct_req(_CNDTN_)  \
+    if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { break; }
+
+
+/* When in test mode, construct a mock test object for fct_xchk to operate
+with. If we fail a setup up, then we go directly to a teardown mode. */
+#define fct_req(_CNDTN_) 				                 \
+    if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) ) {             \
+       _fct_req((_CNDTN_));                                              \
+    }                                                                    \
+    else if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr)           \
+              || fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) { \
+       fctkern_ptr__->ns.curr_test = fct_ts__make_abort_test(            \
+            fctkern_ptr__->ns.ts_curr                                    \
+            );                                                           \
+       if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) {                 \
+           fct_ts__setup_abort(fctkern_ptr__->ns.ts_curr);               \
+           fct_ts__add_test(                                             \
+                fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test   \
+                );                                                       \
+       }                                                                 \
+    } else {                                                             \
+       assert("invalid condition for fct_req!");                         \
+       _fct_req((_CNDTN_));                                              \
+    }
+
+
+#define fct_chk_eq_dbl(V1, V2) \
+    fct_xchk(\
+        ((int)(fabs((V1)-(V2)) < DBL_EPSILON)),\
+        "chk_eq_dbl: %f != %f",\
+        (V1),\
+        (V2)\
+        )
+
+
+#define fct_chk_neq_dbl(V1, V2) \
+    fct_xchk(\
+        ((int)(fabs((V1)-(V2)) >= DBL_EPSILON)),\
+        "chk_neq_dbl: %f == %f",\
+        (V1),\
+        (V2)\
+        )
+
+
+#define fct_chk_eq_str(V1, V2) \
+    fct_xchk(fctstr_eq((V1), (V2)),\
+          "chk_eq_str: '%s' != '%s'",\
+          (V1),\
+          (V2)\
+          )
+
+
+#define fct_chk_neq_str(V1, V2) \
+    fct_xchk(!fctstr_eq((V1), (V2)),\
+          "chk_neq_str: '%s' == '%s'",\
+          (V1),\
+          (V2)\
+          )
+
+/* To quiet warnings with GCC, who think we are being silly and passing
+in NULL to strlen, we will filter the predicate through these little
+functions */
+static int
+_fct_chk_empty_str(char const *s)
+{
+    if ( s == NULL )
+    {
+        return 1;
+    }
+    return strlen(s) ==0;
+}
+static int
+_fct_chk_full_str(char const *s)
+{
+    if ( s == NULL )
+    {
+        return 0;
+    }
+    return strlen(s) >0;
+}
+
+
+#define fct_chk_empty_str(V) \
+    fct_xchk(_fct_chk_empty_str((V)),\
+             "string not empty: '%s'",\
+             (V)\
+             )
+
+#define fct_chk_full_str(V) \
+    fct_xchk(_fct_chk_full_str((V)),\
+             "string is full: '%s'",\
+             (V)\
+             )
+
+
+#define fct_chk_eq_istr(V1, V2) \
+    fct_xchk(fctstr_ieq((V1), (V2)),\
+          "chk_eq_str: '%s' != '%s'",\
+          (V1),\
+          (V2)\
+          )
+
+
+#define fct_chk_neq_istr(V1, V2) \
+    fct_xchk(!fctstr_ieq((V1), (V2)),\
+          "chk_neq_str: '%s' == '%s'",\
+          (V1),\
+          (V2)\
+          )
+
+
+#define fct_chk_endswith_str(STR, CHECK)\
+    fct_xchk(fctstr_endswith((STR),(CHECK)),\
+            "fct_chk_endswith_str: '%s' doesn't end with '%s'",\
+            (STR),\
+            (CHECK)\
+            )
+
+
+#define fct_chk_iendswith_str(STR, CHECK)\
+    fct_xchk(fctstr_iendswith((STR), (CHECK)),\
+             "fch_chk_iendswith_str: '%s' doesn't end with '%s'.",\
+             (STR),\
+             (CHECK)\
+             )
+
+#define fct_chk_excl_str(STR, CHECK_EXCLUDE) \
+    fct_xchk(!fctstr_incl((STR), (CHECK_EXCLUDE)),\
+	  "fct_chk_excl_str: '%s' is included in '%s'",\
+	  (STR),\
+          (CHECK_EXCLUDE)\
+	  )
+
+#define fct_chk_excl_istr(ISTR, ICHECK_EXCLUDE) \
+    fct_xchk(!fctstr_iincl((ISTR), (ICHECK_EXCLUDE)),\
+	  "fct_chk_excl_istr (case insensitive): '%s' is "\
+          "included in'%s'",\
+          (ISTR),\
+          (ICHECK_EXCLUDE)\
+          )
+
+#define fct_chk_incl_str(STR, CHECK_INCLUDE) \
+    fct_xchk(fctstr_incl((STR), (CHECK_INCLUDE)),\
+          "fct_chk_incl_str: '%s' does not include '%s'",\
+	      (STR),\
+          (CHECK_INCLUDE)\
+	  )
+
+
+#define fct_chk_incl_istr(ISTR, ICHECK_INCLUDE) \
+    fct_xchk(fctstr_iincl((ISTR), (ICHECK_INCLUDE)),\
+          "fct_chk_incl_istr (case insensitive): '%s' does "\
+          "not include '%s'",\
+	      (ISTR),\
+          (ICHECK_INCLUDE)\
+	  )
+
+
+#define fct_chk_startswith_str(STR, CHECK)\
+    fct_xchk(fctstr_startswith((STR), (CHECK)),\
+          "'%s' does not start with '%s'",\
+          (STR),\
+          (CHECK)\
+    )
+
+
+#define fct_chk_startswith_istr(STR, CHECK)\
+    fct_xchk(fctstr_istartswith((STR), (CHECK)),\
+          "case insensitive check: '%s' does not start with '%s'",\
+          (STR),\
+          (CHECK)\
+    )
+
+#define fct_chk_eq_int(V1, V2) \
+    fct_xchk(\
+        ((V1) == (V2)),\
+        "chq_eq_int: %d != %d",\
+        (V1),\
+        (V2)\
+        )
+
+
+#define fct_chk_neq_int(V1, V2) \
+    fct_xchk(\
+        ((V1) != (V2)),\
+        "chq_neq_int: %d == %d",\
+        (V1),\
+        (V2)\
+        )
+
+#define fct_chk_ex(EXCEPTION, CODE)   \
+   {                                  \
+      bool pass_chk_ex = false;       \
+      try {                           \
+          CODE;                       \
+          pass_chk_ex = false;        \
+      } catch ( EXCEPTION ) {         \
+          pass_chk_ex = true;         \
+      } catch ( ... ) {               \
+          pass_chk_ex = false;        \
+      }                               \
+      fct_xchk(                       \
+	pass_chk_ex,                  \
+        "%s exception not generated", \
+        #EXCEPTION                    \
+      );                              \
+   }                                  \
+ 
+/*
+---------------------------------------------------------
+GUT CHECK MACROS
+----------------------------------------------------------
+
+The following macros are used to help check the "guts" of
+the FCT, and to confirm that it all works according to spec.
+*/
+
+/* Generates a message to STDERR and exits the application with a
+non-zero number. */
+#define _FCT_GUTCHK(_CNDTN_) \
+   if ( !(_CNDTN_) ) {\
+      fprintf(stderr, "gutchk fail: '"  #_CNDTN_ "' was not true.\n");\
+      exit(1);\
+   }\
+   else {\
+      fprintf(stdout, "gutchk pass:  '" #_CNDTN_ "'\n");\
+   }
+
+/*
+---------------------------------------------------------
+MULTI-FILE TEST SUITE MACROS
+----------------------------------------------------------
+
+I struggled trying to figure this out in a way that was
+as simple as possible. I wanted to be able to define
+the test suite in one object file, then refer it within
+the other one within the minimum amount of typing.
+
+Unfortunately without resorting to some supermacro
+work, I could only find a happy comprimise.
+
+See test_multi.c for an example.
+*/
+
+/* The following macros are used in your separate object
+file to define your test suite.  */
+
+
+#define FCTMF_FIXTURE_SUITE_BGN(NAME) \
+	void NAME (fctkern_t *fctkern_ptr__) {\
+        FCT_REFERENCE_FUNCS();\
+        FCT_FIXTURE_SUITE_BGN( NAME ) {
+
+#define FCTMF_FIXTURE_SUITE_END() \
+		} FCT_FIXTURE_SUITE_END();\
+	}
+
+#define FCTMF_SUITE_BGN(NAME) \
+	void NAME (fctkern_t *fctkern_ptr__) {\
+        FCT_REFERENCE_FUNCS();\
+        FCT_SUITE_BGN( NAME ) {
+#define FCTMF_SUITE_END() \
+       } FCT_SUITE_END(); \
+   }
+
+
+/* Deprecated, no longer required. */
+#define FCTMF_SUITE_DEF(NAME)
+
+
+/* Executes a test suite defined by FCTMF_SUITE* */
+#define FCTMF_SUITE_CALL(NAME)  {\
+    void NAME (fctkern_t *);\
+    NAME (fctkern_ptr__);\
+    }
+
+
+/*
+---------------------------------------------------------
+FCT QUICK TEST API
+----------------------------------------------------------
+The goal of these little macros is to try and get you
+up and running with a test as quick as possible.
+
+The basic idea is that there is one test per test suite.
+*/
+
+#define FCT_QTEST_BGN(NAME) \
+	FCT_SUITE_BGN(NAME) {\
+		FCT_TEST_BGN(NAME) {\
+ 
+#define FCT_QTEST_END() \
+		} FCT_TEST_END();\
+	} FCT_SUITE_END();
+
+
+#define FCT_QTEST_BGN_IF(_CONDITION_, _NAME_) \
+	FCT_SUITE_BGN(_NAME_) {\
+		FCT_TEST_BGN_IF(_CONDITION_, _NAME_) {\
+ 
+#define FCT_QTEST_END_IF() \
+		} FCT_TEST_END_IF();\
+	} FCT_SUITE_END();
+
+#endif /* !FCT_INCLUDED__IMB */
