view src/README.global-renaming @ 4539:061e030e3270

Fix some bugs in load-history construction, built-in symbol file names. lib-src/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * make-docfile.c (main): Allow more than one -d argument, followed by a directory to change to. (put_filename): Don't strip directory information; with previous change, allows retrieval of Lisp function and variable origin files from #'built-in-symbol-file relative to lisp-directory. (scan_lisp_file): Don't add an extraneous newline after the file name, put_filename has added the newline already. lisp/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * loadup.el (load-history): Add the contents of current-load-list to load-history before clearing it. Move the variable declarations earlier in the file to a format understood by make-docfile.c. * custom.el (custom-declare-variable): Add the variable's symbol to the current file's load history entry correctly, don't use a cons. Eliminate a comment that we don't need to worry about, we don't need to check the `initialized' C variable in Lisp. * bytecomp.el (byte-compile-output-file-form): Merge Andreas Schwab's pre-GPLv3 GNU change of 19970831 here; treat #'custom-declare-variable correctly, generating the docstrings in a format understood by make-docfile.c. * loadhist.el (symbol-file): Correct behaviour for checking autoloaded macros and functions when supplied with a TYPE argument. Accept fully-qualified paths from #'built-in-symbol-file; if a path is not fully-qualified, return it relative to lisp-directory if the filename corresponds to a Lisp file, and relative to (concat source-directory "/src/") otherwise. * make-docfile.el (preloaded-file-list): Rationalise some let bindings a little. Use the "-d" argument to make-docfile.c to supply Lisp paths relative to lisp-directory, not absolutely. Add in loadup.el explicitly to the list of files to be processed by make-docfile.c--it doesn't make sense to add it to preloaded-file-list, since that is used for purposes of byte-compilation too. src/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * doc.c (Fbuilt_in_symbol_file): Return a subr's filename immediately if we've found it. Check for compiled function and compiled macro docstrings in DOC too, and return them if they exist. The branch of the if statement focused on functions may have executed, but we may still want to check variable bindings; an else clause isn't appropriate.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 27 Dec 2008 14:05:50 +0000
parents 48eed784e93a
children 2aa9cd456ae7
line wrap: on
line source

README.global-renaming

This file documents the generic scripts that have been used to implement
the recent type renamings, e.g. the "great integral type renaming" and the
"text/char type renaming".  More information about these changes can be
found in the Internals manual.

A sample script to do such renaming is this (used in the great integral
type renaming):

----------------------------------- 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-replace --- modify the contents of a file by a Perl expression

## Copyright (C) 1999 Martin Buchholz.
## Copyright (C) 2001, 2002 Ben Wing.

## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org>
## Maintainer: Ben Wing <ben@xemacs.org>
## Current Version: 1.2, March 12, 2002

# 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.orig' 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.orig" 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 ------------------------------------