// Class Foo
#pragma implementation


// We don't use header files, since we only want to see, whether the
// compiler is installed properly.
//
#if (__GNUG__ == 2)
typedef __SIZE_TYPE__ size_t;
#else
typedef unsigned int size_t;
#endif

extern "C" {
    char *strncpy (char* dest, const char* src, size_t len);
    int printf (const char*, ...);
};

#include "cdtest-foo.h"

int Foo::foos = 0;

void Foo::init_foo ()
{
    printf ("BROKENLY calling Foo::init_foo from __init_start; size_of(Foo) = %ld\n", (long) sizeof(Foo));
    foos = FOOLISH_NUMBER;
}


Foo::Foo ()
{
    i = ++foos;
    strncpy (message, "default-foo", len);
#ifdef WITH_ADDR
    printf ("Constructing Foo(%d) \"default-foo\" at %08x\n", i, this);
#else
    printf ("Constructing Foo(%d) \"default-foo\"\n", i);
#endif
}

Foo::Foo (const char* msg)
{
    i = ++foos;
    strncpy( message, msg, len);
#ifdef WITH_ADDR
    printf ( "Constructing Foo(%d) \"%s\" at %08x\n", i, message, this);
#else
    printf ( "Constructing Foo(%d) \"%s\"\n", i, message);
#endif
}


Foo::Foo (const Foo& foo)
{
    i = ++foos;
#ifdef WITH_ADDR
    printf ("Initializing Foo(%d) \"%s\" at %08x with Foo(%d) %08x\n", 
	    i, foo.message, this, foo.i, &foo);
#else
   printf ("Initializing Foo(%d) \"%s\" with Foo(%d)\n",i, foo.message, foo.i);
#endif
    for ( int k = 0; k < FOO_MSG_LEN; k++) message[k] = foo.message[k];
}


Foo& Foo::operator= (const Foo& foo)
{
#ifdef WITH_ADDR
    printf ("Copying Foo(%d) \"%s\" at %08x to Foo(%d) %08x\n", 
	    foo.i, foo.message, &foo, i, this);
#else
   printf ("Copying Foo(%d) \"%s\" to Foo(%d)\n", foo.i, foo.message, i);
#endif
    for ( int k = 0; k < FOO_MSG_LEN; k++) message[k] = foo.message[k];
    return *this;
}


Foo::~Foo ()
{
    foos--;
#ifdef WITH_ADDR
    printf ("Destructing Foo(%d) \"%s\" at %08x (remaining foos: %d)\n",
	    i, message, this, foos);
#else
    printf ("Destructing Foo(%d) \"%s\" (remaining foos: %d)\n",
	    i, message, foos);
#endif
}
