Mercurial > hg > xemacs-beta
view src/lisp-union.h @ 4570:e6a7054a9c30
Add check-coding-systems-region, test it and others, fix some bugs.
tests/ChangeLog addition:
2008-12-28 Aidan Kehoe <kehoea@parhasard.net>
* automated/query-coding-tests.el:
Add tests for #'unencodable-char-position,
#'check-coding-systems-region, #'encode-coding-char. Remove some
debugging statements.
lisp/ChangeLog addition:
2008-12-28 Aidan Kehoe <kehoea@parhasard.net>
* coding.el (query-coding-region):
(query-coding-string):
Make these defsubsts, they're short enough and they're called
explicitly rarely enough that it make some sense. The alternative
would be compiler macros that avoid the binding of the arguments.
(unencodable-char-position):
Document where the docstring and API are from.
Correct a special case for zero--check-argument-type returns nil
when it succeeds, we can't usefully chain its result in an and
here.
(check-coding-systems-region): New. API taken from GNU; docstring
and implementation are independent.
(encode-coding-char):
Add an optional third argument, as used by recent GNU. Document
the origen of the docstring.
(default-query-coding-region): Add a short docstring to the
non-Mule implementation of this function.
* unicode.el:
Don't set the query-coding-function property for unicode coding
systems if we're on non-mule. Unintern
unicode-query-coding-region, unicode-query-coding-skip-chars-arg
in the same context.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sun, 28 Dec 2008 22:51:14 +0000 |
parents | 78507f684253 |
children | ae48681c47fa |
line wrap: on
line source
/* Fundamental definitions for XEmacs Lisp interpreter -- union objects. Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994 Free Software Foundation, Inc. Copyright (C) 2002, 2005 Ben Wing. 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. */ /* Divergent from FSF. */ /* Definition of Lisp_Object type as a union. The declaration order of the objects within the struct members of the union is dependent on ENDIAN-ness. See lisp-disunion.h for more details. */ typedef union Lisp_Object { /* if non-valbits are at lower addresses */ #ifdef WORDS_BIGENDIAN struct { EMACS_UINT val : VALBITS; enum_field (Lisp_Type) type : GCTYPEBITS; } gu; struct { signed EMACS_INT val : INT_VALBITS; unsigned int bits : INT_GCBITS; } s; struct { EMACS_UINT val : INT_VALBITS; unsigned int bits : INT_GCBITS; } u; #else /* non-valbits are at higher addresses */ struct { enum_field (Lisp_Type) type : GCTYPEBITS; EMACS_UINT val : VALBITS; } gu; struct { unsigned int bits : INT_GCBITS; signed EMACS_INT val : INT_VALBITS; } s; struct { unsigned int bits : INT_GCBITS; EMACS_UINT val : INT_VALBITS; } u; #endif /* non-valbits are at higher addresses */ EMACS_UINT ui; signed EMACS_INT i; /* This was formerly declared `void *v' etc. but that causes GCC to accept any (yes, any) pointer as the argument of a function declared to accept a Lisp_Object. */ struct nosuchstruct *v; } Lisp_Object; #define XCHARVAL(x) ((EMACS_INT)(x).gu.val) #define XPNTRVAL(x) ((x).ui) #define XREALINT(x) ((EMACS_INT)(x).s.val) #define XUINT(x) ((EMACS_UINT)(x).u.val) #define XTYPE(x) ((x).gu.type) #define EQ(x,y) ((x).v == (y).v) DECLARE_INLINE_HEADER ( Lisp_Object make_int_verify (EMACS_INT val) ) { Lisp_Object obj; obj.s.bits = 1; obj.s.val = val; type_checking_assert (XREALINT (obj) == val); return obj; } DECLARE_INLINE_HEADER ( Lisp_Object make_int (EMACS_INT val) ) { Lisp_Object obj; obj.s.bits = 1; obj.s.val = val; return obj; } DECLARE_INLINE_HEADER ( Lisp_Object make_char_1 (Ichar val) ) { Lisp_Object obj; obj.gu.type = Lisp_Type_Char; obj.gu.val = val; return obj; } DECLARE_INLINE_HEADER ( Lisp_Object wrap_pointer_1 (const void *ptr) ) { Lisp_Object obj; obj.ui = (EMACS_UINT) ptr; return obj; } extern MODULE_API Lisp_Object Qnull_pointer, Qzero; #define INTP(x) ((x).s.bits) #define INT_PLUS(x,y) make_int (XINT (x) + XINT (y)) #define INT_MINUS(x,y) make_int (XINT (x) - XINT (y)) #define INT_PLUS1(x) make_int (XINT (x) + 1) #define INT_MINUS1(x) make_int (XINT (x) - 1) /* WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! You can only VOID_TO_LISP something that had previously been LISP_TO_VOID'd. You cannot go the other way, i.e. create a bogus Lisp_Object. If you want to stuff a void * into a Lisp_Object, use make_opaque_ptr(). */ /* Convert between a (void *) and a Lisp_Object, as when the Lisp_Object is passed to a toolkit callback function */ DECLARE_INLINE_HEADER ( Lisp_Object VOID_TO_LISP (const void *arg) ) { Lisp_Object larg; larg.v = (struct nosuchstruct *) arg; return larg; } #define LISP_TO_VOID(larg) ((void *) ((larg).v)) /* Convert a Lisp_Object into something that can't be used as an lvalue. Useful for type-checking. */ #if (__GNUC__ > 1) #define NON_LVALUE(larg) ({ (larg); }) #else /* Well, you can't really do it without using a function call, and there's no real point in that; no-union-type is the rule, and that will catch errors. */ #define NON_LVALUE(larg) (larg) #endif