Mercurial > hg > xemacs-beta
view src/macros.c @ 4932:8b63e21b0436
fix compile issues with gcc 4
-------------------- ChangeLog entries follow: --------------------
ChangeLog addition:
2010-01-24 Ben Wing <ben@xemacs.org>
* aclocal.m4 (XE_SHLIB_STUFF):
Use -export-all-symbols instead of -export-dynamic on PE targets
(Cygwin and MinGW).
* configure.ac (XE_EXPAND_VARIABLE):
* configure.ac (TAB):
Create variable XEMACS_CC_GPP to check whether we're running g++.
Don't just check for an executable called `g++' -- it might be
called g++-4 or whatever. Instead, check for either named `g++*'
or claiming to be g++ when called with --version. Rewrite code do
use the variable.
Add -fno-strict-aliasing to optimization flags when GCC and
optimized, and in all cases with g++, since under these circumstances
strict aliasing is otherwise assumed, and XEmacs can't easily be
made to respect its restrictions.
* configure: Regenerate.
lib-src/ChangeLog addition:
2010-01-24 Ben Wing <ben@xemacs.org>
* fakemail.c (args_size):
* fakemail.c (parse_header):
* ootags.c (C_entries):
Fix warnings about possible use of uninitialized vars.
lwlib/ChangeLog addition:
2010-01-24 Ben Wing <ben@xemacs.org>
* xlwgauge.c (GaugeResize):
* xlwgauge.c (GaugeSize):
Fix warnings about possible use of uninitialized vars.
modules/ChangeLog addition:
2010-01-24 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (print_pgconn):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_exec):
* postgresql/postgresql.c (Fpq_get_result):
Fix g++ 4.3 complaints about implicit conversions of string
literals (const char *) to char *.
src/ChangeLog addition:
2010-01-24 Ben Wing <ben@xemacs.org>
* chartab.c (decode_char_table_range):
* extents.c (extent_fragment_update):
* objects-msw.c (initialize_font_instance):
* process.c (Fgetenv):
* redisplay-output.c (get_next_display_block):
Fix warnings about possible use of uninitialized vars.
* compiler.h:
* compiler.h (REGISTER):
* event-stream.c (is_scrollbar_event):
* window.c (window_scrollbar_width):
* window.c (window_scrollbar_height):
* window.c (window_left_window_gutter_width):
* window.c (window_right_window_gutter_width):
Add USED_IF_SCROLLBARS. Use it to fix warnings about unused
vars when --with-scrollbars=no.
* config.h.in:
Change comment to explain better why DECLARE_INLINE_HEADER
is needed.
* dialog-msw.c:
* emacs.c (SHEBANG_EXE_PROGNAME_LENGTH):
* emacs.c (main_1):
* event-msw.c (struct mswin_message_debug):
* event-msw.c (debug_output_mswin_message):
* font-mgr.c:
* font-mgr.c (Ffc_config_filename):
* glyphs-msw.c (struct):
* glyphs-msw.c (bitmap_table):
* glyphs-x.c (update_widget_face):
* intl-win32.c (struct lang_to_string):
* intl-win32.c (lang_to_string_table):
* nas.c:
* objects-xlike-inc.c:
* objects-xlike-inc.c (xft_find_charset_font):
* syswindows.h:
* win32.c (mswindows_output_last_error):
Fix g++ 4.3 complaints about implicit conversions of string
literals (const char *) to char *.
* lisp.h:
G++ 4.3 needs #include <limits> to avoid errors about min/max.
* lisp.h (disabled_assert_with_message):
Use disabled_assert* whenever asserts are disabled. Rewrite
disabled_assert* to avoid complaints about unused vars by
pretending to use the vars but casting them to (void).
Remove code that defined assert() weirdly if DEBUG_XEMACS but
not USE_ASSERTIONS -- configure sets USE_ASSERTIONS automatically
when DEBUG_XEMACS, and if the user has forced it off, then
so be it.
* lisp.h (SYMBOL_KEYWORD):
Put some of the combined `extern Lisp_Object's back under
the file they are declared in. Cosmetic fix.
* number.h:
Remove `extern Lisp_Object' decls that duplicate lisp.h,
since they have different C vs. C++ linkage.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sun, 24 Jan 2010 22:04:58 -0600 |
parents | 8f1ee2d15784 |
children | 6f2158fa75ed |
line wrap: on
line source
/* Keyboard macros. Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc. This file is part of XEmacs. XEmacs 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. XEmacs 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. */ /* Synched up with: FSF 19.30. */ /* A keyboard macro is a string of ASCII characters, or a vector of event objects. Only key-press, mouse-press, mouse-release, and menu-selection events ever get into a keyboard macro. When interactively defining a keyboard macro, it will always be a vector of events; strings may be executed for backwards compatibility. */ #include <config.h> #include "lisp.h" #include "buffer.h" #include "commands.h" #include "console-impl.h" #include "device.h" #include "events.h" #include "frame.h" #include "keymap.h" #include "macros.h" #include "window.h" Lisp_Object Qexecute_kbd_macro; /* The current macro and our position in it. When executing nested kbd macros, previous values for these are wound through the execution stack with unwind-protect. */ Lisp_Object Vexecuting_macro; int executing_macro_index; DEFUN ("start-kbd-macro", Fstart_kbd_macro, 1, 1, "P", /* Record subsequent keyboard and menu input, defining a keyboard macro. The commands are recorded even as they are executed. Use \\[end-kbd-macro] to finish recording and make the macro available. Use \\[name-last-kbd-macro] to give it a permanent name. Non-nil arg (prefix arg) means append to last macro defined; This begins by re-executing that macro as if you typed it again. */ (append)) { /* This function can GC */ struct console *con = XCONSOLE (Vselected_console); if (!NILP (con->defining_kbd_macro)) invalid_operation ("Already defining kbd macro", Qunbound); if (NILP (con->kbd_macro_builder)) con->kbd_macro_builder = make_vector (30, Qnil); zmacs_region_stays = 1; /* set this before calling Fexecute_kbd_macro() so that functions there can override */ MARK_MODELINE_CHANGED; if (NILP (append)) { con->kbd_macro_ptr = 0; con->kbd_macro_end = 0; message ("Defining kbd macro..."); } else { message ("Appending to kbd macro..."); con->kbd_macro_ptr = con->kbd_macro_end; Fexecute_kbd_macro (con->last_kbd_macro, make_int (1)); } con->defining_kbd_macro = Qt; return Qnil; } DEFUN ("end-kbd-macro", Fend_kbd_macro, 0, 1, "P", /* Finish defining a keyboard macro. The definition was started by \\[start-kbd-macro]. The macro is now available for use via \\[call-last-kbd-macro], or it can be given a name with \\[name-last-kbd-macro] and then invoked under that name. With numeric arg, repeat macro now that many times, counting the definition just completed as the first repetition. An argument of zero means repeat until error. */ (arg)) { /* This function can GC */ struct console *con = XCONSOLE (Vselected_console); int repeat; if (NILP (con->defining_kbd_macro)) invalid_operation ("Not defining kbd macro", Qunbound); if (NILP (arg)) repeat = -1; else repeat = XINT (Fprefix_numeric_value (arg)); if (!NILP (con->defining_kbd_macro)) { int i; int size = con->kbd_macro_end; if (size < 0) size = 0; con->last_kbd_macro = make_vector (size, Qnil); for (i = 0; i < size; i++) XVECTOR_DATA (con->last_kbd_macro) [i] = XVECTOR_DATA (con->kbd_macro_builder) [i]; con->defining_kbd_macro = Qnil; MARK_MODELINE_CHANGED; message ("Keyboard macro defined"); } zmacs_region_stays = 1; /* set this before calling Fexecute_kbd_macro() so that functions there can override */ if (repeat < 0) return Qnil; else if (repeat == 0) return Fexecute_kbd_macro (con->last_kbd_macro, Qzero); else return Fexecute_kbd_macro (con->last_kbd_macro, make_int (repeat - 1)); } /* #### Read the comment in modeline.el to see why this ugliness is needed. #### Try to avoid it, somehow! */ DEFUN ("zap-last-kbd-macro-event", Fzap_last_kbd_macro_event, 0, 0, 0, /* Don't look at this lest you vomit or spontaneously combust. */ ()) { struct console *con = XCONSOLE (Vselected_console); if (con->kbd_macro_end) --con->kbd_macro_end; return Qnil; } /* Store event into kbd macro being defined */ void store_kbd_macro_event (Lisp_Object event) { struct console *con = event_console_or_selected (event); if (con->kbd_macro_ptr == XVECTOR_LENGTH (con->kbd_macro_builder)) { int i; int old_size = XVECTOR_LENGTH (con->kbd_macro_builder); int new_size = old_size * 2; Lisp_Object new_ = make_vector (new_size, Qnil); for (i = 0; i < old_size; i++) XVECTOR_DATA (new_) [i] = XVECTOR_DATA (con->kbd_macro_builder) [i]; con->kbd_macro_builder = new_; } XVECTOR_DATA (con->kbd_macro_builder) [con->kbd_macro_ptr++] = Fcopy_event (event, Qnil); } /* Extract the next kbd-macro element into the given event. If we're done, throws to the catch in Fexecute_kbd_macro(). */ void pop_kbd_macro_event (Lisp_Object event) { if (NILP (Vexecuting_macro)) ABORT (); if (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)) { if (executing_macro_index < XINT (Flength (Vexecuting_macro))) { nth_of_key_sequence_as_event (Vexecuting_macro, executing_macro_index++, event); return; } } else if (!EQ (Vexecuting_macro, Qt)) /* Some things replace the macro with Qt to force an early exit. */ signal_error (Qinvalid_state, "junk in executing-macro", Qunbound); throw_or_bomb_out (Qexecute_kbd_macro, Qt, 0, Qnil, Qnil); } /* Declare that all chars stored so far in the kbd macro being defined really belong to it. This is done in between editor commands. */ void finalize_kbd_macro_chars (struct console *con) { con->kbd_macro_end = con->kbd_macro_ptr; } DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events, 0, 0, 0, /* Cancel the events added to a keyboard macro for this command. */ ()) { struct console *con = XCONSOLE (Vselected_console); con->kbd_macro_ptr = con->kbd_macro_end; return Qnil; } DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, 0, 1, "p", /* Call the last keyboard macro that you defined with \\[start-kbd-macro]. A prefix argument serves as a repeat count. Zero means repeat until error. To make a macro permanent so you can call it even after defining others, use \\[name-last-kbd-macro]. */ (prefix)) { /* This function can GC */ struct console *con = XCONSOLE (Vselected_console); if (!NILP (con->defining_kbd_macro)) invalid_operation ("Can't execute anonymous macro while defining one", Qunbound); else if (NILP (con->last_kbd_macro)) invalid_operation ("No kbd macro has been defined", Qunbound); else Fexecute_kbd_macro (con->last_kbd_macro, prefix); return Qnil; } DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, 1, 2, 0, /* Execute MACRO as string of editor command characters. If MACRO is a symbol, its function definition is used. COUNT is a repeat count, or nil for once, or 0 for infinite loop. */ (macro, count)) { /* This function can GC */ Lisp_Object final; int speccount = specpdl_depth (); int repeat = 1; struct gcpro gcpro1; struct console *con = XCONSOLE (Vselected_console); if (!NILP (count)) { count = Fprefix_numeric_value (count); repeat = XINT (count); } final = indirect_function (macro, 1); if (!STRINGP (final) && !VECTORP (final)) invalid_argument ("Keyboard macros must be strings or vectors", Qunbound); internal_bind_lisp_object (&Vexecuting_macro, Vexecuting_macro); internal_bind_int (&executing_macro_index, executing_macro_index); GCPRO1 (final); do { Vexecuting_macro = final; executing_macro_index = 0; con->prefix_arg = Qnil; internal_catch (Qexecute_kbd_macro, call_command_loop, Qnil, 0, 0, 0); } while (--repeat != 0 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro))); UNGCPRO; return unbind_to (speccount); } void syms_of_macros (void) { DEFSUBR (Fstart_kbd_macro); DEFSUBR (Fend_kbd_macro); DEFSUBR (Fzap_last_kbd_macro_event); DEFSUBR (Fcall_last_kbd_macro); DEFSUBR (Fexecute_kbd_macro); DEFSUBR (Fcancel_kbd_macro_events); DEFSYMBOL (Qexecute_kbd_macro); } void vars_of_macros (void) { DEFVAR_LISP ("executing-macro", &Vexecuting_macro /* Currently executing keyboard macro (a vector of events or string); nil if none executing. */ ); DEFVAR_LISP ("executing-kbd-macro", &Vexecuting_macro /* Currently executing keyboard macro (a vector of events or string); nil if none executing. */ ); } void init_macros (void) { Vexecuting_macro = Qnil; }