Redo VFM interface. Get rid of compaction_necessary, compaction_nval,
[pspp-builds.git] / src / ChangeLog
index 4eb438ae0fd3977f4baf8d02c6e72bc25f8e54b3..c7a160c67b1be9bfc163ec548a0be91ef5e7325c 100644 (file)
+Sun Mar 14 22:48:12 2004  Ben Pfaff  <blp@gnu.org>
+
+       * command.def: Add CASESTOVARS, VARSTOCASES unimplemented commands.
+
+       * dictionary.c: (dict_rename_var) Add assertion.
+       (dict_contains_var) Check by index instead of name.
+
+Sun Mar 14 22:01:02 2004  Ben Pfaff  <blp@gnu.org>
+
+       Get rid of compaction_necessary, compaction_nval, compaction_case.
+       Redo VFM interface.  Replace disk_sink and memory_sink by
+       storage_sink, disk_source and memory_source by storage_source.
+
+       * vfm.h: (struct case_sink) Add `dict', `idx_to_fv', `value_cnt'
+       members.
+
+       * vfm.c: 
+       (struct write_case_data) Remove `begin_func', `end_func',
+       `func_aux' members.  Add `aux', `trns_case', `sink_case',
+       `cases_written', `cases_analyzed' members.
+       (global var compaction_necessary) Make static.
+       (global var compaction_nval) Removed.
+       (global var compaction_case) Removed.
+       (static var case_count) Removed.
+       (struct procedure_aux_data) Removed.
+       (struct split_aux_data) Removed.
+       (procedure) Remove begin_func, end_func parameters.  Rewrite.
+       (static var not_canceled) Removed.
+       (process_active_file) Removed.
+       (process_active_file_write_case) Removed.
+       (process_active_file_output_case) Removed.
+       (prepare_for_writing) Moved into open_active_file().
+       (arrange_compaction) Ditto.
+       (setup_lag) Ditto.
+       (open_active_file) Rewrote.
+       (write_case) New function.
+       [DEBUGGING] (index_to_varname) Removed.
+       (execute_transformations) New function.
+       (exclude_this_case) Renamed filter_case(), changed interface.
+       (clear_case) Added struct ccase * parameter to interface.
+       (close_active_file) Added struct write_case_data * parameter,
+       rewrote.
+       (disk_sink_create) Removed.
+       (disk_sink_destroy) Removed.
+       (disk_sink_make_source) Removed.
+       (disk_sink_write) Removed.
+       (disk_source_count) Removed.
+       (disk_source_destroy) Removed.
+       (disk_source_read) Removed.
+       (global var disk_sink_class) Removed.
+       (global var disk_source_class) Removed.
+       (global var memory_sink_class) Removed.
+       (global var memory_source_class) Removed.
+       (memory_sink_create) Removed.
+       (memory_sink_destroy) Removed.
+       (memory_sink_make_source) Removed.
+       (memory_sink_write) Removed.
+       (memory_source_count) Removed.
+       (memory_source_destroy) Removed.
+       (memory_source_get_cases) Removed.
+       (memory_source_read) Removed.
+       (memory_source_set_cases) Removed.
+       (struct disk_stream_info) Removed.
+       (struct memory_sink_info) Removed.
+       (struct memory_source_info) Removed.
+       (write_active_file_to_disk) Removed.
+       (destroy_storage_stream_info) New function.
+       (global var null_sink_class) New var.
+       (global var storage_sink_class) New var.
+       (global var storage_source_class) New var.
+       (open_storage_file) New function.
+       (storage_sink_destroy) New function.
+       (storage_sink_make_source) New function.
+       (storage_sink_open) New function.
+       (storage_sink_write) New function.
+       (storage_source_count) New function.
+       (storage_source_destroy) New function.
+       (storage_source_get_cases) New function.
+       (storage_source_on_disk) New function.
+       (storage_source_read) New function.
+       (storage_source_set_cases) New function.
+       (storage_source_to_disk) New function.
+       (storage_to_disk) New function.
+       (struct storage_stream_info) New structure.
+       (write_storage_file) New function.
+       (procedure_write_case) Removed.
+       (create_case_source) Add `struct dictionary *' parameter, all
+       references updated.
+       (create_case_sink) Ditto.
+       (free_case_sink) New function.
+       (struct split_aux_data) New structure.
+       (procedure_with_splits) New function implementing what procedure()
+       used to.
+       (SPLIT_FILE_proc_func) Removed.
+       (procedure_with_splits_callback) New function.
+       (equal_splits) New function.
+       
+       * aggregate.c: Pass around a struct instead of using statics.
+       (static var outfile) Remove.
+       (enum type) Give it tag `missing_treatment'.
+       (static var missing) Remove.
+       (static var sort) Remove.
+       (static var agr_first) Remove.
+       (static var agr_next) Remove.
+       (static var case_count) Remove.
+       (static var prev_case) Remove.
+       (static var buf64_1xx) Remove.
+       (static var buf_1xx) Remove.
+       (struct agr_proc) New structure incorporating the above.
+       (cmd_aggregate) Use new struct.  Clean up error handling using
+       agr_destroy().  Completely rewrite actual implementation of
+       aggregation.
+       (create_sysfile) Add struct agr_proc * parameter, modify
+       accordingly.
+       (parse_aggregate_functions) Ditto.
+       (free_aggregate_functions) Ditto.  Rename agr_destroy().
+       (aggregate_single_case) Add struct agr_proc * parameter, modify
+       accordingly.
+       (accumulate_aggregate_info) Ditto.
+       (dump_aggregate_info) Ditto.
+       (initialize_aggregate_info) Ditto.
+       (agr_00x_trns_proc) Removed.
+       (agr_00x_end_func) Removed.
+       (agr_10x_trns_proc) Removed.
+       (agr_10x_trns_free) Removed.
+       (agr_10x_end_func) Removed.
+       (agr_11x_read) Removed.
+       (agr_11x_finish) Removed.
+       [DEBUGGING] (debug_print) Removed.
+       (write_case_to_sfm) Add struct agr_proc * parameter, modify
+       accordingly.
+       (agr_to_active_file) New function.
+       (presorted_agr_to_sysfile) New function.
+       (sort_agr_to_sysfile) New function.
+
+       * autorecode.c: (cmd_autorecode) Use procedure_with_splits().
+
+       * crosstabs.q: (internal_cmd_crosstabs) Ditto.
+
+       * descript.q: (cmd_descriptives) Ditto.
+
+       * dfm.c: (cmd_begin_data) Check for storage_source_class.  Adapt
+       to new procedure() interface.
+
+       * command.c: (cmd_execute) Adapt to new procedure() interface.
+
+       * dictionary.c: (dict_compact_values) Also delete scratch
+       variables.
+       (dict_get_compacted_value_cnt) New function.
+       (dict_get_compacted_idx_to_fv) New function.
+
+       * flip.c: (cmd_flip) Warn about and cancel TEMPORARY.
+       (cmd_flip) Adapt to new procedure() interface.
+       (flip_sink_write) Use sink->idx_to_fv.
+
+       * frequencies.q: (internal_cmd_frequencies) Use
+       procedure_with_splits().
+
+       * get.c: (cmd_save_internal) Adapt to new procedure() interface.
+       (static var mtf_sink) New static var.
+       (static var mtf_case) New static var.
+       (cmd_match_files) Warn about and cancel TEMPORARY.  Redo the way
+       we actually implement the matching.
+       (mtf_delete_file_in_place) Use mtf_case.
+       (mtf_processing) Use mtf_case and mtf_sink.
+       (cmd_export) Adapt to new procedure() interface.
+
+       * levene.c: (levene) Use procedure_with_splits().
+
+       * list.q: (cmd_list) Use procedure_with_splits().
+
+       * matrix-data.c: (read_matrices_without_rowtype) Adapt to new
+       procedure() interface.
+       (read_matrices_with_rowtype) Ditto.
+
+       * modify-vars.c; (cmd_modify_vars) Warn about and cancel
+       TEMPORARY.  Adapt to new procedure() interface.
+
+       * rename-vars.c: Warn about and cancel TEMPORARY.
+
+       * sort.c: (cmd_sort_cases) Warn about TEMPORARY.
+       (sort_cases) Use dict_get_compacted_value_cnt() instead of
+       compaction_nval.  Adapt to new procedure() interface.  Use
+       storage_source_to_disk().
+       (do_internal_sort) Don't try to dump the cases to memory.
+       (compare_case_lists) Pass null idx_to_fv.
+       (struct initial_run_state) Add `idx_to_fv' member.  Remove
+       `case_size' member.
+       (write_initial_runs) Don't initialize irs->case_size.  Adapt to
+       new procedure() interface.  Reset irs->idx_to_fv after calling
+       procedure().
+       (sort_sink_write) Set irs->idx_to_fv.  Use case_size from struct
+       sort_cases_pgm.  Pass irs, not struct sort_cases_pgm to
+       push_heap().
+       (destroy_initial_run_state) Don't dereference irs after freeing
+       it.
+       (allocate_cases) Don't calculate case_size locally.
+       (compare_record) Add idx_to_fv parameter.
+       (compare_record_run) Change parameter from struct sort_cases_pgm *
+       to struct initial_run_state *.  Pass irs->idx_to_fv to
+       compare_record().
+       (compare_record_run) Third parameter now a struct
+       initial_run_state *.
+       (output_record) No need for out_case anymore.  Pass irs, not
+       struct sort_cases_pgm to pop_heap().  Use case_size from struct
+       sort_cases_pgm.
+       (merge) Use case_size from struct sort_cases_pgm.
+       (merge_once) Use case_size from struct sort_cases_pgm.
+       Pass null pointer to compare_record() as idx_to_fv.
+       (global var sort_sink_class) Make static.
+
+       * t-test.q: (cmd_t_test) Use procedure_with_splits().
+
+       * temporary.c: Remove debugging crap.
+
+Sat Mar 13 14:19:52 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * t-test.q, levene.c: Fixed up the handling of MISSING values
+       int the T-TEST
+
+Fri Mar 12 16:23:35 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * t-test.q, levene.c: Added support for T-TEST /GROUP where only 
+       one value is given.
+
+Wed Mar 10 23:25:13 2004  Ben Pfaff  <blp@gnu.org>
+
+       Change explicit variable name checks into use of
+       dict_class_from_id().
+
+       * dictionary.c: (dict_create_var)  Change explicit variable name
+       check into use of dict_class_from_id().
+
+       * get.c: (trim_dictionary) Ditto.
+
+       * sel-if.c: (cmd_filter) Ditto.
+
+       * sysfile-info.c: (cmd_display) Ditto.
+
+       * vars-prs.c: (parse_DATA_LIST_vars) Ditto.
+
+       * vfm.c: (arrange_compaction) Ditto.
+
+       * weight.c: (cmd_weight) Ditto.
+
+Wed Mar 10 21:16:34 2004  Ben Pfaff  <blp@gnu.org>
+
+       * temporary.c: (cmd_temporary) When TEMPORARY was the first
+       transformation following the input program, if any, for some
+       reason we special-cased f_trns.  That's just wrong.  It should
+       always be set to n_trns.
+
+Tue Mar  9 23:44:40 2004  Ben Pfaff  <blp@gnu.org>
+
+       * format.c: (parse_format_specifier_name) Fix brown-bag bug
+       introduced in last check-in.
+
+Tue Mar  9 23:10:41 2004  Ben Pfaff  <blp@gnu.org>
+
+       * format.c: (global array translate_fmt[]) Removed.
+       (translate_fmt) New function as replacement.
+       (parse_format_specifier_name) Rewrite.
+
+       * pfm-read.c: (convert_format) Use translate_fmt() instead of
+       translate_fmt[].
+
+       * sfm-read.c: (parse_format_spec) Ditto.
+
+       * postscript.c: (text) Fix handling of fonts with missing
+       ligatures.
+
+       * sort.c: (struct external_sort) Add temp_name member.
+       (destroy_external_sort) Free temp_dir, temp_name members.
+       (init_external_sort) Allocate temp_name.
+       (get_temp_file_name) Change prototype.
+       (open_temp_file) Deal with change to get_temp_file_name().
+       (close_temp_file) Ditto.
+       (remove_temp_file) Ditto.
+       (write_temp_file) Ditto.
+       (read_temp_file) Ditto.
+       (sort_sink_destroy) Removed.
+       (sort_sink_class) Change destroy member to null.
+
+Tue Mar  9 22:36:34 2004  Ben Pfaff  <blp@gnu.org>
+
+       Eliminate temp_case.
+
+       * aggregate.c: (cmd_aggregate) No need to save/restore temp_case
+       anymore.  Use agr_11x_finish().
+       (aggregate_single_case) Make first param const.
+       (accumulate_aggregate_info) Ditto.
+       (agr_00x_end_func) Use compaction_case, not temp_case.
+       (agr_11x_func) Break into agr_11x_read(), agr_11x_finish().
+
+       * data-list.c: (struct data_list_pgm) Add `case_size' member.
+       (cmd_data_list) Initialize case_size.
+       (read_from_data_list_fixed) Add struct ccase * param, use instead
+       of temp_case.
+       (read_from_data_list_free) Ditto.
+       (read_from_data_list_list) Ditto.
+       (read_one_case) Rename data_list_trns_proc(), all references
+       updated.  Add argument in calling above functions.  Use c
+       argument instead of temp_case.
+       (destroy_dls) Rename data_list_trns_free(), all references
+       updated.
+
+       * expr-evl.c: (expr_evaluate) Make second parameter const.
+
+       * file-type.c: (struct file_type_pgm) Add `case_size' member.
+       (cmd_end_file_type) Initialize `case_size'.
+       (file_type_source_read) Add struct ccase * parameter.  Use instead
+       of temp_case.
+
+       * flip.c: Rewritten.
+
+       * get.c: (struct get_pgm) New structure to keep track of
+       case_size.
+       (cmd_get) Initialize case_size.
+       (cmd_import) Ditto.
+       (get_source) Deal with struct get_pgm.
+       (get_source_read) Add struct ccase * parameter, use instead of
+       temp_case.
+       (import_source_read) Ditto.
+
+       * get.c: Use a null pointer instead of temp_case to represent the
+       "current case" in a struct mtf_file's input member.
+       (mtf_processing_finish) Pass null to mtf_processing(), not
+       temp_case.
+       (mtf_read_nonactive_records) Don't set iter->input to temp_case.
+       (mtf_compare_BY_values) Add extra arg, use instead of null input
+       members.
+       (mtf_processing) Use c parameter instead of temp_case.  Pass
+       compaction_case to process_active_file_output_case().
+       
+       * glob.c: (global variable temp_case) Removed.
+
+       * inpt-pgm.c: (struct input_program_pgm) Add `case_size' member.
+       (cmd_input_program) Initialize case_size.  Set
+       vfm_source->value_cnt.
+       (init_case) Add struct ccase * parameter, use instead of
+       temp_case.
+       (clear_case) Ditto.
+       (input_program_source_read) Ditto.
+
+       * matrix-data.c: (matrix_data_read_without_rowtype) Ditto.
+       (dump_cell_content) Ditto.
+       (nr_output_data) Ditto.
+       (read_matrices_without_rowtype) Ditto.
+       (matrix_data_read_with_rowtype) Ditto.
+       (wr_read_splits) Ditto.
+       (wr_output_data) Ditto.
+
+       * sort.h: (struct sort_cases_pgm) New member `case_size'.
+       
+       * sort.c: (sort_cases) Initialize scp->case_size.
+       (struct external_sort) Remove `case_size' member.
+       (write_initial_runs) Only call vfm_sink->class_destroy if
+       non-null.
+       (struct sort_source_aux) New structure.
+       (sort_source_read_helper) New function.
+       (sort_source_read) Use sort_source_read_helper().
+       (read_sort_output) Change interface to be more reasonable.
+       (read_internal_sort_output) Ditto.
+       (read_external_sort_output) Ditto.
+
+       * vars-prs.c: (dict_class_to_name) Pass return value through
+       gettext.
+
+       * vfm.c: (struct procedure_aux_data) Add `trns_case' member.
+       (procedure) Initialize trns_case.
+       (procedure) Pass trns_case to vfm_source->class->read().
+       Free trns_case.
+       (process_active_file) Start using struct procedure_aux_data.
+       (process_active_file_write_case) Pass trns_case to
+       transformations, lag_case(), clear_case().
+       (process_active_file_output_case) Add struct ccase * parameter.
+       (create_trns_case) New function.
+       (make_temp_case) Removed.
+       (vector_initialization) Removed.
+       (close_active_file) Only call make_source if non-null, otherwise
+       set vfm_source to null pointer.  Don't free temp_case.
+       (disk_source_read) Add struct ccase * parameter, use instead of
+       temp_case.
+       (memory_source_read) Ditto.
+       (lag_case) Add const struct ccase * member.
+       (procedure_write_case) Use trns_case instead of temp_case.
+       (clear_case) Add struct ccase * member, use instead of temp_case.
+       (exclude_this_case) Ditto.
+       (create_case_source) Add struct dictionary * parameter, use to
+       initialize source->value_cnt.
+
+       * vfm.h: (struct case_source) Add `value_cnt' member.
+       (struct case_source_class) Add struct ccase * parameter to `read'
+       member function pointer.
+       (struct case_sink_class) Make struct ccase * parameter const in
+       `write' member function pointer.
+       
+Wed Mar  3 20:44:37 2004  Ben Pfaff  <blp@gnu.org>
+
+       Fix a lot of "possibly uninitialized variable" warnings.  Some of
+       them are even real bugs.  A few of them make me wonder how the
+       code ever worked.
+
+       * aggregate.c: (parse_aggregate_functions) Initialize `function.
+
+       * ascii.c: (output_lines) Add default case to switch.
+
+       * crosstabs.q: Remove static variable `expected' and all
+       references to it.
+       (display_crosstabulation) Always calculate expected value.
+       (calc_chisq) Ditto.
+       (output_pivot_table) Initialize `cmp'.
+       (display_crosstabulation) New variable `last_row', which is
+       initialized.
+
+       * data-in.c: (parse_numeric) Always initialize sign.  How did this
+       work at all?!
+
+       * data-list.c: (repeating_data_trns_proc) Always initialize code.
+       Always set info.ofs.  (How did this work?!)
+
+       * expr-opt.c: (optimize_tree) Always initialize `m'.
+       (evaluate_tree) Always initialize `c'.  (How did this work?)
+
+       * frequencies.q: (frq_custom_variables) Always initialize min,
+       max.
+       (frq_custom_grouped) Always initialize `dl'.
+
+       * groff-font.c: (groff_read_font) Always initialize char_set.
+
+       * matrix-data.c: (nr_output_data) Initialize `split'.
+       (wr_read_splits) Remove shadowing split_cnt declaration.
+       (wr_output_data) Initialize `split'.
+
+       * output.c: (tokener) Skip add character on syntax error.
+
+       * pool.c: (pool_strndup) Always set `copy'.  (How did this work?!)
+
+       * postscript.c: (read_ps_encodings) Use line.string instead of
+       uninitialized `bp'.
+       (write_text) Add default case to switch.
+       (text) Always initialize multiple variables.  Fix bug with
+       ligatures.
+
+       * print.c: (fixed_parse_fortran) Initialize head.
+       (alloc_line) Add default case to switch.
+
+       * recode.c: (parse_dest_spec) Handle case where nothing matches.
+       (recode_trns_proc) Move variable declaration inward.  Add default
+       case to switch.
+
+       * sfm-read.c: (read_header) Initialize skip_amt.
+
+       * sysfile-info.c: (display_variables) Always initialize pc.
+
+       * vars-prs.c: Initialized `included'.
+
+Wed Mar  3 09:30:09 2004  Ben Pfaff  <blp@gnu.org>
+
+       * main.c: (main) sigaction()'s sa_flags member was uninitialized.
+       Just use signal() instead.
+
+Wed Mar  3 09:26:30 2004  Ben Pfaff  <blp@gnu.org>
+
+       Get rid of vfm_sink_info and vfm_source_info.
+       
+       * aggregate.c: (agr_00x_end_func) Don't increment
+       sfm_sink_info.ncases.
+
+       * sort.c: (do_internal_sort) Get case count from
+       vfm_source->class->count().
+       (struct external_sort) Add `case_size' member.
+       (do_external_sort) Initialize case_size.
+       (struct initial_run_state) Add `case_size' member.
+       (write_initial_runs) Initialize case_size.
+       (sort_sink_write) Use case_size.
+       (read_external_sort_output) Use case_size.  Get case_cnt from
+       initial_runs.
+
+       * vfm.c: (struct write_case_data) Add underscores to existing arg
+       names, all references updated.  Renamed `aux' as `func_aux', all
+       references updated.  Added new `aux' member.
+       (global var vfm_source_info) Removed.
+       (global var vfm_sink_info) Removed.
+       (struct procedure_aux_data) New.
+       (struct split_aux_data) New.
+       (procedure) Use `aux' fields for procedure_aux_data,
+       split_aux_data.
+       (process_active_file_write_case) Pass case_count + 1 to
+       transformation procedures, exclude_this_case().
+       (process_active_file_output_case) Don't increment
+       vfm_sink_info.ncases.
+       (prepare_for_writing) Don't initialize vfm_sink_info.  Don't try
+       to send data to disk early.
+       (make_temp_case) Don't use vfm_sink_info.case_size.
+       (close_active_file) Don't initialize vfm_source_info.
+       (struct disk_stream_info) New, to allow for case_cnt and case_size fields.
+       (disk_sink_create) Initialize and/or update disk_stream_info.
+       (disk_sink_write) Ditto.
+       (disk_sink_destroy) Ditto.
+       (disk_sink_make_source) Ditto.
+       (disk_source_read) Ditto.
+       (disk_source_destroy) Ditto.
+       (global var disk_source_class) Add disk_source_count().
+       (disk_source_count) New function.
+       (struct memory_sink_info) Add `case_cnt', `case_size' members.
+       (struct memory_source_info) Ditto.
+       (memory_sink_create) Deal with case_cnt, case_size.
+       (memory_sink_write) Ditto.
+       (memory_sink_make_source) Ditto.
+       (memory_source_read) Ditto.
+       (memory_source_count) New function.
+       (memory_source_class) Add memory_source_count().
+       (procedure_write_case) Don't use vfm_sink_info.ncases.  Do use
+       proc_aux->cases_written, and pass it to transformation procedures
+       and exclude_this_case ().
+       (exclude_this_case) Add case_num parameter.  Pass it to
+       expr_evaluate().
+       (SPLIT_FILE_procfunc) Use split_aux->prev_case instead of static
+       variable.
+
+       * vfm.h: (struct case_source_class) Add `count' member.
+
+       * vfmP.h: (struct stream_info) Removed.
+       (global variable vfm_source_info) Removed.
+       (global variable vfm_sink_info) Removed.
+       
+Tue Mar  2 23:38:17 2004  Ben Pfaff  <blp@gnu.org>
+
+       * var.h: (typedef trns_proc_func) New typedef.
+       (trns_free_func) New typedef.
+       (struct trns_header) Change `proc' to type trns_proc_func, `free'
+       to type trns_free_func.  This only changes the actual type of
+       trns_proc_func, adding a `case_num' parameter.  Updated all
+       implementations to use the typedefs instead.
+
+       * compute.c: (compute_num) Pass case_num to expr_evaluate().
+       (compute_num_vec) Ditto.
+       (compute_str) Ditto.
+       (compute_str_vec) Ditto.
+
+       * do-if.c: (do_if_trns_proc) Ditto.
+
+       * expr-evl.c: (expr_evaluate) Add new case_num parameter, use for
+       OP_CASENUM.
+
+       * inpt-pgm.c: (input_program_source_read) Maintain case count,
+       pass to transformation functions.
+       (reread_trns_proc) Pass case_num arg to expr_evaluate().
+
+       * loop.c: (loop_1_trns_proc) Ditto.
+       (loop_2_trns_proc) Ditto.
+       (loop_3_trns_proc) Ditto.
+
+       * print.c: (print_space_trns_proc) Ditto.
+
+       * sel-if.c: (select_if_proc) Ditto.
+
+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