Mercurial > hg > xemacs-beta
comparison src/README.global-renaming @ 868:48eed784e93a
[xemacs-hg @ 2002-06-05 12:00:40 by ben]
To: xemacs-patches@xemacs.org
internals/internals.texi:
author | ben |
---|---|
date | Wed, 05 Jun 2002 12:01:11 +0000 |
parents | |
children | 2aa9cd456ae7 |
comparison
equal
deleted
inserted
replaced
867:804517e16990 | 868:48eed784e93a |
---|---|
1 README.global-renaming | |
2 | |
3 This file documents the generic scripts that have been used to implement | |
4 the recent type renamings, e.g. the "great integral type renaming" and the | |
5 "text/char type renaming". More information about these changes can be | |
6 found in the Internals manual. | |
7 | |
8 A sample script to do such renaming is this (used in the great integral | |
9 type renaming): | |
10 | |
11 ----------------------------------- cut ------------------------------------ | |
12 files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" | |
13 gr Memory_Count Bytecount $files | |
14 gr Lstream_Data_Count Bytecount $files | |
15 gr Element_Count Elemcount $files | |
16 gr Hash_Code Hashcode $files | |
17 gr extcount bytecount $files | |
18 gr bufpos charbpos $files | |
19 gr bytind bytebpos $files | |
20 gr memind membpos $files | |
21 gr bufbyte intbyte $files | |
22 gr Extcount Bytecount $files | |
23 gr Bufpos Charbpos $files | |
24 gr Bytind Bytebpos $files | |
25 gr Memind Membpos $files | |
26 gr Bufbyte Intbyte $files | |
27 gr EXTCOUNT BYTECOUNT $files | |
28 gr BUFPOS CHARBPOS $files | |
29 gr BYTIND BYTEBPOS $files | |
30 gr MEMIND MEMBPOS $files | |
31 gr BUFBYTE INTBYTE $files | |
32 gr MEMORY_COUNT BYTECOUNT $files | |
33 gr LSTREAM_DATA_COUNT BYTECOUNT $files | |
34 gr ELEMENT_COUNT ELEMCOUNT $files | |
35 gr HASH_CODE HASHCODE $files | |
36 ----------------------------------- cut ------------------------------------ | |
37 | |
38 | |
39 `fixtypes.sh' is a Bourne-shell script; it uses 'gr': | |
40 | |
41 | |
42 ----------------------------------- cut ------------------------------------ | |
43 #!/bin/sh | |
44 | |
45 # Usage is like this: | |
46 | |
47 # gr FROM TO FILES ... | |
48 | |
49 # globally replace FROM with TO in FILES. FROM and TO are regular expressions. | |
50 # backup files are stored in the `backup' directory. | |
51 from="$1" | |
52 to="$2" | |
53 shift 2 | |
54 echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" | |
55 ----------------------------------- cut ------------------------------------ | |
56 | |
57 | |
58 `gr' in turn uses a Perl script to do its real work, `global-replace', | |
59 which follows: | |
60 | |
61 | |
62 ----------------------------------- cut ------------------------------------ | |
63 : #-*- Perl -*- | |
64 | |
65 ### global-replace --- modify the contents of a file by a Perl expression | |
66 | |
67 ## Copyright (C) 1999 Martin Buchholz. | |
68 ## Copyright (C) 2001, 2002 Ben Wing. | |
69 | |
70 ## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> | |
71 ## Maintainer: Ben Wing <ben@xemacs.org> | |
72 ## Current Version: 1.2, March 12, 2002 | |
73 | |
74 # This program is free software; you can redistribute it and/or modify | |
75 # it under the terms of the GNU General Public License as published by | |
76 # the Free Software Foundation; either version 2, or (at your option) | |
77 # any later version. | |
78 # | |
79 # This program is distributed in the hope that it will be useful, but | |
80 # WITHOUT ANY WARRANTY; without even the implied warranty of | |
81 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
82 # General Public License for more details. | |
83 # | |
84 # You should have received a copy of the GNU General Public License | |
85 # along with XEmacs; see the file COPYING. If not, write to the Free | |
86 # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
87 # 02111-1307, USA. | |
88 | |
89 eval 'exec perl -w -S $0 ${1+"$@"}' | |
90 if 0; | |
91 | |
92 use strict; | |
93 use FileHandle; | |
94 use Carp; | |
95 use Getopt::Long; | |
96 use File::Basename; | |
97 | |
98 (my $myName = $0) =~ s@.*/@@; my $usage=" | |
99 Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] | |
100 PERLEXPR FILE ... | |
101 | |
102 Globally modify a file, either line by line or in one big hunk. | |
103 | |
104 Typical usage is like this: | |
105 | |
106 [with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. | |
107 in file names] | |
108 | |
109 find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n | |
110 | |
111 [with non-GNU print, xargs] | |
112 | |
113 find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n | |
114 | |
115 | |
116 The file is read in, either line by line (with --line-mode specified) | |
117 or in one big hunk (with --hunk-mode specified; it's the default), and | |
118 the Perl expression is then evalled with \$_ set to the line or hunk of | |
119 text, including the terminating newline if there is one. It should | |
120 destructively modify the value there, storing the changed result in \$_. | |
121 | |
122 Files in which any modifications are made are backed up to the directory | |
123 specified using --backup-dir, or to `backup.orig' by default. To disable | |
124 this, use --backup-dir= with no argument. | |
125 | |
126 Hunk mode is the default because it is MUCH MUCH faster than line-by-line. | |
127 Use line-by-line only when it matters, e.g. you want to do a replacement | |
128 only once per line (the default without the `g' argument). Conversely, | |
129 when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one | |
130 replacement in the entire file! | |
131 "; | |
132 | |
133 my %options = (); | |
134 $Getopt::Long::ignorecase = 0; | |
135 &GetOptions ( | |
136 \%options, | |
137 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', | |
138 ); | |
139 | |
140 | |
141 die $usage if $options{"help"} or @ARGV <= 1; | |
142 my $code = shift; | |
143 | |
144 die $usage if grep (-d || ! -w, @ARGV); | |
145 | |
146 sub SafeOpen { | |
147 open ((my $fh = new FileHandle), $_[0]); | |
148 confess "Can't open $_[0]: $!" if ! defined $fh; | |
149 return $fh; | |
150 } | |
151 | |
152 sub SafeClose { | |
153 close $_[0] or confess "Can't close $_[0]: $!"; | |
154 } | |
155 | |
156 sub FileContents { | |
157 my $fh = SafeOpen ("< $_[0]"); | |
158 my $olddollarslash = $/; | |
159 local $/ = undef; | |
160 my $contents = <$fh>; | |
161 $/ = $olddollarslash; | |
162 return $contents; | |
163 } | |
164 | |
165 sub WriteStringToFile { | |
166 my $fh = SafeOpen ("> $_[0]"); | |
167 binmode $fh; | |
168 print $fh $_[1] or confess "$_[0]: $!\n"; | |
169 SafeClose $fh; | |
170 } | |
171 | |
172 foreach my $file (@ARGV) { | |
173 my $changed_p = 0; | |
174 my $new_contents = ""; | |
175 if ($options{"line-mode"}) { | |
176 my $fh = SafeOpen $file; | |
177 while (<$fh>) { | |
178 my $save_line = $_; | |
179 eval $code; | |
180 $changed_p = 1 if $save_line ne $_; | |
181 $new_contents .= $_; | |
182 } | |
183 } else { | |
184 my $orig_contents = $_ = FileContents $file; | |
185 eval $code; | |
186 if ($_ ne $orig_contents) { | |
187 $changed_p = 1; | |
188 $new_contents = $_; | |
189 } | |
190 } | |
191 | |
192 if ($changed_p) { | |
193 my $backdir = $options{"backup-dir"}; | |
194 $backdir = "backup.orig" if !defined ($backdir); | |
195 if ($backdir) { | |
196 my ($name, $path, $suffix) = fileparse ($file, ""); | |
197 my $backfulldir = $path . $backdir; | |
198 my $backfile = "$backfulldir/$name"; | |
199 mkdir $backfulldir, 0755 unless -d $backfulldir; | |
200 print "modifying $file (original saved in $backfile)\n"; | |
201 rename $file, $backfile; | |
202 } | |
203 WriteStringToFile ($file, $new_contents); | |
204 } | |
205 } | |
206 ----------------------------------- cut ------------------------------------ |