
*****  Please see the KNOWN_BUGS file for possible problems and warnings. *****

Alpha_30.4 - 15-Aug-2009

  Renamed the compress_sparse program to compress_archive and expand_sparse
  program to restore_archive.

  Fixed usage print in patch_compressed to include --ignore-times option.

  Changed warning print statement about block counts mismatch in sync_archive
  program to clarify which archive has which block counts.

  Fix Bug #2835563 - assert in nwos_check_blocks_available.  Changed 'ref'
  local variable in nwos_check_blocks_available function to uint64.

  Fix Bug #2834542 - assert when importing files.  Fixed so that it verifies
  there is enough space between chunk islands before trying to use it.  Also
  added loop to try to recover if, because of a bug, it tries to allocate a
  chunk that is already allocated it will skip over it and allocate the next
  unused chunk.

  Fix Bug #2834462 - passing invalid option to disc_list causes infinite loop.
  Changed to print error message and exit if unknown option given.

  Fix Bug #2834458 - log_disc crashes when changing storage location.  Added
  hack to set upper 4 bytes of reference (currently called flags) to zero.
  This is needed because in this transitional period the lower layers expect
  zeros and then they set them to 0xfffffffe.

  Completely rearranged directory structure.  Created new directories:

    src/apps/data
    src/apps/file
    src/apps/public
    src/apps/util
    src/lib/archive
    src/lib/objectify

  And moved the source files that were in the root directory into them.
  Moved the attic, fine, gnu, http, and next_gen  directories into the new
  structure:

    src/apps/fine
    src/attic
    src/lib/gnu
    src/http

  Changed all Makefiles, tests, etc. to work in the new directory structure.

  Changed backup.c to deal with block reference IDs as 8 bytes instead of
  ObjRefs because ObjRefs are defined at a higher level of the code.


Alpha_30.3 - 31-Jul-2009

  Fix Bug #2827375 - Will allow creating the same password two or more times.
  Fixed objectify.c to test for duplicate pass phrase before allowing a new
  pass phrase to be created.  <SVN-4219>

  Changed disk_usage --verbose option to --graph and only print the graph when
  the option is given.  Also changed to allow passing archive in on command
  line.  <SVN-4216>  <SVN-4217>  <SVN-4218>

  Changed 'verbose' global variable to 'nwos_verbosity_level'.

  Fixed check_archive to work correctly with new 64-bit block references (with
  0xfffffffe in the upper bytes), added checking of chunk MD5 checksums, added
  verbose option that prints the chunk_info table for each chunk, and allow
  passing the archive in on the command line.  <SVN-4202>  <SVN-4205>
  <SVN-4206>  <SVN-4207>  <SVN-4208>  <SVN-4215>

  Removed the code in disk_usage that verified the used block counts in the
  chunk_info table matched the number of bits set in the chunk bit maps.  It
  took too long to run.  Instead use the check_archive program to check all
  of the chunk_info.  <SVN-4201>

  Renamed check_block_maps program to check_archive.  <SVN-4200>

  Changed sync_archive so that it catches control-C, finishes writing the
  current chunk and terminates normally.  <SVN-4199>  <SVN-4212>

  Changed test_diff_compressed to test new archive specified on the command
  line for prep_disk, test source archive being optional to sync_archive, and
  for duplicate source and destinations to sync_archive.  <SVN-4196>

  Changed sync_archive so that the source archive is optional on the command
  line, if it isn't specified it uses the default archive.  <SVN-4195>

  Changed prep_disk to optionally allow the archive to be preped to be
  specified on the command line.  <SVN-4194>

  Fix Bug #2827366 - Sync_archive doesn't print error if source and dest are
  the same.  Changed to print error message and exit if the source and
  destination specified are the same.  <SVN-4193>

  Fix Bug #2814112 - Will create a duplicate person.  Changed to print warning
  message if a person with the same first and last names already exists and
  the middle name doesn't distinguish them.  <SVN-4192>

  Fix Bug #2827240 - If version is wrong in private archive wrong path is
  printed.  Changed to print private path when the private header fails
  instead of the public path.  <SVN-4188>

  Changed the headers in all source files, etc. to include the Objectify
  project and remove the old CVS logs because Subversion doesn't support the
  Log keyword.  <SVN-4184>

  Changed from using CVS in the New World OS project on SourceForge
  (http://sourceforge.net/projects/nwos) to using Subversion (SVN) under the
  Objectify project (http://sourceforge.net/projects/objectify).  To checkout
  a copy of the main trunk use the following command: "svn checkout
  https://objectify.svn.sourceforge.net/svnroot/objectify/trunk/objectify".


Alpha_30.2 - 21-Jul-2009

  PLEASE NOTE: This should be the last release using CVS under the New World
  OS project on SourceForge.  I plan to move to Subversion under the Objectify
  project immediately after this release.

  Partial fix for Bug #2824308 - Existing tests don't test everything.  Added
  sync_archive test to test_diff_compressed.sh.

  Fix Bug #2824790 - sync_archive doesn't work if the destination is a file.
  Copied code from expand_sparse.c to increase the number of chunks in the
  destination archive if it is a file.

  Added erase and start progress bar calls to sync_archive around code that
  prints the empty reference warning.

  Fix Bug #2824305 - sync_archive spews warning messages.  Changed to loop
  over USABLE_BLOCKS_PER_CHUNK instead of BLOCKS_IN_CHUNK and add
  BIT_MAP_BLOCKS to chunk base.

  Fix Bug #2824303 - assert in disk_usage.  Changed to subtract the
  BASE_32_BIT_PRIVATE from the chunk_info reference.

  Included changes made to fine/play_music program from 2009-02-20.


Alpha_30.1 - 19-Jul-2009

  PLEASE NOTE: if you used version Alpha_30 the references will be incorrect.
  Please contact me at qrwsoftware@gmail.com for help fixing them.  I don't
  think this happened because as of this morning there haven't been any
  downloads of Alpha_30.

  Fixed Bug #2821846 - changed so that the upper 4 bytes of the reference in
  private blocks is fffffffe to make it compatible with a future change to 64
  bit references.

  Fixed diff_compressed and patch_compressed to print message to stderr when
  the upper word of the reference in the block isn't zero and exit with an
  error code.  Before it just printed a message to the stdout and exited
  normally.

  Fixed bug in compress_sparse where it was looping over all BLOCKS_IN_CHUNK,
  which caused it to print a warning, instead of USABLE_BLOCKS_PER_CHUNK.


Alpha_30 - 12-Jul-2009

  WARNING: because the size of a chunk has changed which chunk a particular
  block goes into has changed.  Therefore, an archive may use more chunks in
  Alpha_30 than it did in Alpha_2x versions.

  To simplify upgrading an archive from Alpha_29 to Alpha_30, I added a new
  program called copy_0029_to_0030.  Read the INSTALL file for instructions on
  how to use it.

  Created a new program "dump_header" that will display the contents of the
  header of a file or archive.  Should work on either an Alpha_2x or Alpha_3x
  version file or archive.

  Deleted the nwos_total_private_blocks global variable.  The header was
  changed to store the total chunks (nwos_total_private_chunks) and the total
  blocks was calculated from that.  This was redundant and so it was removed.

  More refactoring to divide up the functionality better.  Created new 
  storage.h, storage.c, header.h and header.c files.

  Fixed compiler warnings in print statements when compiling on AMD 64
  machines.

  Changed version string to 0030 because the header, the size of the chunks,
  and the chunk_info table was modified.  The chunk_info table was changed to
  have 32-bit 'flags_used' member instead of the old 16-bit 'used' member.
  This allows room for 17 bits for the used block count (so 65536 can be
  represented) and bits for flags.  Also the 'ref' member was changed from
  32-bits to 64-bits, the index from 16-bits to 32-bits, and a MD5 checksum
  was added for each chunk.

  The header was changed as follows:

       bytes      0029 header                           0030 header
        0-3:  NWOS                              NWOS
        4-7:  0029                              0030
        8-11: time stamp of last prep upper     type code
       12-15: time stamp of last prep lower     block offset to first chunk

       16-19: reserved blocks                   time stamp of last prep upper
       20-23: blocks used                       time stamp of last prep lower
       24-27: time stamp of last change upper   total chunks
       28-31: time stamp of last change lower   used chunks

       32-25: block offset to first chunk       time stamp of last change upper
       36-39:                                   time stamp of last change lower
       40-43:                                   used blocks upper
       44-47:                                   used blocks lower

  Notice that before the total blocks (reserved_blocks) was stored and that
  was changed to store the total chunks available.

  The chunks were changed such that the block used bit map is not included in
  the 16 megabytes.  I.E. in the Alpha_2x versions each chunk used a total of
  16 MB of space on the disk, with 8 KB of that used for the bit map.  In 
  Alpha_30 each chunk can store up to 16 MB of data and the bit map is an
  additional 8 KB.  So the total size of a chunk is now 16 MB + 8 KB.


Alpha_29.11 - 9-Jun-2009

  Fix Bug #2803265 - Leaves small amount of space at the end of each chunk.
  Changed so that even if the estimated number of blocks is small it will
  allow two chunks.  Before if the number of blocks was less than 1/3 of a
  chunk it would require it to fit in one chunk.  This caused it to skip space
  at the end of a chunk and start in the next chunk, thereby leaving an empty
  space at the end of some chunks.

  Fix Bug #2734284 - Prints warning message about chunks not contiguous.
  Changed so that it only prints the warning message if the archive is on a
  disk (or partition) and there are no more chunks available.  Otherwise it
  calls the new find_new_chunk_location function and allocates all new chucks.
  Also changed to occasionally allocate a new chunk separate to keep from
  having all of the chunks in one series (island) of chunks.

  Fix Bug #2802374 - add_password fails if archive is a file.  Changed to not
  check for disk full and to allocate a new chunk if the archive is a file.

  Changed to find a random location for the private class definition object
  and it's associated reference list instead of having them in the first two
  locations in the chunk as they were in the Alpha_29.10 release.

  Fix Bug #2740516 - Compiler warnings about fgets.  Changed to check return
  value on all calls and exit if end of file or error.

  Added new dialog.c file with functions to ask user a question and moved the
  function to ask the user for a yes or no answer from objectify.c.

  Fix Bug #2455976 -If no disc copies exist, list_discs won't print list.
  Changed so that if there are disc lists, but no disc copies it prints a
  warning message and continues instead of exiting.

  Fixed PUBLIC_MODE so that it works correctly with all of the refactoring.


Alpha_29.10 - 5-May-2009

  Fix Bug #2786129 - Alpha_29.9 compiles incorrectly on big endian machines.
  Added include of config.h to chunk_info.c so WORDS_BIGENDIAN is defined
  correctly.

  Added verification that used block counts are correct in the chunk info table
  when Objectify terminates.

  Fixed some compiler warnings in file.c and import_file.c when building on Mac
  OS X.


Alpha_29.9 - 4-Apr-2009

  Fix Bug #2109054 - Assert in import_file when using --minimal-security.
  Changed to always keep at least half a chunk of space in reserve.

  Disabled what I have been calling the "security level".   That was somewhat
  of a misnomer, what it did was change how spread out the data (mostly file
  data) was in the archive.  The --minimal-security kept the data almost
  contiguous whereas the --extreme-security scatttered the data all over the
  entire archive at random.  I (still) believe that made the data, at least
  somewhat, more secure.  But it also made chunk allocation more complicated,
  so for the time being I have decided to simplify it and allocate blocks
  for data as sequentially as possible.  I plan to re-introduce this feature,
  under a different name, at some point in the future.

  Renamed objectify_private.h to disk_io.h and refactored it and objectify.h
  into new backup.h, bit_map.h, chunk_info.h, class_definition.h, disk_io.h,
  gen_id.h, log.h, objects.h, progress_bar.h, reference.h, reference_list.h,
  security.h, strlcxx.h, and user_config.h.

  Moved the nwos_malloc, nwos_realloc, and nwos_free functions from objectify.c
  into new mem_alloc.c file.  And moved the external declarations for them from
  objectify.h into new mem_alloc.h file.

  Moved the strlcat and strlcpy functions out of log.c and created a new
  strlcxx.c file.

  Created new bit_map.c file with variables and functions taken from the
  disk_io.c file.

  Changed prep_disk to not print a progress bar anymore since when prepping
  either a block device or a file only writes one or two chunks.

  Optimized so that if the archive is stored in a file (as opposed to a block
  device) that it doesn't write each chunk twice, once to expand the file and
  once when allocating the chunk.

  Created new chunk_info.c file with variables and functions taken from the
  disk_io.c file.

  Feature Request #1873009 - Changed so that archive file size is dynamic when
  using a file for storage.  File now always starts out as 32 MB and grows as
  needed.  No longer pass a size parameter to prep_disc when using a file.

  Created new gen_id.c file with constants, variables, and functions taken
  from the objectify.c file.


Alpha_29.8 - 1-Feb-2009

  Fix Bug #2427286 - Checksum error in file block.  This bug occurred on files
  that were smaller than 244 bytes (only used 1 file block) and were encrypted
  with the old encryption (swizzle before blowfish).  

  Changed to dump file block data if it has a crc32 error.

  Added check_files program to read every file stored and verify it doesn't
  have any errors.

  Fix Bug #2392531 - Import_file time is not linear.  Removed loop that
  previously searched list for the last block and instead keeps a pointer to
  the last_block pointer in cache.

  Moved functions to get old file class definitions from objectify.c file into
  the class_definition.c file.

  Moved functions that deal with disc_lists and logging discs from the file.c
  file into the new disc.c file.

  Modified the Makefile so that the remove_file and update_files_0028 programs
  are no longer compiled by default.  If you need to use either of them do:
  "make remove_file" or "make update_files_0028".

  NOTE: there are known bugs with remove_file, I highly recommend not using it
  at all until they are fixed.  (See Bug #2520844 for example.)

  Changed the warning text in the remove_file program and added test to verify
  backup (.dif) files are disabled and terminate if so.

  Fixed progress bar to allow more than one call to update with 100%, so it
  won't assert if it is already at 100%.

  Changed sync_archive program to take both a source and destination argument
  instead of using the default archive for the source.

  Added sync_archive program to Makefile.


Alpha_29.7 - 30-Dec-2008

  Added a new program called 'sync_archive' that currently just copies one
  archive to another.  For example if you have an Objectify archive on
  /dev/sda9 you could copy it directly to a USB drive on /dev/sdg.  It does the
  same thing as doing a compress_sparse on /dev/sda9 and then an expand_sparse
  to /dev/sdg.  (It was created by combining the compress_sparse program and
  the expand_sparse program.)  NOTE: use with caution, it has only had minimal
  testing at this time.

  Added an example Fine (Eiffel) program in the 'fine' directory to play .mp3
  and .ogg files from Objectify.  It is purely experimental at this point.

  Fixed test_import_export.sh test to be more automatic (set the environment
  variables itself, stop if an error occurs, etc.).

  Merged changes from alpha_29_5_branch back into main trunk.  And let me just
  add what a mistake it was doing all those changes in the branch.  Hopefully
  I will learn this lesson and not make a mess like that again.

  Fix Bug #2354266 - Somtimes it aborts when entering wrong pass phrase.
  Added code so that nwos_read_block returns false if the block is empty (I.E.
  the bit isn't set in the bit map).

  Feature Request #1952357 - Fix to build on Mac OS X.  The previous fix for
  Bug #2466388 has also fixed it so that it will compile and run on Mac OS X.

  Fix Bug #2466388 - Objectify will no longer build on OpenBSD.  Changed to
  use fsync function if fdatasync function is not available on the system.

  Fixed Bug #2051304 - changed assert in "computer list persons" to print a
  message that there are no persons in the system and exit.

  Fixed Bug #2026708 - use strlcpy and strlcat instead of strncpy and strncat.


Alpha_29.6 - 21-Dec-2008

  Fixed Bug #2427250 - Verify_file time values mismatch - assert/core dump.
  Changed so the file names are case sensitive.  In previous versions the file
  names main.html and Main.html were considered the same.  I decided this
  caused too many problems and so now main.html and Main.html are considered
  two different files.  Also fixed verify_file so that it just prints a warning
  message when the time values don't match exactly instead of asserting.

  Modified the import_file program to not allow creating a new path and file
  association in the case where both already existed but were not associated.
  This created a case where the file could not be exported.

  Modified the list_files program to report any arguments that did not match
  any files and to return an exit code of 1 if there were any.

  Modified the import_file program to exit with a 1 status if any paths weren't
  found, there were any duplicate paths or files, any multiple files, or any of
  the files had errors, or it was too full to add any files.

  Modified the export_file program to exit with a 1 status if any of the files
  specified on the command line were not found.

  Modified the verify_file program to exit with a 1 status if any files weren't
  found or were not removed.

  Fixed Bug #2392474 - possible overflow in gigabyte calculation.  This
  technically was no longer a problem because of the previous change to have
  graph display 0 to 16 gigabytes instead of 0 to 100 percent, but it is better
  to have it fixed so any future changes won't break it again.

  Changed disk_usage to display graph in gigabytes instead of percent and to
  display the number of allocated blocks in the graph.

  Bug #2354269 - The graph printed by the disk_usage program is wrong.  It was
  dividing the number of used blocks by the number of allocated blocks instead
  of the total number of blocks.


Alpha_29.5 - 1-Nov-2008

  PLEASE NOTE: I am actually releasing this on 15-Nov-2008.  The reason I have
  dated it 1-Nov-2008 is because it is as the project was on the first.  I have
  made changes since the first that have broken the project, because I am in
  crunch mode at work it may be a two weeks or more before I can fix it.
  Therefore I have decided to release it as it was before I broke it.

  Made new minimum and maximum defines for reference types so they are
  orthoginal, moved reference test functions from objectify.c to disk_io.c, and
  created new ones to test for public and temporary references.

  Changed chunk skip forward and backward values to be unsigned and the skip
  backward value to be positive instead of negative.

  Changed so that if the backup directory is empty (as it is if the environment
  variable is defined but empty) no backup file is created.

  Added a hack to nwos_check_blocks_available so that if it reaches the end of
  the private chunk space it turns around and works backwards.

  Changed so that 'index' in bit map cache is a chunk index instead of an
  index into the chunk_info table.  This fixes a problem that occurred when a
  new chunk was inserted into the table instead of added at the end.

  Fix Bug #2184020 - Assert when adding files and chunk is near upper limit.
  Fixed if statement that checks for reaching the last available chunk.

  Added TSU_NOTIFICATION describing the process of notifying the government
  about this project because it does encryption.  See Feature Requests #1994380
  and #1985484.

  Changed so to randomize the root object reference id.  This also fixes allows
  pass phrases that have a reference id that is in the public or temporary
  space to be used.

  Fix Bug #2117258 - Seg fault running disk_usage.  The seg fault occurred when
  the storage was fairly large, say 250 GB, and only a small amount was
  allocated, for example 32 MB.  It would scan the chunk info table for total
  chunks instead of used chunks and read past the memory allocated for the
  chunk info table.

  Fix Bug #2126403 - Assert when using compressed file.  Changed so that
  chunk_info table is not created and processed when reading from a compressed
  file.  This also fixed the problem where it complained about calculated sum
  of used blocks not matching stored count when reading from a compressed file.

  Changed maximum valid reference (on disk) to be 0xffefffff so that references
  from 0xfff00000 to 0xffffffff can be used for temporary IDs (not stored on
  disk).  Since the chunks are not even in Alpha_29 (they will be in Alpha_30)
  the maximum valid reference in Alpha_29 is 0xffeffe40 instead of 0xffefffff.

  PLEASE NOTE: if anyone has an archive with an ID greater than 0xffeffe40
  please e-mail me at qrwsoftware@gmail.com and I will try to work out some way
  to fix it.

  Feature Request #2114041 - Changed disk_usage program to no longer print out
  gigabyte usage (which was broken anyway) and added a bar graph.

  Fix Bug #2103915 - If showing Pass Phrase it isn't obfuscated after entering.
  Changed so if it is in "show" mode when enter is pressed, it is overwritten
  with asterisks.
 

Alpha_29.4 - 7-Sep-2008

  Changed to hide the characters typed for the pass phrase by substituting an
  asterisk by default when typing.  Added commands which can be typed at the
  pass phrase prompt to change display option.  If 'show' is typed at the
  prompt it will display all of the characters as they are typed (as it was in
  prior versions).  If 'last' is typed it displays the last character that was
  typed, but all the prior keys are replaced by asterisks.  If 'help' is typed
  it displays information on what characters are permitted in a pass phrase and
  a list of the commands.

  Removed the TEST_PASS_PHRASE from config.h.in.  Changed to check for an
  environment variable for testing.  The environment variable should NEVER be
  set during normal usage.


Alpha_29.3 - 1-Sep-2008

   Fix Bug #2043130 - Verify_file assert if given absolute path.  Fixed both
   import_file and verify_file to print a warning, and ignore the path, instead
   asserting.

   Feature Request #1878248 - Changed to print a real error message when the
   pass phrase is incorrect instead of asserting.  Also allows three tries
   before exiting.

   Removed --allocate-all option from prep_disk, no longer necessary.

   Fixed bug in nwos_allocate_new_chunk where it trashed the chunk_info table
   if called to create a chunk that was before an existing chunk (insertion did
   not work correctly).

   Moved code that created the root object from prep_disk and add_password into
   nwos_create_root function.

   Moved code that obtained the pass phrase and set up all of the key variables
   from all of the programs into nwos_initialize_objectify.  This simplified
   all of the program code so it didn't have to be done in each separate
   program.


Alpha_29.2 - 24-Aug-2008

  Modified so that there is no longer a default log file and if there is no
  Log File Path specified it will not write a log file.


Alpha_29.1 - 9-Aug-2008

  Fix Bug #2038862 - change to not assert if 100% was already done by
  nwos_update_progress_bar.


Alpha_29 - 4-Aug-2008

  Added --ignore-empty-directories and --ignore-empty-files to the disc_list
  and log_disc programs.  This way if a disc has empty directories or empty
  files on it, it can still be logged.

  Fix Bug #2035981 - "Disc_list reports empty directories when they are not".
  Previously when it encountered an empty directory it would then report that
  every directory following it was empty as well.

  Added logging of arguments to "remove_file".  (I don't recommend using the 
  "remove_file" program at this time, unless there is no other choice.  The
  backup (.dif) files and "diff_compressed" program cannot deal with blocks
  that are removed in this version and so if you use "remove_file" there is no
  way to use any backup (.dif) files to recover if something goes wrong.  If
  you must use "remove_file" you should do a full backup, with
  "compress_sparse", before you run it.  Then do another "compress_sparse"
  after you have done the "remove_file".  Sorry for the inconvenience, I have
  just not had the time to fix this yet.)

  Changed dump_obj to print out the class name and dump the object data in
  hexadecimal.

  Feature Request #2006029 "Reverse the order of the encryption" - modified the
  encryption algorithm to do the blowfish encryption first and then scramble
  the bytes.  My theory being that if one were to crack the blowfish code then
  it would be easy to unscramble the data because certain values were known.
  In the new order the bytes to unscramble are encrypted so the actual values
  cannot be seen and give clues to how to unscramble them.

  Fixed bug where it was only checking the first byte of the object header
  checksum.  The test for the object header checksum was checking byte 1 OR
  byte 2 OR byte 3 OR byte 4 were equal, it should have been checking for byte
  1 AND byte 2 AND byte 3 AND byte 4 were all equal.  The end result being that
  the test would pass if any one of the bytes were equal.

  Fixed so that "clean" target of Makefile doesn't remove "export_c_structs"
  and "c_structs.h" because they don't change very often and it was a pain when
  something got broken in the code and "export_c_structs" couldn't be compiled.


Alpha_28.4 - 27-Jul-2008

  Added Feature Request #1848644 "Allow subdirectories in disc_list" - fixed
  disc_list and log_disc programs to scan directories recursively.  So discs
  can now have subdirectories.


Alpha_28.3 - 19-Jul-2008

  Fixed update_file_0028 program to create an updated file class if it didn't
  already exist.

  Fixed re-entrancy problem in nwos_add_to_references by calling 
  nwos_get_object_class_without_update instead of nwos_get_object_class.

  Added asserts in nwos_find_or_create_private_class_definition to verify that
  after an updated class was cloned it was accessible.

  Changed the compress_sparse and expand_sparse programs so they no longer spew
  every block ID to the screen.  Now they print a progress bar instead.

  Added an assert in the nwos_write_object_to_disk and
  nwos_overwrite_object_to_disk functions to verify that the class definition
  for an object is of the correct type, public or private.

  Fixed the nwos_update_file_001_object_to_current and
  nwos_update_file_002_object_to_current functions to always update the class
  definition even if an updated private FILE class doesn't exist yet.  Before
  it would leave the class definition unchanged if an updated FILE class didn't
  exist and then if the object was overwritten to disk it would have the wrong
  class.

  Changed the nwos_find_or_create_private_class_definition function to return
  ObjCreateResult instead of void so the caller can tell exactly what happened.

  Fixed copy and paste error in disk_io.c - nwos_allocate_new_chunk where the
  chunk_info .used and .index values were written over the .ref value instead
  of being copied into the next .used and .index values.

  Fix Bug #2016420 "After expanding a compressed 0026 file reading a file
  causes a bad checksum error".  The get_file_002_reference was returning the
  wrong reference id when no file_003 objects existed in the archive.  Wrote a
  new get_file_references function that finds all of the public file references
  and any existing private file references.  It verifies any private file
  references against the public references to make sure they are correct.

  Updated the dump_obj program to work with the latest version of the code.  It
  had not been used since version 0004 in December 2005.

  Feature Request #1856369 "Fix so if imported file is already in system it 
  works" - fixed import_file to import data for a file that already exists in
  the system from a disc_list, but doesn't have the data stored.  Also fixed it
  so that if any of the checksums (md5, sha1, sha256, sha512) are missing from
  the file object (I.E. the file object was created before sha256 and/or sha512
  checksums were added to the file class), they will be created and included in
  the file object.

  Changed import_file so that if allow_multiple_paths flag is true then it will
  create a new association for an existing file even if there is another file
  with the same path.


Alpha_28.2 - 11-Jul-2008

  Fix Feature Request #1996867 "Move verify_file --shred option warning before
  doing it".  Instead of moving the warning, removed the warning completely and
  changed the "--shred" option to "--remove-min-shred".  Also changed the
  "--remove" option to "--remove-no-shred" so that it forces the user to choose
  if they want shredding or not.  That way one is reminded of the choice
  before executing it, instead of using --remove and then remembering it should
  have been shredded after it is too late.

  Added include of limits.h to import_file.c and verify_file.c to define
  PATH_MAX.

  Fix Bug #2015898 "Permission denied when running export_c_structs".  Changed
  so that export_c_structs is NOT compiled in PUBLIC_MODE so the public objects
  are opened read only.

  Fix Feature Request #1993875 "Change to terminate if opening backup fails."
  and Bug #2001629 "If opening backup (.dif) file fails it continues anyway"
  (they were duplicate entries).  Changed so that if it cannot open the backup
  (.dif) file it will terminate.


Alpha_28.1 - 25-Jun-2008

  Fix Bug #1997776 "If import_file -r directory/ with a slash breaks path
  name".  Added a function to normalize all paths, which eliminates duplicate
  slashes, single periods (.), and double periods (..).  NOTE: it cannot import
  files relative to the parent directory, so doing "import_file -r ../xyzzy"
  will not work.

  Fix Bug #1992924 "If a program is run in the same second as a previous
  program was run, a backup (.dif) file isn't created".  Changed so if the .dif
  file already exists the code waits 1 second, generates a new file name and
  retries.  Also added a count so that it will only retry five times.

  Added #ifndef HTTP around code that tries to open a config file in the user's
  home directory because when running from Apache there is no $HOME defined.

  Fix Bug #1987367 "Running verify_file --public creates backup (.dif) file".
  Moved setting of 'read_only' flag outside of if private objects conditional.


Alpha_28 - 4-Jun-2008

  Fix Bug #1954154 "Assert when creating disc_list", this was caused by having
  the previous/next file revision links in the FILE objects instead of the PATH
  AND FILE ASSOCIATION objects.  This has been changed in this version and now
  the file revision links are in the PATH AND FILE ASSOCIATION objects.

  After updating you MUST run the update_files_0028 for each and every pass
  phrase in the archive (unless you are certain that you do not have any files
  that have revisions).  You can verify that there are files with the old
  method of revisions by running the list_files program as follows:

      list_files --revision

  It will print a warning at the end if you have any files are using the old
  method of doing revisions.

  PLEASE NOTE: there were no changes in the disk header or disk layout that
  warranted changing to version 0028.  The change to version 0028 was done to
  mark that the file objects had changed and print a warning.  If you do not
  run the update_files_0028 on a 0027 or older archive, any old revision links
  will remain and you might get warnings or crashes.


Alpha_27.2 - 19-May-2008

  PLEASE NOTE: Bug #1954154 "Assert when creating disc_list", is *NOT* fixed in
  this release.  The bug only occurs in certain cases when using --add-revision
  and the revised file has two different names.  I decided not to hold up this
  release any longer for this bug, as it should not happen very often.  The fix
  for it is somewhat complicated, but I hope to have it for the next release.

  Increased the number of files that combine_backup_files from 64 to 100.

  Bug #1957144 - NO Fix, this problem was not with disc_list --add-revision,
  but with the attic/link_img_files program which was a hack and should not be
  used.

  Feature Request #1966442 - Changed the list_discs program to accept disc IDs
  with wildcards on the command line.  For example: list_discs "200805*".

  Started changing the Objectify functions that decrypt objects to return a
  result (pass/fail) instead of asserting.  This change is incomplete so it
  still asserts when a read fails, just higher up in the call chain.

  Fix Bug #1957451 - change so that if the compressed file being used is on
  read only media (like a DVD+R) it does not try to create an index file.

  NOTE: I don't recommend using control-C to terminate any of the Objectify
  programs.  The current version does NOT handle it gracefully.

  Fixed compress_sparse to skip over blocks with an reference ID of zero.
  This occurs when you hit control-C in the middle of writing data.

  Feature Request #1919585 - Added a very minimal --shred option to the
  verify_file program.  I did not have time to get the GNU shred code
  integrated so this --shred is a quick hack that just makes one pass of
  writing random data over the file.  If you really need to be sure (or at
  least somewhat sure) you should use the GNU shred program instead!!

  Feature Request #1915401 - added --recursive option to verify_file program,
  so it will walk a directory tree, verifying (and removing if desired) all the
  files in it.

  Feature Request #1915401 - added --recursive option to import_file program,
  so it will walk a directory tree, importing all the files in it.

  Made first attempt at compiling on Mac OS X.  Fixed to get around not having
  the clock_gettime function (use gettimeofday instead).  Did not fix the
  problem with no fdatasync function yet.

  Changed list_discs and list_files programs to NOT make log entries.

  Added http subdirectory with list_files.cgi program and other files for the
  www.worldwide-database.org page.


Alpha_27.1 -  4-Apr-2008

  Added file locking so two programs cannot access the private file at the same
  time.

  Feature Request #1851834 - added check for public files to disc_list* so that
  it will check to see if there is a public file with the same name.  Then it
  checks to make sure all of the checksums match before creating a disc list.

  *NOTE: this makes creating disc lists with public files much slower because it
  reads the files twice.  I intend to fix this in a later release.  If you have
  already verified (for example with "verify_file --public <file>" or
  "md5sum -c MD5SUMS" you can skip the check and use the --ignore-public option
  to disc_list.

  Added error message to log_disc so that if the directory (disc) is empty it
  doesn't spit a bogus assert message at the user.

  Added --public to verify_file so that it will check public files.


Alpha_27 - 15-Mar-2008

  Changed version to 0027 because of new revision of FILE class with SHA512
  checksums (so that there is indication of using the wrong public files).
  The disk header is still identical to 0026.

  Feature Request #1914900 - Added a release checklist in the attic.
  The file is attic/RELEASE_CHECKLIST.  Due to the whole chicken and egg
  problem, the checklist will be one revision behind.

  Feature Request #1913484 - Added SHA512 checksums to FILE class so in 
  addition to storing MD5, SHA1, and SHA256, it now also stores a SHA512 
  checksum.

  Fixed problem in Makefile where it wouldn't build the 'gnu' object files.

  Fixed bug in nwos_find_md5, nwos_find_sha1, nwos_find_sha256, and
  nwos_find_sha512 function where they were only comparing the first four bytes
  of the checksum.


Alpha_26.6 - 12-Mar-2008

  NOTE: logging public files is NOT complete in this version.

  Added files to create a .deb file for Ubuntu Linux.  This is not complete.

  Fixed the export_c_structs program to not write to the log file.

  Changed the default file path for private.obj to the user's home directory.
  This is because the current code is not safe for multiple users to be
  accessing the same public objects at the same time.  This will be fixed at
  some point in the future, but for now it is safest to have separate
  storage for each user.  Also changed to have a .objectify directory under
  the user's home directory.

  Made a new subdirectory ('gnu') to keep all of the files that come from the
  Free Software Foundation in.  Moved the md5, sha1, and sha256 files into it.
  Added the sha512 files as well.

  Feature Request #1856434 - Changed to use GNU MD5 functions instead of the
  RSA MD5 functions.  This eliminates the need to deal with different licensing
  (everything is now GPL).

  Fix Bug #1900246, if a file path contains a subdirectory (for example
  docs/xyzzy.txt) and that subdirectory (docs/) doesn't exist it will be
  created.

  Changed 'rename_file' to require either the '--no-history' or the
  '--keep-history' options, will not proceed if no history option is specified.

  Fixed chunk allocation so that if existing blocks are 90% full, it will
  allocate new chunks.  NOTE: this is not completely fixed, at this time it
  will only allocate chunks following existing chunks.

  Fix Bug #1900855, changed loop that searches for chunk to pick any chunk with
  empty blocks, and if it doesn't find one do a linear search.

  Changed to check for a configuration file in the users home directory, before
  reading the system (/etc/objectify.conf) file.

  Added read_md5_file and log_file in attic.  These programs are only used by
  someone adding checksums for public files to the public objects.  Contact me
  at qrwsoftware@gmail.com if you want to add some public files (like .iso
  files).


Alpha_26.5 -  5-Feb-2008

  Fix Bug #1887042 - changed user_config.c to read all environment variables
  before reading the configuration file.

  Fix Bug #1887574 - changed expand_sparse.c so that it calls 
  nwos_initialize_objectify with DEFAULT_FILE (NULL) instead of the storage
  path.  Now disk_io will not assume that it is a compressed file.


Alpha_26.4 -  4-Feb-2008

  Feature Request #1870454: removed configuration of directories and files from
  config.h.in and made a new objectify.conf file that can be put in /etc.  This
  way the configuration can be modified without recompiling.

  In patch_compressed added printing of the number of used blocks in the old
  file and the patch file to the print statement, when they don't match.

  Added some options that were missing from the "usage" information in
  list_files and added explanations of what the various options do.

  Changed prep_disk so that if --allocate-all is specified it only writes the
  bit map.  This is almost 100 times faster.  Also changed it so that it 
  doesn't cause large delays in other processes that might be using the disk at
  the same time.  And finally added a progress bar when using --allocate-all.

  Changed file.c to write MD5, SHA1, and SHA256 checksum results when importing
  files or creating a disc_list to log file instead of the standard output.

  Added --ignore-times option to patch_compressed to allow it to continue even
  if the time stamps in the compressed file header don't match the time stamps
  in the patch file.  This allows patching a compressed file that was restored.
  For example: if one restored (expand_sparse) from a compressed file then and
  then added data to the system creating backup (*.dif) files.  Then wanted to
  patch the compressed file that was used to restore, the time stamps would not
  match because the *.dif files were created after the restore.


Alpha_26.3 -  4-Jan-2008

  Fixed Bug #1862306 in the backup (.dif) file sorting routine.  Also added
  code to verify the .dif file is in the proper order after the sort, and
  print an error message if it isn't.

  Fixed diff_compressed to close the output file.

  Fixed rename_file to log it's arguments to the log file.

  Started moving items from the TODO list to the Objectify projects Feature
  Request Tracker.  The Objectify project is at:

       http://sourceforge.net/projects/objectify


  Feature Request #1856370: added --add-revision option to disc_list so it will
  connect any files that are revisions of previous files (have the same name).

  Added --time and --revision options to list_files program.

  Added a program in the attic (eliminate_one_block_chunks) to find disk chunks
  (16 megabytes) that only have 1 block (256 bytes) in them and move those 
  blocks to other locations on the disk to free up those chunks.  This is 
  experimental and I only recommend using it if it is absolutely necesssary.
  For example I moved my storage from a 250 gigabyte disk to a 160 gigabyte 
  partition and so I had to reduce the amount of disk space used.  The program
  takes a compressed file as input and outputs a compressed file with those
  blocks moved.

  Fixed disk_io.c so that it can be opened more than once.

 
Alpha_26.2 -  4-Dec-2007

  Added a new feature where it automatically creates a backup file of changes
  to the archive as information is added to it.  This is the first step towards
  having it backup on a remote machine.

  One significant advantage to having the backup files is if the system should
  crash during use, it is now possible to take the last compressed save file
  use the backup files to bring it up to the point just prior to the failure.

  Added a program that combines the backup files into a single file so one can
  apply all the changes in one pass.

  Fixed objectify.c to compile correctly in PUBLIC_MODE.  (PUBLIC_MODE is
  currently only used to add objects to the Public objects.)


Alpha_26.1 -  4-Nov-2007

  Added --help option and usage display to 'import_file' program.

  Added a small note on the security levels in the 'import_file' program in
  doc/Security_Levels.txt.

  Added --allocate-all option to prep_disk program.  This is a hack to force it
  to allocate all the disk space at the same time it preps the disk.  This is
  a temporary work around, until I can get all of the auto allocation code
  working.

  Added --verbose option to disk_usage program so it will print the blocks used
  in every chunk (if it is a large disk, that is a lot of spew).

  Changed output of disk_usage program to a table listing both chunks and
  blocks.

  Changed autoconf to test for 'strlcat' and 'strlcpy' functions and use the
  HAVE_STRLCAT and HAVE_STRLCPY instead of ifdef linux to decide whether to
  use the system provided functions or include our own.

  Changed autoconf to test for struct stat.mtimespec and changed file.c to test
  for not HAVE_STRUCT_STAT_ST_MTIMESPEC instead of testing for "linux" defined.

  Added include of sys/time.h to time_stamp.h because some systems need it to
  define struct timeval.

  Added OLDEST_COMPATIBLE_COMPRESSED_VERSION to configuration so expand_sparse
  can read all old compressed files that are compatible.

  Added "distclean" target to Makefiles.


Alpha_26 -  4-Oct-2007

  Added index to chunk on disk in chunk info table (change version to 0026).
  This allows the chunks to be spread across the disk instead of all being
  smashed together, which makes expanding the storage easier (don't need to
  move the chunks on the disk).

  Fixed Bug #1771323 - Error message if file being verified is larger than 2GB.
  This error only occurred on Linux running on 32-bit machines, GNU/Linux on 
  64-bit machines and *BSD on 32-bit machines worked correctly as well.  I was
  using the wrong method (_LARGEFILE64_SOURCE) instead of _FILE_OFFSET_BITS=64
  to tell GNU/Linux to use 64 bits for file size and offsets.

  Moved the definition of HAVE_STDINT_H out of the Makefile.in and have it
  inserted into config.h by autoconf/configure.

  Changed internal name for different security levels from Encryption_XXXXX to
  Security_XXXX because it better represents what is happening (there is NO
  changes to the encryption in different security levels.

  Added code to allow creation of public File objects.

  Added SHA256 checksums to file objects.  Note: it will still work with older
  file objects that were created before SHA256 checksums were calulated.

  Added file name globbing to export_file program.

  Added 'rename_file' program to allow renaming a file stored in the system.
  It does so by creating new Path and Path and File Association objects and
  does not delete the old ones.  It will NOT allow changing a file name if the
  file is stored in a disc list.  At some point in the future I need to add a 
  program to allow attaching a second name to a file so it can have two names.

  Changed the list_files program to NOT list the old names of files that have
  been renamed unless the new option --list-old-files is given.

  Changed the export_file program so that wild cards will NOT match old renamed
  file names.  Files can be exported using the old name if the old name is
  explicitly specified on the command line with no wild cards.

  Added doc/Document_Storage.txt file that contains a brief explanation of the
  procedure I use to store my documents into the system.

  Fixed bugs #1786616 and #1786619, problems creating a phone number for the
  first time.

  Fixed remove_from_reference_list so it can deal with all scenarios, not just
  in the last block.

  Because of the above fix, the remove_file program should work on any file.

  Added remove_file test script in attic, to test various cases of where the
  file is stored in reference lists (remove_from_reference_list).

  Fixed bug #1806945, the month least significant digit in the log file name
  an odd character if the month was October, November, or December.


Alpha_25.2 - 01-Aug-2007

  Fixed bug #1765315 - data checksum error when reading File object that
  has a newer revision.  Problem was with File object upgrade, when the old
  object was re-written, it was re-written as an updated File object.
  However, the data checksum had not been updated for the updated data.


Alpha_25.1 - 30-Jul-2007

  Fixed expand_sparse to allow either 0023 and 0024 compressed files to be
  read in.

  Fixed bug when private updated File class definition hasn't been created
  yet.

  Fixed bug when object storage is opened read only and it attempted to
  create the updated File class definition.


Alpha_25 - 29-Jul-2007

  Changed header version string from 0024 to 0025 even though the header did
  NOT change.  Because of the File class definition change if the public
  objects and the code were out of sync bad things could happen.  To avoid
  this I decided to change the version string.

  Fixed bug #1754741 - assert in read_object_from_disk, eliminated assert
  because it was old code that checked to make sure the block wasn't used
  before writing to it.  Now we assume the bit map is correct and we can
  write to the block even if it is non-zero.

  Fixed bug #1763165 - assert in verify_file when file doesn't exist.  The
  nwos_find_matching_path_and_file_association function was supposed to
  return false when a failure occurred reading the file, instead it was
  returning the enueration ERROR_OCCURRED which is non-zero or true.

  Moved VERSION_STRING from objectify.h into configure.ac so that version
  can be changed in only one file.

  Added an updated "File" class (public-070727-0024) that allows 64 bit file 
  sizes so it can record files up to 1 terabyte now.  Note: it still has an 
  artificial limit of 1 gigabyte for files stored in the system itself.

  Added a hack to remove an imported file from the system.  I DON'T recommend
  using it because it could fail and trash your archive.

  Fixed export_file to deal with files that have more than one revision
  (for now only the most recent file can be exported).

  Added --add-revision option to import_file so a newer revision of a file
  that is already in the system can be imported.

  Fixed a bug in verify_file so that if the user passed in the --ignore-time
  option and the file was stored it the system the nwos_file_is_identical
  assert would fail.

  Added --compressed option to verify_file so that it can read from a
  compresed file instead of the default storage if desired.

  Changed to use GNU autoconf to create the Makefiles and config.h, so that
  it handles the clock_gettime correctly on *BSD systems (we don't need to
  include -lrt when linking).

  Also correctly handles WORDS_BIGENDIAN when compiling sha1.o and compiles
  ok on *BSD where there isn't the endian.h and byteswap.h files.

  Added code to allow a person's birthday to be set after the person was in
  the system.

  Fixed bug that occurred when running on FreeBSD where errno was non-zero on
  entry to write_chunks so it thought there was an error after writing chunks.

  Fixed bug in reference_lists where the memory for the "first_block" structure
  allocated was FILE_BLOCK_SIZE instead of the real size of the structure
  (which is a pointer larger than FILE_BLOCK_SIZE).


Alpha_24 - 07-Jul-2007

  Changed LICENSE to GPL Version 3.

  Changed chunk_index so that instead of just storing the base object reference
  id for each chunk a block used count for that chunk is stored.  That way it
  is fast and easy to determine how full a chunk is.

  Fixed a bug reading a compressed file (this bug was in Alpha_23).

  Changed log_disc so a disc can be moved from one storage location to another.
  Also changed log_disc so storage locations can be defined by the user,
  instead of the ones predefined in the log_disc.c file.

  Fixed bug when compiled with PUBLIC_MODE define, introduced when Disk I/O 
  functions were split out of objectify.c and the disk_io.c file was created 
  (24-Jun-2007 Alpha_22.2).  


Alpha_23.1 - 30-Jun-2007

  Fixed a bug in the generate random id function where it tested the
  wrong byte in the bit map and sometimes returned an ID that was already
  in use, causing the block used assert to fail.

  Put #ifdef around the logging of write_blocks and add_to_reference_list,
  so they are not logged by default.


Alpha_23 - 27-Jun-2007

  Changed to store object blocks in order in storage instead of wrapping 
  them around the storage size.  There are several advantages to this, the
  main one being, the objects are not as dependant upon the storage size.
  Now a compressed file can be expanded into a different size of disk, as
  long as it is large enough to hold the objects.  Another advantage is
  that the blocks in compressed files are always sequential and won't
  change the order of blocks depending upon the size of storage.

  There was only one change to the header:

       bytes      0022 header                                 0023 header
        0-3:  NWOS                                    NWOS
        4-7:  0022                                    0023
        8-11: time stamp of last prep upper           time stamp of last prep upper
       12-15: time stamp of last prep lower           time stamp of last prep lower

       16-19: reserved blocks                         reserved blocks
       20-23: blocks used                             blocks used
       24-27: time stamp of last change upper         time stamp of last change upper
       28-31: time stamp of last change lower         time stamp of last change lower

       32-25: block offset to first chunk             block offset to first chunk
       36-39:                                         private chunks used
       40-43: 
       44-47: 

  In addition there is now a chunk index table stored, starting in the block
  following the header.  It is the first object reference for the chunk.

  Another change is that the blocks used for the bit_maps is not included in
  the "blocks used" count.


Alpha_22.3 - 25-Jun-2007

  Fix bug in prep_disc that let it continue even if there was an error in
  the size of allocation parameters.

  Moved the agreeing to no warranty after the parameters were checked in
  prep_disk.  This way he/she doesn't have to agree, just to find out that
  the paramters were wrong.


Alpha_22.2 - 24-Jun-2007

  Split all disk I/O routines out of objectify.c and created a new file
  disk_io.c.


Alpha_22.1 - 23-Jun-2007

  Moved some one off programs and programs no longer needed into the 'attic'
  directory.

  Fixed objectify.c so it would compile correctly in PUBLIC_MODE.

  Added code to objectify.c to close public objects file when terminating.

  Added code to diff_compressed.c to correctly handle the 0021 to 0022 
  transition.

  Added 'uninstall' command to Makefile.


Alpha_22 - 22-Jun-2007

  Changed so that public objects are just read from a file instead of being
  stored in the same storage as the private objects.  This required the header
  to be changed yet again to 0022:

       bytes      0021 header                                 0022 header
        0-3:  NWOS                                    NWOS
        4-7:  0021                                    0022
        8-11: time stamp of last prep upper           time stamp of last prep upper
       12-15: time stamp of last prep lower           time stamp of last prep lower

       16-19: reserved public blocks                  reserved private blocks
       20-23: public blocks used                      private blocks used
       24-27: time stamp of last public change upper  time stamp of last private change upper
       28-31: time stamp of last public change lower  time stamp of last private change lower

       32-25: reserved private blocks                 block offset to first chunk
       36-39: private blocks used
       40-43: time stamp of last private change upper
       44-47: time stamp of last private change lower

       48-51:
       52-55: next chunk with available ref
       56-59:
       60-63:


  Changed disc_list, log_disc, and identify_disc programs to take a directory as 
  input, instead of a list of files.


Alpha_21.2 - 9-Jun-2007

  Changed storage_location so that it can be a location or a person.

  Change file matching stuff to allow mismatch on time/date.

  Added "Manufacturer" class.

  Added "Account", "Account Number", and "Checking" classes and code to create
  checking  accounts.

  Added "Acronym" class.

  Added code to create index file for compressed file and use it if
  available (speed up indexing compressed file).

  Move test for bad open right after open.

  Changed add_person function to verify public names first.

  Added "Universal Resource Locator" (URL) class.


Alpha_21.1 - 15-Apr-2007

  Fixed bug in prep_disk that wrote public data into the private block area, thereby
  trashing the bit maps.

  Fixed bug in check_block_maps that printed the wrong percentage of disk used.

  Modified generate_random_id to try longer instead of giving up after only 13 tries.


Alpha_21 - 14-Apr-2007

  Storage can be in a disk partition, entire disk drive, or a normal file.

  Updated INSTALL file with more up to date information.  Also some info on using the
  various features.


25-Mar-2007

  0021 Changed the header, yet again, to split the time stamps for public and private
       last changed.

       bytes      0016-0020 header                    0021 header
        0-3:  NWOS                             NWOS
        4-7:  0020                             0021
        8-11: time stamp of last change 1
       12-15: time stamp of last change 2

       16-19: reserved public blocks           reserved public blocks
       20-23: reserved private blocks          public blocks used
       24-27:                                  time stamp of last public change upper
       28-31:                                  time stamp of last public change lower

       32-25: public blocks used               reserved private blocks
       36-39: private blocks used              private blocks used
       40-43:                                  time stamp of last private change upper
       44-47:                                  time stamp of last private change lower

       48-51:
       52-55: next chunk with available ref    next chunk with available ref
       56-59:
       60-63:


8-Mar-2007

  0020 Changed back to having 0x0xxxxxxx id's reserved for public blocks.  This was
       necessary because 0019 archives used id numbers in that range so if the archive
       didn't reserve exactly 64G for public blocks it will be broken.


26-Feb-2007

  0019 Changed the way the bit maps are dealt with in hashing the ID to the disk block
       number.  In previous versions it left holes in the ID and certain IDs (the ones
       that overlapped the bit maps) could not be used.  In 0019 I changed it so that
       the bit maps are simply skipped over and all ID numbers can be used.

       Also went back to just reserving 0x00000000 to 0x0fffffff for public space even
       if not all that space is allocated on the disk.

24-Feb-2007

  0018 Changed reference ids back to the original concept where reference ids are a full 32 
       bits on a particular disk drive and they are mapped down to the range of the disk.
       This works out much better when the size of the disk or partition changes.

  Note: since my old archive (version 0017) has only the reference IDs which are in the disk
        range, I have currently set the "generate_random_id" function to only create IDs in 
        the range above the disk drive.  After enough new IDs are created to make them 
        balanced I will change "generate_random_id" function to again create some IDs that 
        are in the disk range.


13-Jan-2007

  0017 Changed format of file object, moved modification_time to path_and_file_association
       object.

15-Dec-2006

  0016 Changed back to two area (Public and Private Encrypted) disk layout.

    The reasoning is:

      1) Having 3 areas is added complexity.
      2) More complicated to manage (dividing it up 3 ways, what is the right size?).
      3) Besides having to have no password for the unencypted area the only advantage
         is speed (no need to decrypt).
      4) One advantage to having all private blocks encrypted is that is additional
         fodder that someone trying to crack it has to wade through.

    However I did not change the header completely back, just removed the extra entries:

       bytes      0015 header                         0016 header
        0-3:  NWOS                             NWOS
        4-7:  0015                             0016
        8-11: time stamp of last change 1      time stamp of last change 1
       12-15: time stamp of last change 2      time stamp of last change 2

       16-19: reserved public blocks           reserved public blocks
       20-23: reserved private blocks          reserved private blocks
       24-27: reserved encrypted blocks
       28-31: 

       32-25: public blocks used               public blocks used
       36-39: private blocks used              private blocks used
       40-43: encrypted blocks used
       44-47:

       48-51:
       52-55: next chunk with available ref    next chunk with available ref
       56-59:
       60-63:

  The disk is now divided into only two sections instead of three like it was before:
 
           0015                0016

     +-------------+      +-----------+
     |  Reserved   |      | Reserved  |
     |   public    |      |  public   |
     |   blocks    |      |  blocks   |
     +-------------+      +-----------+
     |   Private   |      |  Private  |
     | Unencrypted |      | Encrypted |
     |   blocks    |      |  blocks   |
     +-------------+      +-----------+
     |   Private   |
     |  Encrypted  |
     |   blocks    |
     +-------------+


3-Dec-2006

  0015 rearranged disk layout and header:

       bytes      0014 header                         0015 header
        0-3:  NWOS                             NWOS
        4-7:  0014                             0015
        8-11: reserved public blocks           time stamp of last change 1
       12-15: disk size                        time stamp of last change 2

       16-19: public blocks used               reserved public blocks
       20-23:                                  reserved private blocks
       24-27: time stamp of last change 1      reserved encrypted blocks
       28-31: time stamp of last change 2

       32-25:                                  public blocks used (next available reference)
       36-39:                                  private blocks used
       40-43:                                  encrypted blocks used
       44-47:

       48-51:
       52-55:                                  next chunk with available reference
       56-59:
       60-63:

  The disk is now divided into three sections instead of two
 
           0014                0015

      +-----------+      +-------------+
      | Reserved  |      |  Reserved   |
      |  public   |      |   public    |
      |  blocks   |      |   blocks    |
      +-----------+      +-------------+
      |  Private  |      |   Private   |
      | Encrypted |      | Unencrypted |
      |  blocks   |      |   blocks    |
      +-----------+      +-------------+
                         |   Private   |
                         |  Encrypted  |
                         |   blocks    |
                         +-------------+


Labeled: objectify_061202_bad_multifile_path - 2-Dec-2006

  This version I modified the code so that the file_path object could point
  either directly to a file or it could point to a reference list that in turn
  pointed to a file.  I then determined that this wasn't going to work because
  there was nothing a disc_list could point to that specifically identified
  both the file and it's path.  Need to change to use the plan outlined on page
  100 (5-Nov-2006) of my notes, where there is an object the associates a
  specific file and a specific path which the disc_list can then point to.

Note somewhere 0012 reserved space for public objects?
               0013 added the bit maps
               0014 added the next public id in header bytes 16-19

Alpha_05_3 - 27-Sep-2006

  Changed so that data is stored in one large "sparse" file,
  instead of all the little /obj/xxxxxxxx files.

  Added utility functions to export the old /obj/xxxxxxxx files
  into a series of comma separated variable (csv) files, and to
  import those csv files into the new single sparse file.

  Also added utility programs to compress the large sparse file
  into a non-sparse file for backup, etc. and to expand a
  compressed file back into the sparse file.


Alpha_14 -

  Added document on the evolution of the object identifier (reference), in
  "/doc/object_ids.txt".


Alpha_13 - 26-Feb-2006

  This version is INCOMPLETE and won't build or run.  I have created it simply
  as a marker: big_bang_07.  I have decided to completely change the layout of
  the objects again.  The problem being that grafting them on top of another
  programming language causes schizophrenia, for instance, trying to deal with
  inheritance in both the objects and the language is difficult.  For example
  in the previous verson, the word and letter class definitions never existed. 

  Moved the class definition references out of the nwos_predefined_references.e
  file/class and into a new file/class nwos_classes.e.

  Added an "is_a" feature to the class definition, to allow finding out what a
  classes parent class is (I.E. noun -> word).


Alpha_12 - 20-Feb-2006

  I have decided to take this version as the "official" one and say the
  objects created by this version (big_bang_06) are the first official
  objects.  However, there is no need that I can see to create a general
  release because this version should never really be run again.  Once
  these objects exist they should be used by everyone and not regenerated
  again.

  Removed the usage of "aspell" to generate the spelling objects.

  Changed "NWOS_HEADER" to "NWOS_OBJECT" to hopefully make it easier to
  understand.

  Changed all classes to load on demand.  So an object can be created with
  "make_unresolved" and then when any of it's attributes are referenced it
  will automatically load itself from the disk.


Alpha_11 - 17-Feb-2006

  This version is also UNRELEASED.  It works but is still not really
  working as well as I would like.  The CVS tag for it is "big_bang_05".

  Fixed the reading of objects back in.  However, "print_spellings" still
  ends up reading every single object back in.  It is painfully slow.

  In this version I downloaded the GNU aspell English dictionary with the
  idea of using it to insert all of the English spellings into the
  database.  I thought it would be better to have as many as possible
  different spellings in the system up front and then the specific words
  could be created later without having to affect all of the spelling
  indexes.  Unfortunately, in looking through the aspell dictionary I see
  words that I am not sure about.  I have looked them up in my Merriam-
  Webster's Collegiate Dictionary and they don't appear there.  Not that
  it is the final authority, but since there is some doubt in my mind, I
  have decided to not just insert all of those spellings at this time.
  My new plan is to just add spelling that I know I need at this point in
  the project.


Alpha_10 - 11-Feb-2006

  This is another UNRELEASED version.  It doesn't work.  I am
  only releasing it as a marker (tag in CVS is big_bang_04).

  The file header in objects created with this version is 0010.

  Combined HISTORY file into RELEASE_NOTES, too hard dealing with
  two files and why use two when one will do?

  In this version the big_bang appears to work, however reading
  objects back in is broken.  This version includes a test program
  "print_spellings" that should have read the objects in and
  printed all of the spellings in the database.  However this
  version was designed to read all objects into memory.  Somehow,
  however, it gets tangled up in all the recursion of reading
  all objects and ends up reading creating two objects in memory
  for the same object.  This screws up the cache and it stack
  dumps.

  I have decided to discontinue this plan because it wasn't the
  optimum solution anyway.  When the database gets large there
  won't be enough room in memory for it anyway.  The plan never
  was to keep reading every single object into memory.


Alpha_09 - 04-Feb-2006

  This release was never actually created (Not tagged in CVS).  I
  did create a few objects with the header version 0009 and then
  decided to change the header format yet again.  So I decided to 
  increment the header version to 0010.

  The only CVS tag related to the files that created 0009 objects
  is "big_bang_03".


Alpha_08 - 02-Feb-2006

  This release was never actually created (Not tagged in CVS).  I
  did create a few objects with the header version 0008 and then
  decided to change the format again.  So I decided to increment
  the header version to 0009.

  The only CVS tag related to the files that created 0008 objects
  is "big_bang_02".


Alpha_07 - 30-Jan-2006

  Unreleased version - DO NOT USE

  This version is just a marker.  I created a base set of objects
  from the Fine (Eiffel) program create_base_letters.  But then once
  again decided to change the format before proceeding.

  This is the first version that uses Fine (Eiffel) for programming
  instead of C.


Alpha_06 - 23-Jan-2006

  Unreleased version - DO NOT USE

  This version is just a marker.  I created a few of the base objects
  but then decided that the header format needs to be changed before
  proceeding.

  This is the first version where the public objects are created once
  and they exist from that point on.  This version was the first
  attempt to create the base objects.


Alpha_05 - 09-Jan-2006

  Merged create_person (cperson), create_phone (cphone) and 
  find_phone (phone) apps into one app called "computer" that can
  do all of those things and more.

  Fixed several bugs in the name code, that mismatched names.

  Added cities and states now have capital cities.

  Changed "big_bang" to update objects from Alpha_04 (0004) objects
  to Alpha_05 (0005) objects.


Alpha_04 - 30-Dec-2005

  Added security by encrypting all of the data objects (but in this
  version reference lists are NOT encrypted).  The object's data is
  scrambled into 512 bytes of random data and the simplest form of 
  the Blowfish encryption is then run on the 512 bytes and it is
  written to disk.

  For now only one security option is available, all of the data is
  encrypted with the same key (pass phrase).  The pass phrase is a
  minimum of 34 characters.  If the pass phrase is lost or forgotten
  ALL DATA IS LOST as well.

  Changed the objects that have variable length data (Spelling, Name,
  and Year objects) to be a variable size.  This was to allow the
  random data to be better utilized.  I.E. if a spelling object for
  example was a fixed size (like before) and allowed a space for 100
  characters (like before) then 100 zeros would be in the random data
  and give some clue as to the data.  With the variable sized objects
  there are no zeros to be written into the random data and so there
  are fewer clues as to the contents of the data.

  Added disclaimers when the "big_bang" program is first run.


Alpha_03 - 29-Dec-2005 (Additional note added after Alpha_03 release)

  Also changed in Alpha_03 was the format of the version numbers.  In 
  Alpha_01 and Alpha_02 the version number in the file header was three 
  digits and was followed by a character indicating the endianess of the 
  object as it was stored on the disk ('l' = little endian, 'b' = big 
  endian, and 'n' no endianess).  In Alpha_03 the version was changed
  to be four digits and the endianess character was eliminated.  The
  endianess was eliminated because I decided to always just store and
  transfer objects as big endian and reversal needed (on little endian
  machines can be done when the object is read in from disk).

  So then the version numbers in the stored objects were:

    Alpha_01: 001x (where x is the endianess character)
    Alpha_02: 002x (where x is the endianess character)
    Alpha_03: 0003


Alpha_03 - 27-Dec-2005

  Changed the ObjRef again so that it is only 4 bytes instead of 8 bytes.
  The logic behind this is that even with a 250 gigabyte hard drive you
  can really only have a maximum of 488 million files since the size of
  each object is 512 bytes.  That is less than 12% of the available ids
  using 4 bytes, so there really isn't any danger of running out of ids
  right away.  A terrabyte drive would still use less than half of the
  available ids.  And when we start having 2 and up terabytes on a drive
  we should be fairly easily go to 5 byte ids.  That should be good up
  to a petabyte (is that what is after terabytes?).  There is no need to
  go from 4 bytes all the way to 8 bytes because there is no reason to
  have to be binary multiples since we are dealing with them one byte
  at a time.

  The object reference size should be adjusted to fit properly on the 
  storage medium, when 5 terabyte drives become available it will need 
  to be 5 bytes.  On smaller devices such a 256 Mb flash drives (assuming 
  minimum files size is still 512) could even do with 2 or 3 byte object 
  reference.  Let's see two bytes: 512 * 65536 = 33,554,432 would be good 
  for up to 32 Mb and three bytes: 512 * 16777216 = 8,589,934,592 would
  be good up to 8 Gb.

  Since we only have 4 bytes to deal with there is also no need to use
  the weird base32 file names.  The funny base32 filenames were kinda
  cool looking and made it easy to find objects, but that also made it
  easier for anyone trying to crack the system to get information.  So
  for security reasons I have changed it to use completely random ids.


Alpha_02 - 24-Dec-2005

  Fixed bugs in the create_phone and find_phone apps that couldn't deal with
  names where there was only one choice.

  Fixed bugs in the create_phone where the string buffers for area code and
  phone number were too short (not room for the new line character).

  Removed the "host" id from all object references (ObjRef).  Host redirection
  will be done with "redirection" objects in the future.


Alpha_01 - 22-Dec-2005

  I do NOT recommend using this version to store information that you don't want 
  anyone else to read.  There is no security in this version, all of the data 
  can be easily be read by anyone with access to the files.

  This is the first version that actually does something.  You can input 
  information about a person including their phone number and read it back.


