Mercurial > hg > xemacs-beta
diff src/ChangeLog @ 734:8bd30fae1bce
[xemacs-hg @ 2002-01-25 16:46:24 by stephent]
Per patch <87665q9yfh.fsf@tleepslib.sk.tsukuba.ac.jp>.
author | stephent |
---|---|
date | Fri, 25 Jan 2002 16:46:26 +0000 |
parents | b1f74adcc1ff |
children | 2e5e2ccbeed2 |
line wrap: on
line diff
--- a/src/ChangeLog Tue Jan 22 20:40:03 2002 +0000 +++ b/src/ChangeLog Fri Jan 25 16:46:26 2002 +0000 @@ -1,3 +1,8 @@ +2002-01-26 Stephen J. Turnbull <stephen@xemacs.org> + + * ChangeLog (2001-09-19 Ben Wing): Entry dosed with Dramamine. + * README.integral-types: New file excised from ChangeLog. + 2002-01-19 Jan Vroonhof <jan@xemacs.org> * cmdloop.c: New variable Qdisabled_command_loop. @@ -1180,347 +1185,46 @@ The great integral types renaming. - The purpose of this is to rationalize the names used for various - integral types, so that they match their intended uses and follow - consist conventions, and eliminate types that were not semantically - different from each other. - - The conventions are: - - -- All integral types that measure quantities of anything are - signed. Some people disagree vociferously with this, but their - arguments are mostly theoretical, and are vastly outweighed by - the practical headaches of mixing signed and unsigned values, - and more importantly by the far increased likelihood of - inadvertent bugs: Because of the broken "viral" nature of - unsigned quantities in C (operations involving mixed - signed/unsigned are done unsigned, when exactly the opposite is - nearly always wanted), even a single error in declaring a - quantity unsigned that should be signed, or even the even more - subtle error of comparing signed and unsigned values and - forgetting the necessary cast, can be catastrophic, as - comparisons will yield wrong results. -Wsign-compare is turned - on specifically to catch this, but this tends to result in a - great number of warnings when mixing signed and unsigned, and - the casts are annoying. More has been written on this - elsewhere. - - -- All such quantity types just mentioned boil down to EMACS_INT, - which is 32 bits on 32-bit machines and 64 bits on 64-bit - machines. This is guaranteed to be the same size as Lisp - objects of type `int', and (as far as I can tell) of size_t - (unsigned!) and ssize_t. The only type below that is not an - EMACS_INT is Hashcode, which is an unsigned value of the same - size as EMACS_INT. - - -- Type names should be relatively short (no more than 10 - characters or so), with the first letter capitalized and no - underscores if they can at all be avoided. - - -- "count" == a zero-based measurement of some quantity. Includes - sizes, offsets, and indexes. - - -- "bpos" == a one-based measurement of a position in a buffer. - "Charbpos" and "Bytebpos" count text in the buffer, rather than - bytes in memory; thus Bytebpos does not directly correspond to - the memory representation. Use "Membpos" for this. - - -- "Char" refers to internal-format characters, not to the C type - "char", which is really a byte. - - -- For the actual name changes, see the script below. - - I ran the following script to do the conversion. (NOTE: This script - is idempotent. You can safely run it multiple times and it will - not screw up previous results -- in fact, it will do nothing if - nothing has changed. Thus, it can be run repeatedly as necessary - to handle patches coming in from old workspaces, or old branches.) - There are two tags, just before and just after the change: - `pre-integral-type-rename' and `post-integral-type-rename'. When - merging code from the main trunk into a branch, the best thing to - do is first merge up to `pre-integral-type-rename', then apply the - script and associated changes, then merge from - `post-integral-type-change' to the present. (Alternatively, just do - the merging in one operation; but you may then have a lot of - conflicts needing to be resolved by hand.) - - Script `fixtypes.sh' follows: - - ------------------------------------ cut ------------------------------------ -files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" -gr Memory_Count Bytecount $files -gr Lstream_Data_Count Bytecount $files -gr Element_Count Elemcount $files -gr Hash_Code Hashcode $files -gr extcount bytecount $files -gr bufpos charbpos $files -gr bytind bytebpos $files -gr memind membpos $files -gr bufbyte intbyte $files -gr Extcount Bytecount $files -gr Bufpos Charbpos $files -gr Bytind Bytebpos $files -gr Memind Membpos $files -gr Bufbyte Intbyte $files -gr EXTCOUNT BYTECOUNT $files -gr BUFPOS CHARBPOS $files -gr BYTIND BYTEBPOS $files -gr MEMIND MEMBPOS $files -gr BUFBYTE INTBYTE $files -gr MEMORY_COUNT BYTECOUNT $files -gr LSTREAM_DATA_COUNT BYTECOUNT $files -gr ELEMENT_COUNT ELEMCOUNT $files -gr HASH_CODE HASHCODE $files ------------------------------------ cut ------------------------------------ - - - `fixtypes.sh' is a Bourne-shell script; it uses 'gr': - - ------------------------------------ cut ------------------------------------ -#!/bin/sh - -# Usage is like this: - -# gr FROM TO FILES ... - -# globally replace FROM with TO in FILES. FROM and TO are regular expressions. -# backup files are stored in the `backup' directory. -from="$1" -to="$2" -shift 2 -echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" ------------------------------------ cut ------------------------------------ - - - `gr' in turn uses a Perl script to do its real work, - `global-replace', which follows: - - ------------------------------------ cut ------------------------------------ -: #-*- Perl -*- - -### global-modify --- modify the contents of a file by a Perl expression - -## Copyright (C) 1999 Martin Buchholz. -## Copyright (C) 2001 Ben Wing. - -## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> -## Maintainer: Ben Wing <ben@xemacs.org> -## Current Version: 1.0, May 5, 2001 - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with XEmacs; see the file COPYING. If not, write to the Free -# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -eval 'exec perl -w -S $0 ${1+"$@"}' - if 0; - -use strict; -use FileHandle; -use Carp; -use Getopt::Long; -use File::Basename; - -(my $myName = $0) =~ s@.*/@@; my $usage=" -Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] - PERLEXPR FILE ... - -Globally modify a file, either line by line or in one big hunk. - -Typical usage is like this: - -[with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. - in file names] - -find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n - -[with non-GNU print, xargs] - -find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n - - -The file is read in, either line by line (with --line-mode specified) -or in one big hunk (with --hunk-mode specified; it's the default), and -the Perl expression is then evalled with \$_ set to the line or hunk of -text, including the terminating newline if there is one. It should -destructively modify the value there, storing the changed result in \$_. - -Files in which any modifications are made are backed up to the directory -specified using --backup-dir, or to `backup' by default. To disable this, -use --backup-dir= with no argument. - -Hunk mode is the default because it is MUCH MUCH faster than line-by-line. -Use line-by-line only when it matters, e.g. you want to do a replacement -only once per line (the default without the `g' argument). Conversely, -when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one -replacement in the entire file! -"; - -my %options = (); -$Getopt::Long::ignorecase = 0; -&GetOptions ( - \%options, - 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', -); - - -die $usage if $options{"help"} or @ARGV <= 1; -my $code = shift; - -die $usage if grep (-d || ! -w, @ARGV); - -sub SafeOpen { - open ((my $fh = new FileHandle), $_[0]); - confess "Can't open $_[0]: $!" if ! defined $fh; - return $fh; -} - -sub SafeClose { - close $_[0] or confess "Can't close $_[0]: $!"; -} - -sub FileContents { - my $fh = SafeOpen ("< $_[0]"); - my $olddollarslash = $/; - local $/ = undef; - my $contents = <$fh>; - $/ = $olddollarslash; - return $contents; -} - -sub WriteStringToFile { - my $fh = SafeOpen ("> $_[0]"); - binmode $fh; - print $fh $_[1] or confess "$_[0]: $!\n"; - SafeClose $fh; -} - -foreach my $file (@ARGV) { - my $changed_p = 0; - my $new_contents = ""; - if ($options{"line-mode"}) { - my $fh = SafeOpen $file; - while (<$fh>) { - my $save_line = $_; - eval $code; - $changed_p = 1 if $save_line ne $_; - $new_contents .= $_; - } - } else { - my $orig_contents = $_ = FileContents $file; - eval $code; - if ($_ ne $orig_contents) { - $changed_p = 1; - $new_contents = $_; - } - } - - if ($changed_p) { - my $backdir = $options{"backup-dir"}; - $backdir = "backup" if !defined ($backdir); - if ($backdir) { - my ($name, $path, $suffix) = fileparse ($file, ""); - my $backfulldir = $path . $backdir; - my $backfile = "$backfulldir/$name"; - mkdir $backfulldir, 0755 unless -d $backfulldir; - print "modifying $file (original saved in $backfile)\n"; - rename $file, $backfile; - } - WriteStringToFile ($file, $new_contents); - } -} ------------------------------------ cut ------------------------------------ - - - In addition to those programs, I needed to fix up a few other - things, particularly relating to the duplicate definitions of - types, now that some types merged with others. Specifically: - - 1. in lisp.h, removed duplicate declarations of Bytecount. The - changed code should now look like this: (In each code snippet - below, the first and last lines are the same as the original, as - are all lines outside of those lines. That allows you to locate - the section to be replaced, and replace the stuff in that - section, verifying that there isn't anything new added that - would need to be kept.) - ---------------------------------- snip ------------------------------------- -/* Counts of bytes or chars */ -typedef EMACS_INT Bytecount; -typedef EMACS_INT Charcount; - -/* Counts of elements */ -typedef EMACS_INT Elemcount; - -/* Hash codes */ -typedef unsigned long Hashcode; - -/* ------------------------ dynamic arrays ------------------- */ ---------------------------------- snip ------------------------------------- - - 2. in lstream.h, removed duplicate declaration of Bytecount. - Rewrote the comment about this type. The changed code should - now look like this: - - ---------------------------------- snip ------------------------------------- -#endif - -/* The have been some arguments over the what the type should be that - specifies a count of bytes in a data block to be written out or read in, - using Lstream_read(), Lstream_write(), and related functions. - Originally it was long, which worked fine; Martin "corrected" these to - size_t and ssize_t on the grounds that this is theoretically cleaner and - is in keeping with the C standards. Unfortunately, this practice is - horribly error-prone due to design flaws in the way that mixed - signed/unsigned arithmetic happens. In fact, by doing this change, - Martin introduced a subtle but fatal error that caused the operation of - sending large mail messages to the SMTP server under Windows to fail. - By putting all values back to be signed, avoiding any signed/unsigned - mixing, the bug immediately went away. The type then in use was - Lstream_Data_Count, so that it be reverted cleanly if a vote came to - that. Now it is Bytecount. - - Some earlier comments about why the type must be signed: This MUST BE - SIGNED, since it also is used in functions that return the number of - bytes actually read to or written from in an operation, and these - functions can return -1 to signal error. - - Note that the standard Unix read() and write() functions define the - count going in as a size_t, which is UNSIGNED, and the count going - out as an ssize_t, which is SIGNED. This is a horrible design - flaw. Not only is it highly likely to lead to logic errors when a - -1 gets interpreted as a large positive number, but operations are - bound to fail in all sorts of horrible ways when a number in the - upper-half of the size_t range is passed in -- this number is - unrepresentable as an ssize_t, so code that checks to see how many - bytes are actually written (which is mandatory if you are dealing - with certain types of devices) will get completely screwed up. - - --ben -*/ - -typedef enum lstream_buffering ---------------------------------- snip ------------------------------------- - - - 3. in dumper.c, there are four places, all inside of switch() - statements, where XD_BYTECOUNT appears twice as a case tag. In - each case, the two case blocks contain identical code, and you - should *REMOVE THE SECOND* and leave the first. + Rationalize the names used for various integral types, so that + they match their intended uses and follow consist conventions, and + eliminate types that were not semantically different from each + other. The following global substitutions were made: + + Memory_Count Bytecount + Lstream_Data_Count Bytecount + Element_Count Elemcount + Hash_Code Hashcode + extcount bytecount + bufpos charbpos + bytind bytebpos + memind membpos + bufbyte intbyte + Extcount Bytecount + Bufpos Charbpos + Bytind Bytebpos + Memind Membpos + Bufbyte Intbyte + EXTCOUNT BYTECOUNT + BUFPOS CHARBPOS + BYTIND BYTEBPOS + MEMIND MEMBPOS + BUFBYTE INTBYTE + MEMORY_COUNT BYTECOUNT + LSTREAM_DATA_COUNT BYTECOUNT + ELEMENT_COUNT ELEMCOUNT + HASH_CODE HASHCODE + + This resulted in some duplications. + + * lisp.h: removed duplicate declarations of Bytecount. + + * lstream.h: removed duplicate declaration of Bytecount. + Rewrote the comment about this type. + + * dumper.c: remove duplicate case tag XD_BYTECOUNT, and the + accompanying duplicate code, from 4 switchs tatements. + + See README.integral-types in this directory for more details. 2001-09-17 Ben Wing <ben@xemacs.org>