Preparing 5.6.52
[chr.git] / ChangeLog
blob6c8fc9c5f131ab9c1dd036c1e2490672117df2e3
1 [Feb 27 2008]
3  * ENHANCED: CHR performance of find_chr_constraint when called with nonvar argument
5 [Feb 14 2008]
7  * ENHANCED: CHR performance (minor issues)
9 [Feb 13 2008]
11  * FIX: CHR new C file for Windows
13  * FIX: CHR: single chr_support.c C file
15 [Feb 12 2008]
17  * ENHANCED: CHR: moved performance critical predicates to C
19 [Feb 11 2008]
21  * ENHANCED: CHR user-provided background knowledge (Jon Sneyers)
23 [Feb 10 2008]
25  * ENHANCED: CHR compiler performance
27  * ENHANCED: CHR compiler performance
29 [Jan 29 2008]
31  * EHANCED: CHR performance: compacted indexing code
33 [Jan 28 2008]
35  * ADDED: CHR: chr_constants/1 built-in type for enumerated constants
37 [Jan 27 2008]
39  * ENHANCED: CHR: performance improvements (success continuation, Prolog code optimization)
41  * COMPAT: Removed min_list/2 from library(hprolog) as this is now in library lists.
43 Jan 24, 2008
45   * TS: Exploit success continuation information.
47 Jan 23, 2008
49   * TS: Bug fix in continuation optimization.
50   * TS: Fixed singleton variable.
51   * TS: Suppress debug message.
53 Jan 22, 2008
55   * TS: Rewrite Prolog code: common prefix elimination in
56         successive clauses of the same predicate. 
57   * TS: Tries stores enabled by default again.
58   * TS: Success and failure continuation optimization for
59         propagation occurrences.
61 Jan 14, 2008
63   * TS: Fix performance bug in locking of guard variables.
64   * TS: Fix performance bug in spurious hash_term call.
66 Jan 10, 2008
68   * TS: Type check constraint declarations.
69   * TS: Trie stores hidden behind `experimental' option.
70   * TS: New option `verbose' prints constraint indices.
71   * TS: Don't compute term_hash for int and natural types.
73 Jan 9, 2008
75   * TS: Avoid trivial warning for declare_stored_constraints.
76   * TS: Bug fix: missing full store was causing compiler to loop.
78 Jan 9, 2008
80   * TS: Bug fix: atomic_constants store was causing compiler
81         to loop.
82   * TS: Clean-up and avoid adding additional global_ground store
83         if atomic_constants store covers all cases.
84   * TS: Clean-up and bug fix.
86 Jan 7, 2008
88   * TS: Performance improvement: use new store
89         implementation for multi-argument lookups
90         on manifest ground terms. Should be faster than 
91         hashtable.
93 Jan 4, 2008
95   * TS: Performance improvement: use new store
96         implementation for single-argument lookups
97         on manifest atomics. Should be faster than
98         hashtable. Will be generalized to arbitrary
99         manifest ground lookups and non-manifest
100         atomically typed lookups .
101         
102 Jan 3, 2008
104   * TS: Modified error messages of declare_stored_constraints
105         option, to distinguish between stored, temporarily stored
106         and never stored.
107   * TS: write/1, writeln/1 and format/2 are now treated as non-binding
108         builtins.
109   * TS: Properly inline inthash constraint lookup.
111 Dec 31, 2007
113   * TS: Additional assertion # default(Goal) for the
114         declare_stored_constraints, which specifies that
115         an unconditional simplification rule for the constraint
116         must be added to the end of the program. The Goal
117         parameter specifies the goal of that rule, e.g.
118         true or fail or throw(...). Experimental.
120 Dec 29, 2007
122   * TS: Experimental option declare_stored_constraints for
123         telling the compiler to warn for stored constraints
124         that are not asserted to be stored. Use the
125                 :- chr_constraint f(...) # stored.
126         notation for asserting that a constraint is expected to
127         be stored.
129 Dec 27, 2007
131   * TS: Inline constraint lookup.
133   * TS: Precompile term hashing.
135 Sep 26, 2007
137   * TS: Code cleaning was hampered by line numbers.
138         Reported by Mike Elston.
140 May 2, 2007
142   * PVW: Bug fix in observation analysis.
143   * PVW: Consistency checks of experimental history pragma.
145 Apr 5, 2007
147   * TS: Lessened worst bottlenecks in CHR compiler,
148         in the guard simplification phase.
150 Mar 26, 2007
152   * TS: Experimental dynattr option, for dynamic size attribute terms.
154 Mar 16, 2007
156   * TS: Extended observation analysis (abstract interpretation)
157         to deal with disjunctions. With Paolo Tacchella.
159 Mar 14, 2007
161   * TS: Renamed hprolog:substitute/4 to substitute_eq/4, because of
162         name conflict with library(edit).
164 Mar 12, 2007
166   * TS: Use line numbers in error and warning messages.
168 Mar 8, 2007
170   * TS: Added maintenance of line numbers through CHR compilation
171         as an option: chr_option(line_numbers,on).
173 Mar 5, 2007
175   * TS: Bug fix: setarg/3 instantiation error reported by Mike Elston.
176         Caused by missing suspension argument in debug off, optimize off
177         mode.
179 Feb 22, 2007
181  * LDK: O(1) removal from hashtables, with experimental
182         chr_option(ht_removal,on).
184 Jan 25, 2007
186  * PVW: Bugfixes for optional use of CHR constraints in rule guards.
188 Jan 18, 2007
190   * PVW: Optional use of CHR constraints in rule guards.
192 Nov 20, 2006
194   * TS: Bug fix in compiler_errors.pl.
196 Oct 25, 2006
198   * TS: Bug fix in occurrence subsumption by Jon Sneyers.
200 Oct 18, 2006
202   * TS: New preprocessor feature.
204   * TS: Parametrization of experimental chr_identifier type.
206 Oct 16, 2006
208   * TS: More inlining.
210   * TS: Stronger static type checking.
212   * TS: Omitted buggy FD analysis from bootstrapping process.
214 Oct 12, 2006
216   * TS: More inlining.
218   * TS: Experimental chr_identifier type.
220 Oct 10, 2006
222   * TS: Allow for empty type definitions aka phantom types. These are 
223         useful for some type-level tricks. A warning is issued so the 
224         user can check whether a phantom type is intended. No other
225         phantom type-specific checks are in place yet.
227   * TS: Fixed static type checking of built-in types.
229 Oct 9, 2006
231   * TS: The dense_int type can now appear on the rhs of type alias
232         definitions.
234 Oct 3, 2006
236   * TS: Fixed bug concerning matchings between ground and possibly
237         non-ground arguments.   
239 Oct 2, 2006
241   * TS: Fixed a bug in code generation, overeager removal of a clause.
243 Sep 28, 2006
245   * TS: Refactored some code.
247 Sep 22, 2006
249   * TS: Add exception handler to initialize chr_leash in new threads.
250   
251 Sep 18. 2006
253   * TS: Bug fix for programs in debugging mode.
255 Aug 30, 2006
257   * JW: Fixed make clean
258   * JW: Enlarged stacks to make build succeed
260 Aug 24, 2006
262   * JW: Add target ln-install
264 Aug 21, 2006
266   * TS: Fixed wrong arities in not inlined predicates. Mike Elston.
268 Aug 18, 2006
270   * TS: Code clean-up, more inlining, only generate used imports.
272 Aug 17, 2006
274   * TS: Inlining and more specialization of auxiliary predicates.
276 Aug 10, 2006
278   * TS: Fixed bug for constraints without rules in debug mode.
280   * TS: Compiler clean-up
282   * TS: Experimental var_assoc_store.
285 Aug 9, 2006
287   * TS: Various minor code generation improvements, including smaller
288         suspension terms.
290 Aug 8, 2006
292   * TS: Absolutely no lock checking when check_guard_bindings is disabled.
294 Aug 4, 2006
296   * TS: Minor optimizations for (-) arguments.
298   * TS: Important optimization for awakening fewer suspended constraints
300 Aug 3, 2006
302   * TS: Fixed typo in static type checker.
304   * TS: Documented static and dynamic type checking.
306 Aug 2, 2006
308   * TS: Fixed bug (type alias related) in static type checker. Mike Elston.
310   * TS: Added static type checking on variable matching in rule heads.
312   * TS: Added static type checking on CHR constraints in rule bodies.
314 Aug 1, 2006
316   * TS: New (limited) compile time type checking of rule heads.
318 Jul 28, 2006
320   * TS: New experimental robustness feature in debug mode:
321         runtime type checking of CHR constraints.
323 Jul 5, 2006
325   * TS: Minor bug fixes.
327 Jun 22, 2006
329   * TS: Improved performance of ai_observation_analysis,
330         mainly via additional tabling and passive declarations.
332 Jun 8, 2006
334   * TS: Disabled some code only intended for SICStus.
336   * TS: Fixed bug in removal of constraints. Spotted by Leslie De Koninck.
338 Jun 7, 2006
340   * TS: Next fix to tracer. Cconstraints in propagation
341         rules are shown in textual order.
343 Jun 2, 2006
345   * TS: Next few fixes to tracer. Constraints in simpagation rules
346         are now shown on the right side of the backslash.
348 Jun 1, 2006
350   * TS: Synchronization with SICStus version of K.U.Leuven CHR.
352   * TS: First few fixes to tracer. Cconstraints in simplification
353         rules are shown in textual order. Constraint insertions
354         are always shown.
356 May 17, 2006
358   * TS: Termination bug fixed in guard_entailment.
360   * TS:  Runtime library predicate run_suspensions is now specialized
361         per constraint, avoiding requirement of fixed suspension layout.
363   * TS: Further update to suspension term layout. Only constraints for
364         which the propagation history is used get a history field.
366 May 9, 2006
368   * TS: Ignore propagation rules with trivial body 'true'.
370 Apr 24, 2006
372   * TS: Guard entailment now first simplifies the formula it processes,
373         in order to reduce the number of disjunctions, to obtain a smaller
374         search tree.
376 Apr 22, 2006
378   * TS: Bug fix by Jon Sneyers:  type aliases now support built-in types.
379         Spotted by Mike Elston.
381   * TS: Small refactorings based on Ciao port experience.
383   * TS: Removed -singleton stylecheck option now that portray_clause
384         prints singleton variables as _.
386 Apr 19, 2006
388  * JW: Make library(chr) load its private stuff silent.
390 Apr 14, 2006
392  * TS: Bug fix: too many guards were locked.
394 Apr 11, 2006
396   * TS: Most runtime library predicates are now specialized
397         per constraint, avoiding generic =.. and lists code.
399         Mayor update to suspension term layout. Layout may now
400         differ from one constraint to the other. Some unused suspension
401         fields (continuation goal and generation number) are omitted.
402         Further analysis can remove more fields.
404         Default store constraints now each have
405         their own global variable: a list of all the suspensions.
406         Removal from this list is now O(1) thanks to setarg/1 and
407         back pointers in the suspension terms. This can cause time
408         time complexity improvements in solvers that always have 
409         variable indexing on their constraints.
411         Ground, non-indexed constraints are now removed from
412         their global list store in O(1), as for the default store.
414         Minor bug fixes in a number of places.
416 Mar 16, 2006
418   * TS: Fixed subtle bug in ai_observation analysis,
419         that caused goal sequences to only generate
420         the optimistic default answer pattern, leading
421         to invalid 'not observed' conclusions.
422   * TS: Variable indexing/suspension analysis now ignores functor/3
423         in guards. Could be extended to other built-ins
424         that cause an error when arguments are not
425         properly instantiated.
427 Mar 11, 2006
428   
429   * TS: Renamed global variable id to chr_id in chr_runtime.pl.
431 Mar 9, 2006
432   * JS: Synchronization with experimental version:
433         - minor optimizations, e.g. efficient lookups with statically known
434           instantiated data 
435         - new alternative syntax for passive declarations
436         - new dense_int built-in type + underlying store
437         - new type alias definitions, like in Mercury
439 Mar 4, 2006
440   * BD: small changes in chr_compiler_options.pl and chr_translate.chr
441         affecting only the SICStus port
443 Mar 3, 2006
444   * BD: lots of changes related to porting to SICStus
445   * TS: Now exception/3 hook is only used in SWI-Prolog
447 Mar 2, 2006
449   * TS: Use exception/3 hook to catch undefined 
450         global variables of chr_runtime.pl and CHR modules,
451         for multi-threaded programs and saved states.
453 Feb 9, 2006
455   * JW: Fix "make check" path issues.
456   * TS: Removed all is_chr_file tests when loading file.
458 Feb 8, 2006
460   * BD: chr_swi.pl: option(optimize --> :- chr_option(optimize
461   * TS: Removed obsolete experimental optimization option.
462   * TS: Correctly report variable pragmas!
463   * TS: No constraints declared is no longer a special case.
465 Jan 19, 2006
467   * BD: chr_swi.pl - use_module(hprolog added for SICStus port
468   * TS: Removed operator declaration for '::'. No longer used.
470 Dec 23, 2005
472   * TS: Removed chr_constraints declaration again, in favor
473         of only the chr_constraint declaration and modified
474         documentation accordingly.
475   * TS: Modified documentation based on recommendations of Bart Demoen.
476   * TS: Added chr_info/3 predicate to chr_compiler_errors, as suggested by
477         Jon Sneyers. Now print banner on calling compiler.
479 Dec 13, 2005
481   * TS: warnings are now written to user_error stream.
483 Dec 12, 2005
485   * TS: option and constraints declarations are now deprecated. They
486         are replaced by chr_option and chr_constraint(s).
487   * TR: Made an interface for warnings and errors. Errors now implemented
488         with exceptions.
489   * TR: Revised documentation.
491 Dec 2, 2005
492   * BD: chr_translate.chr, chr_translate_bootstrap2.chr
493            mutables "abstracted"
494   * BD: chr_translate_bootstrap1.chr
495            atomic_concat - some duplicate code of it is in more than one file :-(
496            create_get_mutable definitions if-deffed
497            verbosity_on/0 for porting
498         hprolog.pl
499            definitions of init_store/2, get_store/2, update_store/2
500            and of make_init_store_goal/make_get_store_goal/make_update_store_goal
501            removed prolog_flag/3 (seemed  nowhere used)
502         chr_translate_bootstrap2.chr
503            make_init_store_goal/make_get_store_goal/make_update_store_goal introduced
504            verbosity_on/0 for porting
505         chr_translate_bootstrap.pl
506            atom_concat -> atomic_concat
507            verbosity_on/0 for porting
508            conditional import van library(terms)
509         chr_translate.chr
510            make_init_store_goal etc. introduced
511         create_get_mutable_ref wherever needed (chr_translate*)
514 Nov 30, 2005
515   * BD: chr_runtime.pl:
516            chr_init for SICStus
517            included contents of chr_debug.pl
518            removed show_store/1
519            create_mutable changed into 'chr create_mutable'
520            got rid of explicit inlining and did it by goal expansion
521            inlining also of 'chr default_store'
522   * BD: chr_swi.pl:
523            removed :- use_module(chr(chr_debug))
524            module header: version for SICStus
525   * BD: chr_debug.pl: emptied
526   * BD: chr_translate.chr:
527            system specific declarations factored out in insert_declarations
528            changed two atom_concat/3 into atomic_concat/3 (because arg 2 was sometimes an int)
529   * BD: chr_compiler_utility.pl:
530            put atomic_concat/3 there 
531            adapted atom_concat_list/2 to use it
532   * BD: chr_swi_bootstrap.pl:
533            introduced chr_swi_bootstrap/2 for ease of porting
534            exported also chr_compile/3
535            porting code for get_time stuff/read_term/absolute_file_name
536   * BD: builtins.pl, a_star.pl, clean_code.pl:
537            some ifdefs
540 Nov 29, 2005
541   * BD: hprolog.pl: removed strip_attributes/2 and restore_attributes/2
543 Nov 29, 2005
544   * BD: chr_swi.pl: Removed code that took Handler for Module (in chr_expand(end_of_file)
545                     Added :- chr_option(_,_) with same meaning as option(_,_)
546                     is_chr_file: .chr is no longer a recognised suffix
547                     added use_module(library(lists))
548                     changed calls to source_location/2 into prolog_load_context/2
549   * BD: chr_translate.chr: chr_translate/2: added end_of_file to translated program
550                            adapted SICStus compatibility message
551                            made :- chr_option(_,_) available
552                            changed precedence of + - ? to 980 (these ops are
553                                      probably not local enough to the module)
555 Nov 21, 2005
557   * TS: Further synchronization with hProlog.
559 Nov 18, 2005
561   * TS: Removed dead code in guard_entailment.chr
562   * TS: Fixed performance bug: now lookup is indexed
563         on maximal number of arguments.
564   * TS: Removed some redundant intermediate predicates
565         in chr_runtime.pl.
566   * TS: It is now possible to disable the printing
567         of the CHR constraint store per module,
568         through the option toplevel_show_store on/off
569   * TS: Synchronized with hProlog
570   * TS: bug fix in functional dependency analysis
572 Nov 17, 2005
574   * TS: Removed two dead predicates in chr_translate.chr
575         and hooked up the late_storage_analysis
576         that was being bypassed.
577   * TS: Renamed global_term_ref_1 to default_store.
578   * TS: Removed redundant predicate values_ht.
579   * TS: Compiler no longer generates dead code for never stored constraints,
580         i.e. attach/detach predicates.
581         This reduces the generated .pl by about 700 lines.
583 Nov 10, 2005
585   * TS: Two more bug fixes for constraints without
586         active occurrences that trigger.
588 Nov 4, 2005
590   * TS: Small optimization of code for constraints
591         without any active occurrence.
592   * TS: Fixed bug caused by previous bug fix:
593         added only_ground_indexed_arguments/1 test
594         to separate out that meaning from may_trigger/1.
596 Nov 3, 2005
598   * TS: Removed strip_attributes code.
599   * TS: Fixed bug that causes new constraints to be added on triggering.
601 Oct 25, 2005
603   * TS: Two minor bug fixes.
605 Oct 19, 2005
607   * TS: Fixed bug due to overly aggressive inlining of get_mutable_value.
609 Oct 18, 2005
611   * JS: Compiled code is broken, if debug is off and optimize too.
612         Debug off now entails optimize on.
614   * TS: Some fixes of the documentation. Thanks to Bart Demoen
615         and Thom Fruehwirth. 
617 Sep 2, 2005
619   * TS: Synchronized with hProlog.
621 Aug 31, 2005
623   * TS: Added missing operator declarations for prefix (?).
625 Aug 9, 2005
627   * JW: import lists into chr_compiler_utility.pl
629   * JW: make message hook for query(yes) detect CHR global variables.
631   * JW: Exported pairlist_delete_eq/3 from pairlist and use this in
632     chr_hashtable_store.pl
634 Aug 4, 2005
636   * TS: Renamed pairlist:delete/3 to pairlist:pairlist_delete/3.
637         Mike Elston.
638 Aug 1, 2005
640   * TS: Extended more efficient ground matching code to
641         removed simpagation occurrence code.
643 Jul 28, 2005
645   * TS: New input verification: duplicate constraint declaration
646         now reported as an error. Requested by Mike Elston.
647   * TS: More efficient matching code for ground constraints
648         when matching an argument of a partner constraint with
649         a ground term
650   * JS: Bug fix in guard simplification.
652 Jul 3, 2005
654   * TS: Factored out option functionality into separate module.
655   * TS: Factored out utility code into separate module.
657 Jun 29, 2005
659   * TS: Changed chr_show_store/1 to use print/1 instead of write/1.
661 Jun 28, 2005
663   * TS: Removed spurious and conflicting operator definitions
664         for +, - and ? as mode declarations.
666 Jun 27, 2005
668   * TS: Added find_chr_constraint/1 functionality.
670 Jun 8, 2005
672   * TS: Improved compiler scalability: use nb_setval/2 to
673         remember compiled code through backtracking over
674         compilation process instead of assert/1.
675   * TS: Removed spurious comma from file.
677 Jun 1, 2005
679   * TS: Added option to disable toplevel constraint store printing.
680   * TS: Slightly improved hash table constraint store implementation.
682 Apr 16, 2005
684   * JW: Added patch from Jon Sneyers.
686 Mar 11, 2005
688   * TS: Improved head reordering heuristic.
689   * TS: Added support primitive for alternate built-in solver dependency.
691 Mar 4, 2005
693   * TS: Fixed bug that causes wrong output in chr_show_store.
695 Feb 25, 2005
697   * TS: Fixed several bugs in generation of debugable code.
699 Feb 19, 2005
701   * JW: Cleanup integration in SWI-Prolog environment:
702         - Extended SWI-Prolog library ordsets.  Renamed ord_delete/3 to
703           ord_del_element/3 and ord_difference/3 to ord_subtract/3 for
704           better compatibility.
705         - Renamed module find to chr_find to avoid name conflict and declared
706           preds as meta-predicate.
707         - Re-inserted and exported strip_attributes/2 and
708           restore_attributes/2 in hprolog.pl. Deleted hprolog: from
709           chr_translate.chr.
710         - Added dummy option declarations to bootstrap compiler.
711         - Fixed path problems in makefile (-p chr=.) and install new
712           components.
713         - Fixed typo 'chr show_store' --> chr_show_store.
715 Feb 17, 2005
717   * JS: Added guard entailment optimizations and
718         new syntax for type and mode declarations.
720 Dec 15, 2004
722   * TS: Use prolog:message/3 hook to automatically print
723         contents of CHR constraint stores with query bindings
724         on toplevel.
726 Dec  3, 2004
728   * TS: Bugfix in code generation. Reported by Lyosha Ilyukhin.
730 Jul 28, 2004
732   * TS: Updated hashtable stores. They now start small and expand.
734 Jul 19, 2004
736   * JW: Removed chr_pp: module prefixes
737   * JW: Updated Windows makefile.mak (more similar organisation, added check)
739 Jul 17, 2004
741   * TS: Added chr_hashtable_store library.
742   * TS: Added find library.
743   * TS: Added builtins library.
744   * TS: Added clean_code library.
745   * TS: Added binomial_heap library.
746   * TS: Added a_star library.
747   * TS: Added new intermediate bootstrapping step
748   * TS: Synchronized CHR compiler with most recent development version
750   Summary of changes:
752    "The new version of the compiler contains several new optimizations, both
753     fully automatic, such as the antimonotny-based delay avoidance (see
754     http://www.cs.kuleuven.be/publicaties/rapporten/cw/CW385.abs.html for
755     the technical report), and enabled by mode declarations (see CHR
756     documentation), such as hashtable-based constraint indexes."
758 Apr 9, 2004
760   * JW: Added chr_messages.pl.  Make all debug messages use the print_message/2
761     interface to enable future embedding.
763 Apr 7, 2004
765   * JW: Added chr:debug_interact/3 hook.  Defined in chr_swi.pl to void
766     showing constraints first as goal and then as CHR call.
767   * JW: Added chr:debug_event/2 hook.  Defined in chr_swi.pl to make the
768     CHR debugger honour a skip command from the Prolog tracer.
770 Apr 6, 2004
772   * JW: Added b (break) to the CHR debugger.
773   * TS: added chr_expandable/2 clause for pragma/2
775 Apr 5, 2004
777   * JW: fixed reference to format_rule/2.
778   * JW: Use select/3 rather than delete/3 in diff/2 in Tests/zebra.pl
779   * TS: CHR translation now leaves CHR store empty
781 Apr 4, 2004
783   * JW: added :- use_module(library(chr)) to all examples.
784   * JW: mapped -O --> option(optimize, full).
785   * JW: introduced file-search-path `chr' for clarity and to enable running
786     make check from the local environment instead of the public installation.
787   * JW: mapped prolog flag generate_debug_info --> option(debug, on)
788   * JW: Replaced the chr -> pl step with term_expansion/2.
789   * JW: Moved insert_declarations/2 to chr_swi.pl
791 Apr 2, 2004
793   * JW: fixed Undefined procedure: chr_runtime:run_suspensions_loop_d/1
794   * TS: Added <space> for creep and shortened debug line prefix to CHR:
796 Mar 29, 2004
798   * JW: Use \+ \+ in chr_compile/3 to undo changes to the constraint
799     pool.  Regression test suite using "make check" works again.
801 Mar 25, 2004
803   * TS: Added skip and ancestor debug commands
805 Mar 24, 2004
807   * TS: Added bootstrapping process for CHR compiler using CHR.
808   * TS: CHR compiler now uses CHR.
809   * TS: Fixed bug in compilation of multi-headed simpagation rules.
810   * TS: Cleaned up compiler.
811   * TS: Added analysis + optimization for never attached constraints.
812   * TS: Exploit uniqueness (functional dependency) results to detect
813     set semantics type simpagation rules where one rule can be passive
814   * TS: Compiler generates 'chr debug_event'/1 calls
815   * TS: Rudimentary support for debugging.
816     option(debug,on) causes a trace of CHR events to be printed
818 Mar 15, 2004
820   * JW: Fix operator handling.
822 Mar 3, 2004
824   * JW: Integrated new version from Tom Schrijvers.