0.16 (NOT YET RELEASED)
      - treat a "length-prefixed" wire-type message for a repeated field
        as packed-repeated whenever it makes sense (for all types
        other than messages, strings, and bytes).
      - switch to New BSD license.
      - add protobuf_c_rpc_server_configure_threading()
      - bugs in dsk-dispatch (Issue #65 for one thing; POLLHUP for another;
        and a problem where we moved fd_map into a local variable, when in
	fact in can be reallocated all over the place, in dsk_dispatch_dispatch())
      - compile error in packing 64-bit versions on some platforms
        (srobbins99: Issue #68 Comment 1)
      - bug fix: fix for memory error is the required-field check fails.
        See Issue #63 for demo (w/ nice test case by dror.harari).
      - add PROTOBUF_C_{MAJOR,MINOR} for compile-time checks and
        protobuf_c_{major,minor} for checks about the running library. (Issue #53)
      - use a small constant-size hash-table instead of alloca() for
        detecting required fields, and it also prevents us from using too
	much stack, etc.  (Related to Issue #60)
      - add a macro to ensure enums are the size of ints. (Issue #69)

0.15:
      - make protobuf_c_message_init() into a function (Issue #49, daveb)
      - Fix for freeing memory after unpacking bytes w/o a default-value.
        (Andrei Nigmatulin)
      - minor windows portability issues (use ProtobufC_FD) (Pop Stelian)
      - --with-endianness={little,big} (Pop Stelian)
      - bug setting up values of has_idle in public dispatch,
        make protobuf_c_dispatch_run() use only public members (daveb)
      - provide cmake support and some Windows compatibility (Nikita Manovich)

0.14:
      - build fix (missing dependency in test directory)
      - add generation / installation of pkg-config files. (Bobby Powers)
      - support for packed repeated fields (Dave Benson)
      - bug in protobuf_c_dispatch_close_fd(), which usually only
        showed up in later function calls.
      - support for deprecated fields -- enable a GCC warning
        if a field has the "deprecated" option enabled. (Andrei Nigmatulin)
      - hackery to try to avoid touching inttypes.h on windows (Issue #41)
      - fix for protobuf_c_message_unpack() to issue error if any
        "required" field is missing in input stream. (Andrei Nigmatulin)

0.13:
      - Fix for when the number of connections gets too great in RPC.
        (Leszek Swirski) (issue #32)
      - Add --disable-protoc to only build libprotobuf-c (daveb)
      - Bug fixes for protobuf_c_enum_descriptor_get_value_by_name()
        and protobuf_c_service_descriptor_get_method_by_name()
      - if descriptor->message_init != NULL, use it from unpack()
        as an optimization (daveb)
      - implement protobuf_c_{client,server}_set_error_handler()

0.12:
      - for field names which are reserved words, use the real name 
        given in the protobuf-c file, not the mangled name which 
        is the name of the member in the C structure.  (Andrei Nigmatulin)
      - add protobuf_c_message_init() function; add virtual function
        that implements it efficiently.  (Andrei Nigmatulin)
      - bug fix for sfixed32, fixed32, float wire-types on
        big-endian platforms (Robert Edmonds)
      - compile with the latest protobuf (the header file wire_format_inl.h
        is now wire_format.h) (Robert Edmonds)

0.11:
      - allow CFLAGS=-DPRINT_UNPACK_ERRORS=0 to suppress
        unpack warnings from being printed at compile time (Andrei Nigmatulin)
      - give error if an unknown wire-type is encountered (Andrei Nigmatulin)
      - fix technically possible overflows during unpack of very
        large messages (Andrei Nigmatulin)
      - [UNFINISHED] windows RPC work
      - use automake's "foreign" mode from within configure.ac
        and add version information to the library (Robert Edmonds)
      - ProtobufCServiceDescriptor::method_indices_by_name:  missing
        const.  (Issue 21)
      - Update to support new UnknownFields API.  (fix by dcreager) (Issue 20)

0.10:
      - build issue on platforms which don't compute library dependencies
        automatically.
      - fix for certain types of corrupt messages (Landon Fuller) (issue 16)

0.9:
      - build issue: needed $(EXEEXT) in dependency lists for cygwin
      - bug fix:  protobuf_c_service_get_method_by_name() was not correct b/c
        the service's methods were not sorted by name (the header file
        used to incorrectly state that they were).
        Now we correctly implement protobuf_c_service_get_method_by_name()
        (using a bsearch indexed by separate array).
      - generated source incompatibility:  we added a new
        member to ProtobufCServiceDescriptor (method_indices_by_name).
        You will have to run the latest protobuf
        to generate those structures.
      - rename rpc-client's "autoretry" mechanism to "autoreconnect".
      - bug fixes using TCP clients with the RPC system.
      - handle allocation failures more gracefully (Jason Lunz) (issue 15)
0.8:
      - Destroy function typedef for Services was omitting a "*"
      - service_machgen_invoke was broken. (issue 12)
      - add RPC system (BETA)
      - don't segfault when packing NULL strings and messages. (issue 13)
0.7:
      - memory leak:  unknown fields were not being freed by free_unpacked()
      - lowercase field names consistently when composing
        default_value names. (issue 11)
      - remove spurious semicolon (issue 10)
0.6:
      - Warning suppression for -Wcast-qual and -Wshadow.
      - Support for default values of all types allowed by core protobuf.
      - Generate message__init functions, for when the static initializer
        isn't convenient.
      - add some reserved fields at the end of the various descriptors
0.5: 
      - License now included in major files.
      - Use little-endian optimizations; fix a bug therein.
      - Include 'make deb' target.
0.4:
      - Update to work with protobuf 2.0.1.
0.2:
0.3:
      - Minor pedantic concerns about generated code.
0.1:
      - Lots of test code (and bug fixes).
0.0:
      - Initial release.
