Mercurial > hg > xemacs-beta
view src/EmacsShell.c @ 5648:3f4a234f4672
Support non-ASCII correctly in character classes, test this.
src/ChangeLog addition:
2012-04-21 Aidan Kehoe <kehoea@parhasard.net>
Support non-ASCII correctly in character classes ([:alnum:] and
friends).
* regex.c:
* regex.c (ISBLANK, ISUNIBYTE): New. Make these and friends
independent of the locale, since we want them to be consistent in
XEmacs.
* regex.c (print_partial_compiled_pattern): Print the flags for
charset_mule; don't print non-ASCII as the character values in
ranges, this breaks with locales.
* regex.c (enum):
Define various flags the charset_mule and charset_mule_not opcodes
can now take.
* regex.c (CHAR_CLASS_MAX_LENGTH): Update this.
* regex.c (re_iswctype, re_wctype): New, from GNU.
* regex.c (re_wctype_can_match_non_ascii): New; used when deciding
on whether to use charset_mule or the ASCII-only regex character
set opcode.
* regex.c (regex_compile):
Error correctly on long, non-existent character class names.
Break out the handling of charsets that can match non-ASCII into a
separate clause. Use compile_char_class when compiling character
classes.
* regex.c (compile_char_class): New. Used in regex_compile when
compiling character sets that may match non-ASCII.
* regex.c (re_compile_fastmap):
If there are flags set for charset_mule or charset_mule_not, we
can't use the fastmap (since we need to check syntax table values
that aren't available there).
* regex.c (re_match_2_internal):
Check the new flags passed to the charset_mule{,_not} opcode,
observe them if appropriate.
* regex.h:
* regex.h (enum):
Expose re_wctype_t here, imported from GNU.
tests/ChangeLog addition:
2012-04-21 Aidan Kehoe <kehoea@parhasard.net>
* automated/regexp-tests.el:
* automated/regexp-tests.el (Assert-char-class):
Check that #'string-match errors correctly with an over-long
character class name.
Add tests for character class functionality that supports
non-ASCII characters. These tests expose bugs in GNU Emacs
24.0.94.2, but pass under current XEmacs.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 21 Apr 2012 18:58:28 +0100 |
parents | 308d34e9f07d |
children |
line wrap: on
line source
/* Emacs shell widget -- glue. Copyright (C) 1994, 1995 Sun Microsystems, 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>. */ /* Synched up with: Not in FSF. */ /* Written by Ben Wing, May, 1994. */ #include <config.h> #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <X11/StringDefs.h> #include "xintrinsicp.h" #include <X11/Shell.h> #include <X11/ShellP.h> #include "EmacsShell.h" #include "ExternalShell.h" #define ABORT abort #if 0 /* Not currently used */ /* The root_geometry_manager() method in Shell.c is fucked up with regard to the user-specified-position vs. program-specified-position and user-specified-size vs. program-specified-size flag. (It always sets program-specified whenever the program requests a change in its size or position, even when this came from direct user request.) So we provide external entry points to fix this after the program requested a size or position change. If it turns out that the user-specified-position flag needs to be set at the *same* time that the geometry change request is made, then we will have to duplicate the entire root_geometry_manager() method; but I don't think there are any WM's that require this. */ /* junk stolen from IntrinsicI.h */ extern void _XtAllocError( String /* alloc_type */); /* junk ungraciously copied from Shell.c */ static void ComputeWMSizeHints(w, hints) WMShellWidget w; XSizeHints *hints; { long flags; hints->flags = flags = w->wm.size_hints.flags; #define copy(field) hints->field = w->wm.size_hints.field if (flags & (USPosition | PPosition)) { copy(x); copy(y); } if (flags & (USSize | PSize)) { copy(width); copy(height); } if (flags & PMinSize) { copy(min_width); copy(min_height); } if (flags & PMaxSize) { copy(max_width); copy(max_height); } if (flags & PResizeInc) { copy(width_inc); copy(height_inc); } if (flags & PAspect) { copy(min_aspect.x); copy(min_aspect.y); copy(max_aspect.x); copy(max_aspect.y); } #undef copy #define copy(field) hints->field = w->wm.field if (flags & PBaseSize) { copy(base_width); copy(base_height); } if (flags & PWinGravity) copy(win_gravity); #undef copy } static void _SetWMSizeHints(w) WMShellWidget w; { XSizeHints *size_hints = XAllocSizeHints(); if (size_hints == NULL) _XtAllocError("XAllocSizeHints"); ComputeWMSizeHints(w, size_hints); XSetWMNormalHints(XtDisplay((Widget)w), XtWindow((Widget)w), size_hints); XFree((char*)size_hints); } /* end of junk ungraciously copied from Shell.c */ #endif /* 0 */ #if 0 /* Not currently used */ void EmacsShellSetSizeUserSpecified (Widget gw) { WMShellWidget w = (WMShellWidget) gw; w->wm.size_hints.flags |= USSize; w->wm.size_hints.flags &= ~PSize; if (!w->shell.override_redirect && XtIsRealized (gw)) _SetWMSizeHints (w); } void EmacsShellSetPositionUserSpecified (Widget gw) { WMShellWidget w = (WMShellWidget) gw; w->wm.size_hints.flags |= USPosition; w->wm.size_hints.flags &= ~PPosition; if (!w->shell.override_redirect && XtIsRealized (gw)) _SetWMSizeHints (w); } #endif /* 0 */ void EmacsShellSmashIconicHint (Widget shell, int iconic_p) { /* See comment in frame-x.c about this */ WMShellWidget wmshell = (WMShellWidget) shell; assert (XtIsSubclass (shell, wmShellWidgetClass)); /* old_state = (wmshell->wm.wm_hints.flags & StateHint ? wmshell->wm.wm_hints.initial_state : NormalState); */ wmshell->wm.wm_hints.flags |= StateHint; wmshell->wm.wm_hints.initial_state = iconic_p ? IconicState : NormalState; } void EmacsShellUpdateSizeHints (Widget gw) { if (XtIsSubclass (gw, topLevelEmacsShellWidgetClass)) TopLevelEmacsShellUpdateSizeHints (gw); #ifdef EXTERNAL_WIDGET else if (XtIsSubclass (gw, externalShellWidgetClass)) /* do what ??? Don't abort! */; #endif else if (XtIsSubclass (gw, transientEmacsShellWidgetClass)) TransientEmacsShellUpdateSizeHints (gw); else ABORT (); }