// -*- C++ -*-
//    foo.h -- interface to the libfoo* libraries
//
//    Copyright (C) 1998-1999 Free Software Foundation, Inc.
//    Written by Thomas Tanner, 1998
//
//    This file is part of GNU Libtool.
//
// GNU Libtool is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// GNU Libtool is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with GNU Libtool; see the file COPYING.  If not, a copy
// can be downloaded from  http://www.gnu.org/licenses/gpl.html,
// or obtained by writing to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

// Only include this header file once.
#ifndef _FOO_H_
#define _FOO_H_ 1

// Silly constants that the functions return.
#define HELLO_RET 0xe110
#define FOO_RET 0xf00

// Our C test functions.
extern "C"
{
  int foo(void);
  int hello(void);
}

// Our test C++ base class.
class foobar
{
public:
  virtual int foo(void) = 0;
  virtual int hello(void) = 0;
  // Some dummy pure virtual functions.
};


// Our test C++ derived class.
class foobar_derived : public foobar
{
public:
  virtual int foo(void);
  virtual int hello(void);
  // Override the base class' pure virtual functions.
};

#endif /* !_FOO_H_ */
