Beginning of VFM cleanup.
[pspp-builds.git] / src / ChangeLog
index c3877c4ac5e588c8f52f8d77d22b1a82f5be3cdb..eb405c3516cce83d6602c25234aea103947657ee 100644 (file)
+Tue Mar  2 11:36:52 2004  Ben Pfaff  <blp@gnu.org>
+
+       * frequencies.q: (cleanup_freq_tab) Avoid memory leak by
+       destroying hash table.
+
+       * glob.c: (read_active_file) Variable not referenced, removed.
+       (cancel_input_pgm) Ditto.
+
+       * levene.c: Add #include <stdlib.h> needed to call free().
+
+       * aggregate.c: (parse_aggregate_functions) Make `function'
+       variable const.
+
+Tue Mar  2 11:30:56 2004  Ben Pfaff  <blp@gnu.org>
+
+       Start working to eliminate VFM dependence on static variables.
+
+       * command.c: (cmd_parse) Use case_source_is_class().
+
+       * data-list.c: Rewrite to eliminate use of static variables.
+
+       * dfm.c: (cmd_begin_data) Use case_source_is_class().
+
+       * file-handle.q: (fh_handle_name) Make parameter const.
+
+       * file-type.c: Rewrite to eliminate use of static variables.
+
+       * flip.c: Rewrite to eliminate use of static variables.
+
+       * format.c: (get_format_var_width) New function.
+
+       * get.c: Eliminate use of static variables.
+
+       * inpt-pgm.c: Eliminate use of static variables.
+
+       * matrix-data.c: Eliminate use of static variables.
+
+       * set.q: (set_max_workspace) New variable.
+       (cmd_set) Use SET WORKSPACE to modify set_max_workspace.
+
+       * var.h: (struct case_list) Move here from vfmP.h.
+
+       * vars-atr.c: (discard_variables) Handle new vfm_source type.
+
+       * vfm.c: (vfm_source) Change type from struct case_stream to
+       struct case_source.
+       (vfm_sink) Change type from struct case_stream to struct
+       case_sink.
+       (static var paging) Rename workspace_overflow, all references
+       updated.
+       (procedure) Use new class structures.
+       (process_active_file) Ditto.
+       (process_active_file_write_case) Ditto.
+       (prepare_for_writing) Use set_max_workspace.  Use new class
+       structures.
+       (close_active_file) Use new class structures.  Free old sink.
+       (global var disk_source_file) Removed.
+       (global var disk_sink_file) Removed.
+       (disk_stream_init) Removed.
+       (disk_stream_read) Removed.
+       (disk_stream_write) Removed.
+       (disk_stream_mode) Removed.
+       (disk_stream_destroy_source) Removed.
+       (disk_stream_destroy_sink) Removed.
+       (global var vfm_disk_stream) Removed.
+       (disk_sink_create) New function.
+       (disk_sink_write) New function.
+       (disk_sink_destroy) New function.
+       (disk_sink_make_source) New function.
+       (disk_sink_class) New static var.
+       (disk_source_read) New function.
+       (disk_source_destroy) New function.
+       (global var vfm_source_class) New var.
+       (global var memory_source_cases) Removed.
+       (global var memory_sink_cases) Removed.
+       (global var memory_sink_max_cases) Removed.
+       (struct memory_sink_info) New struct.
+       (memory_stream_init) Removed.
+       (memory_stream_read) Removed.
+       (memory_stream_write) Removed.
+       (memory_stream_mode) Removed.
+       (memory_stream_destroy_source) Removed.
+       (memory_stream_destroy_sink) Removed.
+       (global var vfm_memory_stream) Removed.
+       (page_to_disk) Renamed write_active_file_to_disk().
+       (memory_sink_create) New function.
+       (memory_sink_write) New function.
+       (memory_sink_destroy) New function.
+       (memory_sink_make_source) New function.
+       (memory_sink_class) New static var.
+       (memory_source_read) New function.
+       (memory_source_destroy) New function.
+       (memory_source_get_cases) New function.
+       (memory_source_set_cases) New function.
+       (global var vfm_source_class) New var.
+       (procedure_write_case) Use new class structures.
+       (create_case_source) New function.
+       (case_source_is_complex) New function.
+       (case_source_is_class) New function.
+       (create_case_sink) New function.
+
+       * vfm.h: (global variable reinit_sysmis) Not used, removed.
+       (global variable reinit_blanks) Not used, removed.
+       (global variable init_zero) Not used, removed.
+       (global variable init_blanks) Not used, removed.
+       (struct case_source) New struct.
+       (struct case_source_class) New struct.
+       (struct case_sink) New struct.
+       (struct case_sink_class) New struct.
+       (struct case_stream) Removed.
+
+       * vfmP.h: (struct case_list) Moved to var.h.
+
+Tue Mar  2 11:28:30 2004  Ben Pfaff  <blp@gnu.org>
+
+       * algorithm.c: (count_equal) New function.
+       (count_if) New function.
+       (unique) Add assertions.
+       (partition) Add assertions.
+       (is_partitioned) New function.
+       (copy_if) Add assertions.
+       (remove_equal) Add assertions.
+       (lexicographical_compare) Rename lexicographical_compare_3way.
+       (sort) Add assertions.  Rephrase some code.
+       (is_sorted) New function.
+
+Sun Feb 29 23:24:57 2004  Ben Pfaff  <blp@gnu.org>
+
+       Rewrite SORT CASES.
+
+       * sort.c: Completely rewrite.
+
+       * sort.h: Expose interface via struct sort_cases_pgm, not via
+       global variables.
+
+       * aggregate.c: (sort) New static var.
+       (cmd_aggregate) Use sort.
+       (create_sysfile) Ditto.
+       (aggregate_single_case) Ditto.
+       (dump_aggregate_info) Ditto.
+       (agr_00x_end_func) Ditto.
+       (debug_print) Ditto.
+
+       * var.h: (enum SRT_ASCEND) Removed.
+       (enum SRT_DESCEND) Removed.
+       (struct sort_cases_proc) Removed.
+       (struct variable) Remove p.srt member.
+
+Sun Feb 29 23:22:45 2004  Ben Pfaff  <blp@gnu.org>
+
+       Get rid of the old, crappy heap structure and replace it by a new,
+       shiny, C++ STL-like heap structure.
+       
+       * Makefile.am: (pspp_SOURCES) Remove heap.c, heap.h.
+
+       * algorithm.c: (push_heap) New function.
+       (heapify) Ditto.
+       (pop_heap) Ditto.
+       (make_heap) Ditto.
+       (sort_heap) Ditto.
+       (is_heap) Ditto.
+       
+       * heap.c: Removed.
+
+       * heap.h: Removed.
+
+Sun Feb 29 23:21:53 2004  Ben Pfaff  <blp@gnu.org>
+
+       Increase warning level.
+       
+       * Makefile.am: (AM_CFLAGS) Remove -Wnouninitialized.
+
+Sat Feb 21 17:38:58 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+        * main.c: Added a signal handler for SIGSEGV requesting a bug report.
+        
+Fri Feb 20 23:22:14 2004  Ben Pfaff  <blp@gnu.org>
+
+       * dictionary.c: (dict_create_var) Fix root cause of bug worked
+       around by previous change log entry.
+       
+       * compute.c: (lvalue_finalize) Remove workaround from previous
+       change log entry.
+
+Fri Feb 20 14:37:41 WAST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * compute.c: Fixed a bug where the Format was not getting set for 
+         computed variables (thus causing a crash when SAVEing).
+
+       * Added a test to stop this bug ever coming back
+
+Wed Feb 18 22:21:35 2004  Ben Pfaff  <blp@gnu.org>
+
+       Got rid of approx.h.  In general, replaced all references to
+       approx_eq() by ==, approx_lt() by <, etc.  Other types of changes
+       noted below.
+
+       * Makefile.am: (pspp_SOURCES) Removed approx.h.
+
+       * data-out.c: (try_F) Replaced test for approx_eq(number, 0.0) by
+       test for mag < EPSILON.
+
+       * misc.h: Add definition of EPSILON.
+
+Wed Feb 18 21:32:44 2004  Ben Pfaff  <blp@gnu.org>
+
+       * vfm.c: (procedure) Add check to prevent recursive call.
+
+Wed Feb 18 21:48:54 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * Moved the declarations relating to values to their own header file
+         (val.h)
+
+       * Added levene.c and levene.h
+
+       * vars-atr.c: Changed the signature of compare_values to 
+       take const * arguments.
+               
+       * t-test.q: Changed the structure of struct t_test_proc 
+       variables now contain their own group statistics information.
+       Eventually, t_test_proc might get renamed, because it'd be 
+       applicable to other commands too.
+
+Mon Feb 16 23:15:51 2004  Ben Pfaff  <blp@gnu.org>
+
+       * data-out.c: Clean up.  Changed interface of convert_*() to take
+       either a `double' or a `const char *' instead of a `const union
+       value *'.  Update all implementations of those interfaces.
+       (data_out) Use switch statements instead of a table.
+       (convert_AHEX) Rewrite.
+
+       * format.h: Update comment.
+
+Mon Feb 16 22:14:36 2004  Ben Pfaff  <blp@gnu.org>
+
+       * q2c.c: (dump_header) Add an Emacs header line to output files
+       that makes generated .c files read-only by default, to make it
+       difficult to accidentally change generated files.
+
+Mon Feb 16 22:12:07 2004  Ben Pfaff  <blp@gnu.org>
+
+       * frequencies.q: (compare_freq_numeric_a) Compare by frequency,
+       not bogus a->v.c <=> b->v.c pointer compare.
+       (compare_freq_alpha_a) Ditto.
+       (compare_freq_numeric_d) Ditto.
+       (compare_freq_alpha_d) Ditto.
+       
+Mon Feb 16 22:00:53 2004  Ben Pfaff  <blp@gnu.org>
+
+       Changed data_out() to store string data directly into a `union
+       value''s s member, not indirectly into c.
+
+       * crosstabs.q: (output_pivot_table) Use format_short() instead of
+       data_out().
+       (table_value_missing) Ditto.
+       (float_M_suffix) Ditto.
+       (format_short) New function.
+
+       * data-in.h: (data_in_finite_line) Remove inline definition.
+
+       * data-list.c: (destroy_dls_var_spec) New function.
+       (destroy_dls) Rewrite in terms of destroy_dls_var_spec().
+       (data_list_source_destroy_source) Avoid cast.
+       (struct repeating_data_trns) New field `id_value'.  Update
+       comments.
+       (cmd_repeating_data) Initialize id_value.  Use new
+       repeating_data_trns_free() for freeing REPEATING DATA
+       transformations.
+       (rpd_parse_record) Rewrite support for record ID to be less bogus.
+       (repeating_data_trns_free) New function.
+
+       * data-out.c: (data_out) Change return type to `void' by replacing
+       error returns by writing a message into the output buffer.
+       (convert_A) Read from v->s instead of v->c.
+       (convert_AHEX) Ditto.
+
+       * expr-evl.c: Update comment.
+       (expr_evaluate) Add assertion in OP_STRING case.
+
+       * format.h: (macro MAX_FORMATTED_LEN) New macro.
+
+       * list.q: (list_cases) Update for new data_out() semantics.
+
+       * print.c: (print_trns_proc) Ditto.
+
+       * tab.c: (tab_value) Ditto.
+       (tab_float) Avoid stupid cast.
+
+       * var.h: Update comments.
+       (macro MAX_STRING) New macro.
+       (macro MAX_ELEMS_PER_VALUE) New macro.
+
+       * vars-atr.c: (compare_values) New function.
+
+       * vfm.c: (dump_splits) Update for new data_out() semantics.
+
+Mon Feb 16 21:45:47 2004  Ben Pfaff  <blp@gnu.org>
+
+       * crosstabs.q: (struct table_entry) Rename v[] to values[].  All
+       references updated.
+       (struct crosstab) Rename v[] to vars[].  All references updated.
+       (hash_table_entry) Replace the hash algorithm and fix a bug at the
+       same time, which caused the hash value to depend only on a single
+       value, not all of the variables' values.
+       
+Mon Feb 16 12:49:53 2004  Ben Pfaff  <blp@gnu.org>
+
+       Clean up struct dictionary's value_cnt usage.
+
+       * dictionary.c: Add a function comment to each function.
+       (struct dictionary) Rename value_cnt to next_value_idx, which more
+       accurately reflects its meaning.  All references updated.
+       (dict_rename_vars) Add assertion.
+       (dict_get_value_cnt) Rename dict_get_next_value_idx().  All
+       references updated.
+       (dict_get_case_size) New function.
+
+       * aggregate.c: (create_sysfile) Use dict_get_case_size().
+
+       * get.c: (mtf_read_nonactive_records) Ditto.
+
+       * sort.c: (allocate_cases) Ditto.
+       (write_initial_runs) Ditto.
+       (merge) Ditto.
+       (merge_once) Ditto.
+
+       * vfm.c: (prepare_for_writing) Ditto.
+       (setup_lag) Ditto.
+       (lag_case) Ditto.
+
+Mon Feb 16 00:17:55 2004  Ben Pfaff  <blp@gnu.org>
+
+       Make vfm.c slightly less grotesque.
+
+       * vfm.c: (filter_var) Removed.
+       (filter_index) Removed.
+       (FILTERED macro) Removed.
+       (exclude_this_case) New function.
+       (process_active_file_write_case) Use exclude_this_case() instead
+       of FILTERED and inline tests.
+       (procedure_write_case) Ditto.
+       (setup_filter) Removed.
+       (open_active_file) Don't call setup_filter().
+       (close_active_file) Call dict_get_filter() instead of checking
+       filter_var.
+
+Mon Feb 16 00:01:53 2004  Ben Pfaff  <blp@gnu.org>
+
+       * var.h: (struct variable) Update comments.
+
+Sun Feb 15 23:14:59 2004  Ben Pfaff  <blp@gnu.org>
+
+       New functions dict_create_var_assert(), dict_lookup_var_assert().
+       Converted several dict_*_var()/assert pairs into a single
+       dict_*_var_assert().
+
+       * dictionary.c: (dict_create_var_assert) New function.
+       (dict_lookup_var_assert) New function.
+
+Sun Feb 15 23:06:08 2004  Ben Pfaff  <blp@gnu.org>
+
+       Got rid of "struct long_vec", envector(), devector(), etc.  Added
+       two members `init', `reinit' to struct variable as a substitute.
+       
+       * Makefile.am: (pspp_SOURCES) Removed cases.c, cases.h.
+       
+       * cases.c: Removed.
+
+       * cases.h: Removed.
+
+       * aggregate.c: (parse_aggregate_functions) destvar doesn't need
+       init.
+
+       * autorecode.c: (cmd_autorecode) destvars don't need init.
+
+       * compute.c: (lvalue_finalize) Set reinit.
+
+       * data-list.c: (fixed_parse_compatible) Don't need init usually.
+       (dump_fmt_list) Ditto.
+       (parse_free) Ditto.
+
+       * descript.q: (run_z_pass) Don't need init for z-scores.
+
+       * dictionary.c: (dict_create_var) Initialize `init', `reinit'
+       members.
+       (dict_clone_var) Copy `reinit' member, initialize `init' member.
+
+       * glob.c: (init_glob) Remove vec_init() calls.
+
+       * inpt-pgm.c: (cmd_end_input_program) Use `reinit', not `left'.
+       
+       * loop.c: (internal_cmd_loop) Don't need to call envector().
+
+       * numeric.c: (cmd_numeric) Ditto.
+       (cmd_string) Ditto.
+       (cmd_leave) Ditto.  Set `init', `reinit' members.
+
+       * recode.c: (cmd_recode) Don't need to call envector().
+
+       * repeat.c: (internal_cmd_do_repeat) Ditto.
+
+       * var.h: (struct variable) Remove `left'.  Add `init', `reinit'.
+       (force_create_variable) Removed prototype.
+       (force_dup_variable) Ditto.
+
+       * vector.c: (cmd_vector) Don't need to call envector().
+
+       * vfm.c: (reinit_sysmis) Removed.
+       (reinit_blanks) Removed.
+       (init_zero) Removed.
+       (init_blanks) Removed.
+       (process_active_file_write_case) No need to deal with vectors.
+       Call clear_temp_case().
+       (vector_initialization) Rewrite to use `init', `reinit'.
+       (close_active_file) No need to call vec_clear().
+       (procedure_write_case) Call clear_temp_case().
+       (clear_temp_case) New function.
+
+Sun Feb 15 20:50:36 2004  Ben Pfaff  <blp@gnu.org>
+
+       * pfm-write.c: (bufwrite) Get rid of nasty cast that also invoked
+       undefined behavior.
+
+Thu Feb 12 23:35:15 2004  Ben Pfaff  <blp@gnu.org>
+
+       Add auxiliary argument to procedure() interface.  Associated small
+       clean-ups of vfm interface.
+       
+       * Updated every caller of procedure() and process_active_file() to
+       reflect modified interface.  Simple, ordinary changes not listed
+       otherwise below.
+
+       * Updated every function that implements struct case_stream's
+       `read' function to take a write_case_func and a write_case_data.
+       Also updated every caller of write_case() to instead call them
+       through these arguments.  In some cases this meant that the extra
+       args had to be threaded through a couple of extra levels.  This
+       wasn't difficult or interesting so the details won't be given.
+
+       * data-list.c: (struct repeating_data_trns) Add members
+       `write_case', `wc_data' as kluge.
+       (read_one_set_of_repetitions) Rename repeating_data_trns_proc and
+       make non-static.
+       (repeating_data_set_write_case) New function.
+
+       * data-list.h: New file to declare repeating_data_trns_proc() and
+       repeating_data_set_write_case().
+
+       * inpt-pgm.c: (input_program_source_read) Call
+       repeating_data_set_write_case() for all the REPEATING DATA
+       transformations, so that they know where to send their cases.
+       It's a big kluge.  Also kluge in END CASE.
+       (end_case_trns_proc) Never called anymore, but we still need it,
+       so just assert(0).
+
+       * sort.c: (read_sort_output) Update to match struct case_stream
+       `read' member.
+
+       * vfm.c: (struct write_case_data) New structure.
+       (proc_func) Removed.
+       (virt_proc_func) Removed.
+       (begin_func) Removed.
+       (virt_begin_func) Removed.
+       (end_func) Removed.
+       (write_case) Removed.
+       (procedure) Added an auxiliary parameter to each function pointer
+       argument's prototype.  Added an auxiliary data parameter.
+       Rewrote.
+       (process_active_file) Ditto.
+       (process_active_file_write_case) Pass aux data along.
+       (close_active_file) Ditto.
+       (procedure_write_case) Ditto.
+       (SPLIT_FILE_procfunc) Ditto.
+
+       * vfm.h: (typedef write_case_data) New.
+       (typedef write_case_func) New.
+       (struct case_stream) Add parameters to `read' member prototype.
+       
+Thu Feb 12 19:24:53 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * t-test.q:  Added calculations for independent samples. (But no Levene
+       test yet!)
+
+       * Makefile.am: Moved q_sources_c into own variable 
+
+Wed Feb 11 23:56:51 2004  Ben Pfaff  <blp@gnu.org>
+
+       Miscellaneous cleanups.
+       
+       * Change unused to UNUSED in many source files to reflect modified
+       pref.h.  Change use of __WIN32__, __MSDOS, __DJGPP__,
+       __CYGWIN32__, __unix__, and unix not to assume that they're
+       defined to a nonzero value.  Change use of __attribute__ to use
+       NO_RETURN or PRINTF_FORMAT instead.
+       
+       * alloc.h: Move definitions for local_alloc(), local_free() here
+       from ../pref.h.orig and simplify.
+
+       * expr-evl.c: Instead of working differently based on PAGED_STACK,
+       use a pool allocator unconditionally.
+       (CHECK_STRING_SPACE) Removed.
+       (ALLOC_STRING_SPACE) Removed.
+       (expr_evaluate) Use e->pool instead of CHECK_STRING_SPACE and
+       ALLOC_STRING_SPACE.
+
+       * expr-opt.c: (dump_expression) Allocate string pool.
+
+       * expr-prs.c: (expr_free) Free string pool.
+
+       * pool.c: (pool_destroy) This pool must be removed from its
+       parent's list of gizmos, not from its own.  Use free_all_gizmos().
+       (pool_clear) New function.
+       (free_all_gizmos) New function.
+       (pool_alloc) Use space in empty block after this one if any.
+       (pool_release) Only empty out blocks, don't actually free() them.
+
+       * print.c: Get rid of PAGED_STACK special case by always
+       dynamically allocating line buffers.
+       (struct print_trns) Always include the `line' member.
+       (internal_cmd_print) Always initialize the `line' member.
+       (alloc_line) Always allocate memory for `line'.
+       (print_trns_proc) Always initialize buf from `line' member.
+       (print_trns_free) Always free `line' memory.
+
+       * sort.c: (allocate_file_handles) Special-case MS-DOS for mkdir()
+       call.
+       
+Wed Feb 11 20:33:18 2004  Ben Pfaff  <blp@gnu.org>
+
+       * flip.c: Fixed crash from FLIP when a numeric variable is
+         specified on NEWNAMES and a large value is used, and a couple of
+         other minor bugs besides.
+         (struct varname) Make name a 9-character fixed-size array
+         instead of a 1-character variable size array.
+         (make_new_var) Allow digits in variable names.
+         (flip_stream_write) Limit numeric values to 8 characters and
+         format system missing and very large and small values more
+         appropriately.
+
+Thu Feb  5 13:19:06 WAST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * command.c: Fixed test on command return status for the correct 
+          value,  which had been causing a crash under certain invalid input.
+
+Wed Feb  4 15:34:11 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * t-test.q: Added calculations for the one sample variant of the T-TEST
+
+Tue Feb  3 20:09:54 2004  Ben Pfaff  <blp@gnu.org>
+
+       * tab.c: (render_strip) Fix bug that sometimes caused joined text
+         in joined cells to be rendered outside box boundaries.
+
+Tue Feb  3 18:56:45 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * random.c (rng_create): Fixed seeding so that it gets reseeded after
+       SET seed=xx has been called.
+
+Mon Jan 19 14:08:09 2004  Ben Pfaff  <blp@gnu.org> 
+
+       * random.c (rng_get_double): Fix always-returning-zero bug in my
+       preferred way, and at the same time make sure rounding doesn't
+       bite us.
+
+Thu Jan  1 23:16:41 2004  Ben Pfaff  <blp@gnu.org>
+
+       * html.c: (change_attributes) Dead code, removed.
+       (escape_string) Eliminate code to call change_attributes() that
+       never actually called it.
+       (output_tab_table) Get rid of dependence on tab_hit
+       and struct tab_joined_cell's hit member, which are abominations.
+
+       * tab.c: (tab_output_text) Don't call
+       d->class->text_set_font_by_name if it's a null pointer.
+       (macro UNROLL_LOOP) Eliminate.
+       (macro UNROLL_3_LOOPS) Eliminate.
+       (tabi_render) Rewrite not to use the above macros.
+
+Thu Jan  1 23:09:07 2004  Ben Pfaff  <blp@gnu.org>
+
+       Start working on a new output driver system, one that doesn't suck
+       so much, by adding a "device-independent" output driver.  The idea
+       is to write out only a single output stream, then use separate
+       processes to translate them into whatever formats we want.  This
+       is similar to how "groff" works with its various output drivers
+       (grops, grotty, grodvi, ...).
+       
+       * Makefile.am: (pspp_SOURCES) Add devind.c, devind.h.
+
+       * list.q: (write_all_headers) Stub out devind class.
+       (clean_up) Ditto.
+       (determine_layout) Ditto.
+       (list_cases) Ditto.
+
+       * output.c: (outp_init) Add devind class.
+
+       * devind.c: New file.
+
+       * devind.h: New file.
+
+Thu Jan  1 23:08:14 2004  Ben Pfaff  <blp@gnu.org>
+
+       * frequencies.q: (hash_value_alpha) Fixed up the previous change
+       to use the proper string length.
+
+Wed Dec 31 16:27:33 WAST 2003 John Darrington <john@darrington.wattle.id.au>
+
+       * Fixed bug where FREQ would crash on alpha values
+
+Tue Dec 30 22:42:57 2003  Ben Pfaff  <blp@gnu.org>
+
+       * Removed bletcherous alloca() workarounds for AIX from top of
+       many files.  AIX can use the alternative alloca() implementation
+       instead.
+
+Tue Dec 30 22:35:16 2003  Ben Pfaff  <blp@gnu.org>
+
+       * ascii.c: (ascii_option) Fix implementation of headers option.
+
+Tue Dec 30 22:32:53 2003  Ben Pfaff  <blp@gnu.org>
+
+       * ascii.c: Add a "squeeze" option to the ASCII driver to squeeze
+       multiple blank lines into one.
+       (struct ascii_driver_ext) Add squeeze_blank_lines option.
+       (ascii_preopen_driver) Initialize squeeze_blank_lines.
+       (static var option_tab) Add squeeze entry.
+       (ascii_option) Set squeeze_blank_lines.
+       (output_lines) Implement squeezing blank lines.
+
+Wed Dec 31 07:19:46 WST 2003 John Darrington <john@darrington.wattle.id.au>
+
+       * Removed redundant code from output.h
+
+Sat Dec 27 22:17:52 2003  Ben Pfaff  <blp@gnu.org>
+
+       Dictionary classes: each variable is "ordinary", "system", or
+       "scratch".
+
+       * var.h: (enum dict_class) New enum.
+
+       * vars-prs.c: (dict_class_from_id) New function.
+       (dict_class_to_name) New function.
+
+Sat Dec 27 22:16:06 2003  Ben Pfaff  <blp@gnu.org>
+
+       * var.h: (struct freq_tab_set) Removed (not used).
+
+Sat Dec 27 22:15:21 2003  Ben Pfaff  <blp@gnu.org>
+
+       * value-labels.c: (val_labs_destroy) vls needs to be freed too.
+
+Sat Dec 27 22:10:49 2003  Ben Pfaff  <blp@gnu.org>
+
+       * stats.c: (hypercube) Rename pow4().  All references updated.
+
+Sat Dec 27 22:05:49 2003  Ben Pfaff  <blp@gnu.org>
+
+       * rename-vars.c: (cmd_rename_variables) Rewritten.
+       (compare_name) Removed.
+
+Sat Dec 27 22:03:51 2003  Ben Pfaff  <blp@gnu.org>
+
+       var_set feature, and code taking advantage of it.
+       
+       * crosstabs.q: (static var var_dict) Removed.
+       (static var variables) New variable.
+       (static var variables_cnt) New variable.
+       (cmd_crosstabs) Free variables instead of var_dict.
+       (internal_cmd_crosstabs) Initialize and use variables,
+       variables_cnt instead of var_dict.
+       (free_var_dict) Removed.
+       (crs_custom_tables) Use var_set instead of a copied dictionary.
+       (crs_custom_variables) Set up variables, variables_cnt instead of
+       var_dict.
+       [DEBUGGING] (debug_print) Ditto.
+
+       * means.q: (mns_custom_tables) Use var_set instead of a copied
+       dictionary.
+
+       * vars-prs.c: (parse_vs_variable) New function.
+       (parse_dict_variable) Rewritten.
+       (parse_variable) Rewritten.
+       (parse_variables) Renamed parse_var_set_vars(), rewritten.
+       (parse_variables) New function in terms of parse_var_set_vars().
+       Now requires its first argument to be non-null.  All references
+       that passed a null pointer updated to pass default_dict instead.
+       (macro id_dict) Removed.
+       (parse_DATA_LIST_vars) Add assertions.
+       (parse_mixed_vars) Ditto.
+       (struct var_set) New structure.
+       (var_set_get_cnt) New function.
+       (var_set_get_var) New function.
+       (var_set_lookup_var) New function.
+       (var_set_destroy) New function.
+       (dict_var_set_get_cnt) New function.
+       (dict_var_set_get_var) New function.
+       (dict_var_set_lookup_var) New function.
+       (dict_var_set_destroy) New function.
+       (var_set_create_from_dict) New function.
+       (struct array_var_set) New structure.
+       (array_var_set_get_cnt) New function.
+       (array_var_set_get_var) New function.
+       (array_var_set_lookup_var) New function.
+       (array_var_set_destroy) New function.
+       (var_set_create_from_array) New function.
+
+       * q2c.c: (dump_parser) Use parse_variables(default_dict, ...)
+       instead of parse_variables(NULL, ...) in output code.
+
+Sat Dec 27 21:38:53 2003  Ben Pfaff  <blp@gnu.org>
+
+       Change inp_init from a 2-bit vector to an ordinary array.
+       Initialize it all in cmd_end_input_program() instead of in
+       create_variable().
+
+       * inpt-pgm.c: (enum value_init_type) New enum.
+       (global var inp_init) Change to `enum value_init_type *', make
+       static.
+       (inp_init_size) Removed.
+       (inp_nval) Change to `size_t', make static.
+       (cmd_input_program) Don't initialize inp_init or inp_init_size.
+       (cmd_end_input_program) Initialize inp_init, inp_nval.
+       (init_case) Rewrite.
+       (clear_case) Rewrite.
+
+       * inpt-pgm.h: Removed.
+
+Sat Dec 27 21:36:38 2003  Ben Pfaff  <blp@gnu.org>
+
+       * hash.c: (hsh_hash_bytes) Use Fowler-Noll-Vo hash instead of
+       Colin Plumb hash.  It is simpler and should better resist
+       collisions.
+       (hsh_hash_string) Ditto.
+
+Sat Dec 27 21:34:57 2003  Ben Pfaff  <blp@gnu.org>
+
+       * get.c: (export_write_case_func) Remove debug printing code.
+
+Sat Dec 27 21:11:09 2003  Ben Pfaff  <blp@gnu.org>
+
+       * get.c: (cmd_save_internal) Rename parameter.  Use &t->h instead
+       of cast.
+       (save_write_case_func) Use &trns->h instead of cast.
+       (cmd_export) Use &t->h instead of cast.
+
+Sat Dec 27 20:57:42 2003  Ben Pfaff  <blp@gnu.org>
+
+       Moved vectors into the dictionary.
+
+       * var.h: (struct vector) Moved here from vector.h.  `index' member
+       renamed `idx', `v' renamed `var', `nv' renamed `cnt'.  All
+       references updated.
+       
+       * vector.h: Removed.
+
+       * vector.c: (global var vec) Removed.
+       (global var nvec) Removed.
+       (cmd_vector) Rewritten.
+       (find_vector) Removed.
+
+       * dictionary.c: (dict_create_vector) New function.
+       (dict_get_vector) New function, replaces reading global vec[]
+       array.
+       (dict_get_vector_cnt) New function, replaces reading global nvec
+       variable.
+       (dict_lookup_vector) New function, replaces find_vector().
+       (dict_clear_vectors) New function.
+
+Sat Dec 27 20:54:01 2003  Ben Pfaff  <blp@gnu.org>
+
+       Start to move away from `struct variable' p `union' member to void
+       * aux member.
+
+       * var.h: (struct variable) Add `aux' member.
+
+Sat Dec 27 20:36:25 2003  Ben Pfaff  <blp@gnu.org>
+
+       Get rid of struct variable `foo' member.
+
+       * frequencies.q: (internal_cmd_frequencies) Use p.frq.used instead
+       of foo.
+       (frq_custom_variables) Ditto.
+       (frq_custom_grouped) Ditto.
+
+       * get.c: (struct save_trns) Change `var' member from `int *' to
+       `struct variable **'.
+       (cmd_save_internal) Use aux instead of foo.
+       (save_trns_proc) Use revised `var' member.
+       (static var mtf_seq_no) Renamed mtf_seq_num.
+       (static var mtf_seq_nums) New static var.
+       (cmd_match_files) Initialize mtf_seq_nums.
+       (mtf_free) Free mtf_seq_nums.
+       (mtf_processing) Use mtf_seq_nums instead of foo.
+       (mtf_merge_dictionary) No need to initialize mv->foo.
+       (cmd_export) Use aux instead of foo.  Use revised `var' member.
+       (mns_custom_tables) Don't use foo to check for duplicates, that's
+       what PV_NO_DUPLICATE is for.
+
+       * var.h: (struct variable) Remove `foo' member.
+       (struct frequencies_proc) New member.
+       
+Sat Dec 27 19:46:13 2003  Ben Pfaff  <blp@gnu.org>
+
+       Clean up COMPUTE and IF.
+
+       * compute.c: More or less rewrite the darn thing.
+       (struct compute_trns) Rename and reorder and add and delete
+       members.
+       (cmd_compute) Rewrite.
+       (compute_num) Make conditional on test expression.  Now used for
+       both COMPUTE and IF.
+       (compute_num_vec) Ditto.
+       (compute_str) Ditto.
+       (compute_str_vec) Ditto.
+       (cmd_if) Rewrite.
+       (if_num) Removed.
+       (if_num_vec) Removed.
+       (if_str) Removed.
+       (if_str_vec) Removed.
+       (parse_target_expression) Renamed parse_rvalue_expression(),
+       rewritten.
+       (new_trns) Renamed compute_trns_create(), rewritten.
+       (delete_trns) Removed.
+       (free_trns) Renamed compute_trns_free(), rewritten.
+       (struct lvalue) New structure.
+       (parse_var_or_vec) Renamed lvalue_parse(), rewritten.
+       (lvalue_get_type) New function.
+       (lvalue_is_vector) New function.
+       (lvalue_finalize) New function.
+       (lvalue_destroy) New function.
+       
+Sat Dec 27 19:44:14 2003  Ben Pfaff  <blp@gnu.org>
+
+       * command.def: Disallow MODIFY VARS in input mode, so that
+       variables can't get dropped and confuse cmd_end_input_program()'s
+       attempt to fill inp_init[].
+       
+       * modify-vars.c: (static var forward_positional_ordering) New
+       variable.
+       (struct var_modification) Entirely changed.
+       (rearrange_dict) Interface changed, rewritten.
+       (cmd_modify_vars) Deal with modified struct var_modification, much
+       rewritten.
+       (struct var_renaming) New structure.
+       (compare_var_renaming_by_new_name) New function.
+       (validate_var_modification) New function.
+
+       * var.h: (struct modify_vars_proc) Removed.
+       (struct variable) Removed member p.mfv.
+
+Sat Dec 27 19:40:26 2003  Ben Pfaff  <blp@gnu.org>
+
+       Make EVALUATE a valid command whether we're debugging or not, so
+       that `make check' can succeed regardless of whether debugging is
+       turned on.
+       
+       * command.def: [GLOBAL_DEBUGGING] Drop the #if.
+
+       * compute.c: [GLOBAL_DEBUGGING] (cmd_evaluate) Drop the #if.
+
+Sat Dec 27 19:34:40 2003  Ben Pfaff  <blp@gnu.org>
+
+       * apply-dict.c: (cmd_apply_dictionary) Replace a ghastly switch
+       statement by a simple if test.
+
+       * dfm.c: (dfm_get_record) Add assertion.
+
+Sat Dec 27 17:51:26 2003  Ben Pfaff  <blp@gnu.org>
+
+       For each file x.c, move #include "x.h" to the very top of the
+       include list, to catch x.h failing to include the proper headers.
+
+Sat Dec 27 17:50:19 2003  Ben Pfaff  <blp@gnu.org>
+
+       * algorithm.c: (find) New function.
+       (remove_equal) New function.
+       (set_difference) New function.
+       (adjacent_find_equal) New function.
+       [TEST_UNIQUE] Removed test case.
+       (copy_if) Find end test.
+
+Sat Dec 27 17:42:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * dictionary.c: (dict_get_case_weight) New convenience function.
+
+       * aggregate.c: (accumulate_aggregate_info) Use
+       dict_get_case_weight().
+
+       * frequencies.q: (calc_general) Ditto.
+       (calc_integer) Ditto.
+       (calc) Ditto.
+
+       * t-test.q: (groups_calc) Ditto.
+       (z_calc) Ditto.
+
+Sat Dec 27 17:29:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * glob.c: (global var default_dict) Change from `struct
+       dictionary' to `struct dictionary *'.  All references changed.
+       (init_glob) Initialize default_dict with dict_create().
+
+Sat Dec 27 17:06:06 2003  Ben Pfaff  <blp@gnu.org>
+
+       struct dictionary now made opaque.  All related functions:
+
+       * get.c: (rename_variables) Removed.
+       (dict_delete_run) Removed.
+       
+       * temporary.c: (copy_variable) Removed.
+       (new_dictionary) Removed.
+       (save_dictionary) Removed.
+       (restore_dictionary) Removed.
+       (free_dictionary) Removed.
+
+       * vars-atr.c: (clear_default_dict) Removed.
+       (find_variable) Removed.
+       (find_dict_variable) Removed.
+       (create_variable) Removed.
+       (delete_variable) Removed.
+       (common_init_stuff) Removed.
+       (init_variable) Removed.  Updating of inp_init moved into
+       cmd_end_input_program().
+       (replace_variable) Removed.
+       (rename_variable) Removed.
+       (clear_variable) Removed.
+       (dup_variable) Removed.
+
+       * vars-prs.c: (is_varname) Removed.
+       (is_dict_varname) Removed.
+       (fill_all_vars) Removed.
+
+       * vector.c: (find_vector) Removed.
+
+       * weight.c: (stop_weighting) Removed.
+
+       * dictionary.c: New file.
+       (dict_create) New, replaces new_dictionary().
+       (dict_clone) New, replaces save_dictionary() and
+       restore_dictionary().
+       (dict_clear) New, replaces clear_default_dict().
+       (dict_destroy) New, replaces free_dictionary().
+       (dict_get_var_cnt) New function, replaces references to
+       dict->nvar.
+       (dict_get_var) New function, replaces references to dict->var[i].
+       (dict_get_vars) New function, replaces fill_all_vars().
+       (dict_create_var) New, replaces create_variable().  Interface
+       drops `type' parameter, using a zero `width' to designate numeric.
+       (dict_clone_var) New, replaces dup_variable().
+       (dict_rename_var) New, replaces rename_variable().
+       (dict_lookup_var) New, replaces find_variable(),
+       find_dict_variable(), is_varname().
+       (dict_contains_var) New function.
+       (compare_variable_dblptrs) New function.
+       (dict_delete_var) New function, replaces clear_variable().
+       (dict_delete_vars) New function, replaces dict_delete_run().
+       (dict_reorder_vars) New function.
+       (dict_rename_vars) New function, replaces rename_variables().
+       (dict_get_weight) New function, replaces reading dict->weight_var.
+       (dict_set_weight) New function, replaces writing dict->weight_var
+       or calling stop_weight(dict).
+       (dict_get_filter) New function, replaces reading dict->filter_var.
+       (dict_set_filter) New function, replaces writing dict->filter_var.
+       (dict_get_case_limit) New function, replaces reading dict->N.
+       (dict_set_case_limit) New function, replaces writing dict->N.
+       (dict_get_value_cnt) New function, replaces reading dict->nval.
+       (dict_compact_values) New function, replaces a loop that was
+       replicated in several places.
+       (dict_get_split_vars) New function, replaces reading dict->splits.
+       (dict_get_split_cnt) New function, replaces reading
+       dict->n_splits.
+       (dict_set_split_vars) New function, replaces writing dict->splits.
+       (dict_get_label) New function, replaces reading dict->label.
+       (dict_set_label) New function, replaces writing dict->label.
+       (dict_get_documents) New function, replaces reading
+       dict->documents.
+       (dict_set_documents) New function, replaces writing
+       dict->documents.
+       
+       All references to above functions updated.
+       
+       * aggregate.c: (cmd_aggregate) Copy file label and documents from
+       old dictionary to new by hand, because dict_create() can't do it
+       itself.  Use dict_set_documents(), dict_set_split_vars().
+
+       * temporary.c: (cancel_temporary) Also set temp_dict to NULL after
+       calling dict_destroy().
+
+       * data-list.c: (dls_var_spec) Remove `type' member, replace by
+       `width'.
+       (fixed_parse_compatible) Some slightly nontrivial changes for
+       dict_create_var().
+       (dump_fmt_list) Ditto.
+       (parse_free) Ditto.
+
+       * file-type.c: (create_col_var) Ditto.
+
+       * get.c: (cmd_get) Use dict_compact_values() instead of a loop.
+       (trim_dictionary) Use dict_delete_vars(), dict_reorder_vars().
+       (rename_variables) Use dict_rename_vars().
+       (mtf_merge_dictionary) Use dict_get_documents(),
+       dict_set_documents(), dict_compact_values().
+
+       * pfm-read.c: (read_variables) Deal with changes to weighting.
+
+       * q2c.c: (dump_parser) Use dict_lookup_var() instead of
+       is_varname() in output code.
+
+       * sfm-read.c: (read_header) Use dict_create(), dict_set_label(),
+       other dictionary functions.
+
+       * title.c: (add_document_line) Use dict_get_documents(),
+       dict_set_documents().
+
+       * vars-atr.c: (discard_variables) Use dict_clear(default_dict),
+       reset default_handle by hand.  dict_clear() will clear vectors so
+       there's no need for that by hand.
+
+       * vfm.c: (close_active_file) Move call to finish_compaction()
+       earlier, so that we can do the compaction as a single step using
+       dict_compact_values().  Use dict_clear_vectors().
+       (finish_compaction) Use dict_delete_var(), dict_compact_values().
+               
+       Some functions don't have replacements:
+
+       * vars-atr.c: (force_create_variable) Removed.  All references
+       updated to dict_create_var() followed by an assertion.
+       (force_dup_variable) Removed.  All references updated to
+       dict_clone_var() followed by an assertion.
+       
+       * weight.c: (update_weighting) Removed.  No longer necessary, so
+       all references removed.
+
+Sat Dec 27 16:43:01 2003  Ben Pfaff  <blp@gnu.org>
+
+       Clean up AGGREGATE.
+       
+       * aggregate.c: Eliminate separation of weighted and unweighted
+       case.  It made the code too obscure and I doubt it was actually
+       faster.  Instead, all code uses the "weighted" code, because
+       that's a generalization of the "unweighted" code.
+       (FWEIGHT) Removed.
+       (FOPTIONS) Ditto.
+       (parse_aggregate_functions) No need to set FWEIGHT.
+       (accumulate_aggregate_info) Get rid of FWEIGHT cases.
+       (dump_aggregate_info) Ditto.
+       (initialize_aggregate_info) No need for special plain_function
+       that gets rid of FWEIGHT option.
+
+       * aggregate.c: Get rid of approximations.
+       (accumulate_aggregate_info) Don't use approx_gt(), approx_lt(),
+       approx_in_range().
+       (aggregate_single_case) Don't use approx_ne().
+
+Sat Dec 27 16:19:36 2003  Ben Pfaff  <blp@gnu.org>
+
+       * ascii.c (ascii_line_width): Dead code, removed.
+
+       * postscript.c (ps_line_width): Ditto.
+
+       * q2c.c (xrealloc): Ditto.
+
+       * count.c (internal_cmd_count): Ditto.
+
+       * means.q (validate_dependent_endpoint): Ditto.
+
+       * set.q: (cmd_gset) Ditto.
+
+       * weight.c: [0] (weight_trns_proc) Ditto.
+
+Sat Dec 27 16:18:16 2003  Ben Pfaff  <blp@gnu.org>
+
+       Make the code -Wmissing-prototypes clean.
+
+       * Makefile.am (version.c): Add #include "version.h".
+       
+       * ascii.c: (ascii_open_global) Make static.
+       (ascii_close_page) Ditto.
+       (ascii_font_sizes) Ditto.
+       (ascii_postopen_driver) Ditto.
+       (ascii_close_driver) Ditto.
+       (ascii_option) Ditto.
+       (ascii_open_page) Ditto.
+       (ascii_line_horz) Ditto.
+       (ascii_line_vert) Ditto.
+       (ascii_line_intersection) Ditto.
+       (ascii_box) Ditto.
+       (ascii_polyline_begin) Ditto.
+       (ascii_polyline_point) Ditto.
+       (ascii_polyline_end) Ditto.
+       (ascii_text_set_font_by_name) Ditto.
+       (ascii_text_set_font_by_position) Ditto.
+       (ascii_text_set_font_by_family) Ditto.
+       (ascii_text_get_font_name) Ditto.
+       (ascii_text_get_font_family) Ditto.
+       (ascii_text_set_size) Ditto.
+       (ascii_text_get_size) Ditto.
+       (ascii_text_metrics) Ditto.
+       (ascii_text_draw) Ditto.
+       (ascii_close_page) Ditto.
+
+       * cmdline.h: New header for parse_command_line().  Used where
+       needed.
+
+       * command.c: Move prototypes for cmd_*() functions to command.h.
+
+       * command.h: Prototypes for cmd_*() functions moved here from
+       command.c.
+
+       * crosstabs.q: (gamma_int) Ditto.
+
+       * file-handle.h: Add fh_init_files() prototype.
+       
+       * getline.c: (welcome) Ditto.
+
+       * glob.h: New header for init_glob().  Used where appropriate.
+
+       * hash.c: (comparison_helper) Ditto.
+
+       * html.c: (html_open_global) Ditto.
+       (html_close_global) Ditto.
+       (html_preopen_driver) Ditto.
+       (html_postopen_driver) Ditto.
+       (html_close_driver) Ditto.
+       (html_option) Ditto.
+       (html_open_page) Ditto.
+       (html_close_page) Ditto.
+       (html_submit) Ditto.
+
+       * inpt-pgm.c: (input_program_source_read) Ditto.
+
+       * output.c: (find_defn_value) Ditto.
+       (destroy_list) Ditto.
+
+       * pfm-read.c: (read_int) Ditto.
+
+       * postscript.c: (ps_open_global) Ditto.
+       (ps_close_global) Ditto.
+       (ps_font_sizes) Ditto.
+       (ps_preopen_driver) Ditto.
+       (ps_postopen_driver) Ditto.
+       (ps_close_driver) Ditto.
+       (ps_option) Ditto.
+       (ps_open_page) Ditto.
+       (ps_close_page) Ditto.
+       (ps_line_horz) Ditto.
+       (ps_line_vert) Ditto.
+       (ps_line_intersection) Ditto.
+       (ps_box) Ditto.
+       (ps_polyline_begin) Ditto.
+       (ps_polyline_point) Ditto.
+       (ps_polyline_end) Ditto.
+       (ps_text_set_font_by_name) Ditto.
+       (ps_text_set_font_by_position) Ditto.
+       (ps_text_set_font_family) Ditto.
+       (ps_text_get_font_name) Ditto.
+       (ps_text_get_font_family) Ditto.
+       (ps_text_set_size) Ditto.
+       (ps_text_get_size) Ditto.
+       (ps_text_metrics) Ditto.
+       (ps_text_draw) Ditto.
+
+       * q2c.c: (finish_up) Ditto.
+       (xmalloc) Ditto.
+       (xstrdup) Ditto.
+       (get_buffer) Ditto.
+       (st_lower) Ditto.
+       (st_upper) Ditto.
+       (skip_ws) Ditto.
+       (get_line) Ditto.
+       (add_symbol) Ditto.
+       (find_symbol) Ditto.
+       (lex_get) Ditto.
+       (force_id) Ditto.
+       (force_string) Ditto.
+       (match_id) Ditto.
+       (match_token) Ditto.
+       (skip_token) Ditto.
+       (parse) Ditto.
+       (parse_setting) Ditto.
+       (parse_specifier) Ditto.
+       (parse_specifiers) Ditto.
+       (parse_subcommand) Ditto.
+       (dump_specifier_vars) Ditto.
+       (is_keyword) Ditto.
+       (make_identifier) Ditto.
+       (dump_declarations) Ditto.
+       (dump_specifier_init) Ditto.
+       (dump_vars_init) Ditto.
+       (make_match) Ditto.
+       (dump_specifier_parse) Ditto.
+       (dump_subcommand) Ditto.
+       (dump_parser) Ditto.
+       (dump_header) Ditto.
+       (dump_free) Ditto.
+       (recognize_directive) Ditto.
+
+       * recode.c: (string_to_long) Ditto.
+
+       * repeat.c: (find_DO_REPEAT_substitution) Ditto.
+
+       * repeat.h: New header for perform_DO_REPEAT_substitutions, used
+       where appropriate.
+
+       * sort.c: (sort_stream_read) Ditto.
+       (sort_stream_mode) Ditto.
+       
+Fri Dec 19 23:35:04 2003  Ben Pfaff  <blp@gnu.org>
+
+       * algorithm.c (binary_search): Fix comparison.
+
+Fri Dec 19 23:27:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * algorithm.c: (binary_search) Fix assertion.
+
+Fri Dec 19 21:31:48 2003  Ben Pfaff  <blp@gnu.org>
+
+       * sysfile-info.c: (compare_vectors_by_name) Rewrite.
+
+Fri Dec 19 21:30:24 2003  Ben Pfaff  <blp@gnu.org>
+
+       * sort.c: (compare_case_lists) Rewrite.
+
+Fri Dec 19 16:44:22 2003  Ben Pfaff  <blp@gnu.org>
+
+       * quicksort.c: Removed (not used).
+
+       * quicksort.h: Removed (not used).
+
+       * sort.c: Removed blp_quicksort() prototype.
+
+Fri Dec 19 16:42:13 2003  Ben Pfaff  <blp@gnu.org>
+
+       * postscript.c: (int_2_compare) Rewrite.
+       (compare_line) Rewrite.
+
+Fri Dec 19 16:38:35 2003  Ben Pfaff  <blp@gnu.org>
+
+       * matrix-data.c (compare_factors) Use lexicographical_compare()
+       algorithm.
+       (compare_doubles) New function.
+       
+       * algorithm.c: (lexicographical_compare) New algorithm.
+
+Fri Dec 19 16:23:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * matrix-data.c (compare_variables_by_mxd_vartype): Rewrite.
+
+Fri Dec 19 15:54:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * expr-prs.c: (cmp_func) Removed.
+       (parse_function) Use binary_search() algorithm.
+       (compare_functions) New function.
+       (init_func_tab) Use sort() algorithm.
+
+       * algorithm.c: (binary_search) New algorithm.
+
+Fri Dec 19 15:50:45 2003  Ben Pfaff  <blp@gnu.org>
+
+       * descript.q: (display) Use sort() algorithm instead of qsort().
+       (compare_func) Removed.
+       (descriptives_compare_variables) New function.
+
+Fri Dec 19 15:08:38 2003  Ben Pfaff  <blp@gnu.org>
+
+       Get rid of AVL trees.  Hashes are more appropriate for everything
+       PSPP does.
+
+       * Makefile.am: (pspp_SOURCES) Remove avl.c, avl.h.
+       
+       * avl.c: Removed.
+
+       * avl.h: Removed.
+
+Fri Dec 19 14:33:31 2003  Ben Pfaff  <blp@gnu.org>
+
+       Much code can be clarified by using C++ STL-like algorithms.  Not
+       all uses of these algorithms are listed below, only the ones where
+       the change to an algorithm was the only change of interest.
+       
+       * Makefile.am: (pspp_SOURCES) Add algorithm.c, algorithm.h.
+       
+       * algorithm.c: New file.
+
+       * algorithm.h: New file.
+
+       * modify-vars.c: (static var forward) Removed.
+       (static var positional) Removed.
+       (compare_variables) Removed.
+       (struct ordering) New.
+       (cmd_modify_vars) Use sort() algorithm.
+       (compare_variables_given_ordering) New function.
+       (rearrange_dict) Use sort() algorithm.
+
+       * sysfile-info.c: (cmd_display) Use sort() algorithm.
+       (cmp_var_by_name) Removed.
+
+Fri Dec 19 14:26:17 2003  Ben Pfaff  <blp@gnu.org>
+
+       Make file handles use a hash table.
+       
+       * file-handle.q: (files) Change to hash table, make static.
+       (cmd_file_handle) Use hash table functions.
+       (fh_get_handle_by_filename) Ditto.
+       (fh_get_handle_by_name) Ditto.
+       (hash_file_handle) New function.
+       (cmp_file_handle) Rewrite.
+       (fh_init_files) Use hash table functions.
+
+Fri Dec 19 14:24:38 2003  Ben Pfaff  <blp@gnu.org>
+
+       Clean up FREQUENCIES.
+       
+       * Makefile.am: (pspp_SOURCES) Remove frequencies.g.
+
+       * frequencies.q: Remove a lot of old #if'd out code at the end.
+       (internal_cmd_frequencies) Use calc() instead of calc_no_weight()
+       or calc_weight().  Initialize percentile_values.
+       (calc) New function based on calc_weight() from frequencies.g.
+       (precalc) Use hash functions.
+       (static var comparison_func) Removed.
+       (static var comparison_param) Removed.
+       (comparison_helper) Removed.
+       (get_freq_comparator) New function.
+       (not_missing) New function.
+       (add_freq) Removed.
+       (postprocess_freq_tab) Use hash table functions, algorithms,
+       get_freq_comparator().  Rewrite.
+       (cleanup_freq_tab) Rephrase.
+       (add_percentile) Clean up spacing.
+       (hash_value_numeric) New function.
+       (hash_value_alpha) New function.
+       (compare_value_numeric_a) Rewrite.
+       (compare_value_alpha_a) Rewrite.
+       (compare_value_numeric_d) Rewrite.
+       (compare_value_alpha_d) Rewrite.
+       (compare_freq_numeric_a) Rewrite.
+       (compare_freq_alpha_a) Rewrite.
+       (compare_freq_numeric_d) Rewrite.
+       (compare_freq_alpha_d) Rewrite.
+       (calc_stats) Clean up mode, percentiles, max.
+       (dump_statistics) Clean up spacing.
+       
+       * frequencies.g: Removed.
+
+       * var.h: (struct freq_tab) Change `data' to hash table.
+
+Fri Dec 19 14:15:46 2003  Ben Pfaff  <blp@gnu.org>
+
+       * file-handle.h: Remove declaration of global variable `files',
+       which wasn't used anywhere.
+
+       * postscript.c: (add_encoding) Remove superfluous cast.
+       (line) Ditto.
+
+       * sfm-read.c: [linux] (bswap_int32) Drop ntohl() non-portable
+       version.
+
+       * temporary.c: [0] (display_tree) Removed.
+
+Fri Dec 19 14:13:04 2003  Ben Pfaff  <blp@gnu.org>
+
+       Implement a new random number generator based on the alleged RC4
+       algorithm.
+
+       * expr-evl.c: (expr_evaluate) Use rng_get_double_normal() instead
+       of rand_normal().
+
+       * random.c: [!HAVE_GOOD_RANDOM] (real_rand) Removed.
+       [!HAVE_GOOD_RANDOM] (real_srand) Removed.
+       (macro k) Removed.
+       (static var V[]) Removed.
+       (static var Y) Removed.
+       (static var X2) Removed.
+       (setup_randomize) Removed.
+       (shuffle) Removed.
+       (rand_uniform) Removed.
+       (rand_normal) Removed.
+       (struct rng) New structure.
+       (rng_create) New function.
+       (rng_destroy) New function.
+       (swap_byte) New static function.
+       (rng_seed) New function.
+       (rng_get_bytes) New function.
+       (rng_get_int) New function.
+       (rng_get_unsigned) New function.
+       (rng_get_double) New function.
+       (rng_get_double_normal) New function.
+       (pspp_rng) New function.
+
+       * random.h: Sync up to random.c.
+
+       * sample.c: (struct sample_trns) Make `frac' unsigned and a
+       fraction of UINT_MAX, not 65536.
+       (cmd_sample) Use rng_get_unsigned(), rng_get_double(), UINT_MAX
+       fraction.
+
+       * vfm.c: (open_active_file) No need to call setup_randomize() any
+       longer.
+
+Fri Dec 19 12:05:56 2003  Ben Pfaff  <blp@gnu.org>
+
+       Change dictionary name indexes to use hash tables instead of AVL
+       trees.
+
+       * crosstabs.q: (free_var_dict) Use hash tables.
+       (crs_custom_tables) Ditto.
+       (calc_general) Ditto.
+       (compare_table_entry) Rewrite.
+       (enum_var_values) Reorder parameters.  All references updated.
+       Rewrite.
+
+       * get.c: (rename_variable) Use hash tables.
+       (mtf_merge_dictionary) Ditto.
+
+       * glob.c: (init_glob) Use hash tables.
+       (cmp_variable) Removed.
+
+       * means.q: (mns_custom_tables) Use hash tables.
+
+       * modify-vars.c: (rearrange_dict) Use hash tables.
+
+       * rename-vars.c: (cmd_rename_variables) Use hash tables.
+
+       * sfm-read.c: (read_header) Use hash tables.
+       (read_variables) Ditto.
+
+       * temporary.c: (new_dictionary) Use hash tables.
+       (save_dictionary) Ditto.
+       (restore_dictionary) Ditto.
+
+       * var.h: (struct dictionary) Change AVL tree `var_by_name' into
+       hash table `name_tab'.
+
+       * vars-atr.c: [DEBUGGING] (dump_one_var_node) Removed.
+       [DEBUGGING] (dump_var_tree) Removed.
+       (find_variable) Use hash tables.
+       (find_dict_variable) Ditto.
+       (common_init_stuff) Ditto.
+       (rename_variable) Ditto.
+       (clear_variable) Ditto.  Also, remove debug code.
+       (dup_variable) Use hash tables.
+
+       * vars-prs.c: (fill_all_vars) Use hash tables.
+       (is_dict_varname) Ditto.
+       (parse_dict_variable) Ditto.
+       
+Fri Dec 19 11:46:23 2003  Ben Pfaff  <blp@gnu.org>
+
+       Change value labels to use hash tables instead of AVL trees, and
+       change value labels into an ADT.
+
+       * Makefile.am: (pspp_SOURCES) Add value-labels.c, value-labels.h.
+       
+       * value-labels.c: New file.
+
+       * value-labels.h: New file.
+
+       * apply-dict.c: (cmd_apply_dictionary) Use value label ADT.
+       Get rid of a stupid use of goto.
+
+       * autorecode.c: (compare_alpha_value) Rewrite.
+       (hash_alpha_value) Ditto.
+       (compare_numeric_value) Rewrite.
+       (hash_numeric_value) Ditto.
+
+       * frequencies.q: (dump_full) Use value label ADT.
+
+       * pfm-read.c: (read_value_label) Use value label ADT.
+
+       * pfm-write.c: (write_value_labels) Use value label ADT.
+
+       * sfm-read.c: (read_variables) Use value label ADT.
+       (read_value_labels) Rewrite.
+
+       * sfm-write.c: (write_value_labels) Rewrite.
+
+       * sysfile-info.c: (cmd_sysfile_info) Use value label ADT.
+       (display_variables) Ditto.
+       (describe_variable) Ditto.
+
+       * t-test.q: (print_t_groups) Use value label ADT.
+
+       * temporary.c: (copy_variable) Use value label ADT.
+       (free_dictionary) Ditto.
+
+       * val-labs.c: (verify_val_labs) Use value label ADT.
+       (get_label) Ditto.
+       (debug_print) Ditto.
+       (val_lab_cmp) Removed.
+       (inc_ref_count) Removed.
+       (copy_value_labels) Removed.
+
+       * var.h: (struct value_label) Removed.
+       (struct variable) Change AVL tree `val_lab' into hash table
+       `val_labs'.
+
+       * vars-atr.c: (init_variable) Use value label ADT.
+       (clear_variable) Ditto.
+       (free_value_label) Removed.
+       (free_val_lab) Removed.
+       (get_val_lab) Removed.
+       (compare_variables) New function.
+       (hash_variable) New function.
+
+       * vfm.c: (dump_splits) Use value label ADT.
+
+Fri Dec 19 11:18:11 2003  Ben Pfaff  <blp@gnu.org>
+
+       Add to the hash table interface.
+
+       * hash.c: (hsh_hash_bytes) Add assertion.
+       (hsh_hash_string) Ditto.
+       (hsh_clear) Ditto.
+       (hsh_rehash) Ditto.
+       (hsh_probe) Ditto.
+       (hsh_create) Ditto.  Also make minimum `size'.
+       (hsh_destroy) Rephrase.
+       (sort_nulls_last) Removed.
+       (not_null) New function.
+       (hsh_data) Ditto.
+       (comparison_helper) Ditto.
+       (hsh_sort) Rewritten.
+       (hsh_data_copy) New function.
+       (hsh_sort_copy) Ditto.
+       (hsh_insert) Ditto.
+       (hsh_replace) Ditto.
+       (hsh_hash_double) Ditto.
+       (hsh_delete) Fix stupid bug.
+       
+Thu Dec 18 12:27:03 WAST 2003 John Darrington <john@darrington.wattle.id.au>
+        * added a calculation of the mode to FREQUENCIES
+
+Wed Dec 17 12:53:01 WAST 2003 John Darrington <john@darrington.wattle.id.au>
+
+       * moved (un)defs of DEBUGGING to config.h
+
+Mon Dec 15 21:35:59 2003  Ben Pfaff  <blp@gnu.org>
+
+       * groff-font.c: (add_kern) Fix indentation.
+       (add_kern) Use & instead of % to take power-of-2 modulus.
+       (font_get_kern_adjust) Likewise.
+
+Fri Dec 12 23:54:37 2003  Ben Pfaff  <blp@gnu.org>
+
+       * autorecode.c: (recode) Replace stupid use of memcpy() by
+       memberwise copy.
+       (hash_alpha_value) Use hsh_hash_bytes().  Get rid of nasty casts.
+       (hash_numeric_value) Ditto.
+       (autorecode_proc_func) pool_strdup() was wrong here because the
+       source string was not null-terminated.  Use new pool_strndup()
+       instead.
+
+       * crosstabs.q: (enum_var_values) Remove superfluous and bizarre
+       use of hsh_iterator_init().
+
+       * data-in.c: (parse_N) Initialize i->v->f.
+
+       * flip.c: (cmd_flip) Use memmove(), not memcpy(), to copy
+       overlapping arrays.
+
+       * groff-font.c: Use power-of-2 hash table sizes, not prime.
+       (groff_read_font) Don't call hsh_next_prime().  Don't call
+       fclose(NULL).
+       (static var hash) Remove `size_p', `max_used' members.
+       (font_char_name_to_index) Don't call hsh_next_prime().  Use
+       hsh_hash_string() instead of hashpjw(), & instead of %.
+       (default_font) Don't call hsh_next_prime().
+
+       * pool.c: (pool_strndup) New function.
+       (pool_strdup) Reimplement in terms of pool_strndup.
+
+       * postscript.c: (hash_font_entry) Use hsh_hash_string().  Get rid
+       of nasty casts.
+       (hash_ps_encoding) Use hsh_hash_string().
+       (hash_ps_combo) Use hsh_hash_string(), hsh_hash_int().
+       (hash_filename2font) Use hsh_hash_string().
+
+       * som.c: Add #include <stdlib.h>.
+
+       * tab.c: (tab_destroy) Don't set t->container after freeing `t'
+       (by destroying its pool).
+       
+Fri Dec 12 23:18:59 2003  Ben Pfaff  <blp@gnu.org>
+
+       Miscellaneous hash table code cleanup:
+       
+       * hash.h: (struct hsh_table) Moved into hash.c.
+       (hsh_count) Ditto, and transformed into function.
+       (hsh_compare_func) New typedef, used for defining otherwise-long
+       function types here and in hash.c
+       (hsh_hash_func) Ditto.
+       (hsh_free_func) Ditto.
+       
+       * hash.c: (struct hsh_table) Renamed `n' to `used', `m' to `size',
+       `table' to `entries'.  Removed `mp'.  All references updated.
+       (hsh_clear) Don't shrink entries array; if the hash was this big
+       once, it probably will be again.
+       (hsh_rehash) Made static.
+       (force_hsh_insert) Renamed hsh_force_insert.
+       (force_hsh_find) Renamed hsh_force_find.
+
+       Made hash table sizes powers of 2, because that's fine with any
+       reasonable hash function and because taking a power-of-2 modulus
+       is faster than any other:
+       
+       (hsh_prime_tab) Removed;
+       (hsh_next_prime) Ditto.
+       (next_power_of_2) New function.
+       (hsh_create) Use next_power_of_2.
+       (hsh_rehash) Use & instead of %.
+
+       Cleaned up hsh_sort:
+       
+       (internal_comparison_fn) Removed.
+       (sort_nulls_last) New function.
+       (hsh_sort) Removed second parameter, switched to using the new
+       quicksort() function from quicksort.h to avoid using nasty need
+       for static variables with qsort().  All references updated.
+
+       Changed the hash functions offered, because there are better hash
+       functions than the ones we had, and cleaned up the names to boot:
+       
+       * hash.c: (hashpjw_d) Removed.
+       (hashpjw) Ditto.
+       (hsh_hash_bytes) New function.
+       (hsh_hash_string) New function.
+       (hsh_hash_int) New function.
+
+       Improved the hash table iteration interface:
+       
+       * hash.h: (hsh_iterator_init) Removed.
+       (struct hsh_iterator) Removed `init' member, change `next' to
+       size_t.
+
+       * hash.c: (hsh_foreach) Removed.  All references updated to use
+       hsh_first/hsh_next instead.
+       (hsh_first) New function.  Notably, unlike hsh_foreach() it does
+       not treat a null pointer as an empty hash table.
+       (hsh_next) New function.
+
+       Made deletion possible, though slow:
+
+       * hash.c: (locate_matching_entry) New function.
+       (hsh_find) Use locate_matching_entry().
+       (hsh_delete) New function also using locate_matching_entry().
+       (hsh_force_delete) New function.
+
+Fri Dec 12 23:16:10 2003  Ben Pfaff  <blp@gnu.org>
+
+       * quicksort.c: New file implementing a sort routine with a
+       interface better than qsort() because it passes a user-provided
+       parameter to the sort routine.
+
+       * Makefile.am: Add quicksort.c, quicksort.h.
+
+Fri Dec 12 13:31:58 2003  Ben Pfaff  <blp@gnu.org>
+
+       * All source files: Get rid of nasty special cases for Checker,
+       which is pretty obsolete now.
+
+Thu Dec 11 21:38:24 WST 2003 John Darrington <john@darrington.wattle.id.au>
+
+       * Fixed a bug apparent when using the FREQUENCIES command with the
+       html driver.  The html driver was incorrectly trying to display 
+       empty cells.
+
 Sun Jan  2 21:40:13 2000  Ben Pfaff  <blp@gnu.org>
 
        * Makefile.am: Reorganized.  Put locale dir in version.c instead