Mercurial > hg > xemacs-beta
annotate src/opaque.c @ 793:e38acbeb1cae
[xemacs-hg @ 2002-03-29 04:46:17 by ben]
lots o' fixes
etc/ChangeLog: New file.
Separated out all entries for etc/ into their own ChangeLog.
Includes entries for the following files:
etc/BABYL, etc/BETA, etc/CHARSETS, etc/DISTRIB, etc/Emacs.ad,
etc/FTP, etc/GNUS-NEWS, etc/GOATS, etc/HELLO, etc/INSTALL,
etc/MACHINES, etc/MAILINGLISTS, etc/MSDOS, etc/MYTHOLOGY, etc/NEWS,
etc/OXYMORONS, etc/PACKAGES, etc/README, etc/TUTORIAL,
etc/TUTORIAL.de, etc/TUTORIAL.ja, etc/TUTORIAL.ko, etc/TUTORIAL.se,
etc/aliases.ksh, etc/altrasoft-logo.xpm, etc/check_cygwin_setup.sh,
etc/custom/example-themes/europe-theme.el,
etc/custom/example-themes/ex-custom-file,
etc/custom/example-themes/example-theme.el, etc/e/eterm.ti,
etc/edt-user.doc, etc/enriched.doc, etc/etags.1, etc/gnuserv.1,
etc/gnuserv.README, etc/package-index.LATEST.gpg,
etc/package-index.LATEST.pgp, etc/photos/jan.png, etc/recycle.xpm,
etc/refcard.tex, etc/sample.Xdefaults, etc/sample.emacs,
etc/sgml/CATALOG, etc/sgml/HTML32.dtd, etc/skk/SKK.tut.E,
etc/smilies/Face_ase.xbm, etc/smilies/Face_ase2.xbm,
etc/smilies/Face_ase3.xbm, etc/smilies/Face_smile.xbm,
etc/smilies/Face_weep.xbm, etc/sounds, etc/toolbar,
etc/toolbar/workshop-cap-up.xpm, etc/xemacs-ja.1, etc/xemacs.1,
etc/yow.lines, etc\BETA, etc\NEWS, etc\README, etc\TUTORIAL,
etc\TUTORIAL.de, etc\check_cygwin_setup.sh, etc\sample.init.el,
etc\unicode\README, etc\unicode\mule-ucs\*, etc\unicode\other\*
unicode/unicode-consortium/8859-16.TXT: New file.
mule/english.el: Define this charset now, since a bug was fixed that formerly
prevented it.
mule/ethio-util.el: Fix compile errors involving Unicode `characters', which should be
integers.
Makefile.in.in: Always include gui.c, to fix compile error when TTY-only.
EmacsFrame.c, abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, bytecode.h, callint.c, callproc.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.c, console-msw.h, console-tty.c, console-x.c, console-x.h, console.c, console.h, data.c, database.c, device-gtk.c, device-msw.c, device-x.c, device.c, device.h, dialog-msw.c, doc.c, doprnt.c, dumper.c, dynarr.c, editfns.c, eldap.c, eldap.h, elhash.c, elhash.h, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, events.h, extents.c, extents.h, faces.c, faces.h, file-coding.c, file-coding.h, fileio.c, filelock.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, free-hook.c, general-slots.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gpmevent.c, gtk-xemacs.c, gui-msw.c, gui-x.c, gui-x.h, gui.c, gui.h, gutter.c, gutter.h, indent.c, input-method-xlib.c, insdel.c, keymap.c, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-canna.c, mule-ccl.c, mule-charset.c, mule-wnnfns.c, native-gtk-toolbar.c, objects-msw.c, objects-tty.c, objects-x.c, objects.c, objects.h, opaque.c, opaque.h, postgresql.c, postgresql.h, print.c, process-unix.c, process.c, process.h, rangetab.c, rangetab.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, search.c, select-gtk.c, select-x.c, sound.c, specifier.c, specifier.h, strftime.c, symbols.c, symeval.h, syntax.h, text.c, text.h, toolbar-common.c, toolbar-msw.c, toolbar.c, toolbar.h, tooltalk.c, tooltalk.h, ui-gtk.c, ui-gtk.h, undo.c, vm-limit.c, window.c, window.h: Eliminate XSETFOO. Replace all usages with wrap_foo().
Make symbol->name a Lisp_Object, not Lisp_String *. Eliminate
nearly all uses of Lisp_String * in favor of Lisp_Object, and
correct macros so most of them favor Lisp_Object.
Create new error-behavior ERROR_ME_DEBUG_WARN -- output warnings,
but at level `debug' (usually ignored). Use it when instantiating
specifiers, so problems can be debugged. Move
log-warning-minimum-level into C so that we can optimize
ERROR_ME_DEBUG_WARN.
Fix warning levels consistent with new definitions.
Add default_ and parent fields to char table; not yet implemented.
New fun Dynarr_verify(); use for further error checking on Dynarrs.
Rearrange code at top of lisp.h in conjunction with dynarr changes.
Fix eifree(). Use Eistrings in various places
(format_event_object(), where_is_to_char(), and callers thereof)
to avoid fixed-size strings buffers. New fun write_eistring().
Reindent and fix GPM code to follow standards.
Set default MS Windows font to Lucida Console (same size as
Courier New but less interline spacing, so more lines fit).
Increase default frame size on Windows to 50 lines. (If that's too
big for the workspace, the frame will be shrunk as necessary.)
Fix problem with text files with no newlines (). (Change
`convert-eol' coding system to use `nil' for autodetect,
consistent with make-coding-system.)
Correct compile warnings in vm-limit.c.
Fix handling of reverse-direction charsets to avoid errors when
opening (e.g.) mule-ucs/lisp/reldata/uiso8859-6.el.
Recode some object printing methods to use write_fmt_string()
instead of a fixed buffer and sprintf.
Turn on display of png comments as warnings (level `info'), now
that they're unobtrusive.
Revamped the sound documentation.
Fixed bug in redisplay w.r.t. hscroll/truncation/continuation
glyphs causing jumping up and down of the lines, since they're
bigger than the line size. (It was seen most obviously when
there's a horizontal scroll bar, e.g. do C-h a glyph or something
like that.) The problem was that the glyph-contrib-p setting on
glyphs was ignored even if it was set properly, which it wasn't
until now.
author | ben |
---|---|
date | Fri, 29 Mar 2002 04:49:13 +0000 |
parents | fdefd0186b75 |
children | a5954632b187 |
rev | line source |
---|---|
428 | 1 /* Opaque Lisp objects. |
2 Copyright (C) 1993, 1994, 1995 Sun Microsystems, Inc. | |
3 Copyright (C) 1995, 1996 Ben Wing. | |
4 | |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
24 /* Written by Ben Wing, October 1993. */ | |
25 | |
26 /* "Opaque" is used internally to hold keep track of allocated memory | |
27 so it gets GC'd properly, and to store arbitrary data in places | |
28 where a Lisp_Object is required and which may get GC'd. (e.g. as | |
29 the argument to record_unwind_protect()). Once created in C, | |
30 opaque objects cannot be resized. | |
31 | |
32 OPAQUE OBJECTS SHOULD NEVER ESCAPE TO THE LISP LEVEL. Some code | |
33 depends on this. As such, opaque objects are a generalization | |
34 of the Qunbound marker. | |
35 */ | |
36 | |
37 #include <config.h> | |
38 #include "lisp.h" | |
39 #include "opaque.h" | |
40 | |
41 Lisp_Object Vopaque_ptr_free_list; | |
42 | |
43 /* Should never, ever be called. (except by an external debugger) */ | |
44 static void | |
45 print_opaque (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | |
46 { | |
442 | 47 const Lisp_Opaque *p = XOPAQUE (obj); |
428 | 48 char buf[200]; |
49 | |
50 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque, size=%lu) 0x%lx>", | |
51 (long)(p->size), (unsigned long) p); | |
52 write_c_string (buf, printcharfun); | |
53 } | |
54 | |
665 | 55 inline static Bytecount |
56 aligned_sizeof_opaque (Bytecount opaque_size) | |
456 | 57 { |
58 return ALIGN_SIZE (offsetof (Lisp_Opaque, data) + opaque_size, | |
59 ALIGNOF (max_align_t)); | |
60 } | |
61 | |
665 | 62 static Bytecount |
442 | 63 sizeof_opaque (const void *header) |
428 | 64 { |
456 | 65 return aligned_sizeof_opaque (((const Lisp_Opaque *) header)->size); |
428 | 66 } |
67 | |
68 /* Return an opaque object of size SIZE. | |
69 If DATA is OPAQUE_CLEAR, the object's data is memset to '\0' bytes. | |
70 If DATA is OPAQUE_UNINIT, the object's data is uninitialized. | |
71 Else the object's data is initialized by copying from DATA. */ | |
72 Lisp_Object | |
665 | 73 make_opaque (const void *data, Bytecount size) |
428 | 74 { |
75 Lisp_Opaque *p = (Lisp_Opaque *) | |
456 | 76 alloc_lcrecord (aligned_sizeof_opaque (size), &lrecord_opaque); |
428 | 77 p->size = size; |
78 | |
79 if (data == OPAQUE_CLEAR) | |
80 memset (p->data, '\0', size); | |
81 else if (data == OPAQUE_UNINIT) | |
82 DO_NOTHING; | |
83 else | |
84 memcpy (p->data, data, size); | |
85 | |
86 { | |
793 | 87 return wrap_opaque (p); |
428 | 88 } |
89 } | |
90 | |
91 /* This will not work correctly for opaques with subobjects! */ | |
92 | |
93 static int | |
94 equal_opaque (Lisp_Object obj1, Lisp_Object obj2, int depth) | |
95 { | |
665 | 96 Bytecount size; |
428 | 97 return ((size = XOPAQUE_SIZE (obj1)) == XOPAQUE_SIZE (obj2) && |
98 !memcmp (XOPAQUE_DATA (obj1), XOPAQUE_DATA (obj2), size)); | |
99 } | |
100 | |
101 /* This will not work correctly for opaques with subobjects! */ | |
102 | |
103 static unsigned long | |
104 hash_opaque (Lisp_Object obj, int depth) | |
105 { | |
106 if (XOPAQUE_SIZE (obj) == sizeof (unsigned long)) | |
107 return *((unsigned long *) XOPAQUE_DATA (obj)); | |
108 else | |
109 return memory_hash (XOPAQUE_DATA (obj), XOPAQUE_SIZE (obj)); | |
110 } | |
111 | |
112 static const struct lrecord_description opaque_description[] = { | |
113 { XD_END } | |
114 }; | |
115 | |
116 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("opaque", opaque, | |
117 0, print_opaque, 0, | |
118 equal_opaque, hash_opaque, | |
119 opaque_description, | |
120 sizeof_opaque, Lisp_Opaque); | |
121 | |
122 /* stuff to handle opaque pointers */ | |
123 | |
124 /* Should never, ever be called. (except by an external debugger) */ | |
125 static void | |
126 print_opaque_ptr (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | |
127 { | |
442 | 128 const Lisp_Opaque_Ptr *p = XOPAQUE_PTR (obj); |
428 | 129 char buf[200]; |
130 | |
442 | 131 sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (opaque-ptr, adr=0x%lx) 0x%lx>", |
428 | 132 (long)(p->ptr), (unsigned long) p); |
133 write_c_string (buf, printcharfun); | |
134 } | |
135 | |
136 static int | |
137 equal_opaque_ptr (Lisp_Object obj1, Lisp_Object obj2, int depth) | |
138 { | |
139 return (XOPAQUE_PTR (obj1)->ptr == XOPAQUE_PTR (obj2)->ptr); | |
140 } | |
141 | |
142 static unsigned long | |
143 hash_opaque_ptr (Lisp_Object obj, int depth) | |
144 { | |
145 return (unsigned long) XOPAQUE_PTR (obj)->ptr; | |
146 } | |
147 | |
442 | 148 DEFINE_LRECORD_IMPLEMENTATION ("opaque-ptr", opaque_ptr, |
428 | 149 0, print_opaque_ptr, 0, |
150 equal_opaque_ptr, hash_opaque_ptr, 0, | |
151 Lisp_Opaque_Ptr); | |
152 | |
153 Lisp_Object | |
154 make_opaque_ptr (void *val) | |
155 { | |
156 Lisp_Object res = allocate_managed_lcrecord(Vopaque_ptr_free_list); | |
157 set_opaque_ptr (res, val); | |
158 return res; | |
159 } | |
160 | |
161 /* Be very very careful with this. Same admonitions as with | |
162 free_cons() apply. */ | |
163 | |
164 void | |
165 free_opaque_ptr (Lisp_Object ptr) | |
166 { | |
167 free_managed_lcrecord (Vopaque_ptr_free_list, ptr); | |
168 } | |
169 | |
170 void | |
171 reinit_opaque_once_early (void) | |
172 { | |
647 | 173 Vopaque_ptr_free_list = make_lcrecord_list (sizeof (Lisp_Opaque_Ptr), |
174 &lrecord_opaque_ptr); | |
428 | 175 staticpro_nodump (&Vopaque_ptr_free_list); |
176 } | |
177 | |
178 void | |
179 init_opaque_once_early (void) | |
180 { | |
442 | 181 INIT_LRECORD_IMPLEMENTATION (opaque); |
182 INIT_LRECORD_IMPLEMENTATION (opaque_ptr); | |
183 | |
428 | 184 reinit_opaque_once_early (); |
185 } |