This is the public Open Source distribution of Apple, Inc.'s
CoreFoundation framework, sometimes known as "CF-lite"
because it does not contain every facility available from the
CoreFoundation framework in Mac OS X.  This distribution is
refered to as Open CF-lite to distinguish it from the official
Apple release, and to reflect the Open Source nature of this
project.

This CoreFoundation corresponds to the Mac OS X 10.5.6 version
of CF (CF-476.17)

This distribution differs from the official Apple, Inc. release
in that it is known to build and run on Mac OS X, Windows, and
Linux.  It would probably be trivial to port to most other
POSIX-based environments (volunteers welcome!)

The goal of this port is to provide a feature-compatible, cross
platform version of the official CoreFoundation framework.  In
general, we do not propose extending functionality beyond the
official Apple release so that this project can serve as a
drop-in replacement.

To repeat Apple's statement:

--- What Apple is NOT interested in, with CF-lite:
* Everybody's little convenience methods. Just because
  "everybody has to write their own", it does not
  follow immediately that it is a good idea to add it
  to the system libraries. It is not a goal of CF to
  be a "Swiss Army Knife"; that just increases the
  size of the binaries, and the documentation and
  maintenance burden. Functions to reverse a string
  or merge two arrays by taking alternate elements
  from the two arrays are not compelling.

The current release is known to work on Windows at a sufficient
level to run the WebKit infrastructure.

Support is available from the discussion groups at http://opencflite.sf.net.

Enjoy!

Brent Fulgham <bfulgham@gmail.com>
Grant Erickson <gerickson@nuovations.com>
