Mercurial > hg > xemacs-beta
annotate src/README.global-renaming @ 4952:19a72041c5ed
Mule-izing, various fixes related to char * arguments
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (print_pgresult):
* postgresql/postgresql.c (Fpq_conn_defaults):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_result_status):
* postgresql/postgresql.c (Fpq_res_status):
Mule-ize large parts of it.
2010-01-26 Ben Wing <ben@xemacs.org>
* ldap/eldap.c (print_ldap):
* ldap/eldap.c (allocate_ldap):
Use write_ascstring().
src/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (build_ascstring):
* alloc.c (build_msg_cistring):
* alloc.c (staticpro_1):
* alloc.c (staticpro_name):
* alloc.c (staticpro_nodump_1):
* alloc.c (staticpro_nodump_name):
* alloc.c (unstaticpro_nodump_1):
* alloc.c (mcpro_1):
* alloc.c (mcpro_name):
* alloc.c (object_memory_usage_stats):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c (print_buffer):
* buffer.c (vars_of_buffer):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.c (init_initial_directory):
* bytecode.c (invalid_byte_code):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* chartab.c (print_table_entry):
* chartab.c (print_char_table):
* config.h.in:
* console-gtk.c:
* console-gtk.c (gtk_device_to_console_connection):
* console-gtk.c (gtk_semi_canonicalize_console_connection):
* console-gtk.c (gtk_canonicalize_console_connection):
* console-gtk.c (gtk_semi_canonicalize_device_connection):
* console-gtk.c (gtk_canonicalize_device_connection):
* console-stream.c (stream_init_frame_1):
* console-stream.c (vars_of_console_stream):
* console-stream.c (init_console_stream):
* console-x.c (x_semi_canonicalize_console_connection):
* console-x.c (x_semi_canonicalize_device_connection):
* console-x.c (x_canonicalize_device_connection):
* console-x.h:
* data.c (eq_with_ebola_notice):
* data.c (Fsubr_interactive):
* data.c (Fnumber_to_string):
* data.c (digit_to_number):
* device-gtk.c (gtk_init_device):
* device-msw.c (print_devmode):
* device-x.c (x_event_name):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-msw.c (vars_of_dialog_mswindows):
* doc.c (weird_doc):
* doc.c (Fsnarf_documentation):
* doc.c (vars_of_doc):
* dumper.c (pdump):
* dynarr.c:
* dynarr.c (Dynarr_realloc):
* editfns.c (Fuser_real_login_name):
* editfns.c (get_home_directory):
* elhash.c (print_hash_table_data):
* elhash.c (print_hash_table):
* emacs.c (main_1):
* emacs.c (vars_of_emacs):
* emodules.c:
* emodules.c (_emodules_list):
* emodules.c (Fload_module):
* emodules.c (Funload_module):
* emodules.c (Flist_modules):
* emodules.c (find_make_module):
* emodules.c (attempt_module_delete):
* emodules.c (emodules_load):
* emodules.c (emodules_doc_subr):
* emodules.c (emodules_doc_sym):
* emodules.c (syms_of_module):
* emodules.c (vars_of_module):
* emodules.h:
* eval.c (print_subr):
* eval.c (signal_call_debugger):
* eval.c (build_error_data):
* eval.c (signal_error):
* eval.c (maybe_signal_error):
* eval.c (signal_continuable_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (signal_error_2):
* eval.c (maybe_signal_error_2):
* eval.c (signal_continuable_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (signal_ferror):
* eval.c (maybe_signal_ferror):
* eval.c (signal_continuable_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (signal_ferror_with_frob):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (signal_continuable_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (syntax_error):
* eval.c (syntax_error_2):
* eval.c (maybe_syntax_error):
* eval.c (sferror):
* eval.c (sferror_2):
* eval.c (maybe_sferror):
* eval.c (invalid_argument):
* eval.c (invalid_argument_2):
* eval.c (maybe_invalid_argument):
* eval.c (invalid_constant):
* eval.c (invalid_constant_2):
* eval.c (maybe_invalid_constant):
* eval.c (invalid_operation):
* eval.c (invalid_operation_2):
* eval.c (maybe_invalid_operation):
* eval.c (invalid_change):
* eval.c (invalid_change_2):
* eval.c (maybe_invalid_change):
* eval.c (invalid_state):
* eval.c (invalid_state_2):
* eval.c (maybe_invalid_state):
* eval.c (wtaerror):
* eval.c (stack_overflow):
* eval.c (out_of_memory):
* eval.c (print_multiple_value):
* eval.c (issue_call_trapping_problems_warning):
* eval.c (backtrace_specials):
* eval.c (backtrace_unevalled_args):
* eval.c (Fbacktrace):
* eval.c (warn_when_safe):
* event-Xt.c (modwarn):
* event-Xt.c (modbarf):
* event-Xt.c (check_modifier):
* event-Xt.c (store_modifier):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (describe_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (store_modifier):
* event-gtk.c (gtk_reset_modifier_mapping):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (FROB):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-stream.c (external_debugging_print_event):
* event-stream.c (execute_help_form):
* event-stream.c (vars_of_event_stream):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* faces.c (print_face):
* faces.c (complex_vars_of_faces):
* file-coding.c:
* file-coding.c (print_coding_system):
* file-coding.c (print_coding_system_in_print_method):
* file-coding.c (default_query_method):
* file-coding.c (find_coding_system):
* file-coding.c (make_coding_system_1):
* file-coding.c (chain_print):
* file-coding.c (undecided_print):
* file-coding.c (gzip_print):
* file-coding.c (vars_of_file_coding):
* file-coding.c (complex_vars_of_file_coding):
* fileio.c:
* fileio.c (report_file_type_error):
* fileio.c (report_error_with_errno):
* fileio.c (report_file_error):
* fileio.c (barf_or_query_if_file_exists):
* fileio.c (vars_of_fileio):
* floatfns.c (matherr):
* fns.c (print_bit_vector):
* fns.c (Fmapconcat):
* fns.c (add_suffix_to_symbol):
* fns.c (add_prefix_to_symbol):
* frame-gtk.c:
* frame-gtk.c (Fgtk_window_id):
* frame-x.c (def):
* frame-x.c (x_cde_transfer_callback):
* frame.c:
* frame.c (Fmake_frame):
* gc.c (show_gc_cursor_and_message):
* gc.c (vars_of_gc):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (gtk_print_image_instance):
* glyphs-msw.c (mswindows_print_image_instance):
* glyphs-x.c (x_print_image_instance):
* glyphs-x.c (update_widget_face):
* glyphs.c (make_string_from_file):
* glyphs.c (print_image_instance):
* glyphs.c (signal_image_error):
* glyphs.c (signal_image_error_2):
* glyphs.c (signal_double_image_error):
* glyphs.c (signal_double_image_error_2):
* glyphs.c (xbm_mask_file_munging):
* glyphs.c (pixmap_to_lisp_data):
* glyphs.h:
* gui.c (gui_item_display_flush_left):
* hpplay.c (player_error_internal):
* hpplay.c (myHandler):
* intl-win32.c:
* intl-win32.c (langcode_to_lang):
* intl-win32.c (sublangcode_to_lang):
* intl-win32.c (Fmswindows_get_locale_info):
* intl-win32.c (lcid_to_locale_mule_or_no):
* intl-win32.c (mswindows_multibyte_to_unicode_print):
* intl-win32.c (complex_vars_of_intl_win32):
* keymap.c:
* keymap.c (print_keymap):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fkey_description):
* keymap.c (Ftext_char_description):
* lisp.h:
* lisp.h (struct):
* lisp.h (DECLARE_INLINE_HEADER):
* lread.c (Fload_internal):
* lread.c (locate_file):
* lread.c (read_escape):
* lread.c (read_raw_string):
* lread.c (read1):
* lread.c (read_list):
* lread.c (read_compiled_function):
* lread.c (init_lread):
* lrecord.h:
* marker.c (print_marker):
* marker.c (marker_equal):
* menubar-msw.c (displayable_menu_item):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar.c (vars_of_menubar):
* minibuf.c (reinit_complex_vars_of_minibuf):
* minibuf.c (complex_vars_of_minibuf):
* mule-charset.c (Fmake_charset):
* mule-charset.c (complex_vars_of_mule_charset):
* mule-coding.c (iso2022_print):
* mule-coding.c (fixed_width_query):
* number.c (bignum_print):
* number.c (ratio_print):
* number.c (bigfloat_print):
* number.c (bigfloat_finalize):
* objects-msw.c:
* objects-msw.c (mswindows_color_to_string):
* objects-msw.c (mswindows_color_list):
* objects-tty.c:
* objects-tty.c (tty_font_list):
* objects-tty.c (tty_find_charset_font):
* objects-xlike-inc.c (xft_find_charset_font):
* objects-xlike-inc.c (endif):
* print.c:
* print.c (write_istring):
* print.c (write_ascstring):
* print.c (Fterpri):
* print.c (Fprint):
* print.c (print_error_message):
* print.c (print_vector_internal):
* print.c (print_cons):
* print.c (print_string):
* print.c (printing_unreadable_object):
* print.c (print_internal):
* print.c (print_float):
* print.c (print_symbol):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_canonicalize_host_name):
* process-unix.c (unix_canonicalize_host_name):
* process.c (print_process):
* process.c (report_process_error):
* process.c (report_network_error):
* process.c (make_process_internal):
* process.c (Fstart_process_internal):
* process.c (status_message):
* process.c (putenv_internal):
* process.c (vars_of_process):
* process.h:
* profile.c (vars_of_profile):
* rangetab.c (print_range_table):
* realpath.c (vars_of_realpath):
* redisplay.c (vars_of_redisplay):
* search.c (wordify):
* search.c (Freplace_match):
* sheap.c (sheap_adjust_h):
* sound.c (report_sound_error):
* sound.c (Fplay_sound_file):
* specifier.c (print_specifier):
* symbols.c (Fsubr_name):
* symbols.c (do_symval_forwarding):
* symbols.c (set_default_buffer_slot_variable):
* symbols.c (set_default_console_slot_variable):
* symbols.c (store_symval_forwarding):
* symbols.c (default_value):
* symbols.c (defsymbol_massage_name_1):
* symbols.c (defsymbol_massage_name_nodump):
* symbols.c (defsymbol_massage_name):
* symbols.c (defsymbol_massage_multiword_predicate_nodump):
* symbols.c (defsymbol_massage_multiword_predicate):
* symbols.c (defsymbol_nodump):
* symbols.c (defsymbol):
* symbols.c (defkeyword):
* symbols.c (defkeyword_massage_name):
* symbols.c (check_module_subr):
* symbols.c (deferror_1):
* symbols.c (deferror):
* symbols.c (deferror_massage_name):
* symbols.c (deferror_massage_name_and_message):
* symbols.c (defvar_magic):
* symeval.h:
* symeval.h (DEFVAR_SYMVAL_FWD):
* sysdep.c:
* sysdep.c (init_system_name):
* sysdll.c:
* sysdll.c (MAYBE_PREPEND_UNDERSCORE):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (dll_error):
* sysdll.c (dll_open):
* sysdll.c (dll_close):
* sysdll.c (image_for_address):
* sysdll.c (my_find_image):
* sysdll.c (search_linked_libs):
* sysdll.h:
* sysfile.h:
* sysfile.h (DEFAULT_DIRECTORY_FALLBACK):
* syswindows.h:
* tests.c (DFC_CHECK_LENGTH):
* tests.c (DFC_CHECK_CONTENT):
* tests.c (Ftest_hash_tables):
* text.c (vars_of_text):
* text.h:
* tooltalk.c (tt_opnum_string):
* tooltalk.c (tt_message_arg_ival_string):
* tooltalk.c (Ftooltalk_default_procid):
* tooltalk.c (Ftooltalk_default_session):
* tooltalk.c (init_tooltalk):
* tooltalk.c (vars_of_tooltalk):
* ui-gtk.c (Fdll_load):
* ui-gtk.c (type_to_marshaller_type):
* ui-gtk.c (Fgtk_import_function_internal):
* ui-gtk.c (emacs_gtk_object_printer):
* ui-gtk.c (emacs_gtk_boxed_printer):
* unicode.c (unicode_to_ichar):
* unicode.c (unicode_print):
* unicode.c (unicode_query):
* unicode.c (vars_of_unicode):
* unicode.c (complex_vars_of_unicode):
* win32.c:
* win32.c (mswindows_report_process_error):
* window.c (print_window):
* xemacs.def.in.in:
BASIC IDEA: Further fixing up uses of char * and CIbyte *
to reflect their actual semantics; Mule-izing some code;
redoing of the not-yet-working code to handle message translation.
Clean up code to handle message-translation (not yet working).
Create separate versions of build_msg_string() for working with
Ibyte *, CIbyte *, and Ascbyte * arguments. Assert that Ascbyte *
arguments are pure-ASCII. Make build_msg_string() be the same
as build_msg_ascstring(). Create same three versions of GETTEXT()
and DEFER_GETTEXT(). Also create build_defer_string() and
variants for the equivalent of DEFER_GETTEXT() when building a
string. Remove old CGETTEXT(). Clean up code where GETTEXT(),
DEFER_GETTEXT(), build_msg_string(), etc. was being called and
introduce some new calls to build_msg_string(), etc. Remove
GETTEXT() from calls to weird_doc() -- we assume that the
message snarfer knows about weird_doc(). Remove uses of
DEFER_GETTEXT() from error messages in sysdep.c and instead use
special comments /* @@@begin-snarf@@@ */ and /* @@@end-snarf@@@ */
that the message snarfer presumably knows about.
Create build_ascstring() and use it in many instances in place
of build_string(). The purpose of having Ascbyte * variants is
to make the code more self-documenting in terms of what sort of
semantics is expected for char * strings. In fact in the process
of looking for uses of build_string(), much improperly Mule-ized
was discovered.
Mule-ize a lot of code as described in previous paragraph,
e.g. in sysdep.c.
Make the error functions take Ascbyte * strings and fix up a
couple of places where non-pure-ASCII strings were being passed in
(file-coding.c, mule-coding.c, unicode.c). (It's debatable whether
we really need to make the error functions work this way. It
helps catch places where code is written in a way that message
translation won't work, but we may well never implement message
translation.)
Make staticpro() and friends take Ascbyte * strings instead of
raw char * strings. Create a const_Ascbyte_ptr dynarr type
to describe what's held by staticpro_names[] and friends,
create pdump descriptions for const_Ascbyte_ptr dynarrs, and
use them in place of specially-crafted staticpro descriptions.
Mule-ize certain other functions (e.g. x_event_name) by correcting
raw use of char * to Ascbyte *, Rawbyte * or another such type,
and raw use of char[] buffers to another type (usually Ascbyte[]).
Change many uses of write_c_string() to write_msg_string(),
write_ascstring(), etc.
Mule-ize emodules.c, emodules.h, sysdll.h.
Fix some un-Mule-ized code in intl-win32.c.
A comment in event-Xt.c and the limitations of the message
snarfer (make-msgfile or whatever) is presumably incorrect --
it should be smart enough to handle function calls spread over
more than one line. Clean up code in event-Xt.c that was
written awkwardly for this reason.
In config.h.in, instead of NEED_ERROR_CHECK_TYPES_INLINES,
create a more general XEMACS_DEFS_NEEDS_INLINE_DECLS to
indicate when inlined functions need to be declared in
xemacs.defs.in.in, and make use of it in xemacs.defs.in.in.
We need to do this because postgresql.c now calls qxestrdup(),
which is an inline function.
Make nconc2() and other such functions MODULE_API and put
them in xemacs.defs.in.in since postgresql.c now uses them.
Clean up indentation in lread.c and a few other places.
In text.h, document ASSERT_ASCTEXT_ASCII() and
ASSERT_ASCTEXT_ASCII_LEN(), group together the stand-in
encodings and add some more for DLL symbols, function and
variable names, etc.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Tue, 26 Jan 2010 23:22:30 -0600 |
parents | 48eed784e93a |
children | 2aa9cd456ae7 |
rev | line source |
---|---|
868 | 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 ------------------------------------ |