Mercurial > hg > xemacs-beta
annotate src/lisp.h @ 5041:efaa6cd845e5
add regexp-debugging
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-15 Ben Wing <ben@xemacs.org>
* regex.c:
* regex.c (DEBUG_FAIL_PRINT1):
* regex.c (PUSH_FAILURE_POINT):
* regex.c (POP_FAILURE_POINT):
* regex.c (regex_compile):
* regex.c (re_match_2_internal):
* regex.h:
* search.c:
* search.c (search_buffer):
* search.c (debug_regexps_changed):
* search.c (vars_of_search):
Add an internal variable debug_regexps and a corresponding Lisp
variable `debug-regexps' that takes a list of areas in which to
display debugging info about regex compilation and matching
(currently three areas exist). Use existing debugging code
already in regex.c and modify it so that it recognizes the
debug_regexps variable and the flags in it.
Rename variable `debug-xemacs-searches' to just `debug-searches',
consistent with other debug vars.
tests/ChangeLog addition:
2010-02-15 Ben Wing <ben@xemacs.org>
* automated/search-tests.el (let):
* automated/search-tests.el (boundp):
debug-xemacs-searches renamed to debug-searches.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Mon, 15 Feb 2010 21:51:22 -0600 |
| parents | 838630c0734f |
| children | 9410323e4b0d 6f2158fa75ed b5df3737028a |
| rev | line source |
|---|---|
| 428 | 1 /* Fundamental definitions for XEmacs Lisp interpreter. |
| 2 Copyright (C) 1985-1987, 1992-1995 Free Software Foundation, Inc. | |
| 3 Copyright (C) 1993-1996 Richard Mlynarik. | |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
4 Copyright (C) 1995, 1996, 2000-2005, 2009, 2010 Ben Wing. |
| 428 | 5 |
| 6 This file is part of XEmacs. | |
| 7 | |
| 8 XEmacs is free software; you can redistribute it and/or modify it | |
| 9 under the terms of the GNU General Public License as published by the | |
| 10 Free Software Foundation; either version 2, or (at your option) any | |
| 11 later version. | |
| 12 | |
| 13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 16 for more details. | |
| 17 | |
| 18 You should have received a copy of the GNU General Public License | |
| 19 along with XEmacs; see the file COPYING. If not, write to | |
| 20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 21 Boston, MA 02111-1307, USA. */ | |
| 22 | |
| 23 /* Synched up with: FSF 19.30. */ | |
| 24 | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
25 #ifndef INCLUDED_lisp_h_ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
26 #define INCLUDED_lisp_h_ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
27 |
| 853 | 28 /* Authorship: |
| 29 | |
| 30 Based on code from pre-release FSF 19, c. 1991. | |
| 31 Various changes by Jamie Zawinski 1991-1994: | |
| 32 converting to ANSI C, splitting out function prototypes to a separate | |
| 33 file (later moved back for unknown reasons by Steve Baur?), debug-gcpro | |
| 34 stuff (now moribund). | |
| 35 ANSI-fication of DEFUN macros by Felix Lee, c. 1992? | |
| 36 NOT_REACHED, DOESNT_RETURN, PRINTF_ARGS by Richard Mlynarik, c. 1994. | |
| 37 Many changes over the years corresponding to Lisp_Object definition | |
| 38 changes, esp. by Richard Mlynarik (c. 1993) and Kyle Jones (c. 1998). | |
| 39 See alloc.c for more details. | |
| 40 Overhauled and reordered by Ben Wing, 1995-1996, and many things added: | |
| 41 Dynarrs, REALLOC macros, asserts, typedefs, inline header code, | |
| 42 first LIST_LOOP macros, CONCHECK_*, all error-checking code | |
| 43 (e.g. error-checking versions of XFOO macros), structure read syntax, | |
| 44 weak lists, lcrecord lists, reworking of quit handling, object hashing, | |
| 45 nested GCPRO, character objects and Ebola checking, memory usage stats, | |
| 46 others. | |
| 47 LOADHIST changes from Steve Baur, c. 1997? | |
| 48 Various macro-related changes by Martin Buchholz, 1998-1999: | |
| 49 LIST_LOOP macros greatly expanded and tortoise-hared; | |
| 50 RETURN_SANS_WARNINGS; reworked DEFUN macros; EXFUN macros (???). | |
| 1743 | 51 Various macro-related changes by Jerry James, 2003: |
| 52 MODULE_API introduced; | |
| 53 Compiler-specific definitions modernized and moved to compiler.h. | |
| 853 | 54 */ |
| 55 | |
| 2367 | 56 /* Conventions in comments: |
| 57 | |
| 58 "Mule-izing" is the process of going through a file and eliminating | |
| 59 assumptions that the internal format (Ibyte * text) is the same as the | |
| 60 external format used by library routines. Mule-ization should also | |
| 61 include replacing *ALL* raw references to `char' or `unsigned char' with | |
| 62 one of the self-documenting types created below. How exactly to do the | |
| 63 conversion, and how to write correctly Mule-ized code, is described in | |
| 64 the internals manual. Files that say "This file is Mule-ized" have | |
| 65 been reviewed at some point; that's not to say that incorrect code hasn't | |
| 66 crept in, though. | |
| 67 | |
| 68 "Unicode-splitting" is the process of fixing a file so that it will | |
| 69 handle external text in Unicode under Microsoft Windows, as appropriate. | |
| 70 ("splitting" because it needs to handle either Unicode or variable-width | |
| 71 multibyte depending on the OS -- NT or 9x). See intl-win32.c. | |
| 72 | |
| 73 #### is a way of marking problems of any sort. | |
| 74 | |
| 75 !!#### marks places that are not properly Mule-ized. | |
| 76 | |
| 77 &&#### marks places that need to be fixed in order for the "8-bit mule" | |
| 78 conversion to work correctly, i.e. in order to support multiple different | |
| 79 buffer formats under Mule, including a fixed 8-bit format. | |
| 80 | |
| 81 ^^#### marks places that need to be fixed in order to eliminate the | |
| 82 assumption that Ibyte * text is composed of 1-byte units (e.g. UTF-16 | |
| 83 is composed of 2-byte units and might be a possible format to consider | |
| 84 for Ibyte * text). | |
| 85 | |
| 86 %%#### marks places that need work for KKCC (the new garbage collector). | |
| 87 | |
| 88 */ | |
| 89 | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
90 /************************************************************************/ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
91 /* include files */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
92 /************************************************************************/ |
| 442 | 93 |
| 428 | 94 /* We include the following generally useful header files so that you |
| 95 don't have to worry about prototypes when using the standard C | |
| 96 library functions and macros. These files shouldn't be excessively | |
| 97 large so they shouldn't cause that much of a slowdown. */ | |
| 98 | |
| 99 #include <stdlib.h> | |
|
5016
2ade80e8c640
enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents:
5015
diff
changeset
|
100 /* Evil, but ... -Wshadow is genuinely useful but also leads to spurious |
|
2ade80e8c640
enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents:
5015
diff
changeset
|
101 warnings when you have a local var named `index'. Avoid this by |
|
2ade80e8c640
enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents:
5015
diff
changeset
|
102 hacking around it. */ |
|
2ade80e8c640
enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents:
5015
diff
changeset
|
103 #define index old_index |
| 428 | 104 #include <string.h> /* primarily for memcpy, etc. */ |
|
5016
2ade80e8c640
enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents:
5015
diff
changeset
|
105 #undef index |
| 428 | 106 #include <stdio.h> /* NULL, etc. */ |
| 107 #include <ctype.h> | |
| 108 #include <stdarg.h> | |
| 109 #include <stddef.h> /* offsetof */ | |
| 110 #include <sys/types.h> | |
| 442 | 111 #include <limits.h> |
| 4932 | 112 #ifdef __cplusplus |
| 113 #include <limits> /* necessary for max()/min() under G++ 4 */ | |
| 114 #endif | |
| 115 | |
| 442 | 116 |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
117 /************************************************************************/ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
118 /* error checking */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
119 /************************************************************************/ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
120 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
121 /* ------------------------- large categories ------------------------- */ |
| 853 | 122 |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
123 /* How these work: |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
124 |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
125 The most common classes will be `text' and `type', followed by `structure'. |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
126 `text' is for problems related to bad textual format. `type' is for |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
127 problems related to wrongly typed arguments, structure fields, etc. |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
128 `structure' is for bad data inside of a structure. Sometimes these are |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
129 used "incorrectly", e.g. `type' is often used for structure-checking. |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
130 Consider `text': |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
131 |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
132 `text_checking_assert() will assert() only when ERROR_CHECK_TEXT is defined; |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
133 otherwise it's a no-op. text_checking_assert_at_line() is similar, but |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
134 allows you to override the file name and line number normally supplied in |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
135 the message. This is especially useful in inline header functions, and |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
136 so there's a special inline_text_checking_assert() for this; this works |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
137 like text_checking_assert() but supplies the file and line of the calling |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
138 function. In order for this to work, you need to declare your inline |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
139 function with INLINE_TEXT_CHECK_ARGS at the end of its argument list, |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
140 and give its function name a _1 extension or similar. Then create a |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
141 macro that calls your inline function and includes INLINE_TEXT_CHECK_CALL |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
142 at the end of the parameter list. This will arrange to pass in and receive |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
143 the file and line (__FILE__, __LINE__) at place where the call occurs in |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
144 the calling function; but nothing will get passed in when ERROR_CHECK_TEXT |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
145 is not defined. |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
146 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
147 Currently the full bevy of *foo_checking_assert* macros are defined only |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
148 for `text' and `types'; for others, only the basic foo_checking_assert() |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
149 macro is defined. Writing out all the variations for all possible error |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
150 categories would produce too much clutter. If any of these become |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
151 needed, they can always be defined. */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
152 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
153 /* #### I suggest revamping these and making proper use of the |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
154 category/subcategory system. Here is one proposal: |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
155 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
156 Major category Minor categories |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
157 -------------------------------- |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
158 Allocation |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
159 Malloc |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
160 Dynarr |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
161 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
162 Display |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
163 Extents |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
164 Glyphs |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
165 Redisplay |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
166 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
167 Execution |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
168 Byte-Code |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
169 Catch |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
170 Garbage Collection |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
171 Trapping-Problems |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
172 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
173 Lisp Objects |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
174 Buffers |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
175 Char Tables |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
176 Events |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
177 Lstreams |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
178 Hash Tables |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
179 Range Tables |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
180 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
181 Types |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
182 Lrecord Types |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
183 Subtypes |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
184 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
185 Text |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
186 Byte Positions |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
187 Conversion |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
188 Eistrings |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
189 Itext |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
190 Lisp Strings |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
191 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
192 --ben |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
193 */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
194 |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
195 |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
196 #define INLINE_ERROR_CHECK_ARGS , const char *__file__, int __line__ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
197 #define INLINE_ERROR_CHECK_CALL , __FILE__, __LINE__ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
198 #define DISABLED_INLINE_ERROR_CHECK_ARGS |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
199 #define DISABLED_INLINE_ERROR_CHECK_CALL |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
200 |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
201 /* For assertions in inline header functions which will report the file and |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
202 line of the calling function */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
203 #define inline_assert(assertion) assert_at_line (assertion, __file__, __line__) |
|
5021
4e784bfabae7
fix bad defn of disabled inline assert
Ben Wing <ben@xemacs.org>
parents:
5020
diff
changeset
|
204 /* The following should not use disabled_assert_at_line() because when the |
|
4e784bfabae7
fix bad defn of disabled inline assert
Ben Wing <ben@xemacs.org>
parents:
5020
diff
changeset
|
205 inline assert is disabled, params __file__ and __line__ do not exist. */ |
|
4e784bfabae7
fix bad defn of disabled inline assert
Ben Wing <ben@xemacs.org>
parents:
5020
diff
changeset
|
206 #define disabled_inline_assert(assertion) disabled_assert (assertion) |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
207 |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
208 /* ------- the specific categories -------- */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
209 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
210 #if defined (ERROR_CHECK_BYTE_CODE) || defined (ERROR_CHECK_DISPLAY) || defined (ERROR_CHECK_EXTENTS) || defined (ERROR_CHECK_GC) || defined (ERROR_CHECK_GLYPHS) || defined (ERROR_CHECK_MALLOC) || defined (ERROR_CHECK_STRUCTURES) || defined (ERROR_CHECK_TEXT) || defined (ERROR_CHECK_TYPES) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
211 #define ERROR_CHECK_ANY |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
212 #endif |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
213 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
214 /* KEEP THESE SORTED! */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
215 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
216 #ifdef ERROR_CHECK_BYTE_CODE |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
217 #define byte_code_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
218 #else /* not ERROR_CHECK_BYTE_CODE */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
219 #define byte_code_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
220 #endif /* ERROR_CHECK_BYTE_CODE */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
221 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
222 #ifdef ERROR_CHECK_DISPLAY |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
223 #define display_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
224 #else /* not ERROR_CHECK_DISPLAY */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
225 #define display_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
226 #endif /* ERROR_CHECK_DISPLAY */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
227 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
228 #ifdef ERROR_CHECK_EXTENTS |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
229 #define extent_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
230 #else /* not ERROR_CHECK_EXTENTS */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
231 #define extent_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
232 #endif /* ERROR_CHECK_EXTENTS */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
233 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
234 #ifdef ERROR_CHECK_GC |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
235 #define gc_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
236 #else /* not ERROR_CHECK_GC */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
237 #define gc_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
238 #endif /* ERROR_CHECK_GC */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
239 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
240 #ifdef ERROR_CHECK_GLYPHS |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
241 #define glyph_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
242 #else /* not ERROR_CHECK_GLYPHS */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
243 #define glyph_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
244 #endif /* ERROR_CHECK_GLYPHS */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
245 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
246 #ifdef ERROR_CHECK_MALLOC |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
247 #define malloc_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
248 #else /* not ERROR_CHECK_MALLOC */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
249 #define malloc_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
250 #endif /* ERROR_CHECK_MALLOC */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
251 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
252 #ifdef ERROR_CHECK_STRUCTURES |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
253 #define structure_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
254 #else /* not ERROR_CHECK_STRUCTURES */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
255 #define structure_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
256 #endif /* ERROR_CHECK_STRUCTURES */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
257 |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
258 #ifdef ERROR_CHECK_TEXT |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
259 #define text_checking_assert(assertion) assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
260 #define text_checking_assert_at_line(assertion, file, line) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
261 assert_at_line (assertion, file, line) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
262 #define inline_text_checking_assert(assertion) inline_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
263 #define INLINE_TEXT_CHECK_ARGS INLINE_ERROR_CHECK_ARGS |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
264 #define INLINE_TEXT_CHECK_CALL INLINE_ERROR_CHECK_CALL |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
265 #define text_checking_assert_with_message(assertion, msg) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
266 assert_with_message (assertion, msg) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
267 #else /* not ERROR_CHECK_TEXT */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
268 #define text_checking_assert(assertion) disabled_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
269 #define text_checking_assert_at_line(assertion, file, line) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
270 disabled_assert_at_line (assertion, file, line) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
271 #define inline_text_checking_assert(assertion) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
272 disabled_inline_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
273 #define INLINE_TEXT_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
274 #define INLINE_TEXT_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
275 #define text_checking_assert_with_message(assertion, msg) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
276 disabled_assert_with_message (assertion, msg) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
277 #endif /* ERROR_CHECK_TEXT */ |
| 853 | 278 |
| 1318 | 279 #ifdef ERROR_CHECK_TYPES |
| 280 #define type_checking_assert(assertion) assert (assertion) | |
| 281 #define type_checking_assert_at_line(assertion, file, line) \ | |
| 282 assert_at_line (assertion, file, line) | |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
283 #define inline_type_checking_assert(assertion) inline_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
284 #define INLINE_TYPE_CHECK_ARGS INLINE_ERROR_CHECK_ARGS |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
285 #define INLINE_TYPE_CHECK_CALL INLINE_ERROR_CHECK_CALL |
| 1318 | 286 #define type_checking_assert_with_message(assertion, msg) \ |
| 287 assert_with_message (assertion, msg) | |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
288 #else /* not ERROR_CHECK_TYPES */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
289 #define type_checking_assert(assertion) disabled_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
290 #define type_checking_assert_at_line(assertion, file, line) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
291 disabled_assert_at_line (assertion, file, line) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
292 #define inline_type_checking_assert(assertion) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
293 disabled_inline_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
294 #define INLINE_TYPE_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
295 #define INLINE_TYPE_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
296 #define type_checking_assert_with_message(assertion, msg) \ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
297 disabled_assert_with_message (assertion, msg) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
298 #endif /* ERROR_CHECK_TYPES */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
299 |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
300 /* ------------------------- small categories ------------------------- */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
301 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
302 /* The large categories established by configure can be subdivided into |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
303 smaller subcategories, for problems in specific modules. You can't |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
304 control this using configure, but you can manually stick in a define as |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
305 necessary. |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
306 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
307 The idea is to go ahead and create a new type of error-checking and |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
308 have it turned on if the larger category it is a part of is also |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
309 turned on. For example, ERROR_CHECK_DYNARR is considered a subcategory |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
310 of ERROR_CHECK_STRUCTURES. |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
311 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
312 We also define foo_checking_assert() macros for convenience, but |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
313 generally don't define the many variations of this macro as for the |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
314 major types above, because it produces too much clutter. If any of |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
315 these become needed, they can always be defined. */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
316 |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
317 #ifdef ERROR_CHECK_STRUCTURES |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
318 /* Check for problems with the catch list and specbind stack */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
319 #define ERROR_CHECK_CATCH |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
320 /* Check for incoherent Dynarr structures, attempts to access Dynarr |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
321 positions out of range, reentrant use of Dynarrs through Dynarr locking, |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
322 etc. */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
323 #define ERROR_CHECK_DYNARR |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
324 /* Check for insufficient use of call_trapping_problems(), particularly |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
325 due to glyph-related changes causing eval or QUIT within redisplay */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
326 #define ERROR_CHECK_TRAPPING_PROBLEMS |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
327 #endif /* ERROR_CHECK_STRUCTURES */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
328 |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
329 #ifdef ERROR_CHECK_CATCH |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
330 #define catch_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
331 #else /* not ERROR_CHECK_CATCH */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
332 #define catch_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
333 #endif /* ERROR_CHECK_CATCH */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
334 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
335 #ifdef ERROR_CHECK_DYNARR |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
336 #define dynarr_checking_assert(assertion) assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
337 #else /* not ERROR_CHECK_DYNARR */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
338 #define dynarr_checking_assert(assertion) disabled_assert (assertion) |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
339 #endif /* ERROR_CHECK_DYNARR */ |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
340 |
| 1318 | 341 #ifdef ERROR_CHECK_TRAPPING_PROBLEMS |
| 342 #define trapping_problems_checking_assert(assertion) assert (assertion) | |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
343 #else /* not ERROR_CHECK_TRAPPING_PROBLEMS */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
344 #define trapping_problems_checking_assert(assertion) disabled_assert (assertion) |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
345 #endif /* ERROR_CHECK_TRAPPING_PROBLEMS */ |
| 1318 | 346 |
| 2367 | 347 /************************************************************************/ |
| 348 /** Definitions of basic types **/ | |
| 349 /************************************************************************/ | |
| 350 | |
| 351 /* ------------- generic 8/16/32/64/128-bit integral types ------------ */ | |
| 647 | 352 |
| 826 | 353 #if SIZEOF_SHORT == 2 |
| 354 #define INT_16_BIT short | |
| 355 #define UINT_16_BIT unsigned short | |
| 356 #elif SIZEOF_INT == 2 | |
| 357 /* Bwa ha ha. As if XEmacs could actually support such systems. */ | |
| 358 #define INT_16_BIT int | |
| 359 #define UINT_16_BIT unsigned int | |
| 360 #else | |
| 361 #error Unable to find a 16-bit integral type | |
| 362 #endif | |
| 363 | |
| 364 #if SIZEOF_INT == 4 | |
| 365 #define INT_32_BIT int | |
| 366 #define UINT_32_BIT unsigned int | |
| 367 #define MAKE_32_BIT_UNSIGNED_CONSTANT(num) num##U | |
| 368 #elif SIZEOF_LONG == 4 | |
| 369 /* Bwa ha ha again. */ | |
| 370 #define INT_32_BIT long | |
| 371 #define UINT_32_BIT unsigned long | |
| 372 #define MAKE_32_BIT_UNSIGNED_CONSTANT(num) num##UL | |
| 373 #elif SIZEOF_SHORT == 4 | |
| 374 /* And again. */ | |
| 375 #define INT_32_BIT short | |
| 376 #define UINT_32_BIT unsigned short | |
| 377 #define MAKE_32_BIT_UNSIGNED_CONSTANT(num) num##U | |
| 1429 | 378 #elif 1 /* Unable to find a 32-bit integral type! */ |
| 826 | 379 #error What kind of strange-ass system are you running on? |
| 380 #endif | |
| 381 | |
| 382 #if SIZEOF_LONG == 8 | |
| 383 #define INT_64_BIT long | |
| 384 #define UINT_64_BIT unsigned long | |
| 385 #define MAKE_64_BIT_UNSIGNED_CONSTANT(num) num##UL | |
| 386 #elif SIZEOF_LONG_LONG == 8 | |
| 387 #define INT_64_BIT long long | |
| 388 #define UINT_64_BIT unsigned long long | |
| 389 #define MAKE_64_BIT_UNSIGNED_CONSTANT(num) num##ULL | |
|
4682
648f4a0dac3e
Fix build problems on WIN32 platforms caused by the large image crash fix.
Jerry James <james@xemacs.org>
parents:
4678
diff
changeset
|
390 #elif defined(WIN32_ANY) |
|
648f4a0dac3e
Fix build problems on WIN32 platforms caused by the large image crash fix.
Jerry James <james@xemacs.org>
parents:
4678
diff
changeset
|
391 #define INT_64_BIT __int64 |
|
648f4a0dac3e
Fix build problems on WIN32 platforms caused by the large image crash fix.
Jerry James <james@xemacs.org>
parents:
4678
diff
changeset
|
392 #define UINT_64_BIT unsigned __int64 |
|
648f4a0dac3e
Fix build problems on WIN32 platforms caused by the large image crash fix.
Jerry James <james@xemacs.org>
parents:
4678
diff
changeset
|
393 #define MAKE_64_BIT_UNSIGNED_CONSTANT(num) num##UI64 |
| 826 | 394 /* No error otherwise; just leave undefined */ |
| 395 #endif | |
| 396 | |
| 397 #if SIZEOF_LONG_LONG == 16 | |
| 398 #define INT_128_BIT long long | |
| 399 #define UINT_128_BIT unsigned long long | |
| 400 #define MAKE_128_BIT_UNSIGNED_CONSTANT(num) num##ULL | |
| 401 /* No error otherwise; just leave undefined */ | |
| 402 #endif | |
| 403 | |
| 404 /* #### Fill this in for other systems */ | |
| 405 #if defined (INT_64_BIT) && !(defined (i386) || defined (__i386__)) | |
| 406 #define EFFICIENT_INT_64_BIT INT_64_BIT | |
| 407 #define EFFICIENT_UINT_64_BIT UINT_64_BIT | |
| 408 #endif | |
| 409 | |
| 410 #if defined (INT_128_BIT) | |
| 411 #define EFFICIENT_INT_128_BIT INT_128_BIT | |
| 412 #define EFFICIENT_UINT_128_BIT UINT_128_BIT | |
| 413 #endif | |
| 414 | |
| 2367 | 415 #ifdef HAVE_INTTYPES_H |
| 416 #include <inttypes.h> | |
| 417 #elif defined (HAVE_INTPTR_T_IN_SYS_TYPES_H) | |
| 418 /* included elsewhere */ | |
| 419 #elif SIZEOF_VOID_P == SIZEOF_INT | |
| 420 typedef int intptr_t; | |
| 421 typedef unsigned int uintptr_t; | |
| 422 #elif SIZEOF_VOID_P == SIZEOF_LONG | |
| 423 typedef long intptr_t; | |
| 424 typedef unsigned long uintptr_t; | |
| 425 #elif defined (SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG | |
| 426 typedef long long intptr_t; | |
| 427 typedef unsigned long long uintptr_t; | |
| 428 #else | |
| 429 /* Just pray. May break, may not. */ | |
| 430 typedef long intptr_t; | |
| 431 typedef unsigned long uintptr_t; | |
| 432 #endif | |
| 433 | |
| 3988 | 434 #if SIZEOF_VOID_P == 8 |
| 435 #define DEADBEEF_CONSTANT 0xCAFEBABEDEADBEEF | |
| 436 #elif SIZEOF_VOID_P == 4 | |
| 437 #define DEADBEEF_CONSTANT 0xDEADBEEF | |
| 438 #else | |
| 439 #error "What size are your pointers, really?" | |
| 440 #endif /* SIZEOF_VOID_P == 8 */ | |
| 441 | |
| 2367 | 442 /* ---------------------- definition of EMACS_INT --------------------- */ |
| 443 | |
| 444 /* EMACS_INT is the underlying integral type into which a Lisp_Object must fit. | |
| 445 In particular, it must be large enough to contain a pointer. | |
| 446 config.h can override this, e.g. to use `long long' for bigger lisp ints. | |
| 447 | |
| 448 #### In point of fact, it would NOT be a good idea for config.h to mess | |
| 449 with EMACS_INT. A lot of code makes the basic assumption that EMACS_INT | |
| 450 is the size of a pointer. */ | |
| 451 | |
| 452 #ifndef SIZEOF_EMACS_INT | |
| 453 # define SIZEOF_EMACS_INT SIZEOF_VOID_P | |
| 454 #endif | |
| 455 | |
| 456 #ifndef EMACS_INT | |
| 457 # if SIZEOF_EMACS_INT == SIZEOF_LONG | |
| 458 # define EMACS_INT long | |
| 459 # elif SIZEOF_EMACS_INT == SIZEOF_INT | |
| 460 # define EMACS_INT int | |
| 461 # elif SIZEOF_EMACS_INT == SIZEOF_LONG_LONG | |
| 462 # define EMACS_INT long long | |
| 463 # else | |
| 464 # error Unable to determine suitable type for EMACS_INT | |
| 465 # endif | |
| 466 #endif | |
| 467 | |
| 468 #ifndef EMACS_UINT | |
| 469 # define EMACS_UINT unsigned EMACS_INT | |
| 470 #endif | |
| 471 | |
| 472 #define BITS_PER_EMACS_INT (SIZEOF_EMACS_INT * BITS_PER_CHAR) | |
| 473 | |
| 474 /* -------------------------- basic byte typedefs --------------------- */ | |
| 475 | |
| 476 /* The definitions we put here and in the next section use typedefs to | |
| 477 attribute specific meaning to types that by themselves are pretty | |
| 478 general. | |
| 479 | |
| 480 REMEMBER! These typedefs are purely for documentation purposes; from | |
| 647 | 481 the C code's perspective, they are exactly equivalent to `char *', |
| 482 `unsigned char *', etc., so you can freely use them with library | |
| 2367 | 483 functions declared as such. |
| 484 | |
| 485 (See also "Byte/Character Types" in text.c) | |
| 486 | |
| 487 The basic semantics for `char': | |
| 488 | |
| 489 a) [Ibyte] pointer to internally-formatted text | |
| 490 b) [Extbyte] pointer to text in some external format, which can be | |
| 491 defined as all formats other than the internal one | |
| 492 c) [Ascbyte] pure ASCII text | |
| 493 d) [Binbyte] binary data that is not meant to be interpreted as text | |
| 494 e) [Rawbyte] general data in memory, where we don't care about whether | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
495 it's text or binary; often used when computing memory- |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
496 based/byte-based offsets of pointers |
| 2367 | 497 f) [Boolbyte] a zero or a one |
| 498 g) [Bitbyte] a byte used for bit fields | |
| 499 h) [Chbyte] null-semantics `char *'; used when casting an argument to | |
| 500 an external API where the the other types may not be | |
| 501 appropriate | |
| 502 | |
| 503 | |
| 504 Prefixing codes: | |
| 505 | |
| 506 C = plain char, when the base type is unsigned | |
| 507 U = unsigned | |
| 508 S = signed | |
| 509 | |
| 510 Ideally, XEmacs code should NEVER directly use `char' or any type | |
| 511 derived from it. This is for Mule-cleanliness. If you find yourself | |
| 512 wanting or needing to use `char' and one of the above six semantics does | |
| 513 not apply, add a new type of semantics; don't use `char' directly. | |
| 514 | |
| 515 See text.c under "Byte Types", and following sections. | |
| 516 */ | |
| 647 | 517 |
| 518 /* The data representing the text in a buffer is logically a set | |
| 867 | 519 of Ibytes, declared as follows. */ |
| 520 | |
| 521 typedef unsigned char Ibyte; | |
| 647 | 522 |
| 523 /* The following should be used when you are working with internal data | |
| 524 but for whatever reason need to have it declared a "char *". Examples | |
| 525 are function arguments whose values are most commonly literal strings, | |
| 526 or where you have to apply a stdlib string function to internal data. | |
| 527 | |
| 2367 | 528 In general, you should avoid this where possible and use Ascbyte if the |
| 529 text is just ASCII (e.g. string literals) or otherwise Ibyte, for | |
| 530 consistency. For example, the new Mule workspace contains Ibyte | |
| 531 versions of the stdlib string functions. */ | |
| 867 | 532 |
| 533 typedef char CIbyte; | |
| 647 | 534 |
| 535 /* The data representing a string in "external" format (binary or any | |
| 536 external encoding) is logically a set of Extbytes, declared as | |
| 537 follows. Extbyte is guaranteed to be just a char, so for example | |
| 538 strlen (Extbyte *) is OK. Extbyte is only a documentation device | |
| 539 for referring to external text. */ | |
| 540 | |
| 541 typedef char Extbyte; | |
| 771 | 542 typedef unsigned char UExtbyte; |
| 647 | 543 |
| 2367 | 544 #define EXTTEXT_ZTERM_SIZE (sizeof (Extbyte)) |
| 647 | 545 |
| 546 /* A byte in a string in entirely US-ASCII format: (Nothing outside | |
| 547 the range 00 - 7F) */ | |
| 548 | |
| 2367 | 549 typedef char Ascbyte; |
| 550 typedef unsigned char UAscbyte; | |
| 551 | |
| 552 /* A generic memory pointer, no text or binary semantics assumed. | |
| 553 In general, there should be no manipulation of the memory pointed to | |
| 554 by these pointers other than just copying it around. */ | |
| 555 | |
| 556 typedef unsigned char Rawbyte; | |
| 557 typedef char CRawbyte; | |
| 558 | |
| 559 /* A byte in a string in binary (not meant as text) format: */ | |
| 560 | |
| 561 typedef unsigned char Binbyte; | |
| 562 typedef char CBinbyte; | |
| 563 typedef signed char SBinbyte; | |
| 564 | |
| 565 /* A byte used to represent a boolean value: 0 or 1. | |
| 566 Normally use plain Boolint, and only use Boolbyte to save space. */ | |
| 567 | |
| 568 typedef char Boolbyte; | |
| 569 | |
| 570 /* A byte composed of bitfields. Hardly ever used. */ | |
| 571 | |
| 572 typedef unsigned char Bitbyte; | |
| 573 | |
| 574 /* A no-semantics `char'. Used (pretty-much) ONLY for casting arguments to | |
| 575 functions accepting a `char *', `unsigned char *', etc. where the other | |
| 576 types don't exactly apply and what you are logically concerned with is | |
| 577 the type of the function's argument and not its semantics. | |
| 578 | |
| 579 DO NOT DO NOT DO NOT DO NOT use this as a sloppy replacement for one of | |
| 580 the other types. If you're not using this as part of casting an | |
| 581 argument to a function call, and you're not Ben Wing, you're using it | |
| 582 wrong. Go find another one of the types. */ | |
| 583 | |
| 584 typedef char Chbyte; | |
| 585 typedef unsigned char UChbyte; | |
| 586 typedef signed char SChbyte; | |
| 587 | |
| 588 /* ------------------------ other text-related typedefs ------------------- */ | |
| 647 | 589 |
| 826 | 590 /* To the user, a buffer is made up of characters. In the non-Mule world, |
| 867 | 591 characters and Ibytes are equivalent, restricted to the range 0 - 255. |
| 3498 | 592 In the Mule world, many more characters are possible (21 bits worth, |
| 867 | 593 more or less), and a character requires (typically) 1 to 4 Ibytes for |
| 826 | 594 its representation in a buffer or string. Note that the representation |
| 595 of a character by itself, in a variable, is very different from its | |
| 596 representation in a string of text (in a buffer or Lisp string). | |
| 597 | |
| 598 Under Mule, text can be represented in more than one way. The "default" | |
| 599 format is variable-width (1 to 4 bytes) and compatible with ASCII -- | |
| 600 ASCII chars are stored in one byte, as themselves, and all other chars | |
| 601 use only high bytes. The default format is currently the only format | |
| 602 used for text stored anywhere but in a buffer. In a buffer, other | |
| 603 formats -- fixed-width formats (1, 2, or 4 bytes) -- are possible, for | |
| 604 speed. | |
| 605 | |
| 606 See text.c/text.h for a detailed discussion of all of this. */ | |
| 607 | |
| 608 /* A character, as represented on its own. */ | |
| 647 | 609 |
| 867 | 610 typedef int Ichar; |
| 647 | 611 |
| 826 | 612 /* The "raw value" of a character as stored in the buffer. In the default |
| 613 format, this is just the same as the character. In fixed-width formats, | |
| 614 this is the actual value in the buffer, which will be limited to the | |
| 615 range as established by the format. This is used when searching for a | |
| 616 character in a buffer -- it's faster to convert the character to the raw | |
| 617 value and look for that, than repeatedly convert each raw value in the | |
| 618 buffer into a character. */ | |
| 619 | |
| 867 | 620 typedef int Raw_Ichar; |
| 826 | 621 |
| 2367 | 622 /* Internal text as a series of textual units (8-bit bytes in the old |
| 623 "Mule" encoding -- still the standard internal encoding -- and in UTF-8, | |
| 624 but 16-bit bytes in UTF-16 and 32-bit bytes in UTF-32). See text.c. */ | |
| 625 | |
| 626 #ifdef UTF16_IBYTE_FORMAT | |
| 627 #define NON_ASCII_INTERNAL_FORMAT | |
| 628 typedef unsigned short Itext; | |
| 629 #else | |
| 630 typedef Ibyte Itext; | |
| 631 #endif | |
| 632 typedef EMACS_INT Textcount; | |
| 633 | |
| 634 #define ITEXT_SIZE (sizeof (Itext)) | |
| 635 /* Use this to emphasize that we are adding space for the zero-terminator */ | |
| 636 #define ITEXT_ZTERM_SIZE ITEXT_SIZE | |
| 637 | |
| 638 /* Wexttext is wchar_t on WIN32_NATIVE (and perhaps other systems that | |
| 639 support wchar_t's in library functions), and Extbyte otherwise. This is | |
| 640 used whenever we have to do any sort of manipulation of | |
| 641 externally-encoded strings -- generally a very bad idea, and unsafe, but | |
| 642 in some cases we have no choice (especially at startup, and esp. prior | |
| 643 to pdump, where we haven't loaded the Unicode tables necessary for | |
| 644 conversion under Windows). On platforms where the external encoding may | |
| 645 be Unicode (i.e. Windows), we always do our manipulations in Unicode, | |
| 646 converting to and from multibyte if necessary -- otherwise we'd have to | |
| 647 conditionalize on Unicode vs. multibyte all over the place, which is | |
| 648 just a nightmare. */ | |
| 649 #ifdef WIN32_NATIVE | |
| 650 #define WEXTTEXT_IS_WIDE | |
| 651 typedef wchar_t Wexttext; | |
| 652 #else | |
| 653 typedef Extbyte Wexttext; | |
| 654 #endif | |
| 826 | 655 |
| 656 #if !defined (__cplusplus) || !defined (CPLUSPLUS_INTEGRAL_CLASSES_NOT_YET) | |
| 657 | |
| 658 /* Counts of bytes or chars */ | |
| 659 | |
| 660 typedef EMACS_INT Bytecount; | |
| 661 typedef EMACS_INT Charcount; | |
| 662 | |
| 647 | 663 /* Different ways of referring to a position in a buffer. We use |
| 664 the typedefs in preference to 'EMACS_INT' to make it clearer what | |
| 826 | 665 sort of position is being used. See text.c for a description |
| 666 of the different positions. | |
| 667 | |
| 668 Note that buffer positions are 1-based, and there's a gap in the middle | |
| 669 of a buffer; that's why we have separate typedefs. For Lisp strings and | |
| 670 other strings of text, we just use Bytecount and Charcount. */ | |
| 800 | 671 |
| 665 | 672 typedef EMACS_INT Charbpos; |
| 673 typedef EMACS_INT Bytebpos; | |
| 674 typedef EMACS_INT Membpos; | |
| 647 | 675 |
| 826 | 676 /* Different ways of referring to a position that can be either in a buffer |
| 677 or string; used when passing around an object that can be either a | |
| 678 buffer or string, and an associated position. Conceptually, they | |
| 679 resolve as follows: | |
| 680 | |
| 681 Typedef Buffer String | |
| 682 ------------------------------------------------------ | |
| 683 Charxpos Charbpos Charcount | |
| 684 Bytexpos Bytebpos Bytecount | |
| 685 Memxpos Membpos Bytecount | |
| 686 | |
| 687 */ | |
| 688 | |
| 814 | 689 typedef EMACS_INT Charxpos; |
| 690 typedef EMACS_INT Bytexpos; | |
| 691 typedef EMACS_INT Memxpos; | |
| 692 | |
| 693 #else /* __cplusplus */ | |
| 694 | |
| 695 /* Implement strong type-checking of the above integral types by declaring | |
| 696 them to be classes and using operator overloading. Unfortunately this | |
| 697 is a huge pain in the ass because C++ doesn't strongly distinguish | |
| 698 "bool" and "size_t" from int. The problem is especially bad with "bool" | |
| 2956 | 699 -- if you want to be able to say `if (len--)' where len is e.g. a |
| 814 | 700 Bytecount, you need to declare a conversion operator to bool(); and |
| 701 since bool is just an alias for int, you suddenly get tons and tons of | |
| 702 ambiguities, which need to be resolved by lots of laborious declarations | |
| 703 for every single possible type combination. Hence the multitude of | |
| 704 declarations in DECLARE_INTCLASS_ARITH_COMPARE(). The bool/int | |
| 705 equivalence also means that we have to forcibly block the combinations | |
| 706 we don't want by creating overloaded versions of them and declaring them | |
| 707 private. */ | |
| 708 | |
| 709 class Bytecount; | |
| 710 class Bytebpos; | |
| 711 class Bytexpos; | |
| 712 class Charcount; | |
| 713 class Charbpos; | |
| 714 class Charxpos; | |
| 715 class Membpos; | |
| 716 class Memxpos; | |
| 717 | |
| 718 /* Declare the arithmetic and comparison operations for an integral class, | |
| 719 i.e. one of the above classes. If this is a "position" class, where the | |
| 720 difference between two positions is a different class (a "count" class), | |
| 721 then use POSCL for the position class and COUNTCL for the count class. | |
| 722 If this is a simple class, where all operations yield the same class, | |
| 723 substitute the same class for POSCL and COUNTCL. */ | |
| 724 | |
| 725 #define DECLARE_INTCLASS_ARITH_COMPARE(poscl, countcl) \ | |
| 726 poscl operator += (const countcl& l) { data += l.data; return *this; } \ | |
| 727 poscl operator -= (const countcl& l) { data -= l.data; return *this; } \ | |
| 728 poscl operator + (const countcl& l) const { return poscl (data + l.data); } \ | |
| 729 poscl operator - (const countcl& l) const { return poscl (data - l.data); } \ | |
| 730 poscl operator += (const int& l) { data += l; return *this; } \ | |
| 731 poscl operator -= (const int& l) { data -= l; return *this; } \ | |
| 732 poscl operator + (const int& l) const { return poscl (data + l); } \ | |
| 733 poscl operator - (const int& l) const { return poscl (data - l); } \ | |
| 734 poscl operator += (const unsigned int& l) { data += l; return *this; } \ | |
| 735 poscl operator -= (const unsigned int& l) { data -= l; return *this; } \ | |
| 736 poscl operator + (const unsigned int& l) const \ | |
| 737 { return poscl (data + l); } \ | |
| 738 poscl operator - (const unsigned int& l) const \ | |
| 739 { return poscl (data - l); } \ | |
| 740 poscl operator += (const long& l) { data += l; return *this; } \ | |
| 741 poscl operator -= (const long& l) { data -= l; return *this; } \ | |
| 742 poscl operator + (const long& l) const { return poscl (data + l); } \ | |
| 743 poscl operator - (const long& l) const { return poscl (data - l); } \ | |
| 744 poscl operator += (const unsigned long& l) { data += l; return *this; } \ | |
| 745 poscl operator -= (const unsigned long& l) { data -= l; return *this; } \ | |
| 746 poscl operator + (const unsigned long& l) const \ | |
| 747 { return poscl (data + l); } \ | |
| 748 poscl operator - (const unsigned long& l) const \ | |
| 749 { return poscl (data - l); } \ | |
| 750 poscl operator += (const short& l) { data += l; return *this; } \ | |
| 751 poscl operator -= (const short& l) { data -= l; return *this; } \ | |
| 752 poscl operator + (const short& l) const { return poscl (data + l); } \ | |
| 753 poscl operator - (const short& l) const { return poscl (data - l); } \ | |
| 754 poscl operator += (const unsigned short& l) { data += l; return *this; } \ | |
| 755 poscl operator -= (const unsigned short& l) { data -= l; return *this; } \ | |
| 756 poscl operator + (const unsigned short& l) const \ | |
| 757 { return poscl (data + l); } \ | |
| 758 poscl operator - (const unsigned short& l) const \ | |
| 759 { return poscl (data - l); } \ | |
| 760 \ | |
| 761 poscl operator *= (const countcl& l) { data *= l.data; return *this; } \ | |
| 762 poscl operator /= (const countcl& l) { data /= l.data; return *this; } \ | |
| 763 poscl operator * (const countcl& l) const { return poscl (data * l.data); } \ | |
| 764 poscl operator / (const countcl& l) const { return poscl (data / l.data); } \ | |
| 765 poscl operator *= (const int& l) { data *= l; return *this; } \ | |
| 766 poscl operator /= (const int& l) { data /= l; return *this; } \ | |
| 767 poscl operator * (const int& l) const { return poscl (data * l); } \ | |
| 768 poscl operator / (const int& l) const { return poscl (data / l); } \ | |
| 769 poscl operator *= (const unsigned int& l) { data *= l; return *this; } \ | |
| 770 poscl operator /= (const unsigned int& l) { data /= l; return *this; } \ | |
| 771 poscl operator * (const unsigned int& l) const { return poscl (data * l); } \ | |
| 772 poscl operator / (const unsigned int& l) const { return poscl (data / l); } \ | |
| 773 poscl operator *= (const long& l) { data *= l; return *this; } \ | |
| 774 poscl operator /= (const long& l) { data /= l; return *this; } \ | |
| 775 poscl operator * (const long& l) const { return poscl (data * l); } \ | |
| 776 poscl operator / (const long& l) const { return poscl (data / l); } \ | |
| 777 poscl operator *= (const unsigned long& l) { data *= l; return *this; } \ | |
| 778 poscl operator /= (const unsigned long& l) { data /= l; return *this; } \ | |
| 779 poscl operator * (const unsigned long& l) const \ | |
| 780 { return poscl (data * l); } \ | |
| 781 poscl operator / (const unsigned long& l) const \ | |
| 782 { return poscl (data / l); } \ | |
| 783 poscl operator *= (const short& l) { data *= l; return *this; } \ | |
| 784 poscl operator /= (const short& l) { data /= l; return *this; } \ | |
| 785 poscl operator * (const short& l) const { return poscl (data * l); } \ | |
| 786 poscl operator / (const short& l) const { return poscl (data / l); } \ | |
| 787 poscl operator *= (const unsigned short& l) { data *= l; return *this; } \ | |
| 788 poscl operator /= (const unsigned short& l) { data /= l; return *this; } \ | |
| 789 poscl operator * (const unsigned short& l) const \ | |
| 790 { return poscl (data * l); } \ | |
| 791 poscl operator / (const unsigned short& l) const \ | |
| 792 { return poscl (data / l); } \ | |
| 793 \ | |
| 794 poscl operator &= (const countcl& l) { data &= l.data; return *this; } \ | |
| 795 poscl operator |= (const countcl& l) { data |= l.data; return *this; } \ | |
| 796 poscl operator & (const countcl& l) const { return poscl (data & l.data); } \ | |
| 797 poscl operator | (const countcl& l) const { return poscl (data | l.data); } \ | |
| 798 poscl operator &= (const int& l) { data &= l; return *this; } \ | |
| 799 poscl operator |= (const int& l) { data |= l; return *this; } \ | |
| 800 poscl operator & (const int& l) const { return poscl (data & l); } \ | |
| 801 poscl operator | (const int& l) const { return poscl (data | l); } \ | |
| 802 poscl operator &= (const unsigned int& l) { data &= l; return *this; } \ | |
| 803 poscl operator |= (const unsigned int& l) { data |= l; return *this; } \ | |
| 804 poscl operator & (const unsigned int& l) const { return poscl (data & l); } \ | |
| 805 poscl operator | (const unsigned int& l) const { return poscl (data | l); } \ | |
| 806 poscl operator &= (const long& l) { data &= l; return *this; } \ | |
| 807 poscl operator |= (const long& l) { data |= l; return *this; } \ | |
| 808 poscl operator & (const long& l) const { return poscl (data & l); } \ | |
| 809 poscl operator | (const long& l) const { return poscl (data | l); } \ | |
| 810 poscl operator &= (const unsigned long& l) { data &= l; return *this; } \ | |
| 811 poscl operator |= (const unsigned long& l) { data |= l; return *this; } \ | |
| 812 poscl operator & (const unsigned long& l) const \ | |
| 813 { return poscl (data & l); } \ | |
| 814 poscl operator | (const unsigned long& l) const \ | |
| 815 { return poscl (data | l); } \ | |
| 816 poscl operator &= (const short& l) { data &= l; return *this; } \ | |
| 817 poscl operator |= (const short& l) { data |= l; return *this; } \ | |
| 818 poscl operator & (const short& l) const { return poscl (data & l); } \ | |
| 819 poscl operator | (const short& l) const { return poscl (data | l); } \ | |
| 820 poscl operator &= (const unsigned short& l) { data &= l; return *this; } \ | |
| 821 poscl operator |= (const unsigned short& l) { data |= l; return *this; } \ | |
| 822 poscl operator & (const unsigned short& l) const \ | |
| 823 { return poscl (data & l); } \ | |
| 824 poscl operator | (const unsigned short& l) const \ | |
| 825 { return poscl (data | l); } \ | |
| 826 \ | |
| 827 poscl operator - () { return poscl (-data); } \ | |
| 828 poscl operator-- () { data--; return *this; } \ | |
| 829 poscl operator-- (int) { data--; return poscl (data + 1); } \ | |
| 830 poscl operator++ () { data++; return *this; } \ | |
| 831 poscl operator++ (int) { data++; return poscl (data - 1); } \ | |
| 832 \ | |
| 833 bool operator < (const poscl& l) const { return data < l.data; } \ | |
| 834 bool operator <= (const poscl& l) const { return data <= l.data; } \ | |
| 835 bool operator > (const poscl& l) const { return data > l.data; } \ | |
| 836 bool operator >= (const poscl& l) const { return data >= l.data; } \ | |
| 837 bool operator == (const poscl& l) const { return data == l.data; } \ | |
| 838 bool operator != (const poscl& l) const { return data != l.data; } \ | |
| 839 bool operator < (const int& l) const { return data < (EMACS_INT) l; } \ | |
| 840 bool operator <= (const int& l) const { return data <= (EMACS_INT) l; } \ | |
| 841 bool operator > (const int& l) const { return data > (EMACS_INT) l; } \ | |
| 842 bool operator >= (const int& l) const { return data >= (EMACS_INT) l; } \ | |
| 843 bool operator == (const int& l) const { return data == (EMACS_INT) l; } \ | |
| 844 bool operator != (const int& l) const { return data != (EMACS_INT) l; } \ | |
| 845 bool operator < (const unsigned int& l) const \ | |
| 846 { return data < (EMACS_INT) l; } \ | |
| 847 bool operator <= (const unsigned int& l) const \ | |
| 848 { return data <= (EMACS_INT) l; } \ | |
| 849 bool operator > (const unsigned int& l) const \ | |
| 850 { return data > (EMACS_INT) l; } \ | |
| 851 bool operator >= (const unsigned int& l) const \ | |
| 852 { return data >= (EMACS_INT) l; } \ | |
| 853 bool operator == (const unsigned int& l) const \ | |
| 854 { return data == (EMACS_INT) l; } \ | |
| 855 bool operator != (const unsigned int& l) const \ | |
| 856 { return data != (EMACS_INT) l; } \ | |
| 857 bool operator < (const long& l) const { return data < (EMACS_INT) l; } \ | |
| 858 bool operator <= (const long& l) const { return data <= (EMACS_INT) l; } \ | |
| 859 bool operator > (const long& l) const { return data > (EMACS_INT) l; } \ | |
| 860 bool operator >= (const long& l) const { return data >= (EMACS_INT) l; } \ | |
| 861 bool operator == (const long& l) const { return data == (EMACS_INT) l; } \ | |
| 862 bool operator != (const long& l) const { return data != (EMACS_INT) l; } \ | |
| 863 bool operator < (const unsigned long& l) const \ | |
| 864 { return data < (EMACS_INT) l; } \ | |
| 865 bool operator <= (const unsigned long& l) const \ | |
| 866 { return data <= (EMACS_INT) l; } \ | |
| 867 bool operator > (const unsigned long& l) const \ | |
| 868 { return data > (EMACS_INT) l; } \ | |
| 869 bool operator >= (const unsigned long& l) const \ | |
| 870 { return data >= (EMACS_INT) l; } \ | |
| 871 bool operator == (const unsigned long& l) const \ | |
| 872 { return data == (EMACS_INT) l; } \ | |
| 873 bool operator != (const unsigned long& l) const \ | |
| 874 { return data != (EMACS_INT) l; } \ | |
| 875 bool operator < (const short& l) const { return data < (EMACS_INT) l; } \ | |
| 876 bool operator <= (const short& l) const { return data <= (EMACS_INT) l; } \ | |
| 877 bool operator > (const short& l) const { return data > (EMACS_INT) l; } \ | |
| 878 bool operator >= (const short& l) const { return data >= (EMACS_INT) l; } \ | |
| 879 bool operator == (const short& l) const { return data == (EMACS_INT) l; } \ | |
| 880 bool operator != (const short& l) const { return data != (EMACS_INT) l; } \ | |
| 881 bool operator < (const unsigned short& l) const \ | |
| 882 { return data < (EMACS_INT) l; } \ | |
| 883 bool operator <= (const unsigned short& l) const \ | |
| 884 { return data <= (EMACS_INT) l; } \ | |
| 885 bool operator > (const unsigned short& l) const \ | |
| 886 { return data > (EMACS_INT) l; } \ | |
| 887 bool operator >= (const unsigned short& l) const \ | |
| 888 { return data >= (EMACS_INT) l; } \ | |
| 889 bool operator == (const unsigned short& l) const \ | |
| 890 { return data == (EMACS_INT) l; } \ | |
| 891 bool operator != (const unsigned short& l) const \ | |
| 892 { return data != (EMACS_INT) l; } \ | |
| 893 bool operator ! () const { return !data; } | |
| 894 | |
| 895 /* Declare the "bad" or disallowed arithmetic and comparion operations | |
| 896 between class GOOD and class BAD. Meant to go inside the private | |
| 897 section of class GOOD. */ | |
| 898 | |
| 899 #define DECLARE_BAD_INTCLASS_ARITH_COMPARE(good, bad) \ | |
| 900 good operator += (const bad& l) { return badret; } \ | |
| 901 good operator -= (const bad& l) { return badret; } \ | |
| 902 good operator *= (const bad& l) { return badret; } \ | |
| 903 good operator /= (const bad& l) { return badret; } \ | |
| 904 good operator + (const bad& l) { return badret; } \ | |
| 905 good operator - (const bad& l) { return badret; } \ | |
| 906 good operator * (const bad& l) { return badret; } \ | |
| 907 good operator / (const bad& l) { return badret; } \ | |
| 908 \ | |
| 909 bool operator < (const bad& l) { return 0; } \ | |
| 910 bool operator <= (const bad& l) { return 0; } \ | |
| 911 bool operator > (const bad& l) { return 0; } \ | |
| 912 bool operator >= (const bad& l) { return 0; } \ | |
| 913 bool operator == (const bad& l) { return 0; } \ | |
| 914 bool operator != (const bad& l) { return 0; } | |
| 915 | |
| 916 /* Declare the "bad" or disallowed arithmetic operations between class GOOD | |
| 917 and another of the same class, for a position class. Meant to go inside | |
| 918 the private section of class GOOD. */ | |
| 919 | |
| 920 #define DECLARE_BAD_POS_CLASS_ARITH(good) \ | |
| 921 good operator += (const good& l) { return badret; } \ | |
| 922 good operator -= (const good& l) { return badret; } \ | |
| 923 good operator *= (const good& l) { return badret; } \ | |
| 924 good operator /= (const good& l) { return badret; } \ | |
| 925 good operator + (const good& l) { return badret; } \ | |
| 926 good operator * (const good& l) { return badret; } \ | |
| 927 good operator / (const good& l) { return badret; } | |
| 928 | |
| 929 /* Basic declaration at the top of all integral classes. Don't call | |
| 930 directly, use one of the more specific versions below. */ | |
| 931 | |
| 932 #define DECLARE_INTCLASS(cl) \ | |
| 933 public: \ | |
| 934 EMACS_INT data; \ | |
| 935 cl () { data = 0xCDCDCDCD; } \ | |
| 936 cl (int i) { data = i; } \ | |
| 937 cl (unsigned int i) { data = i; } \ | |
| 938 cl (long i) { data = i; } \ | |
| 939 cl (unsigned long i) { data = i; } \ | |
| 940 cl (short i) { data = i; } \ | |
| 941 cl (unsigned short i) { data = i; } \ | |
| 942 operator EMACS_INT () const { return data; } | |
| 943 | |
| 944 /* Basic declaration at the top of all count classes. */ | |
| 945 | |
| 946 #define DECLARE_COUNT_CLASS(cl) \ | |
| 947 DECLARE_INTCLASS (cl) \ | |
| 948 DECLARE_INTCLASS_ARITH_COMPARE (cl, cl) \ | |
| 949 private: \ | |
| 950 static cl badret; | |
| 951 | |
| 952 /* Basic declaration at the bottom of the prelude of all position classes. | |
| 953 Don't call directly. */ | |
| 954 | |
| 955 #define DECLARE_POS_CLASS_SECOND_HALF(cl, countcl) \ | |
| 956 DECLARE_INTCLASS_ARITH_COMPARE (cl, countcl) \ | |
| 957 countcl operator - (const cl& l) const { return countcl (data - l.data); } \ | |
| 958 private: \ | |
| 959 static cl badret; \ | |
| 960 DECLARE_BAD_POS_INTCLASS_ARITH (cl) | |
| 961 | |
| 962 /* Basic declaration at the top of all buffer position classes. */ | |
| 963 | |
| 964 #define DECLARE_BPOS_CLASS(cl, countcl) \ | |
| 965 DECLARE_INTCLASS (cl) \ | |
| 966 DECLARE_POS_CLASS_SECOND_HALF (cl, countcl) | |
| 967 | |
| 968 /* Basic declaration at the top of all X-position classes (that can refer | |
| 969 to buffers or strings). CL1 and CL2 are the equivalent more specific | |
| 1318 | 970 classes referring only to buffers or strings, respectively. */ |
| 814 | 971 |
| 972 #define DECLARE_XPOS_CLASS(cl, countcl, cl1, cl2) \ | |
| 973 DECLARE_INTCLASS (cl) \ | |
| 974 cl (const cl1& x) { data = x.data; } \ | |
| 975 cl (const cl2& x) { data = x.data; } \ | |
| 976 operator cl1 () const { return cl1 (data); } \ | |
| 977 operator cl2 () const { return cl2 (data); } \ | |
| 978 DECLARE_POS_CLASS_SECOND_HALF (cl, countcl) | |
| 979 | |
| 980 /* Declare the "bad" or disallowed arithmetic and comparion operations | |
| 981 between class CHARCL (a character class) and various non-character | |
| 982 classes. Meant to go inside the private section of class GOOD. */ | |
| 983 | |
| 984 #define DECLARE_BAD_CHAR_INTCLASS_ARITH_COMPARE(charcl) \ | |
| 985 DECLARE_BAD_INTCLASS_ARITH_COMPARE (charcl, Bytecount) \ | |
| 986 DECLARE_BAD_INTCLASS_ARITH_COMPARE (charcl, Bytebpos) \ | |
| 987 DECLARE_BAD_INTCLASS_ARITH_COMPARE (charcl, Bytexpos) \ | |
| 988 DECLARE_BAD_INTCLASS_ARITH_COMPARE (charcl, Membpos) \ | |
| 989 DECLARE_BAD_INTCLASS_ARITH_COMPARE (charcl, Memxpos) | |
| 990 | |
| 991 /* Declare the "bad" or disallowed arithmetic and comparion operations | |
| 992 between class BYTECL (a byte class) and various non-byte classes. | |
| 993 Meant to go inside the private section of class GOOD. */ | |
| 994 | |
| 995 #define DECLARE_BAD_BYTE_INTCLASS_ARITH_COMPARE(bytecl) \ | |
| 996 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charcount) \ | |
| 997 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charbpos) \ | |
| 998 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charxpos) \ | |
| 999 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Membpos) \ | |
| 1000 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Memxpos) | |
| 1001 | |
| 1002 /* Declare the "bad" or disallowed arithmetic and comparion operations | |
| 1003 between class BYTECL (a mem class) and various non-mem classes. | |
| 1004 Meant to go inside the private section of class GOOD. */ | |
| 1005 | |
| 1006 #define DECLARE_BAD_MEM_INTCLASS_ARITH_COMPARE(bytecl) \ | |
| 1007 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charcount) \ | |
| 1008 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charbpos) \ | |
| 1009 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Charxpos) \ | |
| 1010 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Bytebpos) \ | |
| 1011 DECLARE_BAD_INTCLASS_ARITH_COMPARE (bytecl, Bytexpos) | |
| 1012 | |
| 1013 class Charcount | |
| 1014 { | |
| 1015 DECLARE_COUNT_CLASS (Charcount) | |
| 1016 DECLARE_BAD_CHAR_INTCLASS_ARITH_COMPARE (Charcount) | |
| 1017 }; | |
| 1018 | |
| 1019 class Charbpos | |
| 1020 { | |
| 1021 DECLARE_BPOS_CLASS (Charbpos, Charcount) | |
| 1022 DECLARE_BAD_CHAR_INTCLASS_ARITH_COMPARE (Charbpos) | |
| 1023 }; | |
| 1024 | |
| 1025 class Charxpos | |
| 1026 { | |
| 1027 DECLARE_XPOS_CLASS (Charxpos, Charcount, Charbpos, Charcount) | |
| 1028 DECLARE_BAD_CHAR_INTCLASS_ARITH_COMPARE (Charxpos) | |
| 1029 }; | |
| 1030 | |
| 1031 class Bytecount | |
| 1032 { | |
| 1033 DECLARE_COUNT_CLASS (Bytecount) | |
| 1034 DECLARE_BAD_BYTE_INTCLASS_ARITH_COMPARE (Bytecount) | |
| 1035 }; | |
| 1036 | |
| 1037 class Bytebpos | |
| 1038 { | |
| 1039 DECLARE_BPOS_CLASS (Bytebpos, Bytecount) | |
| 1040 DECLARE_BAD_BYTE_INTCLASS_ARITH_COMPARE (Bytebpos) | |
| 1041 }; | |
| 1042 | |
| 1043 class Bytexpos | |
| 1044 { | |
| 1045 DECLARE_XPOS_CLASS (Bytexpos, Bytecount, Bytebpos, Bytecount) | |
| 1046 DECLARE_BAD_BYTE_INTCLASS_ARITH_COMPARE (Bytexpos) | |
| 1047 }; | |
| 1048 | |
| 1049 class Membpos | |
| 1050 { | |
| 1051 DECLARE_BPOS_CLASS (Membpos, Bytecount) | |
| 1052 DECLARE_BAD_MEM_INTCLASS_ARITH_COMPARE (Membpos) | |
| 1053 }; | |
| 1054 | |
| 1055 class Memxpos | |
| 1056 { | |
| 1057 DECLARE_XPOS_CLASS (Memxpos, Bytecount, Membpos, Bytecount) | |
| 1058 DECLARE_BAD_MEM_INTCLASS_ARITH_COMPARE (Memxpos) | |
| 1059 }; | |
| 1060 | |
| 826 | 1061 #define DECLARE_POINTER_TYPE_ARITH_COUNT(pointer, countcl) \ |
| 1062 inline pointer operator += (const pointer & x, const countcl& y) \ | |
| 1063 { x += y.data; return x; } \ | |
| 1064 inline pointer operator -= (const pointer & x, const countcl& y) \ | |
| 1065 { x -= y.data; return x; } \ | |
| 1066 inline pointer operator + (const pointer x, const countcl& y) \ | |
| 1067 { return x + y.data; } \ | |
| 1068 inline pointer operator - (const pointer x, const countcl& y) \ | |
| 814 | 1069 { return x - y.data; } |
| 1070 | |
| 1071 #define DECLARE_INTEGRAL_TYPE_ARITH_COUNT(integral, countcl) \ | |
| 1072 inline integral operator += (integral & x, const countcl& y) \ | |
| 1073 { x += y.data; return x; } \ | |
| 1074 inline integral operator -= (integral & x, const countcl& y) \ | |
| 1075 { x -= y.data; return x; } \ | |
| 1076 inline countcl operator + (integral x, const countcl& y) \ | |
| 1077 { return countcl (x + y.data); } \ | |
| 1078 inline countcl operator - (integral x, const countcl& y) \ | |
| 1079 { return countcl (x - y.data); } | |
| 1080 | |
| 1081 #define DECLARE_INTEGRAL_TYPE_COMPARE(integral, cl) \ | |
| 1082 inline bool operator < (integral x, const cl& y) \ | |
| 1083 { return (EMACS_INT) x < y.data; } \ | |
| 1084 inline bool operator <= (integral x, const cl& y) \ | |
| 1085 { return (EMACS_INT) x <= y.data; } \ | |
| 1086 inline bool operator > (integral x, const cl& y) \ | |
| 1087 { return (EMACS_INT) x > y.data; } \ | |
| 1088 inline bool operator >= (integral x, const cl& y) \ | |
| 1089 { return (EMACS_INT) x >= y.data; } \ | |
| 1090 inline bool operator == (integral x, const cl& y) \ | |
| 1091 { return (EMACS_INT) x == y.data; } \ | |
| 1092 inline bool operator != (integral x, const cl& y) \ | |
| 1093 { return (EMACS_INT) x != y.data; } | |
| 1094 | |
| 1095 #if 0 | |
| 1096 /* Unfortunately C++ doesn't let you overload the ?: operator, so we have | |
| 1097 to manually deal with ambiguities using casting */ | |
| 1098 #define DECLARE_INTEGRAL_TYPE_TRISTATE(integral, cl) \ | |
| 1099 inline cl operator ?: (bool b, integral x, const cl& y) \ | |
| 1100 { return b ? cl (x) : y; } \ | |
| 1101 inline cl operator ?: (bool b, const cl& x, integral y) \ | |
| 1102 { return b ? x : cl (y); } | |
| 1103 #endif /* 0 */ | |
| 1104 | |
| 867 | 1105 /* DECLARE_POINTER_TYPE_ARITH_COUNT (const Ibyte *, Bytecount); |
| 826 | 1106 DECLARE_POINTER_TYPE_ARITH_COUNT (const Extbyte *, Bytecount); */ |
| 867 | 1107 DECLARE_POINTER_TYPE_ARITH_COUNT (Ibyte *, Bytecount); |
| 814 | 1108 DECLARE_POINTER_TYPE_ARITH_COUNT (Extbyte *, Bytecount); |
| 1109 | |
| 1110 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (int, Bytecount); | |
| 1111 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (int, Charcount); | |
| 1112 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (unsigned int, Bytecount); | |
| 1113 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (unsigned int, Charcount); | |
| 1114 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (long, Bytecount); | |
| 1115 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (long, Charcount); | |
| 1116 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (unsigned long, Bytecount); | |
| 1117 DECLARE_INTEGRAL_TYPE_ARITH_COUNT (unsigned long, Charcount); | |
| 1118 | |
| 1119 DECLARE_INTEGRAL_TYPE_COMPARE (int, Bytecount); | |
| 1120 DECLARE_INTEGRAL_TYPE_COMPARE (int, Charcount); | |
| 1121 DECLARE_INTEGRAL_TYPE_COMPARE (unsigned int, Bytecount); | |
| 1122 DECLARE_INTEGRAL_TYPE_COMPARE (unsigned int, Charcount); | |
| 1123 DECLARE_INTEGRAL_TYPE_COMPARE (long, Bytecount); | |
| 1124 DECLARE_INTEGRAL_TYPE_COMPARE (long, Charcount); | |
| 1125 DECLARE_INTEGRAL_TYPE_COMPARE (unsigned long, Bytecount); | |
| 1126 DECLARE_INTEGRAL_TYPE_COMPARE (unsigned long, Charcount); | |
| 1127 | |
| 1128 #if 0 /* doesn't work */ | |
| 867 | 1129 inline Bytecount operator - (const Ibyte *x, const Ibyte *y) \ |
| 814 | 1130 { return Bytecount (x - y); } |
| 1131 #endif | |
| 1132 | |
| 1133 #endif /* __cplusplus */ | |
| 1134 | |
| 665 | 1135 /* Counts of elements */ |
| 1136 typedef EMACS_INT Elemcount; | |
| 1137 /* Hash codes */ | |
| 1138 typedef unsigned long Hashcode; | |
| 2367 | 1139 /* Booleans */ |
| 1140 typedef int Boolint; | |
| 771 | 1141 |
| 793 | 1142 /* ------------------------ basic compiler defines ------------------- */ |
| 428 | 1143 |
| 1743 | 1144 #include "compiler.h" |
| 1632 | 1145 |
| 793 | 1146 /* ------------------------ alignment definitions ------------------- */ |
| 1147 | |
| 454 | 1148 /* No type has a greater alignment requirement than max_align_t. |
| 1149 (except perhaps for types we don't use, like long double) */ | |
| 1150 typedef union | |
| 1151 { | |
| 1152 struct { long l; } l; | |
| 1153 struct { void *p; } p; | |
| 1154 struct { void (*f)(void); } f; | |
| 1155 struct { double d; } d; | |
| 1156 } max_align_t; | |
| 1157 | |
| 771 | 1158 /* ALIGNOF returns the required alignment of a type -- i.e. a value such |
| 1159 that data of this type must begin at a memory address which is a | |
| 1160 multiple of that value. For simple types, this is often the same size | |
| 1161 as the type itself. */ | |
| 1162 | |
| 428 | 1163 #ifndef ALIGNOF |
| 1164 # if defined (__GNUC__) && (__GNUC__ >= 2) | |
| 454 | 1165 /* gcc has an extension that gives us exactly what we want. */ |
| 1166 # define ALIGNOF(type) __alignof__ (type) | |
| 1167 # elif ! defined (__cplusplus) | |
| 1168 /* The following is mostly portable, except that: | |
| 1169 - it doesn't work for inside out declarations like void (*) (void). | |
| 1170 (so just call ALIGNOF with a typedef'ed name) | |
| 1171 - it doesn't work with C++. The C++ committee has decided, | |
| 1172 in its infinite wisdom, that: | |
| 1173 "Types must be declared in declarations, not in expressions." */ | |
| 1174 # define ALIGNOF(type) offsetof (struct { char c; type member; }, member) | |
| 428 | 1175 # else |
| 456 | 1176 /* C++ is annoying, but it has a big bag of tricks. |
| 1177 The following doesn't have the "inside out" declaration bug C does. */ | |
| 458 | 1178 template<typename T> struct alignment_trick { char c; T member; }; |
| 456 | 1179 # define ALIGNOF(type) offsetof (alignment_trick<type>, member) |
| 428 | 1180 # endif |
| 454 | 1181 #endif /* ALIGNOF */ |
| 428 | 1182 |
| 771 | 1183 /* ALIGN_SIZE returns the smallest size greater than or equal to LEN which |
| 1184 is a multiple of UNIT. This can be used to assure that data that | |
| 1185 follows a block of the returned size is of correct alignment for a type | |
| 1186 whose alignment (as returned by ALIGNOF) is UNIT (provided that the | |
| 1187 block itself is correctly aligned for this type; memory returned by | |
| 1188 malloc() is guaranteed to be correctly aligned for all types). */ | |
| 1189 | |
| 428 | 1190 #define ALIGN_SIZE(len, unit) \ |
| 1191 ((((len) + (unit) - 1) / (unit)) * (unit)) | |
| 1192 | |
| 826 | 1193 /* ALIGN_FOR_TYPE returns the smallest size greater than or equal to LEN |
| 1194 which is aligned for the given type. This can be used to assure that | |
| 1195 data that follows a block of the returned size is of correct alignment | |
| 1196 for the type (provided that the block itself is correctly aligned for | |
| 1197 this type; memory returned by malloc() is guaranteed to be correctly | |
| 1198 aligned for all types). */ | |
| 1199 | |
| 1200 #define ALIGN_FOR_TYPE(len, type) ALIGN_SIZE (len, ALIGNOF (type)) | |
| 1201 | |
| 771 | 1202 /* MAX_ALIGN_SIZE returns the smallest size greater than or equal to LEN |
| 1203 which guarantees that data following a block of such size is correctly | |
| 1204 aligned for all types (provided that the block itself is so aligned, | |
| 1205 which is the case for memory returned by malloc()). */ | |
| 1206 | |
| 826 | 1207 #define MAX_ALIGN_SIZE(len) ALIGN_FOR_TYPE (len, max_align_t) |
| 1208 | |
| 1209 /* ALIGN_PTR returns the smallest pointer >= PTR which is aligned for | |
| 1210 data of TYPE. */ | |
| 1211 #define ALIGN_PTR(ptr, type) ((void *) ALIGN_FOR_TYPE ((size_t) (ptr), type)) | |
| 428 | 1212 |
| 1743 | 1213 BEGIN_C_DECLS |
| 1650 | 1214 |
| 793 | 1215 /* ------------------------ assertions ------------------- */ |
| 428 | 1216 |
| 1217 /* We define assert iff USE_ASSERTIONS or DEBUG_XEMACS is defined. | |
| 1218 Otherwise we define it to be empty. Quantify has shown that the | |
| 1219 time the assert checks take is measurable so let's not include them | |
| 771 | 1220 in production binaries. |
| 1221 | |
| 788 | 1222 If ASSERTIONS_DONT_ABORT defined, we will continue after assertion |
| 1223 failures. | |
| 1224 | |
| 1225 assert_at_line() is used for asserts inside of inline functions called | |
| 1226 from error-checking macros. If we're not tricky, we just get the file | |
| 1227 and line of the inline function, which is not very useful. */ | |
| 428 | 1228 |
| 1229 /* Highly dubious kludge */ | |
| 1230 /* (thanks, Jamie, I feel better now -- ben) */ | |
| 2367 | 1231 MODULE_API void assert_failed (const Ascbyte *, int, const Ascbyte *); |
|
4914
1628e3b9601a
When aborting due to unknown opcode, output more descriptive msg
Ben Wing <ben@xemacs.org>
parents:
4910
diff
changeset
|
1232 #define ABORT() assert_failed (__FILE__, __LINE__, "ABORT()") |
|
4921
17362f371cc2
add more byte-code assertions and better failure output
Ben Wing <ben@xemacs.org>
parents:
4914
diff
changeset
|
1233 #define abort_with_message(msg) assert_failed (__FILE__, __LINE__, msg) |
| 2535 | 1234 |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1235 /* This used to be ((void) (0)) but that triggers lots of unused variable |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1236 warnings. It's pointless to force all that code to be rewritten, with |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1237 added ifdefs. Any reasonable compiler will eliminate an expression with |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1238 no effects. We keep this abstracted out like this in case we want to |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1239 change it in the future. */ |
|
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1240 #define disabled_assert(x) ((void) (x)) |
| 4932 | 1241 #define disabled_assert_with_message(x, msg) ((void) msg, disabled_assert (x)) |
| 1242 #define disabled_assert_at_line(x, file, line) \ | |
| 1243 ((void) file, (void) line, disabled_assert (x)) | |
|
4843
715b15990d0a
add more foo_checking_assert macros
Ben Wing <ben@xemacs.org>
parents:
4841
diff
changeset
|
1244 |
| 2535 | 1245 #ifdef USE_ASSERTIONS |
| 428 | 1246 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x)) |
| 853 | 1247 # define assert_with_message(x, msg) \ |
| 1248 ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, msg)) | |
| 788 | 1249 # define assert_at_line(x, file, line) \ |
| 1250 ((x) ? (void) 0 : assert_failed (file, line, #x)) | |
| 428 | 1251 #else |
| 2956 | 1252 /* This used to be ((void) (0)) but that triggers lots of unused variable |
| 1253 warnings. It's pointless to force all that code to be rewritten, with | |
| 1254 added ifdefs. Any reasonable compiler will eliminate an expression with | |
| 1255 no effects. */ | |
| 4932 | 1256 # define assert(x) disabled_assert (x) |
| 1257 # define assert_with_message(x, msg) disabled_assert_with_message (x, msg) | |
| 1258 # define assert_at_line(x, file, line) disabled_assert_at_line (x, file, line) | |
| 428 | 1259 #endif |
| 1260 | |
| 2367 | 1261 /************************************************************************/ |
| 1262 /** Memory allocation **/ | |
| 1263 /************************************************************************/ | |
| 853 | 1264 |
| 793 | 1265 /* ------------------------ simple memory allocation ------------------- */ |
| 1266 | |
| 2367 | 1267 /* Basic memory allocation and freeing functions */ |
| 1268 void malloc_warning (const Ascbyte *); | |
| 1743 | 1269 MODULE_API void *xmalloc (Bytecount size) ATTRIBUTE_MALLOC; |
| 1270 MODULE_API void *xmalloc_and_zero (Bytecount size) ATTRIBUTE_MALLOC; | |
| 1271 MODULE_API void *xrealloc (void *, Bytecount size) ATTRIBUTE_MALLOC; | |
| 2367 | 1272 MODULE_API Chbyte *xstrdup (const Chbyte *) ATTRIBUTE_MALLOC; |
| 1273 | |
| 1274 /* Basic free function */ | |
| 1275 | |
| 1276 MODULE_API void xfree_1 (void *); | |
| 1277 #ifdef ERROR_CHECK_MALLOC | |
|
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4969
diff
changeset
|
1278 /* This used to use a temporary variable. But that triggered |
| 2367 | 1279 complaints under strict aliasing. #### There should be a better way. */ |
|
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4969
diff
changeset
|
1280 #define xfree(lvalue) do \ |
| 2367 | 1281 { \ |
| 1282 xfree_1 (lvalue); \ | |
| 3988 | 1283 VOIDP_CAST (lvalue) = (void *) DEADBEEF_CONSTANT; \ |
| 2367 | 1284 } while (0) |
| 1285 #else | |
|
4976
16112448d484
Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents:
4969
diff
changeset
|
1286 #define xfree(lvalue) xfree_1 (lvalue) |
| 2367 | 1287 #endif /* ERROR_CHECK_MALLOC */ |
| 1288 | |
| 1289 /* ------------------------ stack allocation -------------------------- */ | |
| 1290 | |
| 1291 /* Allocating excessively large blocks on the stack can cause crashes. | |
| 851 | 1292 We provide MALLOC_OR_ALLOCA() below for places where it's likely that |
| 1293 large amounts will be allocated; it mallocs the block if it's too big. | |
| 1294 Unfortunately, that requires a call to unbind_to() at the end of the | |
| 1295 function, and it's not feasible to rewrite all calls to alloca() this | |
| 1296 way. | |
| 1297 | |
| 1298 Instead, we use the portable C alloca() substitute in alloca.c above a | |
| 1299 certain size. This actually uses malloc(), but checks the current stack | |
| 1300 pointer to see if data from previous alloca() calls needs to be freed. | |
| 1301 However, this can lead to large heap sizes -- especially since cleanup | |
| 1302 can only happen in a parent function, and will never happen if (as will | |
| 1303 often be the case) it's the same function in the same place in the code | |
| 1304 that keeps tripping the alloca() limit. | |
| 1305 | |
| 1306 So we set up a system to periodically force cleanup. Currently we | |
| 1307 do cleanup: | |
| 1308 | |
| 1309 -- Only when there's C alloca() data, and then | |
| 1310 -- Every stack alloca() or allocation of Lisp data, every call to | |
| 1311 next_event_internal() [typically near the top of the stack], | |
| 1312 or every 10th funcall | |
| 1313 | |
| 1314 This should not be a big penalty because | |
| 1315 | |
| 1316 (a) If there are few C alloca() chunks, checking them will be fast | |
| 1317 (b) If not, we've allocated a huge amount of heap space (remember, each | |
| 1318 chunk represents > 256K of heap), and we really want them gone | |
| 1319 */ | |
| 1320 | |
| 1321 /* We use a larger maximum when the choice is alloca() vs. the C alloca() | |
| 1322 substitute than when the choice is vs. malloc(), because in the former | |
| 1323 case, our alternative choice is less palatable because the memory may | |
| 1324 not be freed for awhile. */ | |
| 1325 | |
| 1326 #define MAX_ALLOCA_VS_C_ALLOCA 262144 | |
| 1327 #define MAX_ALLOCA_VS_MALLOC 65536 | |
| 1328 | |
| 1329 #define MAX_FUNCALLS_BETWEEN_ALLOCA_CLEANUP 10 | |
| 1330 | |
| 1632 | 1331 extern MODULE_API Bytecount __temp_alloca_size__; |
| 851 | 1332 extern Bytecount funcall_alloca_count; |
| 1333 | |
| 1333 | 1334 #ifdef ERROR_CHECK_MALLOC |
| 1632 | 1335 extern MODULE_API int regex_malloc_disallowed; |
| 1333 | 1336 #define REGEX_MALLOC_CHECK() assert (!regex_malloc_disallowed) |
| 1337 #else | |
| 1338 #define REGEX_MALLOC_CHECK() ((void) 0) | |
| 1339 #endif | |
| 1340 | |
| 851 | 1341 /* Do stack or heap alloca() depending on size. |
| 1342 | |
| 1343 NOTE: The use of a global temporary like this is unsafe if ALLOCA() occurs | |
| 1344 twice anywhere in the same expression; but that seems highly unlikely. The | |
| 1345 alternative is to force all callers to declare a local temporary if the | |
| 1346 expression has side effects -- something easy to forget. */ | |
| 1347 | |
| 1348 #define ALLOCA(size) \ | |
| 1333 | 1349 (REGEX_MALLOC_CHECK (), \ |
| 1350 __temp_alloca_size__ = (size), \ | |
| 851 | 1351 __temp_alloca_size__ > MAX_ALLOCA_VS_C_ALLOCA ? \ |
| 1352 xemacs_c_alloca (__temp_alloca_size__) : \ | |
| 1353 (need_to_check_c_alloca ? xemacs_c_alloca (0) : 0, \ | |
| 1354 alloca (__temp_alloca_size__))) | |
| 1355 | |
| 1318 | 1356 /* Version of ALLOCA() that is guaranteed to work inside of function calls |
| 1357 (i.e., we call the C alloca if regular alloca() is broken inside of | |
| 1358 function calls). */ | |
| 1359 #ifdef BROKEN_ALLOCA_IN_FUNCTION_CALLS | |
| 1360 #define ALLOCA_FUNCALL_OK(size) xemacs_c_alloca (size) | |
| 1361 #else | |
| 1362 #define ALLOCA_FUNCALL_OK(size) ALLOCA (size) | |
| 1363 #endif | |
| 1364 | |
| 2367 | 1365 MODULE_API void *xemacs_c_alloca (unsigned int size) ATTRIBUTE_MALLOC; |
| 1366 | |
| 1367 MODULE_API int record_unwind_protect_freeing (void *ptr); | |
| 1368 | |
| 1369 DECLARE_INLINE_HEADER ( | |
| 1370 void * | |
| 1371 xmalloc_and_record_unwind (Bytecount size) | |
| 1372 ) | |
| 1373 { | |
| 1374 void *ptr = xmalloc (size); | |
| 1375 record_unwind_protect_freeing (ptr); | |
| 1376 return ptr; | |
| 1377 } | |
| 1378 | |
| 851 | 1379 /* WARNING: If you use this, you must unbind_to() at the end of your |
| 1380 function! */ | |
| 1381 | |
| 1382 #define MALLOC_OR_ALLOCA(size) \ | |
| 1333 | 1383 (REGEX_MALLOC_CHECK (), \ |
| 1384 __temp_alloca_size__ = (size), \ | |
| 851 | 1385 __temp_alloca_size__ > MAX_ALLOCA_VS_MALLOC ? \ |
| 1386 xmalloc_and_record_unwind (__temp_alloca_size__) : \ | |
| 1387 (need_to_check_c_alloca ? xemacs_c_alloca (0) : 0, \ | |
| 1388 alloca (__temp_alloca_size__))) | |
| 793 | 1389 |
| 2367 | 1390 /* -------------- convenience functions for memory allocation ------------- */ |
| 1391 | |
| 1392 #define countof(x) ((int) (sizeof(x)/sizeof((x)[0]))) | |
| 1393 #define xnew(type) ((type *) xmalloc (sizeof (type))) | |
| 1394 #define xnew_array(type, len) ((type *) xmalloc ((len) * sizeof (type))) | |
| 1395 #define xnew_and_zero(type) ((type *) xmalloc_and_zero (sizeof (type))) | |
| 1396 #define xzero(lvalue) ((void) memset (&(lvalue), '\0', sizeof (lvalue))) | |
| 1397 #define xnew_array_and_zero(type, len) ((type *) xmalloc_and_zero ((len) * sizeof (type))) | |
| 1398 | |
| 1399 #define alloca_new(type) ((type *) ALLOCA (sizeof (type))) | |
| 1400 #define alloca_array(type, len) ((type *) ALLOCA ((len) * sizeof (type))) | |
| 1401 | |
| 1402 #define alloca_itexts(num) alloca_array (Itext, num) | |
| 1403 #define alloca_ibytes(num) alloca_array (Ibyte, num) | |
| 1404 #define alloca_extbytes(num) alloca_array (Extbyte, num) | |
| 1405 #define alloca_rawbytes(num) alloca_array (Rawbyte, num) | |
| 1406 #define alloca_binbytes(num) alloca_array (Binbyte, num) | |
| 1407 #define alloca_ascbytes(num) alloca_array (Ascbyte, num) | |
| 1408 #define xmalloc_itexts(num) xnew_array (Itext, num) | |
| 1409 #define xnew_ibytes(num) xnew_array (Ibyte, num) | |
| 1410 #define xnew_extbytes(num) xnew_array (Extbyte, num) | |
| 1411 #define xnew_rawbytes(num) xnew_array (Rawbyte, num) | |
| 1412 #define xnew_binbytes(num) xnew_array (Binbyte, num) | |
| 1413 #define xnew_ascbytes(num) xnew_array (Ascbyte, num) | |
| 1414 | |
| 1415 /* Make an alloca'd copy of a Ibyte * */ | |
| 1416 #define IBYTE_STRING_TO_ALLOCA(p, lval) \ | |
| 1417 do { \ | |
| 1418 Ibyte **_bsta_ = (Ibyte **) &(lval); \ | |
| 1419 const Ibyte *_bsta_2 = (p); \ | |
| 1420 Bytecount _bsta_3 = qxestrlen (_bsta_2); \ | |
| 1421 *_bsta_ = alloca_ibytes (1 + _bsta_3); \ | |
| 1422 memcpy (*_bsta_, _bsta_2, 1 + _bsta_3); \ | |
| 1423 } while (0) | |
| 1424 | |
| 1425 /* ----------------- convenience functions for reallocation --------------- */ | |
| 1426 | |
| 1427 #define XREALLOC_ARRAY(ptr, type, len) \ | |
| 1428 ((void) (ptr = (type *) xrealloc (ptr, (len) * sizeof (type)))) | |
| 1429 | |
| 793 | 1430 /* also generally useful if you want to avoid arbitrary size limits |
| 1431 but don't need a full dynamic array. Assumes that BASEVAR points | |
| 1432 to a malloced array of TYPE objects (or possibly a NULL pointer, | |
| 1433 if SIZEVAR is 0), with the total size stored in SIZEVAR. This | |
| 1434 macro will realloc BASEVAR as necessary so that it can hold at | |
| 1435 least NEEDED_SIZE objects. The reallocing is done by doubling, | |
| 1436 which ensures constant amortized time per element. */ | |
| 1437 #define DO_REALLOC(basevar, sizevar, needed_size, type) do { \ | |
| 1438 Bytecount do_realloc_needed_size = (needed_size); \ | |
| 1333 | 1439 REGEX_MALLOC_CHECK (); \ |
| 793 | 1440 if ((sizevar) < do_realloc_needed_size) \ |
| 1441 { \ | |
| 1442 if ((sizevar) < 32) \ | |
| 1443 (sizevar) = 32; \ | |
| 1444 while ((sizevar) < do_realloc_needed_size) \ | |
| 1445 (sizevar) *= 2; \ | |
| 1446 XREALLOC_ARRAY (basevar, type, (sizevar)); \ | |
| 1447 } \ | |
| 1448 } while (0) | |
| 1449 | |
| 2367 | 1450 /************************************************************************/ |
| 1451 /** Definitions of more complex types **/ | |
| 1452 /************************************************************************/ | |
| 428 | 1453 |
| 647 | 1454 /* Note that the simplest typedefs are near the top of this file. */ |
| 1455 | |
| 428 | 1456 /* We put typedefs here so that prototype declarations don't choke. |
| 1457 Note that we don't actually declare the structures here (except | |
| 1458 maybe for simple structures like Dynarrs); that keeps them private | |
| 1459 to the routines that actually use them. */ | |
| 1460 | |
| 771 | 1461 /* ------------------------------- */ |
| 1462 /* Error_Behavior typedefs */ | |
| 1463 /* ------------------------------- */ | |
| 1464 | |
| 800 | 1465 #ifndef ERROR_CHECK_TYPES |
| 771 | 1466 |
| 1467 typedef enum error_behavior | |
| 428 | 1468 { |
| 771 | 1469 ERROR_ME, |
| 1470 ERROR_ME_NOT, | |
| 793 | 1471 ERROR_ME_WARN, |
| 1472 ERROR_ME_DEBUG_WARN | |
| 771 | 1473 } Error_Behavior; |
| 1474 | |
| 1475 #define ERRB_EQ(a, b) ((a) == (b)) | |
| 1476 | |
| 1477 #else | |
| 1478 | |
| 1479 /* By defining it like this, we provide strict type-checking | |
| 1480 for code that lazily uses ints. */ | |
| 1481 | |
| 1482 typedef struct _error_behavior_struct_ | |
| 428 | 1483 { |
| 771 | 1484 int really_unlikely_name_to_have_accidentally_in_a_non_errb_structure; |
| 1485 } Error_Behavior; | |
| 1486 | |
| 1487 extern Error_Behavior ERROR_ME; | |
| 1488 extern Error_Behavior ERROR_ME_NOT; | |
| 1489 extern Error_Behavior ERROR_ME_WARN; | |
| 793 | 1490 extern Error_Behavior ERROR_ME_DEBUG_WARN; |
| 771 | 1491 |
| 1492 #define ERRB_EQ(a, b) \ | |
| 1493 ((a).really_unlikely_name_to_have_accidentally_in_a_non_errb_structure == \ | |
| 1494 (b).really_unlikely_name_to_have_accidentally_in_a_non_errb_structure) | |
| 1495 | |
| 1496 #endif | |
| 1497 | |
| 1498 /* ------------------------------- */ | |
| 1499 /* Empty structures and typedefs */ | |
| 1500 /* ------------------------------- */ | |
| 428 | 1501 |
| 1502 struct buffer; /* "buffer.h" */ | |
| 1503 struct console; /* "console.h" */ | |
| 1504 struct device; /* "device.h" */ | |
| 1505 struct extent_fragment; | |
| 1506 struct extent; | |
| 1507 struct frame; /* "frame.h" */ | |
| 1508 struct window; /* "window.h" */ | |
| 771 | 1509 struct utimbuf; /* "systime.h" or <utime.h> */ |
| 428 | 1510 struct display_line; |
| 1511 struct display_glyph_area; | |
| 1512 struct display_box; | |
| 1513 struct redisplay_info; | |
| 1514 struct window_mirror; | |
| 1515 struct scrollbar_instance; | |
| 1516 struct font_metric_info; | |
| 1517 struct face_cachel; | |
| 1518 struct console_type_entry; | |
| 1519 | |
| 771 | 1520 /* This is shared by process.h, events.h and others in future. |
| 1521 See events.h for description */ | |
| 4123 | 1522 typedef unsigned EMACS_INT USID; |
| 771 | 1523 typedef int face_index; |
| 1524 typedef int glyph_index; | |
| 1726 | 1525 typedef struct lstream Lstream; /* lstream.h */ |
| 872 | 1526 typedef struct extent *EXTENT; /* extents-impl.h */ |
| 771 | 1527 typedef struct Lisp_Event Lisp_Event; /* "events.h" */ |
| 872 | 1528 typedef struct Lisp_Face Lisp_Face; /* "faces-impl.h" */ |
| 771 | 1529 typedef struct Lisp_Process Lisp_Process; /* "procimpl.h" */ |
| 872 | 1530 typedef struct Lisp_Color_Instance Lisp_Color_Instance; /* objects-impl.h */ |
| 1531 typedef struct Lisp_Font_Instance Lisp_Font_Instance; /* objects-impl.h */ | |
| 1726 | 1532 typedef struct Lisp_Image_Instance Lisp_Image_Instance; /* glyphs.h */ |
| 771 | 1533 typedef struct Lisp_Gui_Item Lisp_Gui_Item; |
| 1534 | |
| 1535 /* ------------------------------- */ | |
| 1536 /* enum typedefs */ | |
| 1537 /* ------------------------------- */ | |
| 1538 | |
| 428 | 1539 enum run_hooks_condition |
| 1540 { | |
| 1541 RUN_HOOKS_TO_COMPLETION, | |
| 1542 RUN_HOOKS_UNTIL_SUCCESS, | |
| 1543 RUN_HOOKS_UNTIL_FAILURE | |
| 1544 }; | |
| 1545 | |
| 1546 #ifdef HAVE_TOOLBARS | |
| 1547 enum toolbar_pos | |
| 1548 { | |
| 1549 TOP_TOOLBAR, | |
| 1550 BOTTOM_TOOLBAR, | |
| 1551 LEFT_TOOLBAR, | |
| 1552 RIGHT_TOOLBAR | |
| 1553 }; | |
| 1554 #endif | |
| 1555 | |
| 1556 enum edge_style | |
| 1557 { | |
| 1558 EDGE_ETCHED_IN, | |
| 1559 EDGE_ETCHED_OUT, | |
| 1560 EDGE_BEVEL_IN, | |
| 1561 EDGE_BEVEL_OUT | |
| 1562 }; | |
| 1563 | |
| 1564 enum munge_me_out_the_door | |
| 1565 { | |
| 1566 MUNGE_ME_FUNCTION_KEY, | |
| 1567 MUNGE_ME_KEY_TRANSLATION | |
| 1568 }; | |
| 1569 | |
|
5015
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1570 /* The various stages of font instantiation; initial means "find a font for |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1571 CHARSET that matches the charset's registries" and final means "find a |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1572 font for CHARSET that matches iso10646-1, since we haven't found a font |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1573 that matches its registry." |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1574 */ |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1575 enum font_specifier_matchspec_stages |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1576 { |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1577 STAGE_INITIAL, |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1578 STAGE_FINAL, |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1579 NUM_MATCHSPEC_STAGES, |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1580 }; |
|
d95c102a96d3
cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents:
5013
diff
changeset
|
1581 |
| 771 | 1582 /* ------------------------------- */ |
| 1583 /* misc */ | |
| 1584 /* ------------------------------- */ | |
| 1585 | |
| 1586 #ifdef MEMORY_USAGE_STATS | |
| 1587 | |
| 1588 /* This structure is used to keep statistics on the amount of memory | |
| 1589 in use. | |
| 1590 | |
| 1591 WAS_REQUESTED stores the actual amount of memory that was requested | |
| 1592 of the allocation function. The *_OVERHEAD fields store the | |
| 1593 additional amount of memory that was grabbed by the functions to | |
| 1594 facilitate allocation, reallocation, etc. MALLOC_OVERHEAD is for | |
| 1595 memory allocated with malloc(); DYNARR_OVERHEAD is for dynamic | |
| 1596 arrays; GAP_OVERHEAD is for gap arrays. Note that for (e.g.) | |
| 1597 dynamic arrays, there is both MALLOC_OVERHEAD and DYNARR_OVERHEAD | |
| 1598 memory: The dynamic array allocates memory above and beyond what | |
| 1599 was asked of it, and when it in turns allocates memory using | |
| 1600 malloc(), malloc() allocates memory beyond what it was asked | |
| 1601 to allocate. | |
| 1602 | |
| 1603 Functions that accept a structure of this sort do not initialize | |
| 1604 the fields to 0, and add any existing values to whatever was there | |
| 1605 before; this way, you can get a cumulative effect. */ | |
| 1606 | |
| 1607 struct overhead_stats | |
| 1608 { | |
| 1609 int was_requested; | |
| 1610 int malloc_overhead; | |
| 1611 int dynarr_overhead; | |
| 1612 int gap_overhead; | |
| 1613 }; | |
| 1614 | |
| 1615 #endif /* MEMORY_USAGE_STATS */ | |
| 1616 | |
| 428 | 1617 |
| 1618 /************************************************************************/ | |
| 1619 /* Definition of Lisp_Object data type */ | |
| 1620 /************************************************************************/ | |
| 1621 | |
| 1622 /* Define the fundamental Lisp data structures */ | |
| 1623 | |
| 1624 /* This is the set of Lisp data types */ | |
| 1625 | |
| 1626 enum Lisp_Type | |
| 1627 { | |
| 1628 Lisp_Type_Record, | |
| 1629 Lisp_Type_Int_Even, | |
| 1630 Lisp_Type_Char, | |
| 1631 Lisp_Type_Int_Odd | |
| 1632 }; | |
| 1633 | |
| 1634 #define POINTER_TYPE_P(type) ((type) == Lisp_Type_Record) | |
| 1635 | |
| 1636 /* Overridden by m/next.h */ | |
| 1637 #ifndef ASSERT_VALID_POINTER | |
| 1638 # define ASSERT_VALID_POINTER(pnt) (assert ((((EMACS_UINT) pnt) & 3) == 0)) | |
| 1639 #endif | |
| 1640 | |
| 1641 #define GCMARKBITS 0 | |
| 1642 #define GCTYPEBITS 2 | |
| 1643 #define GCBITS 2 | |
| 1644 #define INT_GCBITS 1 | |
| 1645 | |
| 1646 #define INT_VALBITS (BITS_PER_EMACS_INT - INT_GCBITS) | |
| 1647 #define VALBITS (BITS_PER_EMACS_INT - GCBITS) | |
| 542 | 1648 #define EMACS_INT_MAX ((EMACS_INT) ((1UL << (INT_VALBITS - 1)) -1UL)) |
| 442 | 1649 #define EMACS_INT_MIN (-(EMACS_INT_MAX) - 1) |
| 802 | 1650 /* WARNING: evaluates its arg twice. */ |
| 1651 #define NUMBER_FITS_IN_AN_EMACS_INT(num) \ | |
| 1652 ((num) <= EMACS_INT_MAX && (num) >= EMACS_INT_MIN) | |
| 428 | 1653 |
| 1654 #ifdef USE_UNION_TYPE | |
| 1655 # include "lisp-union.h" | |
| 1656 #else /* !USE_UNION_TYPE */ | |
| 1657 # include "lisp-disunion.h" | |
| 1658 #endif /* !USE_UNION_TYPE */ | |
| 1659 | |
| 1660 #define XPNTR(x) ((void *) XPNTRVAL(x)) | |
| 1661 | |
| 1662 /* Close your eyes now lest you vomit or spontaneously combust ... */ | |
| 1663 | |
| 1664 #define HACKEQ_UNSAFE(obj1, obj2) \ | |
| 1665 (EQ (obj1, obj2) || (!POINTER_TYPE_P (XTYPE (obj1)) \ | |
| 1666 && !POINTER_TYPE_P (XTYPE (obj2)) \ | |
| 1667 && XCHAR_OR_INT (obj1) == XCHAR_OR_INT (obj2))) | |
| 1668 | |
| 1669 #ifdef DEBUG_XEMACS | |
| 1632 | 1670 extern MODULE_API int debug_issue_ebola_notices; |
| 1671 MODULE_API int eq_with_ebola_notice (Lisp_Object, Lisp_Object); | |
| 428 | 1672 #define EQ_WITH_EBOLA_NOTICE(obj1, obj2) \ |
| 1673 (debug_issue_ebola_notices ? eq_with_ebola_notice (obj1, obj2) \ | |
| 1674 : EQ (obj1, obj2)) | |
| 1675 #else | |
| 1676 #define EQ_WITH_EBOLA_NOTICE(obj1, obj2) EQ (obj1, obj2) | |
| 1677 #endif | |
| 1678 | |
| 1679 /* OK, you can open them again */ | |
| 1680 | |
| 1743 | 1681 END_C_DECLS |
| 1650 | 1682 |
| 4967 | 1683 #include "lrecord.h" |
| 1684 | |
| 5013 | 1685 /* Turn any void * pointer into a Lisp object. This is the counterpart of |
| 1686 STORE_LISP_IN_VOID, which works in the opposite direction. Note that | |
| 1687 you CANNOT use STORE_LISP_IN_VOID to undo the effects of STORE_VOID_IN_LISP! | |
| 1688 Instead, you GET_VOID_FROM_LISP: | |
| 1689 | |
| 1690 STORE_VOID_IN_LISP <--> GET_VOID_FROM_LISP vs. | |
| 1691 STORE_LISP_IN_VOID <--> GET_LISP_FROM_VOID | |
| 1692 | |
| 1693 STORE_VOID_IN_LISP has a restriction on the void * pointers it can | |
| 1694 handle -- the pointer must be an even address (lowest bit set to 0). | |
| 1695 Generally this is not a problem as nowadays virtually all allocation is | |
| 1696 at least 4-byte aligned, if not 8-byte. | |
| 1697 | |
| 1698 However, if this proves problematic, you can use make_opaque_ptr(), which | |
| 1699 is guaranteed to handle any kind of void * pointer but which does | |
| 1700 Lisp allocation. | |
| 1701 */ | |
| 1702 | |
| 1703 DECLARE_INLINE_HEADER ( | |
| 1704 Lisp_Object | |
| 1705 STORE_VOID_IN_LISP (void *ptr) | |
| 1706 ) | |
| 1707 { | |
| 1708 EMACS_UINT p = (EMACS_UINT) ptr; | |
| 1709 | |
| 1710 type_checking_assert ((p & 1) == 0); | |
| 1711 return make_int (p >> 1); | |
| 1712 } | |
| 1713 | |
| 1714 DECLARE_INLINE_HEADER ( | |
| 1715 void * | |
| 1716 GET_VOID_FROM_LISP (Lisp_Object obj) | |
| 1717 ) | |
| 1718 { | |
| 1719 EMACS_UINT p = XUINT (obj); | |
| 1720 return (void *) (p << 1); | |
| 1721 } | |
| 1722 | |
| 428 | 1723 /************************************************************************/ |
| 4967 | 1724 /** Definitions of dynamic arrays (Dynarrs) and other allocators **/ |
| 1725 /************************************************************************/ | |
| 428 | 1726 |
| 1743 | 1727 BEGIN_C_DECLS |
| 1650 | 1728 |
| 4967 | 1729 /************* Dynarr declaration *************/ |
| 3293 | 1730 |
| 3092 | 1731 #ifdef NEW_GC |
| 4967 | 1732 #define DECLARE_DYNARR_LISP_IMP() \ |
| 1733 const struct lrecord_implementation *lisp_imp; | |
| 1734 #else | |
| 1735 #define DECLARE_DYNARR_LISP_IMP() | |
| 1736 #endif | |
| 1737 | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1738 #ifdef ERROR_CHECK_DYNARR |
| 4967 | 1739 #define DECLARE_DYNARR_LOCKED() \ |
| 1740 int locked; | |
| 3092 | 1741 #else |
| 4967 | 1742 #define DECLARE_DYNARR_LOCKED() |
| 1743 #endif | |
| 1744 | |
| 1745 #define Dynarr_declare(type) \ | |
| 1746 struct lrecord_header header; \ | |
| 1747 type *base; \ | |
| 1748 DECLARE_DYNARR_LISP_IMP () \ | |
| 1749 DECLARE_DYNARR_LOCKED () \ | |
| 1750 int elsize; \ | |
| 1751 int len_; \ | |
| 1752 int largest_; \ | |
| 1753 int max_ | |
| 3092 | 1754 |
| 1755 typedef struct dynarr | |
| 1756 { | |
| 1757 Dynarr_declare (void); | |
| 1758 } Dynarr; | |
| 1759 | |
| 4967 | 1760 #define XD_DYNARR_DESC(base_type, sub_desc) \ |
| 1761 { XD_BLOCK_PTR, offsetof (base_type, base), \ | |
| 1762 XD_INDIRECT(1, 0), {sub_desc} }, \ | |
| 1763 { XD_INT, offsetof (base_type, len_) }, \ | |
| 1764 { XD_INT_RESET, offsetof (base_type, largest_), XD_INDIRECT(1, 0) }, \ | |
| 1765 { XD_INT_RESET, offsetof (base_type, max_), XD_INDIRECT(1, 0) } | |
| 1766 | |
| 1767 #ifdef NEW_GC | |
| 1768 #define XD_LISP_DYNARR_DESC(base_type, sub_desc) \ | |
| 1769 { XD_LISP_OBJECT_BLOCK_PTR, offsetof (base_type, base), \ | |
| 1770 XD_INDIRECT(1, 0), {sub_desc} }, \ | |
| 1771 { XD_INT, offsetof (base_type, len_) }, \ | |
| 1772 { XD_INT_RESET, offsetof (base_type, largest_), XD_INDIRECT(1, 0) }, \ | |
| 1773 { XD_INT_RESET, offsetof (base_type, max_), XD_INDIRECT(1, 0) } | |
| 1774 #endif /* NEW_GC */ | |
| 1775 | |
| 1776 /************* Dynarr verification *************/ | |
| 1777 | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1778 #ifdef ERROR_CHECK_DYNARR |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1779 DECLARE_INLINE_HEADER ( |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1780 int |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1781 Dynarr_verify_pos_at (void *d, int pos, const Ascbyte *file, int line) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1782 ) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1783 { |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1784 Dynarr *dy = (Dynarr *) d; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1785 /* We use `largest', not `len', because the redisplay code often |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1786 accesses stuff between len and largest. */ |
| 4967 | 1787 assert_at_line (pos >= 0 && pos < dy->largest_, file, line); |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1788 return pos; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1789 } |
|
4929
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1790 |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1791 DECLARE_INLINE_HEADER ( |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1792 int |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1793 Dynarr_verify_pos_atp (void *d, int pos, const Ascbyte *file, int line) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1794 ) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1795 { |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1796 Dynarr *dy = (Dynarr *) d; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1797 /* We use `largest', not `len', because the redisplay code often |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1798 accesses stuff between len and largest. */ |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1799 /* [[ Code will often do something like ... |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1800 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1801 val = make_bit_vector_from_byte_vector (Dynarr_atp (dyn, 0), |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1802 Dynarr_length (dyn)); |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1803 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1804 which works fine when the Dynarr_length is non-zero, but when zero, |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1805 the result of Dynarr_atp() not only points past the end of the |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1806 allocated array, but the array may not have ever been allocated and |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1807 hence the return value is NULL. But the length of 0 causes the |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1808 pointer to never get checked. These can occur throughout the code |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1809 so we put in a special check. --ben ]] |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1810 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1811 Update: The common idiom `Dynarr_atp (dyn, 0)' has been changed to |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1812 `Dynarr_begin (dyn)'. Possibly this special check at POS 0 can be |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1813 done only for Dynarr_begin() not for general Dynarr_atp(). --ben */ |
| 4967 | 1814 if (pos == 0 && dy->len_ == 0) |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1815 return pos; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1816 /* #### It's vaguely possible that some code could legitimately want to |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1817 retrieve a pointer to the position just past the end of dynarr memory. |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1818 This could happen with Dynarr_atp() but not Dynarr_at(). If so, it |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1819 will trigger this assert(). In such cases, it should be obvious that |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1820 the code wants to do this; rather than relaxing the assert, we should |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1821 probably create a new macro Dynarr_atp_allow_end() which is like |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1822 Dynarr_atp() but which allows for pointing at invalid addresses -- we |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1823 really want to check for cases of accessing just past the end of |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1824 memory, which is a likely off-by-one problem to occur and will usually |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1825 not trigger a protection fault (instead, you'll just get random |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1826 behavior, possibly overwriting other memory, which is bad). --ben */ |
| 4967 | 1827 assert_at_line (pos >= 0 && pos < dy->largest_, file, line); |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1828 return pos; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1829 } |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1830 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1831 DECLARE_INLINE_HEADER ( |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1832 int |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1833 Dynarr_verify_pos_atp_allow_end (void *d, int pos, const Ascbyte *file, |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1834 int line) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1835 ) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1836 { |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1837 Dynarr *dy = (Dynarr *) d; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1838 /* We use `largest', not `len', because the redisplay code often |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1839 accesses stuff between len and largest. |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1840 We also allow referencing the very end, past the end of allocated |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1841 legitimately space. See comments in Dynarr_verify_pos_atp.()*/ |
| 4967 | 1842 assert_at_line (pos >= 0 && pos <= dy->largest_, file, line); |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1843 return pos; |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1844 } |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1845 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1846 #else |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1847 #define Dynarr_verify_pos_at(d, pos, file, line) (pos) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1848 #define Dynarr_verify_pos_atp(d, pos, file, line) (pos) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1849 #define Dynarr_verify_pos_atp_allow_end(d, pos, file, line) (pos) |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1850 #endif /* ERROR_CHECK_DYNARR */ |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1851 |
|
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1852 #ifdef ERROR_CHECK_DYNARR |
| 4967 | 1853 DECLARE_INLINE_HEADER ( |
| 1854 Dynarr * | |
| 1855 Dynarr_verify_1 (void *d, const Ascbyte *file, int line) | |
| 1856 ) | |
| 1857 { | |
| 1858 Dynarr *dy = (Dynarr *) d; | |
| 1859 assert_at_line (dy->len_ >= 0 && dy->len_ <= dy->largest_ && | |
| 1860 dy->largest_ <= dy->max_, file, line); | |
| 1861 return dy; | |
| 1862 } | |
| 1863 | |
| 1864 DECLARE_INLINE_HEADER ( | |
| 1865 Dynarr * | |
| 1866 Dynarr_verify_mod_1 (void *d, const Ascbyte *file, int line) | |
| 1867 ) | |
| 1868 { | |
| 1869 Dynarr *dy = (Dynarr *) d; | |
| 1870 assert_at_line (!dy->locked, file, line); | |
| 1871 return Dynarr_verify_1 (d, file, line); | |
| 1872 } | |
| 1873 | |
| 1874 #define Dynarr_verify(d) Dynarr_verify_1 (d, __FILE__, __LINE__) | |
| 1875 #define Dynarr_verify_mod(d) Dynarr_verify_mod_1 (d, __FILE__, __LINE__) | |
| 1876 #define Dynarr_lock(d) \ | |
| 1877 do { \ | |
| 1878 Dynarr *dy = Dynarr_verify_mod (d); \ | |
| 1879 dy->locked = 1; \ | |
| 1880 } while (0) | |
| 1881 #define Dynarr_unlock(d) \ | |
| 1882 do { \ | |
| 1883 Dynarr *dy = Dynarr_verify (d); \ | |
| 1884 dy->locked = 0; \ | |
| 1885 } while (0) | |
| 1886 #else | |
|
5005
4170f3809a28
Cast correctly, Dynarr_verify, Dynarr_verify_mod, no ERROR_CHECK_STRUCTURES
Aidan Kehoe <kehoea@parhasard.net>
parents:
5001
diff
changeset
|
1887 #define Dynarr_verify(d) ((Dynarr *) d) |
|
4170f3809a28
Cast correctly, Dynarr_verify, Dynarr_verify_mod, no ERROR_CHECK_STRUCTURES
Aidan Kehoe <kehoea@parhasard.net>
parents:
5001
diff
changeset
|
1888 #define Dynarr_verify_mod(d) ((Dynarr *) d) |
| 4967 | 1889 #define Dynarr_lock(d) DO_NOTHING |
| 1890 #define Dynarr_unlock(d) DO_NOTHING | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1891 #endif /* ERROR_CHECK_DYNARR */ |
| 4967 | 1892 |
| 1893 /************* Dynarr creation *************/ | |
| 1894 | |
| 1895 MODULE_API void *Dynarr_newf (int elsize); | |
| 1896 MODULE_API void Dynarr_free (void *d); | |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1897 |
| 3293 | 1898 #ifdef NEW_GC |
| 3092 | 1899 MODULE_API void *Dynarr_lisp_newf (int elsize, |
| 1900 const struct lrecord_implementation | |
| 1901 *dynarr_imp, | |
| 1902 const struct lrecord_implementation *imp); | |
| 1903 | |
| 1904 #define Dynarr_lisp_new(type, dynarr_imp, imp) \ | |
| 1905 ((type##_dynarr *) Dynarr_lisp_newf (sizeof (type), dynarr_imp, imp)) | |
| 1906 #define Dynarr_lisp_new2(dynarr_type, type, dynarr_imp, imp) \ | |
| 1907 ((dynarr_type *) Dynarr_lisp_newf (sizeof (type)), dynarr_imp, imp) | |
| 3293 | 1908 #endif /* NEW_GC */ |
| 3092 | 1909 #define Dynarr_new(type) ((type##_dynarr *) Dynarr_newf (sizeof (type))) |
| 1910 #define Dynarr_new2(dynarr_type, type) \ | |
| 1911 ((dynarr_type *) Dynarr_newf (sizeof (type))) | |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1912 |
| 4967 | 1913 /************* Dynarr access *************/ |
| 1914 | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1915 #ifdef ERROR_CHECK_DYNARR |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1916 #define Dynarr_at(d, pos) \ |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1917 ((d)->base[Dynarr_verify_pos_at (d, pos, __FILE__, __LINE__)]) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1918 #define Dynarr_atp_allow_end(d, pos) \ |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1919 (&((d)->base[Dynarr_verify_pos_atp_allow_end (d, pos, __FILE__, __LINE__)])) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1920 #define Dynarr_atp(d, pos) \ |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1921 (&((d)->base[Dynarr_verify_pos_atp (d, pos, __FILE__, __LINE__)])) |
|
4929
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1922 #else |
|
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1923 #define Dynarr_at(d, pos) ((d)->base[pos]) |
|
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1924 #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos)) |
|
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1925 #define Dynarr_atp_allow_end(d, pos) Dynarr_atp (d, pos) |
|
b5ad8cf9f6e4
fix dynarr-related crash apparently due to compiler bug
Ben Wing <ben@xemacs.org>
parents:
4880
diff
changeset
|
1926 #endif |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1927 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1928 /* Old #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos)) */ |
| 3092 | 1929 #define Dynarr_begin(d) Dynarr_atp (d, 0) |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1930 #define Dynarr_lastp(d) Dynarr_atp (d, Dynarr_length (d) - 1) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
1931 #define Dynarr_past_lastp(d) Dynarr_atp_allow_end (d, Dynarr_length (d)) |
| 4967 | 1932 |
| 1933 | |
| 1934 /************* Dynarr length/size retrieval and setting *************/ | |
| 1935 | |
| 1936 /* Retrieve the length of a Dynarr. The `+ 0' is to ensure that this cannot | |
| 1937 be used as an lvalue. */ | |
| 1938 #define Dynarr_length(d) (Dynarr_verify (d)->len_ + 0) | |
| 1939 /* Retrieve the largest ever length seen of a Dynarr. The `+ 0' is to | |
| 1940 ensure that this cannot be used as an lvalue. */ | |
| 1941 #define Dynarr_largest(d) (Dynarr_verify (d)->largest_ + 0) | |
| 1942 /* Retrieve the number of elements that fit in the currently allocated | |
| 1943 space. The `+ 0' is to ensure that this cannot be used as an lvalue. */ | |
| 1944 #define Dynarr_max(d) (Dynarr_verify (d)->max_ + 0) | |
| 1945 /* Retrieve the advertised memory usage of a Dynarr, i.e. the number of | |
| 1946 bytes occupied by the elements in the Dynarr, not counting any overhead. */ | |
| 1947 #define Dynarr_sizeof(d) (Dynarr_length (d) * (d)->elsize) | |
| 1948 /* Actually set the length of a Dynarr. This is a low-level routine that | |
| 1949 should not be directly used; use Dynarr_set_length() instead if you need | |
| 1950 to, but be very careful when doing so! */ | |
| 1951 #define Dynarr_set_length_1(d, n) \ | |
| 1952 do { \ | |
| 1953 Elemcount _dsl1_n = (n); \ | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1954 dynarr_checking_assert (_dsl1_n >= 0 && _dsl1_n <= Dynarr_max (d)); \ |
| 4967 | 1955 (void) Dynarr_verify_mod (d); \ |
| 1956 (d)->len_ = _dsl1_n; \ | |
| 1957 /* Use the raw field references here otherwise we get a crash because \ | |
| 1958 we've set the length but not yet fixed up the largest value. */ \ | |
| 1959 if ((d)->len_ > (d)->largest_) \ | |
| 1960 (d)->largest_ = (d)->len_; \ | |
| 1961 (void) Dynarr_verify_mod (d); \ | |
| 1962 } while (0) | |
| 1963 | |
| 1964 /* The following two defines will get you into real trouble if you aren't | |
| 1965 careful. But they can save a lot of execution time when used wisely. */ | |
| 1966 #define Dynarr_set_length(d, n) \ | |
| 1967 do { \ | |
| 1968 Elemcount _dsl_n = (n); \ | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
1969 dynarr_checking_assert (_dsl_n >= 0 && _dsl_n <= Dynarr_largest (d)); \ |
| 4967 | 1970 Dynarr_set_length_1 (d, _dsl_n); \ |
| 1971 } while (0) | |
| 1972 #define Dynarr_increment(d) \ | |
| 1973 Dynarr_set_length (d, Dynarr_length (d) + 1) | |
| 1974 | |
| 1975 /* Reset the Dynarr's length to 0. */ | |
| 1976 #define Dynarr_reset(d) Dynarr_set_length (d, 0) | |
| 1977 | |
| 1978 MODULE_API void Dynarr_resize (void *dy, Elemcount size); | |
| 1979 | |
| 1980 #define Dynarr_resize_if(d, numels) \ | |
| 1981 do { \ | |
| 1982 Elemcount _dri_numels = (numels); \ | |
| 1983 if (Dynarr_length (d) + _dri_numels > Dynarr_max (d)) \ | |
| 1984 Dynarr_resize (d, Dynarr_length (d) + _dri_numels); \ | |
| 1985 } while (0) | |
| 1986 | |
| 1987 #ifdef MEMORY_USAGE_STATS | |
| 1988 struct overhead_stats; | |
| 1989 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); | |
| 1990 #endif | |
| 1991 | |
| 1992 /************* Adding/deleting elements to/from a Dynarr *************/ | |
| 1993 | |
| 1994 #ifdef NEW_GC | |
| 1995 #define Dynarr_add(d, el) \ | |
| 1996 do { \ | |
| 1997 const struct lrecord_implementation *imp = (d)->lisp_imp; \ | |
| 1998 (void) Dynarr_verify_mod (d); \ | |
| 1999 Dynarr_resize_if (d, 1); \ | |
| 2000 ((d)->base)[Dynarr_length (d)] = (el); \ | |
| 2001 if (imp) \ | |
| 2002 set_lheader_implementation \ | |
| 2003 ((struct lrecord_header *)&(((d)->base)[Dynarr_length (d)]), imp); \ | |
| 2004 Dynarr_set_length_1 (d, Dynarr_length (d) + 1); \ | |
| 2005 (void) Dynarr_verify_mod (d); \ | |
| 2006 } while (0) | |
| 2007 #else /* not NEW_GC */ | |
| 2008 #define Dynarr_add(d, el) \ | |
| 2009 do { \ | |
| 2010 (void) Dynarr_verify_mod (d); \ | |
| 2011 Dynarr_resize_if (d, 1); \ | |
| 2012 ((d)->base)[Dynarr_length (d)] = (el); \ | |
| 2013 Dynarr_set_length_1 (d, Dynarr_length (d) + 1); \ | |
| 2014 (void) Dynarr_verify_mod (d); \ | |
| 2015 } while (0) | |
| 2016 #endif /* not NEW_GC */ | |
| 2017 | |
| 2018 | |
| 2019 MODULE_API void Dynarr_insert_many (void *d, const void *el, int len, | |
| 2020 int start); | |
| 2021 MODULE_API void Dynarr_delete_many (void *d, int start, int len); | |
| 2022 | |
| 3092 | 2023 #define Dynarr_insert_many_at_start(d, el, len) \ |
| 2024 Dynarr_insert_many (d, el, len, 0) | |
| 2025 #define Dynarr_add_literal_string(d, s) Dynarr_add_many (d, s, sizeof (s) - 1) | |
| 2026 #define Dynarr_add_lisp_string(d, s, codesys) \ | |
| 2027 do { \ | |
| 2028 Lisp_Object dyna_ls_s = (s); \ | |
| 2029 Lisp_Object dyna_ls_cs = (codesys); \ | |
| 2030 Extbyte *dyna_ls_eb; \ | |
| 2031 Bytecount dyna_ls_bc; \ | |
| 2032 \ | |
| 2033 LISP_STRING_TO_SIZED_EXTERNAL (dyna_ls_s, dyna_ls_eb, \ | |
| 2034 dyna_ls_bc, dyna_ls_cs); \ | |
| 2035 Dynarr_add_many (d, dyna_ls_eb, dyna_ls_bc); \ | |
| 2036 } while (0) | |
| 2037 | |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2038 /* Add LEN contiguous elements to a Dynarr */ |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2039 |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2040 DECLARE_INLINE_HEADER ( |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2041 void |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2042 Dynarr_add_many (void *d, const void *el, int len) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2043 ) |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2044 { |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2045 /* This duplicates Dynarr_insert_many to some extent; but since it is |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2046 called so often, it seemed useful to remove the unnecessary stuff |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2047 from that function and to make it inline */ |
| 4967 | 2048 Dynarr *dy = Dynarr_verify_mod (d); |
| 2049 Dynarr_resize_if (dy, len); | |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2050 /* Some functions call us with a value of 0 to mean "reserve space but |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2051 don't write into it" */ |
|
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2052 if (el) |
| 4967 | 2053 memcpy ((char *) dy->base + Dynarr_sizeof (dy), el, len*dy->elsize); |
| 2054 Dynarr_set_length_1 (dy, Dynarr_length (dy) + len); | |
| 2055 (void) Dynarr_verify_mod (dy); | |
|
4844
91b3d00e717f
Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents:
4843
diff
changeset
|
2056 } |
| 3092 | 2057 |
| 2058 #define Dynarr_pop(d) \ | |
|
5023
838630c0734f
error-checking, Windows shutdown changes
Ben Wing <ben@xemacs.org>
parents:
5021
diff
changeset
|
2059 (dynarr_checking_assert (Dynarr_length (d) > 0), \ |
| 4967 | 2060 Dynarr_verify_mod (d)->len_--, \ |
| 2061 Dynarr_at (d, Dynarr_length (d))) | |
| 3092 | 2062 #define Dynarr_delete(d, i) Dynarr_delete_many (d, i, 1) |
| 2063 #define Dynarr_delete_by_pointer(d, p) \ | |
| 2064 Dynarr_delete_many (d, (p) - ((d)->base), 1) | |
| 2065 | |
| 2066 #define Dynarr_delete_object(d, el) \ | |
| 2067 do \ | |
| 2068 { \ | |
| 2069 REGISTER int i; \ | |
| 2070 for (i = Dynarr_length (d) - 1; i >= 0; i--) \ | |
| 2071 { \ | |
| 2072 if (el == Dynarr_at (d, i)) \ | |
| 2073 Dynarr_delete_many (d, i, 1); \ | |
| 2074 } \ | |
| 2075 } while (0) | |
| 2076 | |
| 4967 | 2077 /************* Dynarr typedefs *************/ |
| 3092 | 2078 |
| 2079 /* Dynarr typedefs -- basic types first */ | |
| 2080 | |
| 2081 typedef struct | |
| 2082 { | |
| 2083 Dynarr_declare (Ibyte); | |
| 2084 } Ibyte_dynarr; | |
| 2085 | |
| 2086 typedef struct | |
| 2087 { | |
| 2088 Dynarr_declare (Extbyte); | |
| 2089 } Extbyte_dynarr; | |
| 2090 | |
| 2091 typedef struct | |
| 2092 { | |
| 2093 Dynarr_declare (Ichar); | |
| 2094 } Ichar_dynarr; | |
| 2095 | |
| 2096 typedef struct | |
| 2097 { | |
| 2098 Dynarr_declare (char); | |
| 2099 } char_dynarr; | |
| 2100 | |
| 2101 typedef struct | |
| 2102 { | |
| 2103 Dynarr_declare (char *); | |
| 2104 } char_ptr_dynarr; | |
| 2105 | |
| 2106 typedef unsigned char unsigned_char; | |
| 2107 typedef struct | |
| 2108 { | |
| 2109 Dynarr_declare (unsigned char); | |
| 2110 } unsigned_char_dynarr; | |
| 2111 | |
| 2112 typedef unsigned long unsigned_long; | |
| 2113 typedef struct | |
| 2114 { | |
| 2115 Dynarr_declare (unsigned long); | |
| 2116 } unsigned_long_dynarr; | |
| 2117 | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2118 typedef const Ascbyte *const_Ascbyte_ptr; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2119 typedef struct |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2120 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2121 Dynarr_declare (const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2122 } const_Ascbyte_ptr_dynarr; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2123 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2124 extern const struct sized_memory_description const_Ascbyte_ptr_description; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2125 extern const struct sized_memory_description const_Ascbyte_ptr_dynarr_description; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
2126 |
| 3092 | 2127 typedef struct |
| 2128 { | |
| 2129 Dynarr_declare (int); | |
| 2130 } int_dynarr; | |
| 2131 | |
| 2132 typedef struct | |
| 2133 { | |
| 2134 Dynarr_declare (Charbpos); | |
| 2135 } Charbpos_dynarr; | |
| 2136 | |
| 2137 typedef struct | |
| 2138 { | |
| 2139 Dynarr_declare (Bytebpos); | |
| 2140 } Bytebpos_dynarr; | |
| 2141 | |
| 2142 typedef struct | |
| 2143 { | |
| 2144 Dynarr_declare (Charcount); | |
| 2145 } Charcount_dynarr; | |
| 2146 | |
| 2147 typedef struct | |
| 2148 { | |
| 2149 Dynarr_declare (Bytecount); | |
| 2150 } Bytecount_dynarr; | |
| 2151 | |
| 2152 /* Dynarr typedefs -- more complex types */ | |
| 2153 | |
| 2154 typedef struct | |
| 2155 { | |
| 2156 Dynarr_declare (struct face_cachel); | |
| 2157 } face_cachel_dynarr; | |
| 2158 | |
| 3293 | 2159 #ifdef NEW_GC |
| 3092 | 2160 DECLARE_LRECORD (face_cachel_dynarr, face_cachel_dynarr); |
| 2161 #define XFACE_CACHEL_DYNARR(x) \ | |
| 2162 XRECORD (x, face_cachel_dynarr, face_cachel_dynarr) | |
| 2163 #define wrap_face_cachel_dynarr(p) wrap_record (p, face_cachel_dynarr) | |
| 2164 #define FACE_CACHEL_DYNARRP(x) RECORDP (x, face_cachel_dynarr) | |
| 2165 #define CHECK_FACE_CACHEL_DYNARR(x) CHECK_RECORD (x, face_cachel_dynarr) | |
| 2166 #define CONCHECK_FACE_CACHEL_DYNARR(x) CONCHECK_RECORD (x, face_cachel_dynarr) | |
| 3293 | 2167 #endif /* NEW_GC */ |
| 3092 | 2168 |
| 2169 typedef struct | |
| 2170 { | |
| 2171 Dynarr_declare (struct glyph_cachel); | |
| 2172 } glyph_cachel_dynarr; | |
| 2173 | |
| 3293 | 2174 #ifdef NEW_GC |
| 3092 | 2175 DECLARE_LRECORD (glyph_cachel_dynarr, glyph_cachel_dynarr); |
| 2176 #define XGLYPH_CACHEL_DYNARR(x) \ | |
| 2177 XRECORD (x, glyph_cachel_dynarr, glyph_cachel_dynarr) | |
| 2178 #define wrap_glyph_cachel_dynarr(p) wrap_record (p, glyph_cachel_dynarr) | |
| 2179 #define GLYPH_CACHEL_DYNARRP(x) RECORDP (x, glyph_cachel_dynarr) | |
| 2180 #define CHECK_GLYPH_CACHEL_DYNARR(x) CHECK_RECORD (x, glyph_cachel_dynarr) | |
| 2181 #define CONCHECK_GLYPH_CACHEL_DYNARR(x) \ | |
| 2182 CONCHECK_RECORD (x, glyph_cachel_dynarr) | |
| 3293 | 2183 #endif /* NEW_GC */ |
| 3092 | 2184 |
| 2185 typedef struct | |
| 2186 { | |
| 2187 Dynarr_declare (struct console_type_entry); | |
| 2188 } console_type_entry_dynarr; | |
| 2189 | |
| 2190 /* WARNING WARNING WARNING. You must ensure on your own that proper | |
| 2191 GC protection is provided for the elements in this array. */ | |
| 2192 typedef struct | |
| 2193 { | |
| 2194 Dynarr_declare (Lisp_Object); | |
| 2195 } Lisp_Object_dynarr; | |
| 2196 | |
| 2197 typedef struct | |
| 2198 { | |
| 2199 Dynarr_declare (Lisp_Object *); | |
| 2200 } Lisp_Object_ptr_dynarr; | |
| 2201 | |
| 4967 | 2202 |
| 2203 /************* Stack-like malloc/free: Another allocator *************/ | |
| 2204 | |
| 2205 void *stack_like_malloc (Bytecount size); | |
| 2206 void stack_like_free (void *val); | |
| 2207 | |
| 2208 | |
| 2209 /************************************************************************/ | |
| 2210 /** Definitions of other basic Lisp objects **/ | |
| 2211 /************************************************************************/ | |
| 2212 | |
| 442 | 2213 /*------------------------------ unbound -------------------------------*/ |
| 428 | 2214 |
| 2215 /* Qunbound is a special Lisp_Object (actually of type | |
| 2216 symbol-value-forward), that can never be visible to | |
| 2217 the Lisp caller and thus can be used in the C code | |
| 2218 to mean "no such value". */ | |
| 2219 | |
| 2220 #define UNBOUNDP(val) EQ (val, Qunbound) | |
| 2221 | |
| 771 | 2222 /* Evaluate expr, return it if it's not Qunbound. */ |
| 2223 #define RETURN_IF_NOT_UNBOUND(expr) do \ | |
| 2224 { \ | |
| 2225 Lisp_Object ret_nunb_val = (expr); \ | |
| 2226 if (!UNBOUNDP (ret_nunb_val)) \ | |
| 2227 RETURN_SANS_WARNINGS ret_nunb_val; \ | |
| 2228 } while (0) | |
| 2229 | |
| 442 | 2230 /*------------------------------- cons ---------------------------------*/ |
| 428 | 2231 |
| 2232 /* In a cons, the markbit of the car is the gc mark bit */ | |
| 2233 | |
| 2234 struct Lisp_Cons | |
| 2235 { | |
| 2236 struct lrecord_header lheader; | |
| 853 | 2237 Lisp_Object car_, cdr_; |
| 428 | 2238 }; |
| 2239 typedef struct Lisp_Cons Lisp_Cons; | |
| 2240 | |
| 2241 #if 0 /* FSFmacs */ | |
| 2242 /* Like a cons, but records info on where the text lives that it was read from */ | |
| 2243 /* This is not really in use now */ | |
| 2244 | |
| 2245 struct Lisp_Buffer_Cons | |
| 2246 { | |
| 2247 Lisp_Object car, cdr; | |
| 2248 struct buffer *buffer; | |
| 665 | 2249 int charbpos; |
| 428 | 2250 }; |
| 2251 #endif | |
| 2252 | |
| 1632 | 2253 DECLARE_MODULE_API_LRECORD (cons, Lisp_Cons); |
| 428 | 2254 #define XCONS(x) XRECORD (x, cons, Lisp_Cons) |
| 617 | 2255 #define wrap_cons(p) wrap_record (p, cons) |
| 428 | 2256 #define CONSP(x) RECORDP (x, cons) |
| 2257 #define CHECK_CONS(x) CHECK_RECORD (x, cons) | |
| 2258 #define CONCHECK_CONS(x) CONCHECK_RECORD (x, cons) | |
| 2259 | |
| 3263 | 2260 #ifdef NEW_GC |
| 2720 | 2261 #define CONS_MARKED_P(c) MARKED_P (&((c)->lheader)) |
| 2262 #define MARK_CONS(c) MARK (&((c)->lheader)) | |
| 3263 | 2263 #else /* not NEW_GC */ |
| 428 | 2264 #define CONS_MARKED_P(c) MARKED_RECORD_HEADER_P(&((c)->lheader)) |
| 2265 #define MARK_CONS(c) MARK_RECORD_HEADER (&((c)->lheader)) | |
| 3263 | 2266 #endif /* not NEW_GC */ |
| 428 | 2267 |
| 1632 | 2268 extern MODULE_API Lisp_Object Qnil; |
| 428 | 2269 |
| 2270 #define NILP(x) EQ (x, Qnil) | |
| 853 | 2271 #define cons_car(a) ((a)->car_) |
| 2272 #define cons_cdr(a) ((a)->cdr_) | |
| 2273 #define XCAR(a) (XCONS (a)->car_) | |
| 2274 #define XCDR(a) (XCONS (a)->cdr_) | |
| 1318 | 2275 #define XCADR(a) (XCAR (XCDR (a))) |
| 2276 #define XCDDR(a) (XCDR (XCDR (a))) | |
| 2277 #define XCADDR(a) (XCAR (XCDDR (a))) | |
| 2278 #define XCDDDR(a) (XCDR (XCDDR (a))) | |
| 2279 #define XCADDDR(a) (XCAR (XCDDDR (a))) | |
| 2280 #define XCDDDDR(a) (XCDR (XCDDDR (a))) | |
| 2281 #define XCADDDDR(a) (XCAR (XCDDDDR (a))) | |
| 2282 #define XCDDDDDR(a) (XCDR (XCDDDDR (a))) | |
| 2283 #define XCADDDDDR(a) (XCAR (XCDDDDDR (a))) | |
| 2284 #define XCDDDDDDR(a) (XCDR (XCDDDDDR (a))) | |
| 2285 #define X1ST(a) XCAR (a) | |
| 2286 #define X2ND(a) XCADR (a) | |
| 2287 #define X3RD(a) XCADDR (a) | |
| 2288 #define X4TH(a) XCADDDR (a) | |
| 2289 #define X5TH(a) XCADDDDR (a) | |
| 2290 #define X6TH(a) XCADDDDDR (a) | |
| 2291 | |
| 853 | 2292 #define XSETCAR(a, b) (XCONS (a)->car_ = (b)) |
| 2293 #define XSETCDR(a, b) (XCONS (a)->cdr_ = (b)) | |
| 428 | 2294 #define LISTP(x) (CONSP(x) || NILP(x)) |
| 2295 | |
| 2296 #define CHECK_LIST(x) do { \ | |
| 2297 if (!LISTP (x)) \ | |
| 2298 dead_wrong_type_argument (Qlistp, x); \ | |
| 2299 } while (0) | |
| 2300 | |
| 2301 #define CONCHECK_LIST(x) do { \ | |
| 2302 if (!LISTP (x)) \ | |
| 2303 x = wrong_type_argument (Qlistp, x); \ | |
| 2304 } while (0) | |
| 2305 | |
| 442 | 2306 /*---------------------- list traversal macros -------------------------*/ |
| 2307 | |
| 2308 /* Note: These macros are for traversing through a list in some format, | |
| 2309 and executing code that you specify on each member of the list. | |
| 2310 | |
| 2311 There are two kinds of macros, those requiring surrounding braces, and | |
| 2312 those not requiring this. Which type of macro will be indicated. | |
| 2313 The general format for using a brace-requiring macro is | |
| 2314 | |
| 2315 { | |
| 2316 LIST_LOOP_3 (elt, list, tail) | |
| 2317 execute_code_here; | |
| 2318 } | |
| 2319 | |
| 2320 or | |
| 2321 | |
| 2322 { | |
| 2323 LIST_LOOP_3 (elt, list, tail) | |
| 2324 { | |
| 2325 execute_code_here; | |
| 2326 } | |
| 2327 } | |
| 2328 | |
| 2329 You can put variable declarations between the brace and beginning of | |
| 2330 macro, but NOTHING ELSE. | |
| 2331 | |
| 2332 The brace-requiring macros typically declare themselves any arguments | |
| 2333 that are initialized and iterated by the macros. If for some reason | |
| 2334 you need to declare these arguments yourself (e.g. to do something on | |
| 2335 them before the iteration starts, use the _NO_DECLARE versions of the | |
| 2336 macros.) | |
| 2337 */ | |
| 2338 | |
| 2339 /* There are two basic kinds of macros: those that handle "internal" lists | |
| 2340 that are known to be correctly structured (i.e. first element is a cons | |
| 2341 or nil, and the car of each cons is also a cons or nil, and there are | |
| 2342 no circularities), and those that handle "external" lists, where the | |
| 2343 list may have any sort of invalid formation. This is reflected in | |
| 2344 the names: those with "EXTERNAL_" work with external lists, and those | |
| 2345 without this prefix work with internal lists. The internal-list | |
| 2346 macros will hit an assertion failure if the structure is ill-formed; | |
| 2347 the external-list macros will signal an error in this case, either a | |
| 2348 malformed-list error or a circular-list error. | |
| 2349 */ | |
| 2350 | |
| 2367 | 2351 /* LIST_LOOP is a simple, old-fashioned macro. It doesn't require brace |
| 2352 surrounding, and iterates through a list, which may or may not known to | |
| 2353 be syntactically correct. It accepts two args, TAIL (set progressively | |
| 2354 to each cons starting with the first), and LIST, the list to iterate | |
| 2355 over. TAIL needs to be defined by the caller. | |
| 442 | 2356 |
| 2357 In each iteration, you can retrieve the current list item using XCAR | |
| 2358 (tail), or destructively modify the list using XSETCAR (tail, | |
| 2359 ...). */ | |
| 2360 | |
| 428 | 2361 #define LIST_LOOP(tail, list) \ |
| 2362 for (tail = list; \ | |
| 2363 !NILP (tail); \ | |
| 2364 tail = XCDR (tail)) | |
| 2365 | |
| 442 | 2366 /* The following macros are the "core" macros for list traversal. |
| 2367 | |
| 2368 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. *** | |
| 2369 | |
| 2370 LIST_LOOP_2 and EXTERNAL_LIST_LOOP_2 are the standard, most-often used | |
| 2371 macros. They take two arguments, an element variable ELT and the list | |
| 2372 LIST. ELT is automatically declared, and set to each element in turn | |
| 2373 from LIST. | |
| 2374 | |
| 2375 LIST_LOOP_3 and EXTERNAL_LIST_LOOP_3 are the same, but they have a third | |
| 2376 argument TAIL, another automatically-declared variable. At each iteration, | |
| 2377 this one points to the cons cell for which ELT is the car. | |
| 2378 | |
| 2379 EXTERNAL_LIST_LOOP_4 is like EXTERNAL_LIST_LOOP_3 but takes an additional | |
| 2380 LEN argument, again automatically declared, which counts the number of | |
| 2381 iterations gone by. It is 0 during the first iteration. | |
| 2382 | |
| 2383 EXTERNAL_LIST_LOOP_4_NO_DECLARE is like EXTERNAL_LIST_LOOP_4 but none | |
| 2384 of the variables are automatically declared, and so you need to declare | |
| 2385 them yourself. (ELT and TAIL are Lisp_Objects, and LEN is an EMACS_INT.) | |
| 2386 */ | |
| 2387 | |
| 2388 #define LIST_LOOP_2(elt, list) \ | |
| 2389 LIST_LOOP_3(elt, list, unused_tail_##elt) | |
| 2390 | |
| 2391 #define LIST_LOOP_3(elt, list, tail) \ | |
| 2392 Lisp_Object elt, tail; \ | |
| 2393 for (tail = list; \ | |
| 2394 NILP (tail) ? \ | |
| 2395 0 : (elt = XCAR (tail), 1); \ | |
| 2396 tail = XCDR (tail)) | |
| 428 | 2397 |
| 2398 /* The following macros are for traversing lisp lists. | |
| 2399 Signal an error if LIST is not properly acyclic and nil-terminated. | |
| 2400 | |
| 2401 Use tortoise/hare algorithm to check for cycles, but only if it | |
| 2402 looks like the list is getting too long. Not only is the hare | |
| 2403 faster than the tortoise; it even gets a head start! */ | |
| 2404 | |
| 2405 /* Optimized and safe macros for looping over external lists. */ | |
| 2406 #define CIRCULAR_LIST_SUSPICION_LENGTH 1024 | |
| 2407 | |
| 2408 #define EXTERNAL_LIST_LOOP_1(list) \ | |
| 2409 Lisp_Object ELL1_elt, ELL1_hare, ELL1_tortoise; \ | |
| 442 | 2410 EMACS_INT ELL1_len; \ |
| 2411 PRIVATE_EXTERNAL_LIST_LOOP_6 (ELL1_elt, list, ELL1_len, ELL1_hare, \ | |
| 428 | 2412 ELL1_tortoise, CIRCULAR_LIST_SUSPICION_LENGTH) |
| 2413 | |
| 2414 #define EXTERNAL_LIST_LOOP_2(elt, list) \ | |
| 442 | 2415 Lisp_Object elt, hare_##elt, tortoise_##elt; \ |
| 2416 EMACS_INT len_##elt; \ | |
| 2417 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, hare_##elt, \ | |
| 428 | 2418 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) |
| 2419 | |
| 2367 | 2420 |
| 2421 #define GC_EXTERNAL_LIST_LOOP_2(elt, list) \ | |
| 2422 do { \ | |
| 2423 XGCDECL3 (elt); \ | |
| 2424 Lisp_Object elt, hare_##elt, tortoise_##elt; \ | |
| 2425 EMACS_INT len_##elt; \ | |
| 2426 XGCPRO3 (elt, elt, hare_##elt, tortoise_##elt); \ | |
| 2427 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, hare_##elt, \ | |
| 2428 tortoise_##elt, \ | |
| 2429 CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2430 | |
| 2431 #define END_GC_EXTERNAL_LIST_LOOP(elt) \ | |
| 2432 XUNGCPRO (elt); \ | |
| 2433 } \ | |
| 2434 while (0) | |
| 2435 | |
| 428 | 2436 #define EXTERNAL_LIST_LOOP_3(elt, list, tail) \ |
| 442 | 2437 Lisp_Object elt, tail, tortoise_##elt; \ |
| 2438 EMACS_INT len_##elt; \ | |
| 2439 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \ | |
| 2440 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2441 | |
| 2442 #define EXTERNAL_LIST_LOOP_4_NO_DECLARE(elt, list, tail, len) \ | |
| 428 | 2443 Lisp_Object tortoise_##elt; \ |
| 442 | 2444 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \ |
| 428 | 2445 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) |
| 2446 | |
| 2447 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \ | |
| 442 | 2448 Lisp_Object elt, tail, tortoise_##elt; \ |
| 2449 EMACS_INT len; \ | |
| 2450 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \ | |
| 428 | 2451 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) |
| 2452 | |
| 2453 | |
| 444 | 2454 #define PRIVATE_EXTERNAL_LIST_LOOP_6(elt, list, len, hare, \ |
| 2455 tortoise, suspicion_length) \ | |
| 2456 for (tortoise = hare = list, len = 0; \ | |
| 2457 \ | |
| 2458 (CONSP (hare) ? ((elt = XCAR (hare)), 1) : \ | |
| 2459 (NILP (hare) ? 0 : \ | |
| 2460 (signal_malformed_list_error (list), 0))); \ | |
| 2461 \ | |
| 2462 hare = XCDR (hare), \ | |
| 2463 (void) \ | |
| 2464 ((++len > suspicion_length) \ | |
| 2465 && \ | |
| 2466 ((((len & 1) != 0) && (tortoise = XCDR (tortoise), 0)), \ | |
| 2467 (EQ (hare, tortoise) && (signal_circular_list_error (list), 0))))) | |
| 428 | 2468 |
| 442 | 2469 /* GET_LIST_LENGTH and GET_EXTERNAL_LIST_LENGTH: |
| 2470 | |
| 2471 These two macros return the length of LIST (either an internal or external | |
| 2472 list, according to which macro is used), stored into LEN (which must | |
| 2473 be declared by the caller). Circularities are trapped in external lists | |
| 2474 (and cause errors). Neither macro need be declared inside brackets. */ | |
| 2475 | |
| 2476 #define GET_LIST_LENGTH(list, len) do { \ | |
| 2477 Lisp_Object GLL_tail; \ | |
| 2478 for (GLL_tail = list, len = 0; \ | |
| 2479 !NILP (GLL_tail); \ | |
| 2480 GLL_tail = XCDR (GLL_tail), ++len) \ | |
| 2481 DO_NOTHING; \ | |
| 2482 } while (0) | |
| 2483 | |
| 2484 #define GET_EXTERNAL_LIST_LENGTH(list, len) \ | |
| 2485 do { \ | |
| 2486 Lisp_Object GELL_elt, GELL_tail; \ | |
| 2487 EXTERNAL_LIST_LOOP_4_NO_DECLARE (GELL_elt, list, GELL_tail, len) \ | |
| 2488 ; \ | |
| 2489 } while (0) | |
| 2490 | |
| 2491 /* For a list that's known to be in valid list format, where we may | |
| 2492 be deleting the current element out of the list -- | |
| 2500 | 2493 will ABORT() if the list is not in valid format */ |
| 442 | 2494 #define LIST_LOOP_DELETING(consvar, nextconsvar, list) \ |
| 2495 for (consvar = list; \ | |
| 2496 !NILP (consvar) ? (nextconsvar = XCDR (consvar), 1) :0; \ | |
| 2497 consvar = nextconsvar) | |
| 2498 | |
| 2499 /* LIST_LOOP_DELETE_IF and EXTERNAL_LIST_LOOP_DELETE_IF: | |
| 2500 | |
| 2501 These two macros delete all elements of LIST (either an internal or | |
| 2502 external list, according to which macro is used) satisfying | |
| 2503 CONDITION, a C expression referring to variable ELT. ELT is | |
| 2504 automatically declared. Circularities are trapped in external | |
| 2505 lists (and cause errors). Neither macro need be declared inside | |
| 2506 brackets. */ | |
| 2507 | |
| 2508 #define LIST_LOOP_DELETE_IF(elt, list, condition) do { \ | |
| 2509 /* Do not use ##list when creating new variables because \ | |
| 2510 that may not be just a variable name. */ \ | |
| 2511 Lisp_Object prev_tail_##elt = Qnil; \ | |
| 2512 LIST_LOOP_3 (elt, list, tail_##elt) \ | |
| 2513 { \ | |
| 2514 if (condition) \ | |
| 2515 { \ | |
| 2516 if (NILP (prev_tail_##elt)) \ | |
| 2517 list = XCDR (tail_##elt); \ | |
| 2518 else \ | |
| 2519 XCDR (prev_tail_##elt) = XCDR (tail_##elt); \ | |
| 2520 } \ | |
| 2521 else \ | |
| 2522 prev_tail_##elt = tail_##elt; \ | |
| 2523 } \ | |
| 2524 } while (0) | |
| 2525 | |
| 2526 #define EXTERNAL_LIST_LOOP_DELETE_IF(elt, list, condition) do { \ | |
| 2527 Lisp_Object prev_tail_##elt = Qnil; \ | |
| 2528 EXTERNAL_LIST_LOOP_4 (elt, list, tail_##elt, len_##elt) \ | |
| 2529 { \ | |
| 2530 if (condition) \ | |
| 2531 { \ | |
| 2532 if (NILP (prev_tail_##elt)) \ | |
| 2533 list = XCDR (tail_##elt); \ | |
| 2534 else \ | |
| 2535 XCDR (prev_tail_##elt) = XCDR (tail_##elt); \ | |
| 2536 /* Keep tortoise from ever passing hare. */ \ | |
| 2537 len_##elt = 0; \ | |
| 2538 } \ | |
| 2539 else \ | |
| 2540 prev_tail_##elt = tail_##elt; \ | |
| 2541 } \ | |
| 2542 } while (0) | |
| 2543 | |
| 2544 | |
| 1204 | 2545 /* Macros for looping over internal alists. |
| 2546 | |
| 2547 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. *** | |
| 2548 | |
| 2549 ALIST_LOOP_3 loops over an alist, at each iteration setting CAR and CDR | |
| 2550 to the car and cdr of the acons. CAR and CDR are automatically | |
| 2551 declared. | |
| 2552 | |
| 2553 ALIST_LOOP_4 is similar to ALIST_LOOP_3 but contains an additional | |
| 2554 variable ACONS at the beginning for access to the acons itself.All of | |
| 2555 the variables ACONS, CAR and CDR are automatically declared. | |
| 2556 */ | |
| 2557 | |
| 2558 #define ALIST_LOOP_3(car, cdr, alist) \ | |
| 2559 Lisp_Object _al3_acons_##car, car, cdr, _al3_tail_##car; \ | |
| 2560 for (_al3_tail_##car = alist; \ | |
| 2561 NILP (_al3_tail_##car) ? \ | |
| 2562 0 : (_al3_acons_##car = XCAR (_al3_tail_##car), \ | |
| 2563 car = XCAR (_al3_acons_##car), \ | |
| 2564 cdr = XCDR (_al3_acons_##car), 1); \ | |
| 2565 _al3_tail_##car = XCDR (_al3_tail_##car)) | |
| 2566 | |
| 2567 #define ALIST_LOOP_4(acons, car, cdr, list) \ | |
| 2568 Lisp_Object acons, car, cdr, _al4_tail_##car; \ | |
| 2569 for (_al4_tail_##car = list; \ | |
| 2570 NILP (_al4_tail_##car) ? \ | |
| 2571 0 : (elt = XCAR (_al4_tail_##car), car = XCAR (elt), \ | |
| 2572 cdr = XCDR (elt), 1); \ | |
| 2573 _al4_tail_##car = XCDR (tail)) | |
| 2574 | |
| 442 | 2575 /* Macros for looping over external alists. |
| 2576 | |
| 2577 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. *** | |
| 2578 | |
| 2579 EXTERNAL_ALIST_LOOP_4 is similar to EXTERNAL_LIST_LOOP_2, but it | |
| 2580 assumes the elements are aconses (the elements in an alist) and | |
| 2581 sets two additional argument variables ELT_CAR and ELT_CDR to the | |
| 2582 car and cdr of the acons. All of the variables ELT, ELT_CAR and | |
| 2583 ELT_CDR are automatically declared. | |
| 2584 | |
| 2585 EXTERNAL_ALIST_LOOP_5 adds a TAIL argument to EXTERNAL_ALIST_LOOP_4, | |
| 2586 just like EXTERNAL_LIST_LOOP_3 does, and again TAIL is automatically | |
| 2587 declared. | |
| 2588 | |
| 2589 EXTERNAL_ALIST_LOOP_6 adds a LEN argument to EXTERNAL_ALIST_LOOP_5, | |
| 2590 just like EXTERNAL_LIST_LOOP_4 does, and again LEN is automatically | |
| 2591 declared. | |
| 2592 | |
| 2593 EXTERNAL_ALIST_LOOP_6_NO_DECLARE does not declare any of its arguments, | |
| 2594 just like EXTERNAL_LIST_LOOP_4_NO_DECLARE, and so these must be declared | |
| 2595 manually. | |
| 2596 */ | |
| 428 | 2597 |
| 2598 /* Optimized and safe macros for looping over external alists. */ | |
| 2599 #define EXTERNAL_ALIST_LOOP_4(elt, elt_car, elt_cdr, list) \ | |
| 442 | 2600 Lisp_Object elt, elt_car, elt_cdr; \ |
| 428 | 2601 Lisp_Object hare_##elt, tortoise_##elt; \ |
| 2602 EMACS_INT len_##elt; \ | |
| 442 | 2603 PRIVATE_EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list, \ |
| 428 | 2604 len_##elt, hare_##elt, tortoise_##elt, \ |
| 2605 CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2606 | |
| 2607 #define EXTERNAL_ALIST_LOOP_5(elt, elt_car, elt_cdr, list, tail) \ | |
| 442 | 2608 Lisp_Object elt, elt_car, elt_cdr, tail; \ |
| 428 | 2609 Lisp_Object tortoise_##elt; \ |
| 2610 EMACS_INT len_##elt; \ | |
| 442 | 2611 PRIVATE_EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list, \ |
| 428 | 2612 len_##elt, tail, tortoise_##elt, \ |
| 2613 CIRCULAR_LIST_SUSPICION_LENGTH) \ | |
| 2614 | |
| 2615 #define EXTERNAL_ALIST_LOOP_6(elt, elt_car, elt_cdr, list, tail, len) \ | |
| 442 | 2616 Lisp_Object elt, elt_car, elt_cdr, tail; \ |
| 2617 EMACS_INT len; \ | |
| 428 | 2618 Lisp_Object tortoise_##elt; \ |
| 442 | 2619 PRIVATE_EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list, \ |
| 428 | 2620 len, tail, tortoise_##elt, \ |
| 2621 CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2622 | |
| 442 | 2623 #define EXTERNAL_ALIST_LOOP_6_NO_DECLARE(elt, elt_car, elt_cdr, list, \ |
| 2624 tail, len) \ | |
| 2625 Lisp_Object tortoise_##elt; \ | |
| 2626 PRIVATE_EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list, \ | |
| 2627 len, tail, tortoise_##elt, \ | |
| 2628 CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2629 | |
| 2630 | |
| 2631 #define PRIVATE_EXTERNAL_ALIST_LOOP_8(elt, elt_car, elt_cdr, list, len, \ | |
| 2632 hare, tortoise, suspicion_length) \ | |
| 2633 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, hare, tortoise, \ | |
| 2634 suspicion_length) \ | |
| 428 | 2635 if (CONSP (elt) ? (elt_car = XCAR (elt), elt_cdr = XCDR (elt), 0) :1) \ |
| 2636 continue; \ | |
| 2637 else | |
| 2638 | |
| 442 | 2639 /* Macros for looping over external property lists. |
| 2640 | |
| 2641 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. *** | |
| 2642 | |
| 2643 EXTERNAL_PROPERTY_LIST_LOOP_3 maps over an external list assumed to | |
| 2644 be a property list, consisting of alternating pairs of keys | |
| 2645 (typically symbols or keywords) and values. Each iteration | |
| 2646 processes one such pair out of LIST, assigning the two elements to | |
| 2647 KEY and VALUE respectively. Malformed lists and circularities are | |
| 2648 trapped as usual, and in addition, property lists with an odd number | |
| 2649 of elements also signal an error. | |
| 2650 | |
| 2651 EXTERNAL_PROPERTY_LIST_LOOP_4 adds a TAIL argument to | |
| 2652 EXTERNAL_PROPERTY_LIST_LOOP_3, just like EXTERNAL_LIST_LOOP_3 does, | |
| 2653 and again TAIL is automatically declared. | |
| 2654 | |
| 2655 EXTERNAL_PROPERTY_LIST_LOOP_5 adds a LEN argument to | |
| 2656 EXTERNAL_PROPERTY_LIST_LOOP_4, just like EXTERNAL_LIST_LOOP_4 does, | |
| 2657 and again LEN is automatically declared. Note that in this case, | |
| 2658 LEN counts the iterations, NOT the total number of list elements | |
| 2659 processed, which is 2 * LEN. | |
| 2660 | |
| 2661 EXTERNAL_PROPERTY_LIST_LOOP_5_NO_DECLARE does not declare any of its | |
| 2662 arguments, just like EXTERNAL_LIST_LOOP_4_NO_DECLARE, and so these | |
| 2663 must be declared manually. */ | |
| 428 | 2664 |
| 2665 /* Optimized and safe macros for looping over external property lists. */ | |
| 2666 #define EXTERNAL_PROPERTY_LIST_LOOP_3(key, value, list) \ | |
| 2667 Lisp_Object key, value, hare_##key, tortoise_##key; \ | |
| 442 | 2668 EMACS_INT len_##key; \ |
| 428 | 2669 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, hare_##key, \ |
| 2670 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2671 | |
| 2672 #define EXTERNAL_PROPERTY_LIST_LOOP_4(key, value, list, tail) \ | |
| 2673 Lisp_Object key, value, tail, tortoise_##key; \ | |
| 442 | 2674 EMACS_INT len_##key; \ |
| 428 | 2675 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, tail, \ |
| 2676 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2677 | |
| 2678 #define EXTERNAL_PROPERTY_LIST_LOOP_5(key, value, list, tail, len) \ | |
| 2679 Lisp_Object key, value, tail, tortoise_##key; \ | |
| 2680 EMACS_INT len; \ | |
| 2681 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len, tail, \ | |
| 2682 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2683 | |
| 442 | 2684 #define EXTERNAL_PROPERTY_LIST_LOOP_5_NO_DECLARE(key, value, list, \ |
| 2685 tail, len) \ | |
| 2686 Lisp_Object tortoise_##key; \ | |
| 2687 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len, tail, \ | |
| 2688 tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2689 | |
| 428 | 2690 |
| 2691 #define EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len, hare, \ | |
| 2692 tortoise, suspicion_length) \ | |
| 2693 for (tortoise = hare = list, len = 0; \ | |
| 2694 \ | |
| 2695 ((CONSP (hare) && \ | |
| 2696 (key = XCAR (hare), \ | |
| 2697 hare = XCDR (hare), \ | |
| 442 | 2698 (CONSP (hare) ? 1 : \ |
| 2699 (signal_malformed_property_list_error (list), 0)))) ? \ | |
| 428 | 2700 (value = XCAR (hare), 1) : \ |
| 2701 (NILP (hare) ? 0 : \ | |
| 2702 (signal_malformed_property_list_error (list), 0))); \ | |
| 2703 \ | |
| 2704 hare = XCDR (hare), \ | |
| 2705 ((++len < suspicion_length) ? \ | |
| 2706 ((void) 0) : \ | |
| 2707 (((len & 1) ? \ | |
| 2708 ((void) (tortoise = XCDR (XCDR (tortoise)))) : \ | |
| 2709 ((void) 0)) \ | |
| 2710 , \ | |
| 2711 (EQ (hare, tortoise) ? \ | |
| 2712 ((void) signal_circular_property_list_error (list)) : \ | |
| 2713 ((void) 0))))) | |
| 2714 | |
| 2421 | 2715 #define PRIVATE_PROPERTY_LIST_LOOP_4(tail, key, value, plist) \ |
| 2716 for (tail = plist; \ | |
| 2717 NILP (tail) ? 0 : \ | |
| 2718 (key = XCAR (tail), tail = XCDR (tail), \ | |
| 2719 value = XCAR (tail), tail = XCDR (tail), 1); \ | |
| 428 | 2720 ) |
| 2721 | |
| 2421 | 2722 #define PROPERTY_LIST_LOOP_3(key, value, plist) \ |
| 2723 Lisp_Object key, value, tail_##key; \ | |
| 2724 PRIVATE_PROPERTY_LIST_LOOP_4 (tail_##key, key, value, plist) | |
| 2725 | |
| 2726 #define GC_PROPERTY_LIST_LOOP_3(key, value, plist) \ | |
| 2727 do { \ | |
| 2728 XGCDECL3 (key); \ | |
| 2729 Lisp_Object key, value, tail_##key; \ | |
| 2730 XGCPRO3 (key, key, value, tail_##key); \ | |
| 2731 PRIVATE_PROPERTY_LIST_LOOP_4 (tail_##key, key, value, plist) | |
| 2732 | |
| 2733 #define END_GC_PROPERTY_LIST_LOOP(key) \ | |
| 2734 XUNGCPRO (key); \ | |
| 2735 } \ | |
| 2736 while (0) | |
| 2737 | |
| 428 | 2738 /* Return 1 if LIST is properly acyclic and nil-terminated, else 0. */ |
| 826 | 2739 DECLARE_INLINE_HEADER ( |
| 2740 int | |
| 428 | 2741 TRUE_LIST_P (Lisp_Object object) |
| 826 | 2742 ) |
| 428 | 2743 { |
| 2744 Lisp_Object hare, tortoise; | |
| 2745 EMACS_INT len; | |
| 2746 | |
| 2747 for (hare = tortoise = object, len = 0; | |
| 2748 CONSP (hare); | |
| 2749 hare = XCDR (hare), len++) | |
| 2750 { | |
| 2751 if (len < CIRCULAR_LIST_SUSPICION_LENGTH) | |
| 2752 continue; | |
| 2753 | |
| 2754 if (len & 1) | |
| 2755 tortoise = XCDR (tortoise); | |
| 2756 else if (EQ (hare, tortoise)) | |
| 2757 return 0; | |
| 2758 } | |
| 2759 | |
| 2760 return NILP (hare); | |
| 2761 } | |
| 2762 | |
| 2763 /* Signal an error if LIST is not properly acyclic and nil-terminated. */ | |
| 2764 #define CHECK_TRUE_LIST(list) do { \ | |
| 2765 Lisp_Object CTL_list = (list); \ | |
| 2766 Lisp_Object CTL_hare, CTL_tortoise; \ | |
| 436 | 2767 EMACS_INT CTL_len; \ |
| 428 | 2768 \ |
| 2769 for (CTL_hare = CTL_tortoise = CTL_list, CTL_len = 0; \ | |
| 2770 CONSP (CTL_hare); \ | |
| 2771 CTL_hare = XCDR (CTL_hare), CTL_len++) \ | |
| 2772 { \ | |
| 2773 if (CTL_len < CIRCULAR_LIST_SUSPICION_LENGTH) \ | |
| 2774 continue; \ | |
| 2775 \ | |
| 2776 if (CTL_len & 1) \ | |
| 2777 CTL_tortoise = XCDR (CTL_tortoise); \ | |
| 2778 else if (EQ (CTL_hare, CTL_tortoise)) \ | |
| 2779 Fsignal (Qcircular_list, list1 (CTL_list)); \ | |
| 2780 } \ | |
| 2781 \ | |
| 2782 if (! NILP (CTL_hare)) \ | |
| 2783 signal_malformed_list_error (CTL_list); \ | |
| 2784 } while (0) | |
| 2785 | |
| 442 | 2786 /*------------------------------ string --------------------------------*/ |
| 428 | 2787 |
| 3092 | 2788 #ifdef NEW_GC |
| 2789 struct Lisp_String_Direct_Data | |
| 2790 { | |
| 2791 struct lrecord_header header; | |
| 2792 Bytecount size; | |
| 2793 Ibyte data[1]; | |
| 2794 }; | |
| 2795 typedef struct Lisp_String_Direct_Data Lisp_String_Direct_Data; | |
| 2796 | |
| 2797 DECLARE_MODULE_API_LRECORD (string_direct_data, Lisp_String_Direct_Data); | |
| 2798 #define XSTRING_DIRECT_DATA(x) \ | |
| 2799 XRECORD (x, string_direct_data, Lisp_String_Direct_Data) | |
| 2800 #define wrap_string_direct_data(p) wrap_record (p, string_direct_data) | |
| 2801 #define STRING_DIRECT_DATAP(x) RECORDP (x, string_direct_data) | |
| 2802 #define CHECK_STRING_DIRECT_DATA(x) CHECK_RECORD (x, string_direct_data) | |
| 2803 #define CONCHECK_STRING_DIRECT_DATA(x) CONCHECK_RECORD (x, string_direct_data) | |
| 2804 | |
| 2805 #define XSTRING_DIRECT_DATA_SIZE(x) XSTRING_DIRECT_DATA (x)->size | |
| 2806 #define XSTRING_DIRECT_DATA_DATA(x) XSTRING_DIRECT_DATA (x)->data | |
| 2807 | |
| 2808 | |
| 2809 struct Lisp_String_Indirect_Data | |
| 2810 { | |
| 2811 struct lrecord_header header; | |
| 2812 Bytecount size; | |
| 2813 Ibyte *data; | |
| 2814 }; | |
| 2815 typedef struct Lisp_String_Indirect_Data Lisp_String_Indirect_Data; | |
| 2816 | |
| 2817 DECLARE_MODULE_API_LRECORD (string_indirect_data, Lisp_String_Indirect_Data); | |
| 2818 #define XSTRING_INDIRECT_DATA(x) \ | |
| 2819 XRECORD (x, string_indirect_data, Lisp_String_Indirect_Data) | |
| 2820 #define wrap_string_indirect_data(p) wrap_record (p, string_indirect_data) | |
| 2821 #define STRING_INDIRECT_DATAP(x) RECORDP (x, string_indirect_data) | |
| 2822 #define CHECK_STRING_INDIRECT_DATA(x) CHECK_RECORD (x, string_indirect_data) | |
| 2823 #define CONCHECK_STRING_INDIRECT_DATA(x) \ | |
| 2824 CONCHECK_RECORD (x, string_indirect_data) | |
| 2825 | |
| 2826 #define XSTRING_INDIRECT_DATA_SIZE(x) XSTRING_INDIRECT_DATA (x)->size | |
| 2827 #define XSTRING_INDIRECT_DATA_DATA(x) XSTRING_INDIRECT_DATA (x)->data | |
| 2828 | |
| 2829 | |
| 2830 #define XSTRING_DATA_SIZE(s) ((s)->indirect)? \ | |
| 2831 XSTRING_INDIRECT_DATA_SIZE ((s)->data_object): \ | |
| 2832 XSTRING_DIRECT_DATA_SIZE ((s)->data_object) | |
| 2833 #define XSTRING_DATA_DATA(s) ((s)->indirect)? \ | |
| 2834 XSTRING_INDIRECT_DATA_DATA ((s)->data_object): \ | |
| 2835 XSTRING_DIRECT_DATA_DATA ((s)->data_object) | |
| 2836 | |
| 2837 #define XSET_STRING_DATA_SIZE(s, len) \ | |
| 2838 if ((s)->indirect) \ | |
| 2839 XSTRING_INDIRECT_DATA_SIZE ((s)->data_object) = len; \ | |
| 2840 else \ | |
| 2841 XSTRING_DIRECT_DATA_SIZE ((s)->data_object) = len | |
| 2842 #define XSET_STRING_DATA_DATA(s, ptr) \ | |
| 2843 if ((s)->indirect) \ | |
| 2844 XSTRING_INDIRECT_DATA_DATA ((s)->data_object) = ptr; \ | |
| 2845 else \ | |
| 2846 XSTRING_DIRECT_DATA_DATA ((s)->data_object) = ptr | |
| 2847 #endif /* NEW_GC */ | |
| 2848 | |
| 428 | 2849 struct Lisp_String |
| 2850 { | |
| 771 | 2851 union |
| 2852 { | |
| 2853 struct lrecord_header lheader; | |
| 2854 struct | |
| 2855 { | |
| 2856 /* WARNING: Everything before ascii_begin must agree exactly with | |
| 2857 struct lrecord_header */ | |
| 2858 unsigned int type :8; | |
| 3263 | 2859 #ifdef NEW_GC |
| 2720 | 2860 unsigned int lisp_readonly :1; |
| 2861 unsigned int free :1; | |
| 2862 /* Number of chars at beginning of string that are one byte in length | |
| 2863 (byte_ascii_p) */ | |
| 2864 unsigned int ascii_begin :22; | |
| 3263 | 2865 #else /* not NEW_GC */ |
| 771 | 2866 unsigned int mark :1; |
| 2867 unsigned int c_readonly :1; | |
| 2868 unsigned int lisp_readonly :1; | |
| 2869 /* Number of chars at beginning of string that are one byte in length | |
| 826 | 2870 (byte_ascii_p) */ |
| 771 | 2871 unsigned int ascii_begin :21; |
| 3263 | 2872 #endif /* not NEW_GC */ |
| 771 | 2873 } v; |
| 2874 } u; | |
| 3092 | 2875 #ifdef NEW_GC |
| 2876 int indirect; | |
| 2877 Lisp_Object data_object; | |
| 2878 #else /* not NEW_GC */ | |
| 793 | 2879 Bytecount size_; |
| 867 | 2880 Ibyte *data_; |
| 3092 | 2881 #endif /* not NEW_GC */ |
| 428 | 2882 Lisp_Object plist; |
| 2883 }; | |
| 2884 typedef struct Lisp_String Lisp_String; | |
| 2885 | |
| 3263 | 2886 #ifdef NEW_GC |
| 3063 | 2887 #define MAX_STRING_ASCII_BEGIN ((1 << 22) - 1) |
| 3263 | 2888 #else /* not NEW_GC */ |
| 851 | 2889 #define MAX_STRING_ASCII_BEGIN ((1 << 21) - 1) |
| 3263 | 2890 #endif /* not NEW_GC */ |
| 771 | 2891 |
| 1632 | 2892 DECLARE_MODULE_API_LRECORD (string, Lisp_String); |
| 428 | 2893 #define XSTRING(x) XRECORD (x, string, Lisp_String) |
| 617 | 2894 #define wrap_string(p) wrap_record (p, string) |
| 428 | 2895 #define STRINGP(x) RECORDP (x, string) |
| 2896 #define CHECK_STRING(x) CHECK_RECORD (x, string) | |
| 2897 #define CONCHECK_STRING(x) CONCHECK_RECORD (x, string) | |
| 2898 | |
| 826 | 2899 /* Most basic macros for strings -- basically just accessing or setting |
| 2900 fields -- are here. Everything else is in text.h, since they depend on | |
| 2901 stuff there. */ | |
| 428 | 2902 |
| 793 | 2903 /* Operations on Lisp_String *'s; only ones left */ |
| 3092 | 2904 #ifdef NEW_GC |
| 3304 | 2905 #define set_lispstringp_direct(s) ((s)->indirect = 0) |
| 3092 | 2906 #define set_lispstringp_indirect(s) ((s)->indirect = 1) |
| 2907 #define set_lispstringp_length(s, len) XSET_STRING_DATA_SIZE (s, len) | |
| 2908 #define set_lispstringp_data(s, ptr) XSET_STRING_DATA_DATA (s, ptr) | |
| 2909 #else /* not NEW_GC */ | |
| 826 | 2910 #define set_lispstringp_length(s, len) ((void) ((s)->size_ = (len))) |
| 2911 #define set_lispstringp_data(s, ptr) ((void) ((s)->data_ = (ptr))) | |
| 3092 | 2912 #endif /* not NEW_GC */ |
| 826 | 2913 |
| 2914 /* Operations on strings as Lisp_Objects. Don't manipulate Lisp_String *'s | |
| 2915 in any new code. */ | |
| 3092 | 2916 #ifdef NEW_GC |
| 2917 #define STRING_DATA_OBJECT(s) ((s)->data_object) | |
| 2918 #define XSTRING_DATA_OBJECT(s) (STRING_DATA_OBJECT (XSTRING (s))) | |
| 2919 #define XSTRING_LENGTH(s) (XSTRING_DATA_SIZE (XSTRING (s))) | |
| 2920 #else /* not NEW_GC */ | |
| 793 | 2921 #define XSTRING_LENGTH(s) (XSTRING (s)->size_) |
| 3092 | 2922 #endif /* not NEW_GC */ |
| 793 | 2923 #define XSTRING_PLIST(s) (XSTRING (s)->plist) |
| 3092 | 2924 #ifdef NEW_GC |
| 2925 #define XSTRING_DATA(s) (XSTRING_DATA_DATA (XSTRING (s))) | |
| 2926 #else /* not NEW_GC */ | |
| 793 | 2927 #define XSTRING_DATA(s) (XSTRING (s)->data_ + 0) |
| 3092 | 2928 #endif /* not NEW_GC */ |
| 793 | 2929 #define XSTRING_ASCII_BEGIN(s) (XSTRING (s)->u.v.ascii_begin + 0) |
| 826 | 2930 #define XSET_STRING_LENGTH(s, ptr) set_lispstringp_length (XSTRING (s), ptr) |
| 2931 #define XSET_STRING_DATA(s, ptr) set_lispstringp_data (XSTRING (s), ptr) | |
| 771 | 2932 /* WARNING: If you modify an existing string, you must call |
| 2933 bump_string_modiff() afterwards. */ | |
| 793 | 2934 #define XSET_STRING_ASCII_BEGIN(s, val) \ |
| 2935 ((void) (XSTRING (s)->u.v.ascii_begin = (val))) | |
| 826 | 2936 #define XSTRING_FORMAT(s) FORMAT_DEFAULT |
| 428 | 2937 |
| 456 | 2938 /* Return the true aligned size of a struct whose last member is a |
| 2939 variable-length array field. (this is known as the "struct hack") */ | |
| 2940 /* Implementation: in practice, structtype and fieldtype usually have | |
| 2941 the same alignment, but we can't be sure. We need to use | |
| 2942 ALIGN_SIZE to be absolutely sure of getting the correct alignment. | |
| 2943 To help the compiler's optimizer, we use a ternary expression that | |
| 2944 only a very stupid compiler would fail to correctly simplify. */ | |
| 2945 #define FLEXIBLE_ARRAY_STRUCT_SIZEOF(structtype, \ | |
| 2946 fieldtype, \ | |
| 2947 fieldname, \ | |
| 2948 array_length) \ | |
| 2949 (ALIGNOF (structtype) == ALIGNOF (fieldtype) \ | |
| 2950 ? (offsetof (structtype, fieldname) + \ | |
| 2951 (offsetof (structtype, fieldname[1]) - \ | |
| 2952 offsetof (structtype, fieldname[0])) * \ | |
| 2953 (array_length)) \ | |
| 826 | 2954 : (ALIGN_FOR_TYPE \ |
| 456 | 2955 ((offsetof (structtype, fieldname) + \ |
| 2956 (offsetof (structtype, fieldname[1]) - \ | |
| 2957 offsetof (structtype, fieldname[0])) * \ | |
| 2958 (array_length)), \ | |
| 826 | 2959 structtype))) |
| 442 | 2960 |
| 2961 /*------------------------------ vector --------------------------------*/ | |
| 428 | 2962 |
| 2963 struct Lisp_Vector | |
| 2964 { | |
| 3017 | 2965 struct LCRECORD_HEADER header; |
| 428 | 2966 long size; |
| 2967 Lisp_Object contents[1]; | |
| 2968 }; | |
| 2969 typedef struct Lisp_Vector Lisp_Vector; | |
| 2970 | |
| 2971 DECLARE_LRECORD (vector, Lisp_Vector); | |
| 2972 #define XVECTOR(x) XRECORD (x, vector, Lisp_Vector) | |
| 617 | 2973 #define wrap_vector(p) wrap_record (p, vector) |
| 428 | 2974 #define VECTORP(x) RECORDP (x, vector) |
| 2975 #define CHECK_VECTOR(x) CHECK_RECORD (x, vector) | |
| 2976 #define CONCHECK_VECTOR(x) CONCHECK_RECORD (x, vector) | |
| 2977 | |
| 2978 #define vector_length(v) ((v)->size) | |
| 2979 #define XVECTOR_LENGTH(s) vector_length (XVECTOR (s)) | |
| 2980 #define vector_data(v) ((v)->contents) | |
| 2981 #define XVECTOR_DATA(s) vector_data (XVECTOR (s)) | |
| 2982 | |
| 442 | 2983 /*---------------------------- bit vectors -----------------------------*/ |
| 428 | 2984 |
| 2985 #if (LONGBITS < 16) | |
| 2986 #error What the hell?! | |
| 2987 #elif (LONGBITS < 32) | |
| 2988 # define LONGBITS_LOG2 4 | |
| 2989 # define LONGBITS_POWER_OF_2 16 | |
| 2990 #elif (LONGBITS < 64) | |
| 2991 # define LONGBITS_LOG2 5 | |
| 2992 # define LONGBITS_POWER_OF_2 32 | |
| 2993 #elif (LONGBITS < 128) | |
| 2994 # define LONGBITS_LOG2 6 | |
| 2995 # define LONGBITS_POWER_OF_2 64 | |
| 2996 #else | |
| 2997 #error You really have 128-bit integers?! | |
| 2998 #endif | |
| 2999 | |
| 3000 struct Lisp_Bit_Vector | |
| 3001 { | |
| 3017 | 3002 struct LCRECORD_HEADER lheader; |
| 665 | 3003 Elemcount size; |
| 428 | 3004 unsigned long bits[1]; |
| 3005 }; | |
| 3006 typedef struct Lisp_Bit_Vector Lisp_Bit_Vector; | |
| 3007 | |
| 3008 DECLARE_LRECORD (bit_vector, Lisp_Bit_Vector); | |
| 3009 #define XBIT_VECTOR(x) XRECORD (x, bit_vector, Lisp_Bit_Vector) | |
| 617 | 3010 #define wrap_bit_vector(p) wrap_record (p, bit_vector) |
| 428 | 3011 #define BIT_VECTORP(x) RECORDP (x, bit_vector) |
| 3012 #define CHECK_BIT_VECTOR(x) CHECK_RECORD (x, bit_vector) | |
| 3013 #define CONCHECK_BIT_VECTOR(x) CONCHECK_RECORD (x, bit_vector) | |
| 3014 | |
| 3015 #define BITP(x) (INTP (x) && (XINT (x) == 0 || XINT (x) == 1)) | |
| 3016 | |
| 3017 #define CHECK_BIT(x) do { \ | |
| 3018 if (!BITP (x)) \ | |
| 3019 dead_wrong_type_argument (Qbitp, x);\ | |
| 3020 } while (0) | |
| 3021 | |
| 3022 #define CONCHECK_BIT(x) do { \ | |
| 3023 if (!BITP (x)) \ | |
| 3024 x = wrong_type_argument (Qbitp, x); \ | |
| 3025 } while (0) | |
| 3026 | |
| 3027 #define bit_vector_length(v) ((v)->size) | |
| 3028 | |
| 826 | 3029 DECLARE_INLINE_HEADER ( |
| 3030 int | |
| 665 | 3031 bit_vector_bit (Lisp_Bit_Vector *v, Elemcount n) |
| 826 | 3032 ) |
| 428 | 3033 { |
| 3034 return ((v->bits[n >> LONGBITS_LOG2] >> (n & (LONGBITS_POWER_OF_2 - 1))) | |
| 3035 & 1); | |
| 3036 } | |
| 3037 | |
| 826 | 3038 DECLARE_INLINE_HEADER ( |
| 3039 void | |
| 665 | 3040 set_bit_vector_bit (Lisp_Bit_Vector *v, Elemcount n, int value) |
| 826 | 3041 ) |
| 428 | 3042 { |
| 3043 if (value) | |
| 3044 v->bits[n >> LONGBITS_LOG2] |= (1UL << (n & (LONGBITS_POWER_OF_2 - 1))); | |
| 3045 else | |
| 3046 v->bits[n >> LONGBITS_LOG2] &= ~(1UL << (n & (LONGBITS_POWER_OF_2 - 1))); | |
| 3047 } | |
| 3048 | |
| 3049 /* Number of longs required to hold LEN bits */ | |
| 3050 #define BIT_VECTOR_LONG_STORAGE(len) \ | |
| 3051 (((len) + LONGBITS_POWER_OF_2 - 1) >> LONGBITS_LOG2) | |
| 3052 | |
| 3659 | 3053 /* For when we want to include a bit vector in another structure, and we |
| 3054 know it's of a fixed size. */ | |
| 3055 #define DECLARE_INLINE_LISP_BIT_VECTOR(numbits) struct { \ | |
| 3056 struct LCRECORD_HEADER lheader; \ | |
| 3057 Elemcount size; \ | |
| 3058 unsigned long bits[BIT_VECTOR_LONG_STORAGE(numbits)]; \ | |
| 3059 } | |
|
4995
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3060 /*---------------------- array, sequence -----------------------------*/ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3061 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3062 #define ARRAYP(x) (VECTORP (x) || STRINGP (x) || BIT_VECTORP (x)) |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3063 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3064 #define CHECK_ARRAY(x) do { \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3065 if (!ARRAYP (x)) \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3066 dead_wrong_type_argument (Qarrayp, x); \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3067 } while (0) |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3068 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3069 #define CONCHECK_ARRAY(x) do { \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3070 if (!ARRAYP (x)) \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3071 x = wrong_type_argument (Qarrayp, x); \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3072 } while (0) |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3073 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3074 #define SEQUENCEP(x) (LISTP (x) || ARRAYP (x)) |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3075 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3076 #define CHECK_SEQUENCE(x) do { \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3077 if (!SEQUENCEP (x)) \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3078 dead_wrong_type_argument (Qsequencep, x); \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3079 } while (0) |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3080 |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3081 #define CONCHECK_SEQUENCE(x) do { \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3082 if (!SEQUENCEP (x)) \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3083 x = wrong_type_argument (Qsequencep, x); \ |
|
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
3084 } while (0) |
| 853 | 3085 |
| 442 | 3086 /*------------------------------ symbol --------------------------------*/ |
| 428 | 3087 |
| 440 | 3088 typedef struct Lisp_Symbol Lisp_Symbol; |
| 428 | 3089 struct Lisp_Symbol |
| 3090 { | |
| 3091 struct lrecord_header lheader; | |
| 3092 /* next symbol in this obarray bucket */ | |
| 440 | 3093 Lisp_Symbol *next; |
| 793 | 3094 Lisp_Object name; |
| 428 | 3095 Lisp_Object value; |
| 3096 Lisp_Object function; | |
| 3097 Lisp_Object plist; | |
| 3098 }; | |
| 3099 | |
| 3100 #define SYMBOL_IS_KEYWORD(sym) \ | |
| 826 | 3101 ((string_byte (symbol_name (XSYMBOL (sym)), 0) == ':') \ |
| 428 | 3102 && EQ (sym, oblookup (Vobarray, \ |
| 793 | 3103 XSTRING_DATA (symbol_name (XSYMBOL (sym))), \ |
| 3104 XSTRING_LENGTH (symbol_name (XSYMBOL (sym)))))) | |
| 428 | 3105 #define KEYWORDP(obj) (SYMBOLP (obj) && SYMBOL_IS_KEYWORD (obj)) |
| 3106 | |
| 1632 | 3107 DECLARE_MODULE_API_LRECORD (symbol, Lisp_Symbol); |
| 428 | 3108 #define XSYMBOL(x) XRECORD (x, symbol, Lisp_Symbol) |
| 617 | 3109 #define wrap_symbol(p) wrap_record (p, symbol) |
| 428 | 3110 #define SYMBOLP(x) RECORDP (x, symbol) |
| 3111 #define CHECK_SYMBOL(x) CHECK_RECORD (x, symbol) | |
| 3112 #define CONCHECK_SYMBOL(x) CONCHECK_RECORD (x, symbol) | |
| 3113 | |
| 3114 #define symbol_next(s) ((s)->next) | |
| 3115 #define symbol_name(s) ((s)->name) | |
| 3116 #define symbol_value(s) ((s)->value) | |
| 3117 #define symbol_function(s) ((s)->function) | |
| 3118 #define symbol_plist(s) ((s)->plist) | |
| 3119 | |
| 793 | 3120 #define XSYMBOL_NEXT(s) (XSYMBOL (s)->next) |
| 3121 #define XSYMBOL_NAME(s) (XSYMBOL (s)->name) | |
| 3122 #define XSYMBOL_VALUE(s) (XSYMBOL (s)->value) | |
| 3123 #define XSYMBOL_FUNCTION(s) (XSYMBOL (s)->function) | |
| 3124 #define XSYMBOL_PLIST(s) (XSYMBOL (s)->plist) | |
| 3125 | |
| 3126 | |
| 442 | 3127 /*------------------------------- subr ---------------------------------*/ |
| 428 | 3128 |
| 853 | 3129 /* A function that takes no arguments and returns a Lisp_Object. |
| 3130 We could define such types for n arguments, if needed. */ | |
| 428 | 3131 typedef Lisp_Object (*lisp_fn_t) (void); |
| 3132 | |
| 3133 struct Lisp_Subr | |
| 3134 { | |
| 3135 struct lrecord_header lheader; | |
| 442 | 3136 short min_args; |
| 3137 short max_args; | |
| 3379 | 3138 /* #### We should make these const Ascbyte * or const Ibyte *, not const |
| 3139 char *. */ | |
| 442 | 3140 const char *prompt; |
| 3141 const char *doc; | |
| 3142 const char *name; | |
| 428 | 3143 lisp_fn_t subr_fn; |
| 3144 }; | |
| 3145 typedef struct Lisp_Subr Lisp_Subr; | |
| 3146 | |
| 3147 DECLARE_LRECORD (subr, Lisp_Subr); | |
| 3148 #define XSUBR(x) XRECORD (x, subr, Lisp_Subr) | |
| 617 | 3149 #define wrap_subr(p) wrap_record (p, subr) |
| 428 | 3150 #define SUBRP(x) RECORDP (x, subr) |
| 3151 #define CHECK_SUBR(x) CHECK_RECORD (x, subr) | |
| 3152 #define CONCHECK_SUBR(x) CONCHECK_RECORD (x, subr) | |
| 3153 | |
| 436 | 3154 #define subr_function(subr) ((subr)->subr_fn) |
| 3155 #define SUBR_FUNCTION(subr,max_args) \ | |
| 3156 ((Lisp_Object (*) (EXFUN_##max_args)) (subr)->subr_fn) | |
| 3157 #define subr_name(subr) ((subr)->name) | |
| 428 | 3158 |
| 442 | 3159 /*------------------------------ marker --------------------------------*/ |
| 3160 | |
| 428 | 3161 |
| 440 | 3162 typedef struct Lisp_Marker Lisp_Marker; |
| 428 | 3163 struct Lisp_Marker |
| 3164 { | |
| 3165 struct lrecord_header lheader; | |
| 440 | 3166 Lisp_Marker *next; |
| 3167 Lisp_Marker *prev; | |
| 428 | 3168 struct buffer *buffer; |
| 665 | 3169 Membpos membpos; |
| 428 | 3170 char insertion_type; |
| 3171 }; | |
| 3172 | |
| 1632 | 3173 DECLARE_MODULE_API_LRECORD (marker, Lisp_Marker); |
| 428 | 3174 #define XMARKER(x) XRECORD (x, marker, Lisp_Marker) |
| 617 | 3175 #define wrap_marker(p) wrap_record (p, marker) |
| 428 | 3176 #define MARKERP(x) RECORDP (x, marker) |
| 3177 #define CHECK_MARKER(x) CHECK_RECORD (x, marker) | |
| 3178 #define CONCHECK_MARKER(x) CONCHECK_RECORD (x, marker) | |
| 3179 | |
| 3180 /* The second check was looking for GCed markers still in use */ | |
| 2500 | 3181 /* if (INTP (XMARKER (x)->lheader.next.v)) ABORT (); */ |
| 428 | 3182 |
| 3183 #define marker_next(m) ((m)->next) | |
| 3184 #define marker_prev(m) ((m)->prev) | |
| 3185 | |
| 3063 | 3186 /*-------------------basic int (no connection to char)------------------*/ |
| 3187 | |
| 3188 #define ZEROP(x) EQ (x, Qzero) | |
| 428 | 3189 |
| 800 | 3190 #ifdef ERROR_CHECK_TYPES |
| 428 | 3191 |
| 3063 | 3192 #define XINT(x) XINT_1 (x, __FILE__, __LINE__) |
| 3193 | |
| 3194 DECLARE_INLINE_HEADER ( | |
| 3195 EMACS_INT | |
| 3196 XINT_1 (Lisp_Object obj, const Ascbyte *file, int line) | |
| 3197 ) | |
| 3198 { | |
| 3199 assert_at_line (INTP (obj), file, line); | |
| 3200 return XREALINT (obj); | |
| 3201 } | |
| 3202 | |
| 3203 #else /* no error checking */ | |
| 3204 | |
| 3205 #define XINT(obj) XREALINT (obj) | |
| 3206 | |
| 3207 #endif /* no error checking */ | |
| 3208 | |
| 3209 #define CHECK_INT(x) do { \ | |
| 3210 if (!INTP (x)) \ | |
| 3211 dead_wrong_type_argument (Qintegerp, x); \ | |
| 3212 } while (0) | |
| 3213 | |
| 3214 #define CONCHECK_INT(x) do { \ | |
| 3215 if (!INTP (x)) \ | |
| 3216 x = wrong_type_argument (Qintegerp, x); \ | |
| 3217 } while (0) | |
| 3218 | |
| 3219 #define NATNUMP(x) (INTP (x) && XINT (x) >= 0) | |
| 3220 | |
| 3221 #define CHECK_NATNUM(x) do { \ | |
| 3222 if (!NATNUMP (x)) \ | |
| 3223 dead_wrong_type_argument (Qnatnump, x); \ | |
| 3224 } while (0) | |
| 3225 | |
| 3226 #define CONCHECK_NATNUM(x) do { \ | |
| 3227 if (!NATNUMP (x)) \ | |
| 3228 x = wrong_type_argument (Qnatnump, x); \ | |
| 3229 } while (0) | |
| 3230 | |
| 3231 /*------------------------------- char ---------------------------------*/ | |
| 3232 | |
| 3233 /* NOTE: There are basic functions for converting between a character and | |
| 3234 the string representation of a character in text.h, as well as lots of | |
| 3235 other character-related stuff. There are other functions/macros for | |
| 3236 working with Ichars in charset.h, for retrieving the charset of an | |
| 3237 Ichar, the length of an Ichar when converted to text, etc. | |
| 3238 */ | |
| 3239 | |
| 3240 #ifdef MULE | |
| 3241 | |
| 3242 MODULE_API int non_ascii_valid_ichar_p (Ichar ch); | |
| 3243 | |
| 3244 /* Return whether the given Ichar is valid. | |
| 3245 */ | |
| 3246 | |
| 3247 DECLARE_INLINE_HEADER ( | |
| 3248 int | |
| 3249 valid_ichar_p (Ichar ch) | |
| 3250 ) | |
| 3251 { | |
| 3252 return (! (ch & ~0xFF)) || non_ascii_valid_ichar_p (ch); | |
| 3253 } | |
| 3254 | |
| 3255 #else /* not MULE */ | |
| 3256 | |
| 3257 /* This works when CH is negative, and correctly returns non-zero only when CH | |
| 3258 is in the range [0, 255], inclusive. */ | |
| 3259 #define valid_ichar_p(ch) (! (ch & ~0xFF)) | |
| 3260 | |
| 3261 #endif /* not MULE */ | |
| 3262 | |
| 3263 #ifdef ERROR_CHECK_TYPES | |
| 3264 | |
| 3265 DECLARE_INLINE_HEADER ( | |
| 3266 int | |
| 3267 CHARP_1 (Lisp_Object obj, const Ascbyte *file, int line) | |
| 3268 ) | |
| 3269 { | |
| 3270 if (XTYPE (obj) != Lisp_Type_Char) | |
| 3271 return 0; | |
| 3272 assert_at_line (valid_ichar_p (XCHARVAL (obj)), file, line); | |
| 3273 return 1; | |
| 3274 } | |
| 3275 | |
| 3276 #define CHARP(x) CHARP_1 (x, __FILE__, __LINE__) | |
| 3277 | |
| 826 | 3278 DECLARE_INLINE_HEADER ( |
| 867 | 3279 Ichar |
| 2367 | 3280 XCHAR_1 (Lisp_Object obj, const Ascbyte *file, int line) |
| 826 | 3281 ) |
| 428 | 3282 { |
| 3063 | 3283 Ichar ch; |
| 788 | 3284 assert_at_line (CHARP (obj), file, line); |
| 3063 | 3285 ch = XCHARVAL (obj); |
| 3286 assert_at_line (valid_ichar_p (ch), file, line); | |
| 3287 return ch; | |
| 428 | 3288 } |
| 3289 | |
| 788 | 3290 #define XCHAR(x) XCHAR_1 (x, __FILE__, __LINE__) |
| 3291 | |
| 3063 | 3292 #else /* not ERROR_CHECK_TYPES */ |
| 3293 | |
| 3294 #define CHARP(x) (XTYPE (x) == Lisp_Type_Char) | |
| 3295 #define XCHAR(x) ((Ichar) XCHARVAL (x)) | |
| 3296 | |
| 3297 #endif /* (else) not ERROR_CHECK_TYPES */ | |
| 3298 | |
| 3299 #define CONCHECK_CHAR(x) do { \ | |
| 3300 if (!CHARP (x)) \ | |
| 3301 x = wrong_type_argument (Qcharacterp, x); \ | |
| 3302 } while (0) | |
| 3303 | |
| 3304 #define CHECK_CHAR(x) do { \ | |
| 3305 if (!CHARP (x)) \ | |
| 3306 dead_wrong_type_argument (Qcharacterp, x); \ | |
| 3307 } while (0) | |
| 3308 | |
| 3309 | |
| 3310 DECLARE_INLINE_HEADER ( | |
| 3311 Lisp_Object | |
| 3312 make_char (Ichar val) | |
| 3313 ) | |
| 3314 { | |
| 3315 type_checking_assert (valid_ichar_p (val)); | |
| 3316 /* This is defined in lisp-union.h or lisp-disunion.h */ | |
| 3317 return make_char_1 (val); | |
| 3318 } | |
| 3319 | |
| 3320 /*------------------------- int-char connection ------------------------*/ | |
| 3321 | |
| 3322 #ifdef ERROR_CHECK_TYPES | |
| 3323 | |
| 3324 #define XCHAR_OR_INT(x) XCHAR_OR_INT_1 (x, __FILE__, __LINE__) | |
| 3325 | |
| 3326 DECLARE_INLINE_HEADER ( | |
| 3327 EMACS_INT | |
| 3328 XCHAR_OR_INT_1 (Lisp_Object obj, const Ascbyte *file, int line) | |
| 3329 ) | |
| 3330 { | |
| 3331 assert_at_line (INTP (obj) || CHARP (obj), file, line); | |
| 3332 return CHARP (obj) ? XCHAR (obj) : XINT (obj); | |
| 3333 } | |
| 3334 | |
| 788 | 3335 #else /* no error checking */ |
| 3336 | |
| 4134 | 3337 /* obj is multiply eval'ed and not an lvalue; use an inline function instead |
| 3338 of a macro. */ | |
| 3339 DECLARE_INLINE_HEADER ( | |
| 3340 EMACS_INT | |
| 3341 XCHAR_OR_INT (Lisp_Object obj) | |
| 3342 ) | |
| 3343 { | |
| 3344 return CHARP (obj) ? XCHAR (obj) : XINT (obj); | |
| 3345 } | |
| 788 | 3346 |
| 3347 #endif /* no error checking */ | |
| 428 | 3348 |
| 3063 | 3349 /* True of X is an integer whose value is the valid integral equivalent of a |
| 3350 character. */ | |
| 3351 | |
| 3352 #define CHAR_INTP(x) (INTP (x) && valid_ichar_p (XINT (x))) | |
| 3353 | |
| 3354 /* True of X is a character or an integral value that can be converted into a | |
| 3355 character. */ | |
| 3356 #define CHAR_OR_CHAR_INTP(x) (CHARP (x) || CHAR_INTP (x)) | |
| 3357 | |
| 3358 DECLARE_INLINE_HEADER ( | |
| 3359 Ichar | |
| 3360 XCHAR_OR_CHAR_INT (Lisp_Object obj) | |
| 3361 ) | |
| 3362 { | |
| 3363 return CHARP (obj) ? XCHAR (obj) : XINT (obj); | |
| 3364 } | |
| 3365 | |
| 3366 /* Signal an error if CH is not a valid character or integer Lisp_Object. | |
| 3367 If CH is an integer Lisp_Object, convert it to a character Lisp_Object, | |
| 3368 but merely by repackaging, without performing tests for char validity. | |
| 3369 */ | |
| 3370 | |
| 3371 #define CHECK_CHAR_COERCE_INT(x) do { \ | |
| 3372 if (CHARP (x)) \ | |
| 3373 ; \ | |
| 3374 else if (CHAR_INTP (x)) \ | |
| 3375 x = make_char (XINT (x)); \ | |
| 3376 else \ | |
| 3377 x = wrong_type_argument (Qcharacterp, x); \ | |
| 3378 } while (0) | |
| 3379 | |
| 3380 /* next three always continuable because they coerce their arguments. */ | |
| 3381 #define CHECK_INT_COERCE_CHAR(x) do { \ | |
| 3382 if (INTP (x)) \ | |
| 3383 ; \ | |
| 3384 else if (CHARP (x)) \ | |
| 3385 x = make_int (XCHAR (x)); \ | |
| 3386 else \ | |
| 3387 x = wrong_type_argument (Qinteger_or_char_p, x); \ | |
| 3388 } while (0) | |
| 3389 | |
| 3390 #define CHECK_INT_COERCE_MARKER(x) do { \ | |
| 3391 if (INTP (x)) \ | |
| 3392 ; \ | |
| 3393 else if (MARKERP (x)) \ | |
| 3394 x = make_int (marker_position (x)); \ | |
| 3395 else \ | |
| 3396 x = wrong_type_argument (Qinteger_or_marker_p, x); \ | |
| 3397 } while (0) | |
| 3398 | |
| 3399 #define CHECK_INT_COERCE_CHAR_OR_MARKER(x) do { \ | |
| 3400 if (INTP (x)) \ | |
| 3401 ; \ | |
| 3402 else if (CHARP (x)) \ | |
| 3403 x = make_int (XCHAR (x)); \ | |
| 3404 else if (MARKERP (x)) \ | |
| 3405 x = make_int (marker_position (x)); \ | |
| 3406 else \ | |
| 3407 x = wrong_type_argument (Qinteger_char_or_marker_p, x); \ | |
| 3408 } while (0) | |
| 428 | 3409 |
| 442 | 3410 /*------------------------------ float ---------------------------------*/ |
| 428 | 3411 |
| 3412 /* Note: the 'unused_next_' field exists only to ensure that the | |
| 3413 `next' pointer fits within the structure, for the purposes of the | |
| 3414 free list. This makes a difference in the unlikely case of | |
| 3415 sizeof(double) being smaller than sizeof(void *). */ | |
| 3416 | |
| 3417 struct Lisp_Float | |
| 3418 { | |
| 3419 struct lrecord_header lheader; | |
| 3420 union { double d; struct Lisp_Float *unused_next_; } data; | |
| 3421 }; | |
| 3422 typedef struct Lisp_Float Lisp_Float; | |
| 3423 | |
| 3424 DECLARE_LRECORD (float, Lisp_Float); | |
| 3425 #define XFLOAT(x) XRECORD (x, float, Lisp_Float) | |
| 617 | 3426 #define wrap_float(p) wrap_record (p, float) |
| 428 | 3427 #define FLOATP(x) RECORDP (x, float) |
| 3428 #define CHECK_FLOAT(x) CHECK_RECORD (x, float) | |
| 3429 #define CONCHECK_FLOAT(x) CONCHECK_RECORD (x, float) | |
| 3430 | |
| 3431 #define float_data(f) ((f)->data.d) | |
| 3432 #define XFLOAT_DATA(x) float_data (XFLOAT (x)) | |
| 3433 | |
| 3434 #define XFLOATINT(n) extract_float (n) | |
| 3435 | |
| 3436 #define CHECK_INT_OR_FLOAT(x) do { \ | |
| 3437 if (!INT_OR_FLOATP (x)) \ | |
| 3438 dead_wrong_type_argument (Qnumberp, x); \ | |
| 3439 } while (0) | |
| 3440 | |
| 3441 #define CONCHECK_INT_OR_FLOAT(x) do { \ | |
| 3442 if (!INT_OR_FLOATP (x)) \ | |
| 3443 x = wrong_type_argument (Qnumberp, x); \ | |
| 3444 } while (0) | |
| 3445 | |
| 3446 # define INT_OR_FLOATP(x) (INTP (x) || FLOATP (x)) | |
| 3447 | |
| 442 | 3448 /*--------------------------- readonly objects -------------------------*/ |
| 440 | 3449 |
| 3263 | 3450 #ifndef NEW_GC |
| 428 | 3451 #define CHECK_C_WRITEABLE(obj) \ |
| 3452 do { if (c_readonly (obj)) c_write_error (obj); } while (0) | |
| 3453 | |
| 2720 | 3454 #define C_READONLY(obj) (C_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj))) |
| 3263 | 3455 #endif /* not NEW_GC */ |
| 2720 | 3456 |
| 428 | 3457 #define CHECK_LISP_WRITEABLE(obj) \ |
| 3458 do { if (lisp_readonly (obj)) lisp_write_error (obj); } while (0) | |
| 3459 | |
| 3460 #define LISP_READONLY(obj) (LISP_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj))) | |
| 3461 | |
| 980 | 3462 /*----------------------------- structures ----------------------------*/ |
| 428 | 3463 |
| 3464 typedef struct structure_keyword_entry structure_keyword_entry; | |
| 3465 struct structure_keyword_entry | |
| 3466 { | |
| 3467 Lisp_Object keyword; | |
| 3468 int (*validate) (Lisp_Object keyword, Lisp_Object value, | |
| 578 | 3469 Error_Behavior errb); |
| 428 | 3470 }; |
| 3471 | |
| 3472 typedef struct | |
| 3473 { | |
| 3474 Dynarr_declare (structure_keyword_entry); | |
| 3475 } structure_keyword_entry_dynarr; | |
| 3476 | |
| 3477 typedef struct structure_type structure_type; | |
| 3478 struct structure_type | |
| 3479 { | |
| 3480 Lisp_Object type; | |
| 3481 structure_keyword_entry_dynarr *keywords; | |
| 578 | 3482 int (*validate) (Lisp_Object data, Error_Behavior errb); |
| 428 | 3483 Lisp_Object (*instantiate) (Lisp_Object data); |
| 3484 }; | |
| 3485 | |
| 3486 typedef struct | |
| 3487 { | |
| 3488 Dynarr_declare (structure_type); | |
| 3489 } structure_type_dynarr; | |
| 3490 | |
| 3491 struct structure_type *define_structure_type (Lisp_Object type, | |
| 3492 int (*validate) | |
| 3493 (Lisp_Object data, | |
| 578 | 3494 Error_Behavior errb), |
| 428 | 3495 Lisp_Object (*instantiate) |
| 3496 (Lisp_Object data)); | |
| 3497 void define_structure_type_keyword (struct structure_type *st, | |
| 3498 Lisp_Object keyword, | |
| 3499 int (*validate) (Lisp_Object keyword, | |
| 3500 Lisp_Object value, | |
| 578 | 3501 Error_Behavior errb)); |
| 428 | 3502 |
| 858 | 3503 /*---------------------------- weak boxes ------------------------------*/ |
| 3504 | |
| 3505 struct weak_box | |
| 3506 { | |
| 3017 | 3507 struct LCRECORD_HEADER header; |
| 858 | 3508 Lisp_Object value; |
| 3509 | |
| 3510 Lisp_Object next_weak_box; /* don't mark through this! */ | |
| 3511 }; | |
| 3512 | |
| 3513 void prune_weak_boxes (void); | |
| 3514 Lisp_Object make_weak_box (Lisp_Object value); | |
| 3515 Lisp_Object weak_box_ref (Lisp_Object value); | |
| 3516 | |
| 3517 DECLARE_LRECORD (weak_box, struct weak_box); | |
| 3518 #define XWEAK_BOX(x) XRECORD (x, weak_box, struct weak_box) | |
| 3519 #define XSET_WEAK_BOX(x, v) (XWEAK_BOX (x)->value = (v)) | |
| 3520 #define wrap_weak_box(p) wrap_record (p, weak_box) | |
| 3521 #define WEAK_BOXP(x) RECORDP (x, weak_box) | |
| 3522 #define CHECK_WEAK_BOX(x) CHECK_RECORD (x, weak_box) | |
| 3523 #define CONCHECK_WEAK_BOX(x) CONCHECK_RECORD (x, weak_box) | |
| 3524 | |
| 888 | 3525 /*--------------------------- ephemerons ----------------------------*/ |
| 3526 | |
| 3527 struct ephemeron | |
| 3528 { | |
| 3017 | 3529 struct LCRECORD_HEADER header; |
| 888 | 3530 |
| 3531 Lisp_Object key; | |
| 3532 | |
| 3533 /* This field holds a pair. The cdr of this cons points to the next | |
| 3534 ephemeron in Vall_ephemerons. The car points to another pair | |
| 3535 whose car is the value and whose cdr is the finalizer. | |
| 3536 | |
| 3537 This representation makes it very easy to unlink an ephemeron | |
| 3538 from Vall_ephemerons and chain it into | |
| 3539 Vall_ephemerons_to_finalize. */ | |
| 3540 | |
| 3541 Lisp_Object cons_chain; | |
| 3542 | |
| 3543 Lisp_Object value; | |
| 3544 }; | |
| 3545 | |
| 3546 void prune_ephemerons (void); | |
| 3547 Lisp_Object ephemeron_value(Lisp_Object ephi); | |
| 1590 | 3548 void init_marking_ephemerons(void); |
| 3549 int continue_marking_ephemerons(void); | |
| 888 | 3550 int finish_marking_ephemerons(void); |
| 3551 Lisp_Object zap_finalize_list(void); | |
| 3552 Lisp_Object make_ephemeron(Lisp_Object key, Lisp_Object value, Lisp_Object finalizer); | |
| 3553 | |
| 3554 DECLARE_LRECORD(ephemeron, struct ephemeron); | |
| 3555 #define XEPHEMERON(x) XRECORD (x, ephemeron, struct ephemeron) | |
| 3556 #define XEPHEMERON_REF(x) (XEPHEMERON (x)->value) | |
| 3557 #define XEPHEMERON_NEXT(x) (XCDR (XEPHEMERON(x)->cons_chain)) | |
| 3558 #define XEPHEMERON_FINALIZER(x) (XCDR (XCAR (XEPHEMERON (x)->cons_chain))) | |
| 3559 #define XSET_EPHEMERON_NEXT(x, n) (XSETCDR (XEPHEMERON(x)->cons_chain, n)) | |
| 3560 #define XSET_EPHEMERON_VALUE(x, v) (XEPHEMERON(x)->value = (v)) | |
| 3561 #define XSET_EPHEMERON_KEY(x, k) (XEPHEMERON(x)->key = (k)) | |
| 3562 #define wrap_ephemeron(p) wrap_record (p, ephemeron) | |
| 3563 #define EPHEMERONP(x) RECORDP (x, ephemeron) | |
| 3564 #define CHECK_EPHEMERON(x) CHECK_RECORD (x, ephemeron) | |
| 3565 #define CONCHECK_EPHEMERON(x) CONCHECK_RECORD (x, ephemeron) | |
| 3566 | |
| 858 | 3567 |
| 442 | 3568 /*---------------------------- weak lists ------------------------------*/ |
| 428 | 3569 |
| 3570 enum weak_list_type | |
| 3571 { | |
| 3572 /* element disappears if it's unmarked. */ | |
| 3573 WEAK_LIST_SIMPLE, | |
| 3574 /* element disappears if it's a cons and either its car or | |
| 3575 cdr is unmarked. */ | |
| 3576 WEAK_LIST_ASSOC, | |
| 3577 /* element disappears if it's a cons and its car is unmarked. */ | |
| 3578 WEAK_LIST_KEY_ASSOC, | |
| 3579 /* element disappears if it's a cons and its cdr is unmarked. */ | |
| 442 | 3580 WEAK_LIST_VALUE_ASSOC, |
| 3581 /* element disappears if it's a cons and neither its car nor | |
| 3582 its cdr is marked. */ | |
| 3583 WEAK_LIST_FULL_ASSOC | |
| 428 | 3584 }; |
| 3585 | |
| 3586 struct weak_list | |
| 3587 { | |
| 3017 | 3588 struct LCRECORD_HEADER header; |
| 428 | 3589 Lisp_Object list; /* don't mark through this! */ |
| 3590 enum weak_list_type type; | |
| 3591 Lisp_Object next_weak; /* don't mark through this! */ | |
| 3592 }; | |
| 3593 | |
| 3594 DECLARE_LRECORD (weak_list, struct weak_list); | |
| 3595 #define XWEAK_LIST(x) XRECORD (x, weak_list, struct weak_list) | |
| 617 | 3596 #define wrap_weak_list(p) wrap_record (p, weak_list) |
| 428 | 3597 #define WEAK_LISTP(x) RECORDP (x, weak_list) |
| 3598 #define CHECK_WEAK_LIST(x) CHECK_RECORD (x, weak_list) | |
| 3599 #define CONCHECK_WEAK_LIST(x) CONCHECK_RECORD (x, weak_list) | |
| 3600 | |
| 3601 #define weak_list_list(w) ((w)->list) | |
| 3602 #define XWEAK_LIST_LIST(w) (XWEAK_LIST (w)->list) | |
| 3603 | |
| 3604 Lisp_Object make_weak_list (enum weak_list_type type); | |
| 3605 /* The following two are only called by the garbage collector */ | |
| 3606 int finish_marking_weak_lists (void); | |
| 3607 void prune_weak_lists (void); | |
| 3608 | |
| 1743 | 3609 END_C_DECLS |
| 428 | 3610 |
| 3611 /************************************************************************/ | |
| 771 | 3612 /* Definitions related to the format of text and of characters */ |
| 3613 /************************************************************************/ | |
| 3614 | |
| 3615 /* Note: | |
| 3616 | |
| 3617 "internally formatted text" and the term "internal format" in | |
| 3618 general are likely to refer to the format of text in buffers and | |
| 3619 strings; "externally formatted text" and the term "external format" | |
| 3620 refer to any text format used in the O.S. or elsewhere outside of | |
| 3621 XEmacs. The format of text and of a character are related and | |
| 3622 there must be a one-to-one relationship (hopefully through a | |
| 3623 relatively simple algorithmic means of conversion) between a string | |
| 3624 of text and an equivalent array of characters, but the conversion | |
| 3625 between the two is NOT necessarily trivial. | |
| 3626 | |
| 3627 In a non-Mule XEmacs, allowed characters are numbered 0 through | |
| 3628 255, where no fixed meaning is assigned to them, but (when | |
| 3629 representing text, rather than bytes in a binary file) in practice | |
| 3630 the lower half represents ASCII and the upper half some other 8-bit | |
| 3631 character set (chosen by setting the font, case tables, syntax | |
| 3632 tables, etc. appropriately for the character set through ad-hoc | |
| 3633 means such as the `iso-8859-1' file and the | |
| 3634 `standard-display-european' function). | |
| 3635 | |
| 3636 #### Finish this. | |
| 3637 | |
| 3638 */ | |
| 3639 #include "text.h" | |
| 3640 | |
| 3641 | |
| 3642 /************************************************************************/ | |
| 428 | 3643 /* Definitions of primitive Lisp functions and variables */ |
| 3644 /************************************************************************/ | |
| 3645 | |
| 3646 | |
| 3647 /* DEFUN - Define a built-in Lisp-visible C function or `subr'. | |
| 3648 `lname' should be the name to give the function in Lisp, | |
| 3649 as a null-terminated C string. | |
| 3650 `Fname' should be the C equivalent of `lname', using only characters | |
| 3651 valid in a C identifier, with an "F" prepended. | |
| 3652 The name of the C constant structure that records information | |
| 3653 on this function for internal use is "S" concatenated with Fname. | |
| 3654 `min_args' should be a number, the minimum number of arguments allowed. | |
| 3655 `max_args' should be a number, the maximum number of arguments allowed, | |
| 3656 or else MANY or UNEVALLED. | |
| 3657 MANY means pass a vector of evaluated arguments, | |
| 3658 in the form of an integer number-of-arguments | |
| 3659 followed by the address of a vector of Lisp_Objects | |
| 3660 which contains the argument values. | |
| 3661 UNEVALLED means pass the list of unevaluated arguments. | |
| 3662 `prompt' says how to read arguments for an interactive call. | |
| 3663 See the doc string for `interactive'. | |
| 3664 A null string means call interactively with no arguments. | |
| 3665 `arglist' are the comma-separated arguments (always Lisp_Objects) for | |
| 3666 the function. | |
| 3667 The docstring for the function is placed as a "C" comment between | |
| 3668 the prompt and the `args' argument. make-docfile reads the | |
| 3669 comment and creates the DOC file from it. | |
| 3670 */ | |
| 3671 | |
| 3672 #define EXFUN_0 void | |
| 3673 #define EXFUN_1 Lisp_Object | |
| 3674 #define EXFUN_2 Lisp_Object,Lisp_Object | |
| 3675 #define EXFUN_3 Lisp_Object,Lisp_Object,Lisp_Object | |
| 3676 #define EXFUN_4 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object | |
| 3677 #define EXFUN_5 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object | |
| 3678 #define EXFUN_6 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \ | |
| 3679 Lisp_Object | |
| 3680 #define EXFUN_7 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \ | |
| 3681 Lisp_Object,Lisp_Object | |
| 3682 #define EXFUN_8 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \ | |
| 3683 Lisp_Object,Lisp_Object,Lisp_Object | |
| 3684 #define EXFUN_MANY int, Lisp_Object* | |
| 3685 #define EXFUN_UNEVALLED Lisp_Object | |
| 3686 #define EXFUN(sym, max_args) Lisp_Object sym (EXFUN_##max_args) | |
| 2268 | 3687 #define EXFUN_NORETURN(sym, max_args) \ |
| 3688 DECLARE_DOESNT_RETURN_TYPE (Lisp_Object, sym (EXFUN_##max_args)) | |
| 428 | 3689 |
| 3690 #define SUBR_MAX_ARGS 8 | |
| 3691 #define MANY -2 | |
| 3692 #define UNEVALLED -1 | |
| 3693 | |
| 3694 /* Can't be const, because then subr->doc is read-only and | |
| 3695 Snarf_documentation chokes */ | |
| 3696 | |
| 3263 | 3697 #ifdef NEW_GC |
| 2720 | 3698 #define DEFUN(lname, Fname, min_args, max_args, prompt, arglist) \ |
| 3699 Lisp_Object Fname (EXFUN_##max_args); \ | |
| 3700 static struct Lisp_Subr MC_ALLOC_S##Fname = \ | |
| 3701 { \ | |
| 3702 { /* struct lrecord_header */ \ | |
| 3703 lrecord_type_subr, /* lrecord_type_index */ \ | |
| 3704 1, /* lisp_readonly bit */ \ | |
| 3705 0, /* free */ \ | |
| 3706 0 /* uid */ \ | |
| 3707 }, \ | |
| 3708 min_args, \ | |
| 3709 max_args, \ | |
| 3710 prompt, \ | |
| 3711 0, /* doc string */ \ | |
| 3712 lname, \ | |
| 3713 (lisp_fn_t) Fname \ | |
| 3714 }; \ | |
| 2814 | 3715 static struct Lisp_Subr *S##Fname; \ |
| 2720 | 3716 Lisp_Object Fname (DEFUN_##max_args arglist) |
| 3717 | |
| 3718 #define DEFUN_NORETURN(lname, Fname, min_args, max_args, prompt, arglist) \ | |
| 3719 DECLARE_DOESNT_RETURN_TYPE (Lisp_Object, Fname (EXFUN_##max_args)); \ | |
| 3720 static struct Lisp_Subr MC_ALLOC_S##Fname = \ | |
| 3721 { \ | |
| 3722 { /* struct lrecord_header */ \ | |
| 3723 lrecord_type_subr, /* lrecord_type_index */ \ | |
| 3724 1, /* lisp_readonly bit */ \ | |
| 3725 0, /* free */ \ | |
| 3726 0 /* uid */ \ | |
| 3727 }, \ | |
| 3728 min_args, \ | |
| 3729 max_args, \ | |
| 3730 prompt, \ | |
| 3731 0, /* doc string */ \ | |
| 3732 lname, \ | |
| 3733 (lisp_fn_t) Fname \ | |
| 3734 }; \ | |
| 2814 | 3735 static struct Lisp_Subr *S##Fname; \ |
| 2720 | 3736 DOESNT_RETURN_TYPE (Lisp_Object) Fname (DEFUN_##max_args arglist) |
| 2834 | 3737 #define GET_DEFUN_LISP_OBJECT(Fname) \ |
| 3738 wrap_subr (S##Fname); | |
| 3263 | 3739 #else /* not NEW_GC */ |
| 428 | 3740 #define DEFUN(lname, Fname, min_args, max_args, prompt, arglist) \ |
| 3741 Lisp_Object Fname (EXFUN_##max_args); \ | |
| 442 | 3742 static struct Lisp_Subr S##Fname = \ |
| 3743 { \ | |
| 3744 { /* struct lrecord_header */ \ | |
| 3745 lrecord_type_subr, /* lrecord_type_index */ \ | |
| 3746 1, /* mark bit */ \ | |
| 3747 1, /* c_readonly bit */ \ | |
| 1111 | 3748 1, /* lisp_readonly bit */ \ |
| 3749 0 /* unused */ \ | |
| 442 | 3750 }, \ |
| 3751 min_args, \ | |
| 3752 max_args, \ | |
| 3753 prompt, \ | |
| 3754 0, /* doc string */ \ | |
| 3755 lname, \ | |
| 3756 (lisp_fn_t) Fname \ | |
| 3757 }; \ | |
| 428 | 3758 Lisp_Object Fname (DEFUN_##max_args arglist) |
| 3759 | |
| 2268 | 3760 #define DEFUN_NORETURN(lname, Fname, min_args, max_args, prompt, arglist) \ |
| 3761 DECLARE_DOESNT_RETURN_TYPE (Lisp_Object, Fname (EXFUN_##max_args)); \ | |
| 3762 static struct Lisp_Subr S##Fname = \ | |
| 3763 { \ | |
| 3764 { /* struct lrecord_header */ \ | |
| 3765 lrecord_type_subr, /* lrecord_type_index */ \ | |
| 3766 1, /* mark bit */ \ | |
| 3767 1, /* c_readonly bit */ \ | |
| 3768 1, /* lisp_readonly bit */ \ | |
| 3769 0 /* unused */ \ | |
| 3770 }, \ | |
| 3771 min_args, \ | |
| 3772 max_args, \ | |
| 3773 prompt, \ | |
| 3774 0, /* doc string */ \ | |
| 3775 lname, \ | |
| 3776 (lisp_fn_t) Fname \ | |
| 3777 }; \ | |
| 3778 DOESNT_RETURN_TYPE (Lisp_Object) Fname (DEFUN_##max_args arglist) | |
| 2834 | 3779 #define GET_DEFUN_LISP_OBJECT(Fname) \ |
| 3780 wrap_subr (&S##Fname); | |
| 3263 | 3781 #endif /* not NEW_GC */ |
| 2268 | 3782 |
| 428 | 3783 /* Heavy ANSI C preprocessor hackery to get DEFUN to declare a |
| 3784 prototype that matches max_args, and add the obligatory | |
| 3785 `Lisp_Object' type declaration to the formal C arguments. */ | |
| 3786 | |
| 3787 #define DEFUN_MANY(named_int, named_Lisp_Object) named_int, named_Lisp_Object | |
| 3788 #define DEFUN_UNEVALLED(args) Lisp_Object args | |
| 3789 #define DEFUN_0() void | |
| 3790 #define DEFUN_1(a) Lisp_Object a | |
| 3791 #define DEFUN_2(a,b) DEFUN_1(a), Lisp_Object b | |
| 3792 #define DEFUN_3(a,b,c) DEFUN_2(a,b), Lisp_Object c | |
| 3793 #define DEFUN_4(a,b,c,d) DEFUN_3(a,b,c), Lisp_Object d | |
| 3794 #define DEFUN_5(a,b,c,d,e) DEFUN_4(a,b,c,d), Lisp_Object e | |
| 3795 #define DEFUN_6(a,b,c,d,e,f) DEFUN_5(a,b,c,d,e), Lisp_Object f | |
| 3796 #define DEFUN_7(a,b,c,d,e,f,g) DEFUN_6(a,b,c,d,e,f), Lisp_Object g | |
| 3797 #define DEFUN_8(a,b,c,d,e,f,g,h) DEFUN_7(a,b,c,d,e,f,g),Lisp_Object h | |
| 3798 | |
| 3799 /* WARNING: If you add defines here for higher values of max_args, | |
| 3800 make sure to also fix the clauses in PRIMITIVE_FUNCALL(), | |
| 3801 and change the define of SUBR_MAX_ARGS above. */ | |
| 3802 | |
| 3803 #include "symeval.h" | |
| 3804 | |
| 1743 | 3805 BEGIN_C_DECLS |
| 1650 | 3806 |
| 428 | 3807 /* `specpdl' is the special binding/unwind-protect stack. |
| 3808 | |
| 3809 Knuth says (see the Jargon File): | |
| 3810 At MIT, `pdl' [abbreviation for `Push Down List'] used to | |
| 3811 be a more common synonym for `stack'. | |
| 3812 Everywhere else `stack' seems to be the preferred term. | |
| 3813 | |
| 3814 specpdl_depth is the current depth of `specpdl'. | |
| 771 | 3815 Save this for use later as arg to `unbind_to_1'. */ |
| 1632 | 3816 extern MODULE_API int specpdl_depth_counter; |
| 428 | 3817 #define specpdl_depth() specpdl_depth_counter |
| 3818 | |
| 442 | 3819 |
| 3820 #define CHECK_FUNCTION(fun) do { \ | |
| 3821 while (NILP (Ffunctionp (fun))) \ | |
| 3822 signal_invalid_function_error (fun); \ | |
| 3823 } while (0) | |
| 3824 | |
| 428 | 3825 |
| 3826 /************************************************************************/ | |
| 3827 /* Checking for QUIT */ | |
| 3828 /************************************************************************/ | |
| 3829 | |
| 1123 | 3830 /* NOTE NOTE NOTE: Invoking QUIT can cause random Lisp code to be executed! |
| 3831 This can happen in numerous ways. For example, on many platforms, QUIT | |
| 3832 needs to drain the event queue to see whether there's a C-g in the works. | |
| 3833 A side effect of this is that, if there's a menu-press event, menu filters | |
| 3834 (i.e. Lisp code) will be invoked. Lisp code could also happen if there's | |
| 3835 an asynchronous timeout, or if the debugger is invoked as a result of | |
| 3836 debug-on-quit and the user returns by hitting `r', etc. etc. | |
| 3837 | |
| 3838 However, GC CANNOT HAPPEN. It is forbidden everywhere within the QUIT- | |
| 3839 processing code, because most callers cannot tolerate GC during QUIT | |
| 3840 since it's just too prevalent. */ | |
| 3841 | |
| 853 | 3842 /* The exact workings of this mechanism are described in detail in signal.c. */ |
| 3843 | |
| 428 | 3844 /* Asynchronous events set something_happened, and then are processed |
| 3845 within the QUIT macro. At this point, we are guaranteed to not be in | |
| 3846 any sensitive code. */ | |
| 3847 | |
| 1632 | 3848 extern MODULE_API volatile int something_happened; |
| 3849 extern MODULE_API int dont_check_for_quit; | |
| 3850 MODULE_API void check_what_happened (void); | |
| 3851 | |
| 3852 extern MODULE_API volatile int quit_check_signal_happened; | |
| 428 | 3853 extern volatile int quit_check_signal_tick_count; |
| 1632 | 3854 MODULE_API void check_quit (void); |
| 3855 | |
| 3856 MODULE_API void signal_quit (void); | |
| 428 | 3857 |
| 853 | 3858 int begin_dont_check_for_quit (void); |
| 3859 int begin_do_check_for_quit (void); | |
| 3860 | |
| 3861 /* Nonzero if the values of `quit-flag' and `inhibit-quit' indicate | |
| 3862 that a quit should be signalled. */ | |
| 771 | 3863 #define QUIT_FLAG_SAYS_SHOULD_QUIT \ |
| 3864 (!NILP (Vquit_flag) && \ | |
| 3865 (NILP (Vinhibit_quit) \ | |
| 3866 || (EQ (Vquit_flag, Qcritical) && !dont_check_for_quit))) | |
| 3867 | |
| 853 | 3868 /* Nonzero if ought to quit now. This is the "efficient" version, which |
| 3869 respects the flags set to indicate whether the full quit check should | |
| 3870 be done. Therefore it may be inaccurate (i.e. lagging reality), esp. | |
| 3871 when poll for quit is used. | |
| 3872 | |
| 3873 This is defined for code that wants to allow quitting, but needs to | |
| 3874 do some cleanup if that happens. (You could always register the cleanup | |
| 3875 code using record_unwind_protect(), but sometimes it makes more sense | |
| 3876 to do it using QUITP.) To use this macro, just call it at the | |
| 3877 appropriate time, and if its value is non-zero, do your cleanup code | |
| 3878 and then call QUIT. | |
| 3879 | |
| 3880 A different version (below) is used for the actual QUIT macro. */ | |
| 428 | 3881 #define QUITP \ |
| 853 | 3882 ((quit_check_signal_happened ? check_quit () : (void) 0), \ |
| 771 | 3883 QUIT_FLAG_SAYS_SHOULD_QUIT) |
| 428 | 3884 |
| 853 | 3885 /* This is the version actually called by QUIT. The difference |
| 3886 between it and QUITP is that it also has side effects in that it | |
| 3887 will handle anything else that has recently signalled itself | |
| 3888 asynchronously and wants to be handled now. Currently this | |
| 3889 includes executing asynchronous timeouts that may have been set | |
| 3890 from Lisp or from the poll-for-quit or poll-for-sigchld | |
| 3891 timers. (#### It seems that, to be slightly more accurate, we | |
| 3892 should also process poll-for-quit timers in the above version. | |
| 3893 However, this mechanism is inherently approximate, so it really | |
| 3894 doesn't matter much.) In the future, it might also include doing a | |
| 3895 thread context switch. Callers of QUITP generally don't except | |
| 1123 | 3896 random side effects to happen (#### unfortunately, random side effects |
| 3897 can happen anyway, e.g. through menu filters -- see comment above), | |
| 3898 so we have this different version. */ | |
| 428 | 3899 #define INTERNAL_QUITP \ |
| 853 | 3900 ((something_happened ? check_what_happened () : (void) 0), \ |
| 771 | 3901 QUIT_FLAG_SAYS_SHOULD_QUIT) |
| 428 | 3902 |
| 3903 /* Check quit-flag and quit if it is non-nil. Also do any other things | |
| 853 | 3904 that are triggered by asynchronous events and might want to be |
| 3905 handled. */ | |
| 428 | 3906 #define QUIT do { if (INTERNAL_QUITP) signal_quit (); } while (0) |
| 3907 | |
| 3908 | |
| 3909 /************************************************************************/ | |
| 3910 /* hashing */ | |
| 3911 /************************************************************************/ | |
| 3912 | |
| 3913 /* #### for a 64-bit machine, we should substitute a prime just over 2^32 */ | |
| 3914 #define GOOD_HASH 65599 /* prime number just over 2^16; Dragon book, p. 435 */ | |
| 3915 #define HASH2(a,b) (GOOD_HASH * (a) + (b)) | |
| 3916 #define HASH3(a,b,c) (GOOD_HASH * HASH2 (a,b) + (c)) | |
| 3917 #define HASH4(a,b,c,d) (GOOD_HASH * HASH3 (a,b,c) + (d)) | |
| 3918 #define HASH5(a,b,c,d,e) (GOOD_HASH * HASH4 (a,b,c,d) + (e)) | |
| 3919 #define HASH6(a,b,c,d,e,f) (GOOD_HASH * HASH5 (a,b,c,d,e) + (f)) | |
| 3920 #define HASH7(a,b,c,d,e,f,g) (GOOD_HASH * HASH6 (a,b,c,d,e,f) + (g)) | |
| 3921 #define HASH8(a,b,c,d,e,f,g,h) (GOOD_HASH * HASH7 (a,b,c,d,e,f,g) + (h)) | |
| 3922 #define HASH9(a,b,c,d,e,f,g,h,i) (GOOD_HASH * HASH8 (a,b,c,d,e,f,g,h) + (i)) | |
| 3923 | |
| 5013 | 3924 #define LISP_HASH(obj) ((unsigned long) STORE_LISP_IN_VOID (obj)) |
| 2516 | 3925 Hashcode memory_hash (const void *xv, Bytecount size); |
| 3926 Hashcode internal_hash (Lisp_Object obj, int depth); | |
| 3927 Hashcode internal_array_hash (Lisp_Object *arr, int size, int depth); | |
| 428 | 3928 |
| 3929 | |
| 3930 /************************************************************************/ | |
| 3931 /* String translation */ | |
| 3932 /************************************************************************/ | |
| 3933 | |
| 771 | 3934 /* When support for message translation exists, GETTEXT() translates a |
| 3935 string from English into the language defined by | |
| 3936 `current-language-environment'. This is done by looking the string | |
| 3937 up in a large predefined table; if no translation is found, the | |
| 3938 original string is returned, and the failure is possibly logged so | |
| 3939 that the translation can later be entered into the table. | |
| 3940 | |
| 3941 In addition to this, there is a mechanism to snarf message strings | |
| 3942 out of the source code so that they can be entered into the tables. | |
| 3943 This is what make-msgfile.lex does. | |
| 3944 | |
| 3945 Handling `format' strings is more difficult: The format string | |
| 3946 should get translated, but not under all circumstances. When the | |
| 3947 format string is a Lisp string, what should happen is that | |
| 3948 Fformat() should format the untranslated args[0] and return that, | |
| 3949 and also call Fgettext() on args[0] and, if that is different, | |
| 3950 format it and store it in the `string-translatable' property of the | |
| 3951 returned string. See Fgettext(). | |
| 3952 | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3953 The variations IGETTEXT, CIGETTEXT and ASCGETTEXT operate on |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3954 Ibyte *, CIbyte *, and Ascbyte * strings, respectively. The |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3955 ASCGETTEXT version has an assert check to verify that its string |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3956 really is pure-ASCII. Plain GETTEXT is defined as ASCGETTEXT, and |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3957 so works the same way. (There are no versions that work for Extbyte *. |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3958 Translate to internal format before working on it.) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3959 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3960 There are similar functions for building a Lisp string from a C |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3961 string and translating in the process. They again come in three |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3962 variants: build_msg_istring(), build_msg_cistring(), and |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3963 build_msg_ascstring(). Again, build_msg_ascstring() asserts that |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3964 its text is pure-ASCII, and build_msg_string() is the same as |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3965 build_msg_ascstring(). |
| 771 | 3966 */ |
| 3967 | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3968 /* Return value NOT Ascbyte, because the result in general will have been |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3969 translated into a foreign language. */ |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3970 DECLARE_INLINE_HEADER (const CIbyte *ASCGETTEXT (const Ascbyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3971 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3972 ASSERT_ASCTEXT_ASCII (s); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3973 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3974 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3975 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3976 DECLARE_INLINE_HEADER (const Ibyte *IGETTEXT (const Ibyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3977 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3978 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3979 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3980 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3981 DECLARE_INLINE_HEADER (const CIbyte *CIGETTEXT (const CIbyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3982 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3983 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3984 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3985 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3986 DECLARE_INLINE_HEADER (Lisp_Object LISP_GETTEXT (Lisp_Object s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3987 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3988 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3989 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3990 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3991 #define GETTEXT ASCGETTEXT |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3992 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3993 MODULE_API Lisp_Object build_msg_istring (const Ibyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3994 MODULE_API Lisp_Object build_msg_cistring (const CIbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3995 MODULE_API Lisp_Object build_msg_ascstring (const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3996 #define build_msg_string build_msg_ascstring |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3997 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3998 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
3999 /* DEFER_GETTEXT() and variants are used to identify strings which are not |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4000 meant to be translated immediately, but instead at some later time. |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4001 This is used in strings that are stored somewhere at dump or |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4002 initialization time, at a time when the current language environment is |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4003 not set. It is the duty of the user of the string to call GETTEXT or |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4004 some variant at the appropriate time. DEFER_GETTTEXT() serves only as a |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4005 marker that the string is translatable, and will as a result be snarfed |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4006 during message snarfing (see above). |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4007 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4008 build_defer_string() and variants are the deferred equivalents of |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4009 build_msg_string() and variants. Similarly to DEFER_GETTEXT(), they |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4010 don't actually do any translation, but serve as place markers for |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4011 message snarfing. However, they may do something more than just build |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4012 a Lisp string -- in particular, they may store a string property |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4013 indicating that the string is translatable (see discussion above about |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4014 this property). |
| 428 | 4015 */ |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4016 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4017 DECLARE_INLINE_HEADER (const Ascbyte *DEFER_ASCGETTEXT (const Ascbyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4018 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4019 ASSERT_ASCTEXT_ASCII (s); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4020 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4021 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4022 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4023 DECLARE_INLINE_HEADER (const Ibyte *DEFER_IGETTEXT (const Ibyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4024 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4025 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4026 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4027 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4028 DECLARE_INLINE_HEADER (const CIbyte *DEFER_CIGETTEXT (const CIbyte *s)) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4029 { |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4030 return s; |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4031 } |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4032 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4033 #define DEFER_GETTEXT DEFER_ASCGETTEXT |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4034 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4035 MODULE_API Lisp_Object build_defer_istring (const Ibyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4036 MODULE_API Lisp_Object build_defer_cistring (const CIbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4037 MODULE_API Lisp_Object build_defer_ascstring (const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4038 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4039 #define build_defer_string build_defer_ascstring |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4040 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4041 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4042 void write_msg_istring (Lisp_Object stream, const Ibyte *str); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4043 void write_msg_cistring (Lisp_Object stream, const CIbyte *str); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4044 void write_msg_ascstring (Lisp_Object stream, const Ascbyte *str); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4045 |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4046 #define write_msg_string write_msg_ascstring |
| 428 | 4047 |
| 4048 | |
| 4049 /************************************************************************/ | |
| 4050 /* Garbage collection / GC-protection */ | |
| 4051 /************************************************************************/ | |
| 4052 | |
| 4053 /* Structure for recording stack slots that need marking */ | |
| 4054 | |
| 4055 /* This is a chain of structures, each of which points at a Lisp_Object | |
| 4056 variable whose value should be marked in garbage collection. | |
| 4057 Normally every link of the chain is an automatic variable of a function, | |
| 4058 and its `val' points to some argument or local variable of the function. | |
| 4059 On exit to the function, the chain is set back to the value it had on | |
| 4060 entry. This way, no link remains in the chain when the stack frame | |
| 4061 containing the link disappears. | |
| 4062 | |
| 4063 Every function that can call Feval must protect in this fashion all | |
| 4064 Lisp_Object variables whose contents will be used again. */ | |
| 4065 | |
| 1632 | 4066 extern MODULE_API struct gcpro *gcprolist; |
| 428 | 4067 |
| 1743 | 4068 END_C_DECLS |
| 1650 | 4069 |
| 1204 | 4070 /* #### Catching insufficient gcpro: |
| 4071 | |
| 4072 The C++ code below catches GCPRO without UNGCPRO or vice-versa. | |
| 4073 Catching cases where there's no GCPRO or UNGCPRO but should be, however, | |
| 4074 is much harder, but could be done: | |
| 4075 | |
| 4076 1. Lisp_Object becomes a real object. Its creator and destructor need to | |
| 4077 figure out whether the object is on the stack (by looking at the range | |
| 4078 that `this' is within), and if so, add the pointer to a list of all | |
| 4079 stack-based Lisp_Objects. | |
| 4080 | |
| 4081 2. The assignment method needs to do reference-counting on actual Lisp | |
| 4082 objects -- in particular, we need to know if there are any references | |
| 4083 to a Lisp object that are *NOT* from stack-based Lisp_Objects. | |
| 4084 | |
| 4085 3. When we get to a point in the code where we might garbage collect -- | |
| 4086 i.e. Ffuncall(), Feval(), or Fgarbage_collect() is called -- we look | |
| 4087 at our list of stack-based Lisp_Objects, and if there are any that | |
| 4088 point to Lisp objects with no non-stack references, see if there are | |
| 4089 any gcpros pointing to the object, and if not, set a flag indicating | |
| 4090 that the object is "destroyed". (Don't abort yet because the function | |
| 4091 might not use the object any more.) | |
| 4092 | |
| 4093 4. When we detag a pointer using XFOO(), abort if its "destroyed" flag | |
| 4094 is set. | |
| 4095 | |
| 4096 --ben | |
| 4097 */ | |
| 4098 | |
| 428 | 4099 struct gcpro |
| 4100 { | |
| 4101 struct gcpro *next; | |
| 771 | 4102 const Lisp_Object *var; /* Address of first protected variable */ |
| 428 | 4103 int nvars; /* Number of consecutive protected variables */ |
| 1204 | 4104 #if defined (__cplusplus) && defined (ERROR_CHECK_GC) |
| 4105 /* Try to catch GCPRO without UNGCPRO, or vice-versa. G++ complains (at | |
| 4106 least with sufficient numbers of warnings enabled, i.e. -Weffc++) if a | |
| 4107 copy constructor or assignment operator is not defined. */ | |
| 4108 gcpro () : next (0), var (0), nvars (0) { } | |
| 4109 gcpro (const gcpro& g) : next (g.next), var (g.var), nvars (g.nvars) { } | |
| 4110 gcpro& operator= (const gcpro& g) { next = g.next; var = g.var; | |
| 4111 nvars = g.nvars; | |
| 4112 return *this;} | |
| 4113 ~gcpro () { assert (!next); } | |
| 4114 #endif /* defined (__cplusplus) && defined (ERROR_CHECK_GC) */ | |
| 428 | 4115 }; |
| 4116 | |
| 4117 /* Normally, you declare variables gcpro1, gcpro2, ... and use the | |
| 4118 GCPROn() macros. However, if you need to have nested gcpro's, | |
| 4119 declare ngcpro1, ngcpro2, ... and use NGCPROn(). If you need | |
| 4120 to nest another level, use nngcpro1, nngcpro2, ... and use | |
| 4121 NNGCPROn(). If you need to nest yet another level, create | |
| 4122 the appropriate macros. */ | |
| 4123 | |
| 1123 | 4124 /* NOTE: About comments like "This function does not GC": These are there to |
| 4125 try to track whether GCPROing is necessary. Strictly speaking, some | |
| 4126 functions that say this might actually GC, but only when it is never | |
| 4127 possible to return (more specifically, in the process of signalling an | |
| 4128 error, the debugger may be invoked, and could GC). For GCPRO purposes, | |
| 4129 you only have to worry about functions that can GC and then return. | |
| 4130 The QUIT macro cannot GC any more, although this wasn't true at some point, | |
| 4131 and so some "This function can GC" comments may be inaccurate. | |
| 4132 */ | |
| 4133 | |
| 1743 | 4134 BEGIN_C_DECLS |
| 1650 | 4135 |
| 2367 | 4136 #define XGCDECL1(x) struct gcpro x##cpro1 |
| 4137 #define XGCDECL2(x) struct gcpro x##cpro1, x##cpro2 | |
| 4138 #define XGCDECL3(x) struct gcpro x##cpro1, x##cpro2, x##cpro3 | |
| 4139 #define XGCDECL4(x) struct gcpro x##cpro1, x##cpro2, x##cpro3, x##cpro4 | |
| 4140 #define XGCDECL5(x) struct gcpro x##cpro1, x##cpro2, x##cpro3, x##cpro4, x##cpro5 | |
| 4141 | |
| 428 | 4142 #ifdef DEBUG_GCPRO |
| 4143 | |
| 2367 | 4144 MODULE_API void debug_gcpro1 (Ascbyte *, int, struct gcpro *, Lisp_Object *); |
| 4145 MODULE_API void debug_gcpro2 (Ascbyte *, int, struct gcpro *, struct gcpro *, | |
| 1632 | 4146 Lisp_Object *, Lisp_Object *); |
| 2367 | 4147 MODULE_API void debug_gcpro3 (Ascbyte *, int, struct gcpro *, struct gcpro *, |
| 1632 | 4148 struct gcpro *, Lisp_Object *, Lisp_Object *, |
| 4149 Lisp_Object *); | |
| 2367 | 4150 MODULE_API void debug_gcpro4 (Ascbyte *, int, struct gcpro *, struct gcpro *, |
| 1632 | 4151 struct gcpro *, struct gcpro *, Lisp_Object *, |
| 4152 Lisp_Object *, Lisp_Object *, Lisp_Object *); | |
| 2367 | 4153 MODULE_API void debug_gcpro5 (Ascbyte *, int, struct gcpro *, struct gcpro *, |
| 1632 | 4154 struct gcpro *, struct gcpro *, struct gcpro *, |
| 4155 Lisp_Object *, Lisp_Object *, Lisp_Object *, | |
| 4156 Lisp_Object *, Lisp_Object *); | |
| 2367 | 4157 MODULE_API void debug_ungcpro(Ascbyte *, int, struct gcpro *); |
| 4158 | |
| 4159 #define XGCPRO1(x,v) \ | |
| 4160 debug_gcpro1 (__FILE__, __LINE__,&x##cpro1,&v) | |
| 4161 #define XGCPRO2(x,v1,v2) \ | |
| 4162 debug_gcpro2 (__FILE__, __LINE__,&x##cpro1,&x##cpro2,&v1,&v2) | |
| 4163 #define XGCPRO3(x,v1,v2,v3) \ | |
| 4164 debug_gcpro3 (__FILE__, __LINE__,&x##cpro1,&x##cpro2,&x##cpro3, \ | |
| 4165 &v1,&v2,&v3) | |
| 4166 #define XGCPRO4(x,v1,v2,v3,v4) \ | |
| 4167 debug_gcpro4 (__FILE__, __LINE__,&x##cpro1,&x##cpro2,&x##cpro3, \ | |
| 4168 &x##cpro4, \ | |
| 428 | 4169 &v1,&v2,&v3,&v4) |
| 2367 | 4170 #define XGCPRO5(x,v1,v2,v3,v4,v5) \ |
| 4171 debug_gcpro5 (__FILE__, __LINE__,&x##cpro1,&x##cpro2,&x##cpro3, \ | |
| 4172 &x##cpro4,&x##cpro5, \ | |
| 428 | 4173 &v1,&v2,&v3,&v4,&v5) |
| 2367 | 4174 #define XUNGCPRO(x) \ |
| 4175 debug_ungcpro(__FILE__, __LINE__,&x##cpro1) | |
| 428 | 4176 |
| 4177 #else /* ! DEBUG_GCPRO */ | |
| 4178 | |
| 2367 | 4179 #define XGCPRO1(x, var1) ((void) ( \ |
| 4180 x##cpro1.next = gcprolist, x##cpro1.var = &var1, x##cpro1.nvars = 1, \ | |
| 4181 gcprolist = &x##cpro1 )) | |
| 4182 | |
| 4183 #define XGCPRO2(x, var1, var2) ((void) ( \ | |
| 4184 x##cpro1.next = gcprolist, x##cpro1.var = &var1, x##cpro1.nvars = 1, \ | |
| 4185 x##cpro2.next = &x##cpro1, x##cpro2.var = &var2, x##cpro2.nvars = 1, \ | |
| 4186 gcprolist = &x##cpro2 )) | |
| 4187 | |
| 4188 #define XGCPRO3(x, var1, var2, var3) ((void) ( \ | |
| 4189 x##cpro1.next = gcprolist, x##cpro1.var = &var1, x##cpro1.nvars = 1, \ | |
| 4190 x##cpro2.next = &x##cpro1, x##cpro2.var = &var2, x##cpro2.nvars = 1, \ | |
| 4191 x##cpro3.next = &x##cpro2, x##cpro3.var = &var3, x##cpro3.nvars = 1, \ | |
| 4192 gcprolist = &x##cpro3 )) | |
| 4193 | |
| 4194 #define XGCPRO4(x, var1, var2, var3, var4) ((void) ( \ | |
| 4195 x##cpro1.next = gcprolist, x##cpro1.var = &var1, x##cpro1.nvars = 1, \ | |
| 4196 x##cpro2.next = &x##cpro1, x##cpro2.var = &var2, x##cpro2.nvars = 1, \ | |
| 4197 x##cpro3.next = &x##cpro2, x##cpro3.var = &var3, x##cpro3.nvars = 1, \ | |
| 4198 x##cpro4.next = &x##cpro3, x##cpro4.var = &var4, x##cpro4.nvars = 1, \ | |
| 4199 gcprolist = &x##cpro4 )) | |
| 4200 | |
| 4201 #define XGCPRO5(x, var1, var2, var3, var4, var5) ((void) ( \ | |
| 4202 x##cpro1.next = gcprolist, x##cpro1.var = &var1, x##cpro1.nvars = 1, \ | |
| 4203 x##cpro2.next = &x##cpro1, x##cpro2.var = &var2, x##cpro2.nvars = 1, \ | |
| 4204 x##cpro3.next = &x##cpro2, x##cpro3.var = &var3, x##cpro3.nvars = 1, \ | |
| 4205 x##cpro4.next = &x##cpro3, x##cpro4.var = &var4, x##cpro4.nvars = 1, \ | |
| 4206 x##cpro5.next = &x##cpro4, x##cpro5.var = &var5, x##cpro5.nvars = 1, \ | |
| 4207 gcprolist = &x##cpro5 )) | |
| 4208 | |
| 4209 #define XGCPRO1_ARRAY(x, array, n) ((void) ( \ | |
| 4210 x##cpro1.next = gcprolist, x##cpro1.var = array, x##cpro1.nvars = n, \ | |
| 4211 gcprolist = &x##cpro1 )) | |
| 4212 | |
| 4213 #define XGCPRO2_ARRAY(x, array1, n1, array2, n2) ((void) ( \ | |
| 4214 x##cpro1.next = gcprolist, x##cpro1.var = array1, x##cpro1.nvars = n1, \ | |
| 4215 x##cpro2.next = &x##cpro1, x##cpro2.var = array2, x##cpro2.nvars = n2, \ | |
| 4216 gcprolist = &x##cpro2 )) | |
| 4217 | |
| 4218 #define XGCPRO3_ARRAY(x, array1, n1, array2, n2, array3, n3) ((void) ( \ | |
| 4219 x##cpro1.next = gcprolist, x##cpro1.var = array1, x##cpro1.nvars = n1, \ | |
| 4220 x##cpro2.next = &x##cpro1, x##cpro2.var = array2, x##cpro2.nvars = n2, \ | |
| 4221 x##cpro3.next = &x##cpro2, x##cpro3.var = array3, x##cpro3.nvars = n3, \ | |
| 4222 gcprolist = &x##cpro3 )) | |
| 853 | 4223 |
| 1204 | 4224 #if defined (__cplusplus) && defined (ERROR_CHECK_GC) |
| 4225 /* We need to reset each gcpro to avoid triggering the assert() in | |
| 4226 ~gcpro(). This happens in UNGCPRO and longjmp(). */ | |
| 4227 #define UNWIND_GCPRO_TO(val) \ | |
| 4228 do \ | |
| 4229 { \ | |
| 4230 struct gcpro *__gcpro_stop = (val); \ | |
| 4231 /* Try to catch UNGCPRO without GCPRO. We arrange for there to be a \ | |
| 4232 sentinel at the end of the gcprolist, so it should never be NULL. */ \ | |
| 4233 assert (__gcpro_stop); \ | |
| 4234 while (gcprolist != __gcpro_stop) \ | |
| 4235 { \ | |
| 4236 struct gcpro *__gcpro_next = gcprolist->next; \ | |
| 4237 gcprolist->next = 0; \ | |
| 4238 gcprolist = __gcpro_next; \ | |
| 4239 assert (gcprolist); \ | |
| 4240 } \ | |
| 4241 } while (0) | |
| 4242 #else | |
| 4243 #define UNWIND_GCPRO_TO(val) (gcprolist = (val)) | |
| 4244 #endif /* defined (__cplusplus) && defined (ERROR_CHECK_GC) */ | |
| 4245 | |
| 2367 | 4246 #define XUNGCPRO(x) UNWIND_GCPRO_TO (x##cpro1.next) |
| 428 | 4247 |
| 4248 #endif /* ! DEBUG_GCPRO */ | |
| 4249 | |
| 2367 | 4250 #define GCDECL1 XGCDECL1 (g) |
| 4251 #define GCDECL2 XGCDECL2 (g) | |
| 4252 #define GCDECL3 XGCDECL3 (g) | |
| 4253 #define GCDECL4 XGCDECL4 (g) | |
| 4254 #define GCDECL5 XGCDECL5 (g) | |
| 4255 | |
| 4256 #define GCPRO1(a) XGCPRO1 (g,a) | |
| 4257 #define GCPRO2(a,b) XGCPRO2 (g,a,b) | |
| 4258 #define GCPRO3(a,b,c) XGCPRO3 (g,a,b,c) | |
| 4259 #define GCPRO4(a,b,c,d) XGCPRO4 (g,a,b,c,d) | |
| 4260 #define GCPRO5(a,b,c,d,e) XGCPRO5 (g,a,b,c,d,e) | |
| 4261 | |
| 4262 #define GCPRO1_ARRAY(a1,n1) XGCPRO1_ARRAY(g,a1,n1) | |
| 4263 #define GCPRO2_ARRAY(a1,n1,a2,n2) XGCPRO2_ARRAY (g,a1,n1,a2,n2) | |
| 4264 #define GCPRO3_ARRAY(a1,n1,a2,n2,a3,n3) XGCPRO3_ARRAY (g,a1,n1,a2,n2,a3,n3) | |
| 4265 | |
| 4266 #define UNGCPRO XUNGCPRO (g) | |
| 4267 | |
| 4268 #define NGCDECL1 XGCDECL1 (ng) | |
| 4269 #define NGCDECL2 XGCDECL2 (ng) | |
| 4270 #define NGCDECL3 XGCDECL3 (ng) | |
| 4271 #define NGCDECL4 XGCDECL4 (ng) | |
| 4272 #define NGCDECL5 XGCDECL5 (ng) | |
| 4273 | |
| 4274 #define NGCPRO1(a) XGCPRO1 (ng,a) | |
| 4275 #define NGCPRO2(a,b) XGCPRO2 (ng,a,b) | |
| 4276 #define NGCPRO3(a,b,c) XGCPRO3 (ng,a,b,c) | |
| 4277 #define NGCPRO4(a,b,c,d) XGCPRO4 (ng,a,b,c,d) | |
| 4278 #define NGCPRO5(a,b,c,d,e) XGCPRO5 (ng,a,b,c,d,e) | |
| 4279 | |
| 4280 #define NGCPRO1_ARRAY(a1,n1) XGCPRO1_ARRAY(ng,a1,n1) | |
| 4281 #define NGCPRO2_ARRAY(a1,n1,a2,n2) XGCPRO2_ARRAY (ng,a1,n1,a2,n2) | |
| 4282 #define NGCPRO3_ARRAY(a1,n1,a2,n2,a3,n3) XGCPRO3_ARRAY (ng,a1,n1,a2,n2,a3,n3) | |
| 4283 | |
| 4284 #define NUNGCPRO XUNGCPRO (ng) | |
| 4285 | |
| 4286 #define NNGCDECL1 XGCDECL1 (nng) | |
| 4287 #define NNGCDECL2 XGCDECL2 (nng) | |
| 4288 #define NNGCDECL3 XGCDECL3 (nng) | |
| 4289 #define NNGCDECL4 XGCDECL4 (nng) | |
| 4290 #define NNGCDECL5 XGCDECL5 (nng) | |
| 4291 | |
| 4292 #define NNGCPRO1(a) XGCPRO1 (nng,a) | |
| 4293 #define NNGCPRO2(a,b) XGCPRO2 (nng,a,b) | |
| 4294 #define NNGCPRO3(a,b,c) XGCPRO3 (nng,a,b,c) | |
| 4295 #define NNGCPRO4(a,b,c,d) XGCPRO4 (nng,a,b,c,d) | |
| 4296 #define NNGCPRO5(a,b,c,d,e) XGCPRO5 (nng,a,b,c,d,e) | |
| 4297 | |
| 4298 #define NNGCPRO1_ARRAY(a1,n1) XGCPRO1_ARRAY(nng,a1,n1) | |
| 4299 #define NNGCPRO2_ARRAY(a1,n1,a2,n2) XGCPRO2_ARRAY (nng,a1,n1,a2,n2) | |
| 4300 #define NNGCPRO3_ARRAY(a1,n1,a2,n2,a3,n3) XGCPRO3_ARRAY (nng,a1,n1,a2,n2,a3,n3) | |
| 4301 | |
| 4302 #define NNUNGCPRO XUNGCPRO (nng) | |
| 4303 | |
| 428 | 4304 /* Evaluate expr, UNGCPRO, and then return the value of expr. */ |
| 4305 #define RETURN_UNGCPRO(expr) do \ | |
| 4306 { \ | |
| 4307 Lisp_Object ret_ungc_val = (expr); \ | |
| 4308 UNGCPRO; \ | |
| 4309 RETURN_SANS_WARNINGS ret_ungc_val; \ | |
| 4310 } while (0) | |
| 4311 | |
| 4312 /* Evaluate expr, NUNGCPRO, UNGCPRO, and then return the value of expr. */ | |
| 4313 #define RETURN_NUNGCPRO(expr) do \ | |
| 4314 { \ | |
| 4315 Lisp_Object ret_ungc_val = (expr); \ | |
| 4316 NUNGCPRO; \ | |
| 4317 UNGCPRO; \ | |
| 4318 RETURN_SANS_WARNINGS ret_ungc_val; \ | |
| 4319 } while (0) | |
| 4320 | |
| 4321 /* Evaluate expr, NNUNGCPRO, NUNGCPRO, UNGCPRO, and then return the | |
| 4322 value of expr. */ | |
| 4323 #define RETURN_NNUNGCPRO(expr) do \ | |
| 4324 { \ | |
| 4325 Lisp_Object ret_ungc_val = (expr); \ | |
| 4326 NNUNGCPRO; \ | |
| 4327 NUNGCPRO; \ | |
| 4328 UNGCPRO; \ | |
| 4329 RETURN_SANS_WARNINGS ret_ungc_val; \ | |
| 4330 } while (0) | |
| 4331 | |
| 452 | 4332 extern Lisp_Object_ptr_dynarr *staticpros; |
| 3092 | 4333 extern Lisp_Object_ptr_dynarr *staticpros_nodump; |
| 771 | 4334 #ifdef DEBUG_XEMACS |
| 4335 | |
| 4336 /* Help debug crashes gc-marking a staticpro'ed object. */ | |
| 4337 | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4338 MODULE_API void staticpro_1 (Lisp_Object *, const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4339 MODULE_API void staticpro_nodump_1 (Lisp_Object *, const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4340 #define staticpro(ptr) staticpro_1 (ptr, #ptr) |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4341 #define staticpro_nodump(ptr) staticpro_nodump_1 (ptr, #ptr) |
| 771 | 4342 |
| 996 | 4343 #ifdef HAVE_SHLIB |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4344 MODULE_API void unstaticpro_nodump_1 (Lisp_Object *, const Ascbyte *); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4345 #define unstaticpro_nodump(ptr) unstaticpro_nodump_1 (ptr, #ptr) |
| 996 | 4346 #endif |
| 4347 | |
| 771 | 4348 #else |
| 611 | 4349 |
| 428 | 4350 /* Call staticpro (&var) to protect static variable `var'. */ |
| 1632 | 4351 MODULE_API void staticpro (Lisp_Object *); |
|
4979
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4352 /* staticpro_1 (varptr, name) is used when we're not directly calling |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4353 staticpro() on the address of a Lisp variable, but on a pointer we |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4354 got from elsewhere. In that case, NAME is a string describing the |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4355 actual variable in question. NAME is used only for debugging purposes, |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4356 and hence when not DEBUG_XEMACS, staticpro_1() just calls staticpro(). |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4357 With DEBUG_XEMACS, however, it's the reverse -- staticpro() calls |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4358 staticpro_1(), using the ANSI "stringize" operator to construct a string |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4359 out of the variable name. */ |
|
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4360 #define staticpro_1(ptr, name) staticpro (ptr) |
| 428 | 4361 |
| 4362 /* Call staticpro_nodump (&var) to protect static variable `var'. */ | |
| 4363 /* var will not be saved at dump time */ | |
| 1632 | 4364 MODULE_API void staticpro_nodump (Lisp_Object *); |
|
4979
4234fd5a7b17
fix bug #668 (compile error, not --with-debug)
Ben Wing <ben@xemacs.org>
parents:
4976
diff
changeset
|
4365 #define staticpro_nodump_1(ptr, name) staticpro_nodump (ptr) |
| 428 | 4366 |
| 996 | 4367 #ifdef HAVE_SHLIB |
| 4368 /* Call unstaticpro_nodump (&var) to stop protecting static variable `var'. */ | |
| 1632 | 4369 MODULE_API void unstaticpro_nodump (Lisp_Object *); |
| 996 | 4370 #endif |
| 4371 | |
| 771 | 4372 #endif |
| 4373 | |
| 3263 | 4374 #ifdef NEW_GC |
| 2720 | 4375 extern Lisp_Object_dynarr *mcpros; |
| 4376 #ifdef DEBUG_XEMACS | |
| 4377 /* Help debug crashes gc-marking a mcpro'ed object. */ | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4378 MODULE_API void mcpro_1 (Lisp_Object, const Ascbyte *); |
| 2720 | 4379 #define mcpro(ptr) mcpro_1 (ptr, #ptr) |
| 4380 #else /* not DEBUG_XEMACS */ | |
| 4381 /* Call mcpro (&var) to protect mc variable `var'. */ | |
| 4382 MODULE_API void mcpro (Lisp_Object); | |
| 4383 #endif /* not DEBUG_XEMACS */ | |
| 3263 | 4384 #endif /* NEW_GC */ |
| 2720 | 4385 |
| 771 | 4386 void register_post_gc_action (void (*fun) (void *), void *arg); |
| 4387 int begin_gc_forbidden (void); | |
| 4388 void end_gc_forbidden (int count); | |
| 1957 | 4389 extern int gc_currently_forbidden; |
| 771 | 4390 |
| 1743 | 4391 END_C_DECLS |
| 1650 | 4392 |
| 771 | 4393 |
| 4394 /************************************************************************/ | |
| 4395 /* Misc definitions */ | |
| 4396 /************************************************************************/ | |
| 442 | 4397 |
| 4398 /************************************************************************/ | |
| 1983 | 4399 /* Other numeric types */ |
| 4400 /************************************************************************/ | |
| 4401 #include "number.h" | |
| 4402 | |
| 4403 | |
| 4404 /************************************************************************/ | |
| 442 | 4405 /* prototypes */ |
| 4406 /************************************************************************/ | |
| 4407 | |
| 4408 /* NOTE: Prototypes should go HERE, not in various header files, unless | |
| 4409 they specifically reference a type that's not defined in lisp.h. | |
| 4410 (And even then, you might consider adding the type to lisp.h.) | |
| 4411 | |
| 4412 The idea is that header files typically contain the innards of objects, | |
| 4413 and we want to minimize the number of "dependencies" of one file on | |
| 4414 the specifics of such objects. Putting prototypes here minimizes the | |
| 4415 number of header files that need to be included -- good for a number | |
| 4416 of reasons. --ben */ | |
| 4417 | |
| 4418 /*--------------- prototypes for various public c functions ------------*/ | |
| 4419 | |
| 4420 /* Prototypes for all init/syms_of/vars_of initialization functions. */ | |
| 4421 #include "symsinit.h" | |
| 4422 | |
| 1743 | 4423 BEGIN_C_DECLS |
| 1650 | 4424 |
| 826 | 4425 /* Defined in abbrev.c */ |
| 1632 | 4426 MODULE_API EXFUN (Fexpand_abbrev, 0); |
| 826 | 4427 |
| 428 | 4428 /* Defined in alloc.c */ |
| 1632 | 4429 MODULE_API EXFUN (Fcons, 2); |
| 4430 MODULE_API EXFUN (Flist, MANY); | |
|
4995
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
4431 EXFUN (Fbit_vector, MANY); |
| 826 | 4432 EXFUN (Fmake_byte_code, MANY); |
| 1632 | 4433 MODULE_API EXFUN (Fmake_list, 2); |
| 4434 MODULE_API EXFUN (Fmake_string, 2); | |
|
4995
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
4435 EXFUN (Fstring, MANY); |
| 1632 | 4436 MODULE_API EXFUN (Fmake_symbol, 1); |
| 4437 MODULE_API EXFUN (Fmake_vector, 2); | |
| 4438 MODULE_API EXFUN (Fvector, MANY); | |
| 826 | 4439 |
| 3263 | 4440 #ifndef NEW_GC |
| 428 | 4441 void release_breathing_space (void); |
| 3263 | 4442 #endif /* not NEW_GC */ |
| 428 | 4443 Lisp_Object noseeum_cons (Lisp_Object, Lisp_Object); |
| 1632 | 4444 MODULE_API Lisp_Object make_vector (Elemcount, Lisp_Object); |
| 4445 MODULE_API Lisp_Object vector1 (Lisp_Object); | |
| 4446 MODULE_API Lisp_Object vector2 (Lisp_Object, Lisp_Object); | |
| 4447 MODULE_API Lisp_Object vector3 (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 665 | 4448 Lisp_Object make_bit_vector (Elemcount, Lisp_Object); |
| 4449 Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, Elemcount); | |
| 428 | 4450 Lisp_Object noseeum_make_marker (void); |
| 3092 | 4451 #ifndef NEW_GC |
| 428 | 4452 void garbage_collect_1 (void); |
| 3092 | 4453 #endif /* not NEW_GC */ |
| 1632 | 4454 MODULE_API Lisp_Object acons (Lisp_Object, Lisp_Object, Lisp_Object); |
| 4455 MODULE_API Lisp_Object cons3 (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 4456 MODULE_API Lisp_Object list1 (Lisp_Object); | |
| 4457 MODULE_API Lisp_Object list2 (Lisp_Object, Lisp_Object); | |
| 4458 MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 4459 MODULE_API Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4460 Lisp_Object); | |
| 4461 MODULE_API Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4462 Lisp_Object); | |
| 4463 MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4464 Lisp_Object, Lisp_Object); | |
| 428 | 4465 DECLARE_DOESNT_RETURN (memory_full (void)); |
| 4466 void disksave_object_finalization (void); | |
| 4467 extern int purify_flag; | |
| 3092 | 4468 #ifndef NEW_GC |
| 428 | 4469 extern EMACS_INT gc_generation_number[1]; |
| 3092 | 4470 #endif /* not NEW_GC */ |
| 428 | 4471 int c_readonly (Lisp_Object); |
| 4472 int lisp_readonly (Lisp_Object); | |
| 1632 | 4473 MODULE_API void copy_lisp_object (Lisp_Object dst, Lisp_Object src); |
|
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
4474 MODULE_API Lisp_Object build_istring (const Ibyte *); |
|
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
4475 MODULE_API Lisp_Object build_cistring (const CIbyte *); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4476 MODULE_API Lisp_Object build_ascstring (const Ascbyte *); |
|
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
4477 MODULE_API Lisp_Object build_extstring (const Extbyte *, Lisp_Object); |
| 1632 | 4478 MODULE_API Lisp_Object make_string (const Ibyte *, Bytecount); |
|
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
4479 MODULE_API Lisp_Object make_extstring (const Extbyte *, EMACS_INT, Lisp_Object); |
| 771 | 4480 void init_string_ascii_begin (Lisp_Object string); |
| 428 | 4481 Lisp_Object make_uninit_string (Bytecount); |
| 1632 | 4482 MODULE_API Lisp_Object make_float (double); |
| 867 | 4483 Lisp_Object make_string_nocopy (const Ibyte *, Bytecount); |
| 853 | 4484 void free_cons (Lisp_Object); |
| 428 | 4485 void free_list (Lisp_Object); |
| 4486 void free_alist (Lisp_Object); | |
| 1204 | 4487 void free_marker (Lisp_Object); |
| 428 | 4488 int object_dead_p (Lisp_Object); |
| 4489 void mark_object (Lisp_Object obj); | |
| 3092 | 4490 #ifndef NEW_GC |
| 1598 | 4491 #ifdef USE_KKCC |
| 2645 | 4492 #ifdef DEBUG_XEMACS |
| 4493 void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj, int level, int pos); | |
| 4494 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ | |
| 4495 kkcc_gc_stack_push_lisp_object_1 (obj, level, pos) | |
| 4496 void kkcc_backtrace (void); | |
| 4497 #else | |
| 4498 void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj); | |
| 4499 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ | |
| 4500 kkcc_gc_stack_push_lisp_object_1 (obj) | |
| 4501 #define kkcc_backtrace() | |
| 4502 #endif | |
| 1598 | 4503 #endif /* USE_KKCC */ |
| 3092 | 4504 #endif /* not NEW_GC */ |
| 428 | 4505 int marked_p (Lisp_Object obj); |
| 851 | 4506 extern int funcall_allocation_flag; |
| 814 | 4507 extern int need_to_garbage_collect; |
| 1632 | 4508 extern MODULE_API int need_to_check_c_alloca; |
| 888 | 4509 extern int need_to_signal_post_gc; |
| 1333 | 4510 extern Lisp_Object Qpost_gc_hook, Qgarbage_collecting; |
| 851 | 4511 void recompute_funcall_allocation_flag (void); |
| 428 | 4512 |
| 4513 #ifdef MEMORY_USAGE_STATS | |
| 665 | 4514 Bytecount malloced_storage_size (void *, Bytecount, struct overhead_stats *); |
| 4515 Bytecount fixed_type_block_overhead (Bytecount); | |
| 428 | 4516 #endif |
| 1204 | 4517 |
| 4518 #ifdef EVENT_DATA_AS_OBJECTS | |
| 4519 Lisp_Object make_key_data (void); | |
| 4520 Lisp_Object make_button_data (void); | |
| 4521 Lisp_Object make_motion_data (void); | |
| 4522 Lisp_Object make_process_data (void); | |
| 4523 Lisp_Object make_timeout_data (void); | |
| 4524 Lisp_Object make_magic_data (void); | |
| 4525 Lisp_Object make_magic_eval_data (void); | |
| 4526 Lisp_Object make_eval_data (void); | |
| 4527 Lisp_Object make_misc_user_data (void); | |
| 4528 void free_key_data (Lisp_Object); | |
| 4529 void free_button_data (Lisp_Object); | |
| 4530 void free_motion_data (Lisp_Object); | |
| 4531 void free_process_data (Lisp_Object); | |
| 4532 void free_timeout_data (Lisp_Object); | |
| 4533 void free_magic_data (Lisp_Object); | |
| 4534 void free_magic_eval_data (Lisp_Object); | |
| 4535 void free_eval_data (Lisp_Object); | |
| 4536 void free_misc_user_data (Lisp_Object); | |
| 4537 #endif /* EVENT_DATA_AS_OBJECTS */ | |
| 934 | 4538 |
| 428 | 4539 /* Defined in buffer.c */ |
| 4540 Lisp_Object get_truename_buffer (Lisp_Object); | |
| 4541 void switch_to_buffer (Lisp_Object, Lisp_Object); | |
| 4542 extern int find_file_compare_truenames; | |
| 4543 extern int find_file_use_truenames; | |
| 867 | 4544 Ibyte *get_initial_directory (Ibyte *pathname, Bytecount size); |
| 771 | 4545 void set_buffer_internal (struct buffer *b); |
| 4546 struct buffer *decode_buffer (Lisp_Object buffer, int allow_string); | |
| 4547 | |
| 4548 void record_buffer (Lisp_Object buf); | |
| 4549 Lisp_Object get_buffer (Lisp_Object name, | |
| 4550 int error_if_deleted_or_does_not_exist); | |
| 4551 int map_over_sharing_buffers (struct buffer *buf, | |
| 4552 int (*mapfun) (struct buffer *buf, | |
| 4553 void *closure), | |
| 4554 void *closure); | |
| 1204 | 4555 void cleanup_buffer_undo_lists (void); |
| 771 | 4556 |
| 4557 extern struct buffer *current_buffer; | |
| 4558 | |
| 4559 extern void init_initial_directory (void); /* initialize initial_directory */ | |
| 4560 | |
| 4561 EXFUN (Fbuffer_disable_undo, 1); | |
| 1632 | 4562 MODULE_API EXFUN (Fbuffer_modified_p, 1); |
| 4563 MODULE_API EXFUN (Fbuffer_name, 1); | |
| 4564 MODULE_API EXFUN (Fcurrent_buffer, 0); | |
| 771 | 4565 EXFUN (Ferase_buffer, 1); |
| 4566 EXFUN (Fget_buffer, 1); | |
| 4567 EXFUN (Fget_buffer_create, 1); | |
| 4568 EXFUN (Fget_file_buffer, 1); | |
| 1632 | 4569 MODULE_API EXFUN (Fkill_buffer, 1); |
| 771 | 4570 EXFUN (Fother_buffer, 3); |
| 4571 EXFUN (Frecord_buffer, 1); | |
| 1632 | 4572 MODULE_API EXFUN (Fset_buffer, 1); |
| 771 | 4573 EXFUN (Fset_buffer_modified_p, 2); |
| 4574 | |
| 4575 extern Lisp_Object QSscratch, Qafter_change_function, Qafter_change_functions; | |
| 4576 extern Lisp_Object Qbefore_change_function, Qbefore_change_functions; | |
| 4577 extern Lisp_Object Qbuffer_or_string_p, Qdefault_directory, Qfirst_change_hook; | |
| 4578 extern Lisp_Object Qpermanent_local, Vafter_change_function; | |
| 4579 extern Lisp_Object Vafter_change_functions, Vbefore_change_function; | |
| 4580 extern Lisp_Object Vbefore_change_functions, Vbuffer_alist, Vbuffer_defaults; | |
| 4581 extern Lisp_Object Vinhibit_read_only, Vtransient_mark_mode; | |
| 428 | 4582 |
| 563 | 4583 /* Defined in bytecode.c */ |
| 826 | 4584 EXFUN (Fbyte_code, 3); |
| 4585 | |
| 593 | 4586 DECLARE_DOESNT_RETURN (invalid_byte_code |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4587 (const Ascbyte *reason, Lisp_Object frob)); |
| 563 | 4588 |
| 4932 | 4589 extern Lisp_Object Qbyte_code, Qinvalid_byte_code; |
| 563 | 4590 |
| 826 | 4591 /* Defined in callint.c */ |
| 4592 EXFUN (Fcall_interactively, 3); | |
| 4593 EXFUN (Fprefix_numeric_value, 1); | |
| 4594 | |
| 4595 /* Defined in casefiddle.c */ | |
| 4596 EXFUN (Fdowncase, 2); | |
|
4910
6bc1f3f6cf0d
Make canoncase visible to Lisp; use it with chars in internal_equalp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4906
diff
changeset
|
4597 EXFUN (Fcanoncase, 2); |
| 826 | 4598 EXFUN (Fupcase, 2); |
| 4599 EXFUN (Fupcase_initials, 2); | |
| 4600 EXFUN (Fupcase_initials_region, 3); | |
| 4601 EXFUN (Fupcase_region, 3); | |
| 4602 | |
| 4603 /* Defined in casetab.c */ | |
| 4604 EXFUN (Fset_standard_case_table, 1); | |
| 4605 | |
| 4606 /* Defined in chartab.c */ | |
| 4607 EXFUN (Freset_char_table, 1); | |
| 4608 | |
| 4609 /* Defined in cmds.c */ | |
| 4610 EXFUN (Fbeginning_of_line, 2); | |
| 4611 EXFUN (Fend_of_line, 2); | |
| 4612 EXFUN (Fforward_char, 2); | |
| 4613 EXFUN (Fforward_line, 2); | |
| 4614 | |
| 428 | 4615 /* Defined in data.c */ |
| 826 | 4616 EXFUN (Fadd1, 1); |
| 4617 EXFUN (Faref, 2); | |
| 4618 EXFUN (Faset, 3); | |
| 4619 EXFUN (Fcar, 1); | |
| 4620 EXFUN (Fcar_safe, 1); | |
| 4621 EXFUN (Fcdr, 1); | |
| 919 | 4622 EXFUN (Fcdr_safe, 1); |
| 826 | 4623 EXFUN (Fgeq, MANY); |
| 4624 EXFUN (Fgtr, MANY); | |
| 4625 EXFUN (Findirect_function, 1); | |
| 4626 EXFUN (Fleq, MANY); | |
| 4627 EXFUN (Flistp, 1); | |
| 4628 EXFUN (Flss, MANY); | |
| 4629 EXFUN (Fmax, MANY); | |
| 4630 EXFUN (Fmin, MANY); | |
| 4631 EXFUN (Fminus, MANY); | |
| 4632 EXFUN (Fnumber_to_string, 1); | |
| 4633 EXFUN (Fplus, MANY); | |
| 4634 EXFUN (Fquo, MANY); | |
| 4635 EXFUN (Frem, 2); | |
| 4636 EXFUN (Fsetcar, 2); | |
| 4637 EXFUN (Fsetcdr, 2); | |
| 4638 EXFUN (Fsub1, 1); | |
| 4639 EXFUN (Fsubr_max_args, 1); | |
| 4640 EXFUN (Fsubr_min_args, 1); | |
| 4641 EXFUN (Ftimes, MANY); | |
| 4642 | |
| 428 | 4643 DECLARE_DOESNT_RETURN (c_write_error (Lisp_Object)); |
| 4644 DECLARE_DOESNT_RETURN (lisp_write_error (Lisp_Object)); | |
| 4645 DECLARE_DOESNT_RETURN (args_out_of_range (Lisp_Object, Lisp_Object)); | |
| 4646 DECLARE_DOESNT_RETURN (args_out_of_range_3 (Lisp_Object, Lisp_Object, | |
| 4647 Lisp_Object)); | |
| 1632 | 4648 MODULE_API Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object); |
| 4649 MODULE_API | |
| 428 | 4650 DECLARE_DOESNT_RETURN (dead_wrong_type_argument (Lisp_Object, Lisp_Object)); |
| 4651 void check_int_range (EMACS_INT, EMACS_INT, EMACS_INT); | |
| 4652 | |
| 771 | 4653 EXFUN (Fint_to_char, 1); |
| 4654 EXFUN (Fchar_to_int, 1); | |
| 4655 | |
| 428 | 4656 enum arith_comparison { |
| 4657 arith_equal, | |
| 4658 arith_notequal, | |
| 4659 arith_less, | |
| 4660 arith_grtr, | |
| 4661 arith_less_or_equal, | |
| 4662 arith_grtr_or_equal }; | |
| 4663 Lisp_Object arithcompare (Lisp_Object, Lisp_Object, enum arith_comparison); | |
| 4664 | |
| 707 | 4665 /* Do NOT use word_to_lisp or wasteful_word_to_lisp to decode time_t's |
| 4666 unless you KNOW arg is non-negative. They cannot return negative | |
| 4667 values! Use make_time. */ | |
| 428 | 4668 Lisp_Object word_to_lisp (unsigned int); |
| 4669 unsigned int lisp_to_word (Lisp_Object); | |
| 4670 | |
| 4932 | 4671 extern Lisp_Object Qarrayp, Qbitp, Qchar_or_string_p, Qcharacterp, |
| 4672 Qerror_conditions, Qerror_message, Qinteger_char_or_marker_p, | |
| 4673 Qinteger_or_char_p, Qinteger_or_marker_p, Qlambda, Qlistp, Qnatnump, | |
| 4674 Qnonnegativep, Qnumber_char_or_marker_p, Qnumberp, Qquote, Qtrue_list_p; | |
| 4675 extern MODULE_API Lisp_Object Qintegerp; | |
| 4676 | |
| 4677 extern Lisp_Object Qarith_error, Qbeginning_of_buffer, Qbuffer_read_only, | |
| 4678 Qcircular_list, Qcircular_property_list, Qconversion_error, | |
| 4679 Qcyclic_variable_indirection, Qdomain_error, Qediting_error, | |
| 4680 Qend_of_buffer, Qend_of_file, Qerror, Qfile_error, Qinternal_error, | |
| 4681 Qinvalid_change, Qinvalid_constant, Qinvalid_function, Qinvalid_operation, | |
| 4682 Qinvalid_read_syntax, Qinvalid_state, Qio_error, Qlist_formation_error, | |
| 4683 Qmalformed_list, Qmalformed_property_list, Qno_catch, Qout_of_memory, | |
| 4684 Qoverflow_error, Qprinting_unreadable_object, Qquit, Qrange_error, | |
| 4685 Qsetting_constant, Qsingularity_error, Qstack_overflow, | |
| 4686 Qstructure_formation_error, Qtext_conversion_error, Qunderflow_error, | |
| 4687 Qvoid_function, Qvoid_variable, Qwrong_number_of_arguments, | |
| 4688 Qwrong_type_argument; | |
| 4689 extern MODULE_API Lisp_Object Qinvalid_argument, Qsyntax_error; | |
| 4690 | |
| 428 | 4691 /* Defined in dired.c */ |
| 867 | 4692 Lisp_Object make_directory_hash_table (const Ibyte *); |
| 428 | 4693 Lisp_Object wasteful_word_to_lisp (unsigned int); |
| 4694 | |
| 4695 /* Defined in doc.c */ | |
| 826 | 4696 EXFUN (Fsubstitute_command_keys, 1); |
| 4697 | |
| 814 | 4698 Lisp_Object unparesseuxify_doc_string (int fd, EMACS_INT position, |
| 867 | 4699 Ibyte *name_nonreloc, |
| 814 | 4700 Lisp_Object name_reloc, |
| 4701 int standard_doc_file); | |
| 428 | 4702 Lisp_Object read_doc_string (Lisp_Object); |
| 4703 | |
| 4704 /* Defined in doprnt.c */ | |
| 867 | 4705 Bytecount emacs_doprnt_va (Lisp_Object stream, const Ibyte *format_nonreloc, |
| 771 | 4706 Bytecount format_length, Lisp_Object format_reloc, |
| 4707 va_list vargs); | |
| 867 | 4708 Bytecount emacs_doprnt (Lisp_Object stream, const Ibyte *format_nonreloc, |
| 771 | 4709 Bytecount format_length, Lisp_Object format_reloc, |
| 4710 int nargs, const Lisp_Object *largs, ...); | |
| 867 | 4711 Lisp_Object emacs_vsprintf_string_lisp (const CIbyte *format_nonreloc, |
| 771 | 4712 Lisp_Object format_reloc, int nargs, |
| 4713 const Lisp_Object *largs); | |
| 867 | 4714 Lisp_Object emacs_sprintf_string_lisp (const CIbyte *format_nonreloc, |
| 771 | 4715 Lisp_Object format_reloc, int nargs, ...); |
| 867 | 4716 Ibyte *emacs_vsprintf_malloc_lisp (const CIbyte *format_nonreloc, |
| 771 | 4717 Lisp_Object format_reloc, int nargs, |
| 4718 const Lisp_Object *largs, | |
| 4719 Bytecount *len_out); | |
| 867 | 4720 Ibyte *emacs_sprintf_malloc_lisp (Bytecount *len_out, |
| 4721 const CIbyte *format_nonreloc, | |
| 771 | 4722 Lisp_Object format_reloc, int nargs, ...); |
| 867 | 4723 Lisp_Object emacs_vsprintf_string (const CIbyte *format, va_list vargs); |
| 4724 Lisp_Object emacs_sprintf_string (const CIbyte *format, ...) | |
| 771 | 4725 PRINTF_ARGS (1, 2); |
| 867 | 4726 Ibyte *emacs_vsprintf_malloc (const CIbyte *format, va_list vargs, |
| 771 | 4727 Bytecount *len_out); |
| 867 | 4728 Ibyte *emacs_sprintf_malloc (Bytecount *len_out, const CIbyte *format, ...) |
| 771 | 4729 PRINTF_ARGS (2, 3); |
| 867 | 4730 Bytecount emacs_vsprintf (Ibyte *output, const CIbyte *format, |
| 771 | 4731 va_list vargs); |
| 867 | 4732 Bytecount emacs_sprintf (Ibyte *output, const CIbyte *format, ...) |
| 771 | 4733 PRINTF_ARGS (2, 3); |
| 4734 | |
| 428 | 4735 |
| 4736 /* Defined in editfns.c */ | |
| 826 | 4737 EXFUN (Fbobp, 1); |
| 4738 EXFUN (Fbolp, 1); | |
| 4739 EXFUN (Fbuffer_substring, 3); | |
| 4740 EXFUN (Fchar_after, 2); | |
| 4741 EXFUN (Fchar_to_string, 1); | |
| 4742 EXFUN (Fdelete_region, 3); | |
| 4743 EXFUN (Feobp, 1); | |
| 4744 EXFUN (Feolp, 1); | |
| 4745 EXFUN (Ffollowing_char, 1); | |
| 4746 EXFUN (Fformat, MANY); | |
| 4747 EXFUN (Fgoto_char, 2); | |
| 4748 EXFUN (Finsert, MANY); | |
| 4749 EXFUN (Finsert_buffer_substring, 3); | |
| 4750 EXFUN (Finsert_char, 4); | |
| 4751 EXFUN (Fnarrow_to_region, 3); | |
| 4752 EXFUN (Fpoint, 1); | |
| 4753 EXFUN (Fpoint_marker, 2); | |
| 4754 EXFUN (Fpoint_max, 1); | |
| 4755 EXFUN (Fpoint_min, 1); | |
| 4756 EXFUN (Fpreceding_char, 1); | |
| 4757 EXFUN (Fsystem_name, 0); | |
| 4758 EXFUN (Fuser_home_directory, 0); | |
| 4759 EXFUN (Fuser_login_name, 1); | |
| 4760 EXFUN (Fwiden, 1); | |
| 4761 | |
| 428 | 4762 void uncache_home_directory (void); |
| 867 | 4763 Ibyte *get_home_directory (void); |
| 4764 Ibyte *user_login_name (uid_t *); | |
| 428 | 4765 void buffer_insert1 (struct buffer *, Lisp_Object); |
| 665 | 4766 Lisp_Object make_string_from_buffer (struct buffer *, Charbpos, Charcount); |
| 4767 Lisp_Object make_string_from_buffer_no_extents (struct buffer *, Charbpos, Charcount); | |
| 707 | 4768 Lisp_Object make_time (time_t); |
| 428 | 4769 Lisp_Object save_excursion_save (void); |
| 844 | 4770 Lisp_Object save_restriction_save (struct buffer *buf); |
| 428 | 4771 Lisp_Object save_excursion_restore (Lisp_Object); |
| 4772 Lisp_Object save_restriction_restore (Lisp_Object); | |
| 771 | 4773 void widen_buffer (struct buffer *b, int no_clip); |
| 4774 int beginning_of_line_p (struct buffer *b, Charbpos pt); | |
| 428 | 4775 |
| 4776 /* Defined in emacsfns.c */ | |
| 4777 Lisp_Object save_current_buffer_restore (Lisp_Object); | |
| 4778 | |
| 4779 /* Defined in emacs.c */ | |
| 2268 | 4780 EXFUN_NORETURN (Fkill_emacs, 1); |
| 826 | 4781 EXFUN (Frunning_temacs_p, 0); |
| 1123 | 4782 EXFUN (Fforce_debugging_signal, 1); |
| 826 | 4783 |
| 428 | 4784 SIGTYPE fatal_error_signal (int); |
| 2367 | 4785 Lisp_Object make_arg_list (int, Wexttext **); |
| 4786 void make_argc_argv (Lisp_Object, int *, Wexttext ***); | |
| 4787 void free_argc_argv (Wexttext **); | |
| 771 | 4788 Lisp_Object split_external_path (const Extbyte *path); |
| 867 | 4789 Lisp_Object split_env_path (const CIbyte *evarname, const Ibyte *default_); |
| 771 | 4790 |
| 428 | 4791 /* Nonzero means don't do interactive redisplay and don't change tty modes */ |
| 442 | 4792 extern int noninteractive, noninteractive1; |
| 2367 | 4793 extern int inhibit_non_essential_conversion_operations; |
| 428 | 4794 extern int preparing_for_armageddon; |
| 458 | 4795 extern Fixnum emacs_priority; |
| 428 | 4796 extern int suppress_early_error_handler_backtrace; |
| 771 | 4797 void debug_break (void); |
| 4854 | 4798 int debug_can_access_memory (const void *ptr, Bytecount len); |
| 2210 | 4799 DECLARE_DOESNT_RETURN (really_abort (void)); |
| 776 | 4800 void zero_out_command_line_status_vars (void); |
| 428 | 4801 |
| 826 | 4802 /* Defined in emodules.c */ |
| 996 | 4803 #ifdef HAVE_SHLIB |
| 826 | 4804 EXFUN (Flist_modules, 0); |
| 4805 EXFUN (Fload_module, 3); | |
| 996 | 4806 extern int unloading_module; |
| 4807 #endif | |
| 826 | 4808 |
| 428 | 4809 /* Defined in eval.c */ |
| 1706 | 4810 MODULE_API EXFUN (Fapply, MANY); |
| 826 | 4811 EXFUN (Fbacktrace, 2); |
| 4812 EXFUN (Fcommand_execute, 3); | |
| 4813 EXFUN (Fcommandp, 1); | |
|
4744
17f7e9191c0b
Rationalise duplicated functionality, #'custom-quote, #'quote-maybe.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4690
diff
changeset
|
4814 EXFUN (Fquote_maybe, 1); |
| 1706 | 4815 MODULE_API EXFUN (Feval, 1); |
| 4816 MODULE_API EXFUN (Ffuncall, MANY); | |
| 826 | 4817 EXFUN (Ffunctionp, 1); |
| 4818 EXFUN (Finteractive_p, 0); | |
| 4819 EXFUN (Fprogn, UNEVALLED); | |
| 1706 | 4820 MODULE_API EXFUN (Fsignal, 2); |
|
4677
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4512
diff
changeset
|
4821 MODULE_API EXFUN_NORETURN (Fthrow, UNEVALLED); |
| 1706 | 4822 MODULE_API EXFUN (Fcall_with_condition_handler, MANY); |
| 853 | 4823 EXFUN (Ffunction_max_args, 1); |
| 4824 EXFUN (Ffunction_min_args, 1); | |
| 826 | 4825 |
|
4677
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4512
diff
changeset
|
4826 MODULE_API DECLARE_DOESNT_RETURN (throw_or_bomb_out (Lisp_Object, |
|
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4512
diff
changeset
|
4827 Lisp_Object, int, |
|
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4512
diff
changeset
|
4828 Lisp_Object, Lisp_Object)); |
|
8f1ee2d15784
Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4512
diff
changeset
|
4829 |
| 1632 | 4830 MODULE_API DECLARE_DOESNT_RETURN (signal_error_1 (Lisp_Object, Lisp_Object)); |
| 563 | 4831 void maybe_signal_error_1 (Lisp_Object, Lisp_Object, Lisp_Object, |
| 578 | 4832 Error_Behavior); |
| 563 | 4833 Lisp_Object maybe_signal_continuable_error_1 (Lisp_Object, Lisp_Object, |
| 578 | 4834 Lisp_Object, Error_Behavior); |
| 1743 | 4835 MODULE_API DECLARE_DOESNT_RETURN (signal_ferror (Lisp_Object, const CIbyte *, |
| 4836 ...)) PRINTF_ARGS(2, 3); | |
| 578 | 4837 void maybe_signal_ferror (Lisp_Object, Lisp_Object, Error_Behavior, |
| 867 | 4838 const CIbyte *, ...) PRINTF_ARGS (4, 5); |
| 4839 Lisp_Object signal_continuable_ferror (Lisp_Object, const CIbyte *, ...) | |
| 442 | 4840 PRINTF_ARGS (2, 3); |
| 563 | 4841 Lisp_Object maybe_signal_continuable_ferror (Lisp_Object, Lisp_Object, |
| 578 | 4842 Error_Behavior, |
| 867 | 4843 const CIbyte *, ...) |
| 442 | 4844 PRINTF_ARGS (4, 5); |
| 563 | 4845 |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4846 Lisp_Object build_error_data (const Ascbyte *reason, Lisp_Object frob); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4847 DECLARE_DOESNT_RETURN (signal_error (Lisp_Object, const Ascbyte *, |
| 563 | 4848 Lisp_Object)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4849 void maybe_signal_error (Lisp_Object, const Ascbyte *, Lisp_Object, |
| 578 | 4850 Lisp_Object, Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4851 Lisp_Object signal_continuable_error (Lisp_Object, const Ascbyte *, |
| 563 | 4852 Lisp_Object); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4853 Lisp_Object maybe_signal_continuable_error (Lisp_Object, const Ascbyte *, |
| 563 | 4854 Lisp_Object, |
| 578 | 4855 Lisp_Object, Error_Behavior); |
| 1743 | 4856 DECLARE_DOESNT_RETURN (signal_ferror_with_frob (Lisp_Object, Lisp_Object, |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4857 const Ascbyte *, ...)) |
| 1743 | 4858 PRINTF_ARGS(3, 4); |
| 563 | 4859 void maybe_signal_ferror_with_frob (Lisp_Object, Lisp_Object, Lisp_Object, |
| 578 | 4860 Error_Behavior, |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4861 const Ascbyte *, ...) PRINTF_ARGS (5, 6); |
| 563 | 4862 Lisp_Object signal_continuable_ferror_with_frob (Lisp_Object, Lisp_Object, |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4863 const Ascbyte *, |
| 563 | 4864 ...) PRINTF_ARGS (3, 4); |
| 4865 Lisp_Object maybe_signal_continuable_ferror_with_frob (Lisp_Object, | |
| 4866 Lisp_Object, | |
| 4867 Lisp_Object, | |
| 578 | 4868 Error_Behavior, |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4869 const Ascbyte *, ...) |
| 442 | 4870 PRINTF_ARGS (5, 6); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4871 DECLARE_DOESNT_RETURN (signal_error_2 (Lisp_Object, const Ascbyte *, |
| 563 | 4872 Lisp_Object, Lisp_Object)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4873 void maybe_signal_error_2 (Lisp_Object, const Ascbyte *, Lisp_Object, |
| 578 | 4874 Lisp_Object, Lisp_Object, Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4875 Lisp_Object signal_continuable_error_2 (Lisp_Object, const Ascbyte *, |
| 563 | 4876 Lisp_Object, Lisp_Object); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4877 Lisp_Object maybe_signal_continuable_error_2 (Lisp_Object, const Ascbyte *, |
| 563 | 4878 Lisp_Object, Lisp_Object, |
| 4879 Lisp_Object, | |
| 578 | 4880 Error_Behavior); |
| 563 | 4881 |
| 4882 | |
| 1927 | 4883 MODULE_API DECLARE_DOESNT_RETURN (signal_malformed_list_error (Lisp_Object)); |
| 4884 MODULE_API DECLARE_DOESNT_RETURN (signal_malformed_property_list_error | |
| 4885 (Lisp_Object)); | |
| 4886 MODULE_API DECLARE_DOESNT_RETURN (signal_circular_list_error (Lisp_Object)); | |
| 4887 MODULE_API DECLARE_DOESNT_RETURN (signal_circular_property_list_error | |
| 4888 (Lisp_Object)); | |
| 436 | 4889 |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4890 DECLARE_DOESNT_RETURN (syntax_error (const Ascbyte *reason, |
| 609 | 4891 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4892 DECLARE_DOESNT_RETURN (syntax_error_2 (const Ascbyte *reason, |
| 609 | 4893 Lisp_Object frob1, |
| 442 | 4894 Lisp_Object frob2)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4895 void maybe_syntax_error (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 578 | 4896 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4897 DECLARE_DOESNT_RETURN (sferror (const Ascbyte *reason, Lisp_Object frob)); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4898 DECLARE_DOESNT_RETURN (sferror_2 (const Ascbyte *reason, Lisp_Object frob1, |
| 563 | 4899 Lisp_Object frob2)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4900 void maybe_sferror (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 578 | 4901 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4902 MODULE_API DECLARE_DOESNT_RETURN (invalid_argument (const Ascbyte *reason, |
| 1632 | 4903 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4904 MODULE_API DECLARE_DOESNT_RETURN (invalid_argument_2 (const Ascbyte *reason, |
| 1632 | 4905 Lisp_Object frob1, |
| 4906 Lisp_Object frob2)); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4907 void maybe_invalid_argument (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 578 | 4908 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4909 MODULE_API DECLARE_DOESNT_RETURN (invalid_operation (const Ascbyte *reason, |
| 1632 | 4910 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4911 MODULE_API DECLARE_DOESNT_RETURN (invalid_operation_2 (const Ascbyte *reason, |
| 1632 | 4912 Lisp_Object frob1, |
| 4913 Lisp_Object frob2)); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4914 MODULE_API void maybe_invalid_operation (const Ascbyte *, Lisp_Object, |
| 1632 | 4915 Lisp_Object, Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4916 DECLARE_DOESNT_RETURN (invalid_state (const Ascbyte *reason, |
| 563 | 4917 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4918 DECLARE_DOESNT_RETURN (invalid_state_2 (const Ascbyte *reason, |
| 563 | 4919 Lisp_Object frob1, |
| 4920 Lisp_Object frob2)); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4921 void maybe_invalid_state (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 609 | 4922 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4923 DECLARE_DOESNT_RETURN (invalid_change (const Ascbyte *reason, |
| 563 | 4924 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4925 DECLARE_DOESNT_RETURN (invalid_change_2 (const Ascbyte *reason, |
| 563 | 4926 Lisp_Object frob1, |
| 4927 Lisp_Object frob2)); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4928 void maybe_invalid_change (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 609 | 4929 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4930 MODULE_API DECLARE_DOESNT_RETURN (invalid_constant (const Ascbyte *reason, |
| 1632 | 4931 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4932 DECLARE_DOESNT_RETURN (invalid_constant_2 (const Ascbyte *reason, |
| 563 | 4933 Lisp_Object frob1, |
| 4934 Lisp_Object frob2)); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4935 void maybe_invalid_constant (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 578 | 4936 Error_Behavior); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4937 DECLARE_DOESNT_RETURN (wtaerror (const Ascbyte *reason, Lisp_Object frob)); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4938 MODULE_API DECLARE_DOESNT_RETURN (out_of_memory (const Ascbyte *reason, |
| 1632 | 4939 Lisp_Object frob)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
4940 DECLARE_DOESNT_RETURN (stack_overflow (const Ascbyte *reason, |
| 442 | 4941 Lisp_Object frob)); |
| 4942 | |
| 436 | 4943 Lisp_Object signal_void_function_error (Lisp_Object); |
| 4944 Lisp_Object signal_invalid_function_error (Lisp_Object); | |
| 4945 Lisp_Object signal_wrong_number_of_arguments_error (Lisp_Object, int); | |
| 4946 | |
| 428 | 4947 Lisp_Object run_hook_with_args_in_buffer (struct buffer *, int, Lisp_Object *, |
| 4948 enum run_hooks_condition); | |
| 4949 Lisp_Object run_hook_with_args (int, Lisp_Object *, enum run_hooks_condition); | |
| 4950 void va_run_hook_with_args (Lisp_Object, int, ...); | |
| 4951 void va_run_hook_with_args_in_buffer (struct buffer *, Lisp_Object, int, ...); | |
| 4952 Lisp_Object run_hook (Lisp_Object); | |
| 1706 | 4953 MODULE_API Lisp_Object apply1 (Lisp_Object, Lisp_Object); |
| 4954 MODULE_API Lisp_Object call0 (Lisp_Object); | |
| 4955 MODULE_API Lisp_Object call1 (Lisp_Object, Lisp_Object); | |
| 4956 MODULE_API Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 4957 MODULE_API Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4958 Lisp_Object); | |
| 4959 MODULE_API Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4960 Lisp_Object, Lisp_Object); | |
| 4961 MODULE_API Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4962 Lisp_Object, Lisp_Object, Lisp_Object); | |
| 4963 MODULE_API Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4964 Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4965 Lisp_Object); | |
| 4966 MODULE_API Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4967 Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4968 Lisp_Object, Lisp_Object); | |
| 4969 MODULE_API Lisp_Object call8 (Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4970 Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4971 Lisp_Object, Lisp_Object, Lisp_Object); | |
| 428 | 4972 Lisp_Object call0_in_buffer (struct buffer *, Lisp_Object); |
| 4973 Lisp_Object call1_in_buffer (struct buffer *, Lisp_Object, Lisp_Object); | |
| 4974 Lisp_Object call2_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, | |
| 4975 Lisp_Object); | |
| 4976 Lisp_Object call3_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, | |
| 4977 Lisp_Object, Lisp_Object); | |
| 4978 Lisp_Object call4_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, | |
| 4979 Lisp_Object, Lisp_Object, Lisp_Object); | |
| 4980 Lisp_Object call5_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, | |
| 4981 Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4982 Lisp_Object); | |
| 4983 Lisp_Object call6_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, | |
| 4984 Lisp_Object, Lisp_Object, Lisp_Object, | |
| 4985 Lisp_Object, Lisp_Object); | |
| 4986 Lisp_Object eval_in_buffer (struct buffer *, Lisp_Object); | |
| 853 | 4987 |
| 4988 struct call_trapping_problems_result | |
| 4989 { | |
| 4990 int caught_error, caught_throw; | |
| 4991 Lisp_Object error_conditions, data; | |
| 4992 Lisp_Object backtrace; | |
| 4993 Lisp_Object thrown_tag; | |
| 4994 Lisp_Object thrown_value; | |
| 4995 }; | |
| 4996 | |
| 4997 #define NO_INHIBIT_ERRORS (1<<0) | |
| 4998 #define NO_INHIBIT_THROWS (1<<1) | |
| 4999 #define INTERNAL_INHIBIT_ERRORS (1<<0) | |
| 5000 #define INTERNAL_INHIBIT_THROWS (1<<1) | |
| 5001 #define INHIBIT_WARNING_ISSUE (1<<2) | |
| 5002 #define ISSUE_WARNINGS_AT_DEBUG_LEVEL (1<<3) | |
| 5003 #define INHIBIT_QUIT (1<<4) | |
| 5004 #define UNINHIBIT_QUIT (1<<5) | |
| 5005 #define INHIBIT_GC (1<<6) | |
| 5006 #define INHIBIT_EXISTING_PERMANENT_DISPLAY_OBJECT_DELETION (1<<7) | |
| 5007 #define INHIBIT_EXISTING_CODING_SYSTEM_DELETION (1<<8) | |
| 5008 #define INHIBIT_EXISTING_CHARSET_DELETION (1<<9) | |
| 5009 #define INHIBIT_PERMANENT_DISPLAY_OBJECT_CREATION (1<<10) | |
| 5010 #define INHIBIT_CODING_SYSTEM_CREATION (1<<11) | |
| 5011 #define INHIBIT_CHARSET_CREATION (1<<12) | |
| 5012 #define INHIBIT_EXISTING_BUFFER_TEXT_MODIFICATION (1<<13) | |
| 5013 #define INHIBIT_ANY_CHANGE_AFFECTING_REDISPLAY (1<<14) | |
| 5014 #define INHIBIT_ENTERING_DEBUGGER (1<<15) | |
| 5015 #define CALL_WITH_SUSPENDED_ERRORS (1<<16) | |
| 1333 | 5016 #define POSTPONE_WARNING_ISSUE (1<<17) |
| 853 | 5017 |
| 5018 enum check_allowed_operation | |
| 5019 { | |
| 5020 OPERATION_DELETE_OBJECT, | |
| 5021 OPERATION_CREATE_OBJECT, | |
| 5022 OPERATION_MODIFY_BUFFER_TEXT, | |
| 1429 | 5023 OPERATION_MODIFY_OBJECT_PROPERTY |
| 853 | 5024 }; |
| 5025 | |
| 5026 int get_inhibit_flags (void); | |
| 5027 void check_allowed_operation (int what, Lisp_Object obj, Lisp_Object prop); | |
| 5028 void note_object_created (Lisp_Object obj); | |
| 5029 void note_object_deleted (Lisp_Object obj); | |
| 5030 Lisp_Object call_with_condition_handler (Lisp_Object (*handler) (Lisp_Object, | |
| 5031 Lisp_Object, | |
| 5032 Lisp_Object), | |
| 5033 Lisp_Object handler_arg, | |
| 5034 Lisp_Object (*fun) (Lisp_Object), | |
| 5035 Lisp_Object arg); | |
| 1318 | 5036 int set_trapping_problems_flags (int flags); |
| 853 | 5037 Lisp_Object call_trapping_problems (Lisp_Object warning_class, |
| 2367 | 5038 const Ascbyte *warning_string, |
| 853 | 5039 int flags, |
| 5040 struct call_trapping_problems_result | |
| 5041 *problem, | |
| 5042 Lisp_Object (*fun) (void *), | |
| 5043 void *arg); | |
| 5044 Lisp_Object va_call_trapping_problems (Lisp_Object warning_class, | |
| 2367 | 5045 const Ascbyte *warning_string, |
| 853 | 5046 int flags, |
| 5047 struct call_trapping_problems_result | |
| 5048 *problem, | |
| 5049 lisp_fn_t fun, int nargs, ...); | |
| 2367 | 5050 Lisp_Object call0_trapping_problems (const Ascbyte *, Lisp_Object, int); |
| 5051 Lisp_Object call1_trapping_problems (const Ascbyte *, Lisp_Object, Lisp_Object, | |
| 853 | 5052 int); |
| 2367 | 5053 Lisp_Object call2_trapping_problems (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 853 | 5054 Lisp_Object, int); |
| 2367 | 5055 Lisp_Object call3_trapping_problems (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 853 | 5056 Lisp_Object, Lisp_Object, int); |
| 2367 | 5057 Lisp_Object call4_trapping_problems (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 853 | 5058 Lisp_Object, Lisp_Object, Lisp_Object, |
| 5059 int); | |
| 2367 | 5060 Lisp_Object call5_trapping_problems (const Ascbyte *, Lisp_Object, Lisp_Object, |
| 853 | 5061 Lisp_Object, Lisp_Object, Lisp_Object, |
| 5062 Lisp_Object, int); | |
| 2367 | 5063 Lisp_Object eval_in_buffer_trapping_problems (const Ascbyte *, struct buffer *, |
| 853 | 5064 Lisp_Object, int); |
| 1333 | 5065 Lisp_Object run_hook_trapping_problems (Lisp_Object, Lisp_Object, int); |
| 5066 Lisp_Object safe_run_hook_trapping_problems (Lisp_Object, Lisp_Object, int); | |
| 5067 Lisp_Object run_hook_with_args_in_buffer_trapping_problems (Lisp_Object, | |
| 5068 struct buffer *, | |
| 5069 int nargs, | |
| 853 | 5070 Lisp_Object *args, |
| 5071 enum | |
| 5072 run_hooks_condition | |
| 5073 cond, int flags); | |
| 1333 | 5074 Lisp_Object run_hook_with_args_trapping_problems (Lisp_Object, |
| 853 | 5075 int nargs, |
| 5076 Lisp_Object *args, | |
| 5077 enum run_hooks_condition | |
| 5078 cond, | |
| 5079 int flags); | |
| 1333 | 5080 Lisp_Object va_run_hook_with_args_trapping_problems (Lisp_Object, |
| 853 | 5081 Lisp_Object hook_var, |
| 5082 int nargs, ...); | |
| 1333 | 5083 Lisp_Object va_run_hook_with_args_in_buffer_trapping_problems (Lisp_Object, |
| 5084 struct buffer *, | |
| 5085 Lisp_Object, | |
| 853 | 5086 int nargs, ...); |
| 5087 Lisp_Object call_with_suspended_errors (lisp_fn_t, Lisp_Object, | |
| 5088 Lisp_Object, | |
| 578 | 5089 Error_Behavior, int, ...); |
| 428 | 5090 /* C Code should be using internal_catch, record_unwind_p, condition_case_1 */ |
| 1318 | 5091 int proper_redisplay_wrapping_in_place (void); |
| 428 | 5092 Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), |
| 853 | 5093 Lisp_Object, int * volatile, |
| 2532 | 5094 Lisp_Object * volatile, |
| 853 | 5095 Lisp_Object * volatile); |
| 428 | 5096 Lisp_Object condition_case_1 (Lisp_Object, |
| 5097 Lisp_Object (*) (Lisp_Object), | |
| 5098 Lisp_Object, | |
| 5099 Lisp_Object (*) (Lisp_Object, Lisp_Object), | |
| 5100 Lisp_Object); | |
| 5101 Lisp_Object condition_case_3 (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 1632 | 5102 MODULE_API Lisp_Object unbind_to_1 (int, Lisp_Object); |
| 771 | 5103 #define unbind_to(obj) unbind_to_1 (obj, Qnil) |
| 428 | 5104 void specbind (Lisp_Object, Lisp_Object); |
| 1632 | 5105 MODULE_API int record_unwind_protect (Lisp_Object (*) (Lisp_Object), |
| 5106 Lisp_Object); | |
| 771 | 5107 int record_unwind_protect_freeing_dynarr (void *ptr); |
| 1333 | 5108 int record_unwind_protect_restoring_int (int *addr, int val); |
| 802 | 5109 int internal_bind_int (int *addr, int newval); |
| 5110 int internal_bind_lisp_object (Lisp_Object *addr, Lisp_Object newval); | |
| 970 | 5111 void do_autoload (Lisp_Object, Lisp_Object); /* GCPROs both arguments */ |
| 428 | 5112 Lisp_Object un_autoload (Lisp_Object); |
| 5113 void warn_when_safe_lispobj (Lisp_Object, Lisp_Object, Lisp_Object); | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5114 MODULE_API void warn_when_safe (Lisp_Object, Lisp_Object, const Ascbyte *, |
| 1632 | 5115 ...) PRINTF_ARGS (3, 4); |
| 1292 | 5116 extern int backtrace_with_internal_sections; |
| 428 | 5117 |
|
4841
3465c3161fea
when `debug', abort when lisp error during loadup
Ben Wing <ben@xemacs.org>
parents:
4805
diff
changeset
|
5118 extern Lisp_Object Vdebug_on_error; |
| 1315 | 5119 extern Lisp_Object Vstack_trace_on_error; |
| 428 | 5120 |
| 5121 /* Defined in event-stream.c */ | |
| 826 | 5122 EXFUN (Faccept_process_output, 3); |
| 5123 EXFUN (Fadd_timeout, 4); | |
| 5124 EXFUN (Fdisable_timeout, 1); | |
| 5125 EXFUN (Fdiscard_input, 0); | |
| 5126 EXFUN (Fdispatch_event, 1); | |
| 5127 EXFUN (Fenqueue_eval_event, 2); | |
| 5128 EXFUN (Fnext_event, 2); | |
| 5129 EXFUN (Fread_key_sequence, 3); | |
| 5130 EXFUN (Fsit_for, 2); | |
| 5131 EXFUN (Fsleep_for, 1); | |
| 5132 | |
| 428 | 5133 void wait_delaying_user_input (int (*) (void *), void *); |
| 1268 | 5134 int detect_input_pending (int how_many); |
| 428 | 5135 void reset_this_command_keys (Lisp_Object, int); |
| 5136 Lisp_Object enqueue_misc_user_event (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 5137 Lisp_Object enqueue_misc_user_event_pos (Lisp_Object, Lisp_Object, | |
| 5138 Lisp_Object, int, int, int, int); | |
| 442 | 5139 extern int modifier_keys_are_sticky; |
| 428 | 5140 |
| 5141 /* Defined in event-Xt.c */ | |
| 5142 void signal_special_Xt_user_event (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 5143 | |
| 5144 | |
| 5145 /* Defined in events.c */ | |
| 826 | 5146 EXFUN (Fcopy_event, 2); |
| 2862 | 5147 EXFUN (Fevent_to_character, 4); |
| 826 | 5148 |
| 428 | 5149 void clear_event_resource (void); |
| 5150 Lisp_Object allocate_event (void); | |
| 5151 | |
| 771 | 5152 EXFUN (Fevent_x_pixel, 1); |
| 5153 EXFUN (Fevent_y_pixel, 1); | |
| 5154 | |
| 5155 | |
| 5156 /* Defined in file-coding.c */ | |
| 5157 EXFUN (Fcoding_category_list, 0); | |
| 5158 EXFUN (Fcoding_category_system, 1); | |
| 5159 EXFUN (Fcoding_priority_list, 0); | |
| 5160 EXFUN (Fcoding_system_description, 1); | |
| 5161 EXFUN (Fcoding_system_documentation, 1); | |
| 5162 EXFUN (Fcoding_system_list, 1); | |
| 5163 EXFUN (Fcoding_system_name, 1); | |
| 5164 EXFUN (Fcoding_system_p, 1); | |
| 5165 EXFUN (Fcoding_system_property, 2); | |
| 5166 EXFUN (Fcoding_system_type, 1); | |
| 5167 EXFUN (Fcopy_coding_system, 2); | |
| 5168 EXFUN (Fdecode_big5_char, 1); | |
| 5169 EXFUN (Fdecode_coding_region, 4); | |
| 5170 EXFUN (Fdecode_shift_jis_char, 1); | |
| 5171 EXFUN (Fdefine_coding_system_alias, 2); | |
| 5172 EXFUN (Fdetect_coding_region, 3); | |
| 5173 EXFUN (Fdefault_encoding_detection_enabled_p, 0); | |
| 5174 EXFUN (Fencode_big5_char, 1); | |
| 5175 EXFUN (Fencode_coding_region, 4); | |
| 5176 EXFUN (Fencode_shift_jis_char, 1); | |
| 5177 EXFUN (Ffind_coding_system, 1); | |
| 5178 EXFUN (Fget_coding_system, 1); | |
|
4690
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4682
diff
changeset
|
5179 EXFUN (Fmake_coding_system_internal, 4); |
| 771 | 5180 EXFUN (Fset_coding_category_system, 2); |
| 5181 EXFUN (Fset_coding_priority_list, 1); | |
| 5182 EXFUN (Fsubsidiary_coding_system, 2); | |
| 5183 | |
| 5184 extern Lisp_Object Qshift_jis, Qiso2022, Qbig5, Qccl; | |
| 5185 extern Lisp_Object Qcharset_g0; | |
| 5186 extern Lisp_Object Qcharset_g1, Qcharset_g2, Qcharset_g3, Qcoding_system_error; | |
| 5187 extern Lisp_Object Qcoding_systemp, Qcr, Qcrlf, Qdecode, Qencode; | |
| 5188 extern Lisp_Object Qeol_cr, Qeol_crlf, Qeol_lf, Qeol_type, Qescape_quoted; | |
| 5189 extern Lisp_Object Qforce_g0_on_output, Qforce_g1_on_output; | |
| 5190 extern Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output; | |
| 5191 extern Lisp_Object Qinput_charset_conversion, Qlf, Qlock_shift; | |
| 5192 extern Lisp_Object Qmnemonic, Qno_ascii_cntl, Qno_ascii_eol; | |
| 5193 extern Lisp_Object Qno_conversion, Qraw_text; | |
| 5194 extern Lisp_Object Qno_iso6429, Qoutput_charset_conversion; | |
| 5195 extern Lisp_Object Qpost_read_conversion, Qpre_write_conversion, Qseven; | |
| 5196 extern Lisp_Object Qshort, Vcoding_system_for_read; | |
| 5197 extern Lisp_Object Vcoding_system_for_write; | |
| 5198 extern Lisp_Object Vfile_name_coding_system, Vkeyboard_coding_system; | |
| 5199 extern Lisp_Object Vterminal_coding_system; | |
| 5200 extern Lisp_Object Qcanonicalize_after_coding; | |
| 5201 int coding_system_is_for_text_file (Lisp_Object coding_system); | |
| 5202 Lisp_Object find_coding_system_for_text_file (Lisp_Object name, int eol_wrap); | |
| 1632 | 5203 MODULE_API Lisp_Object get_coding_system_for_text_file (Lisp_Object name, |
| 5204 int eol_wrap); | |
| 771 | 5205 int coding_system_is_binary (Lisp_Object coding_system); |
| 5206 | |
| 5207 | |
| 428 | 5208 /* Defined in fileio.c */ |
| 826 | 5209 EXFUN (Fdirectory_file_name, 1); |
| 5210 EXFUN (Fdo_auto_save, 2); | |
| 5211 EXFUN (Fexpand_file_name, 2); | |
| 5212 EXFUN (Ffile_accessible_directory_p, 1); | |
| 5213 EXFUN (Ffile_directory_p, 1); | |
| 5214 EXFUN (Ffile_executable_p, 1); | |
| 5215 EXFUN (Ffile_exists_p, 1); | |
| 5216 EXFUN (Ffile_name_absolute_p, 1); | |
| 5217 EXFUN (Ffile_name_as_directory, 1); | |
| 5218 EXFUN (Ffile_name_directory, 1); | |
| 5219 EXFUN (Ffile_name_nondirectory, 1); | |
| 5220 EXFUN (Ffile_readable_p, 1); | |
| 5221 EXFUN (Ffile_symlink_p, 1); | |
| 5222 EXFUN (Ffile_truename, 2); | |
| 5223 EXFUN (Ffind_file_name_handler, 2); | |
| 5224 EXFUN (Finsert_file_contents_internal, 7); | |
| 5225 EXFUN (Fmake_temp_name, 1); | |
| 5226 EXFUN (Fsubstitute_in_file_name, 1); | |
| 5227 EXFUN (Funhandled_file_name_directory, 1); | |
| 5228 EXFUN (Fverify_visited_file_modtime, 1); | |
| 5229 | |
| 428 | 5230 void record_auto_save (void); |
| 5231 void force_auto_save_soon (void); | |
| 563 | 5232 DECLARE_DOESNT_RETURN (report_error_with_errno (Lisp_Object errtype, |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5233 const Ascbyte *reason, |
| 563 | 5234 Lisp_Object data)); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5235 DECLARE_DOESNT_RETURN (report_file_error (const Ascbyte *, Lisp_Object)); |
| 428 | 5236 Lisp_Object lisp_strerror (int); |
| 5237 Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object); | |
| 5238 int internal_delete_file (Lisp_Object); | |
| 2526 | 5239 Ibyte *find_end_of_directory_component (const Ibyte *path, |
| 5240 Bytecount len); | |
| 428 | 5241 |
| 5242 /* Defined in filelock.c */ | |
| 826 | 5243 EXFUN (Funlock_buffer, 0); |
| 5244 | |
| 428 | 5245 void lock_file (Lisp_Object); |
| 5246 void unlock_file (Lisp_Object); | |
| 5247 void unlock_all_files (void); | |
| 5248 void unlock_buffer (struct buffer *); | |
| 5249 | |
| 5250 /* Defined in floatfns.c */ | |
|
4678
b5e1d4f6b66f
Make #'floor, #'ceiling, #'round, #'truncate conform to Common Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4677
diff
changeset
|
5251 EXFUN (Ftruncate, 2); |
| 826 | 5252 |
| 428 | 5253 double extract_float (Lisp_Object); |
| 5254 | |
| 5255 /* Defined in fns.c */ | |
| 1632 | 5256 MODULE_API EXFUN (Fappend, MANY); |
| 826 | 5257 EXFUN (Fassoc, 2); |
| 5258 EXFUN (Fassq, 2); | |
| 5259 EXFUN (Fcanonicalize_lax_plist, 2); | |
| 5260 EXFUN (Fcanonicalize_plist, 2); | |
| 5261 EXFUN (Fcheck_valid_plist, 1); | |
| 5262 EXFUN (Fconcat, MANY); | |
| 5263 EXFUN (Fcopy_alist, 1); | |
| 5264 EXFUN (Fcopy_list, 1); | |
| 5265 EXFUN (Fcopy_sequence, 1); | |
| 5266 EXFUN (Fcopy_tree, 2); | |
| 5267 EXFUN (Fdelete, 2); | |
| 5268 EXFUN (Fdelq, 2); | |
| 5269 EXFUN (Fdestructive_alist_to_plist, 1); | |
| 5270 EXFUN (Felt, 2); | |
| 1632 | 5271 MODULE_API EXFUN (Fequal, 2); |
| 5272 MODULE_API EXFUN (Fget, 3); | |
|
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4888
diff
changeset
|
5273 MODULE_API EXFUN (Feqlsign, MANY); |
|
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4888
diff
changeset
|
5274 MODULE_API EXFUN (Fequalp, 2); |
| 826 | 5275 EXFUN (Flast, 2); |
| 5276 EXFUN (Flax_plist_get, 3); | |
| 5277 EXFUN (Flax_plist_remprop, 2); | |
| 1632 | 5278 MODULE_API EXFUN (Flength, 1); |
|
4995
8431b52e43b1
Move the various map* functions to C; add #'map-into.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4888
diff
changeset
|
5279 EXFUN (FmapcarX, MANY); |
| 826 | 5280 EXFUN (Fmember, 2); |
| 5281 EXFUN (Fmemq, 2); | |
| 5282 EXFUN (Fnconc, MANY); | |
| 1632 | 5283 MODULE_API EXFUN (Fnreverse, 1); |
| 826 | 5284 EXFUN (Fnthcdr, 2); |
| 5285 EXFUN (Fold_assq, 2); | |
| 5286 EXFUN (Fold_equal, 2); | |
| 5287 EXFUN (Fold_member, 2); | |
| 5288 EXFUN (Fold_memq, 2); | |
| 5289 EXFUN (Fplist_get, 3); | |
| 5290 EXFUN (Fplist_member, 2); | |
| 5291 EXFUN (Fplist_put, 3); | |
| 1632 | 5292 MODULE_API EXFUN (Fprovide, 1); |
| 5293 MODULE_API EXFUN (Fput, 3); | |
| 826 | 5294 EXFUN (Frassq, 2); |
| 5295 EXFUN (Fremassq, 2); | |
| 5296 EXFUN (Freplace_list, 2); | |
| 1632 | 5297 MODULE_API EXFUN (Freverse, 1); |
| 1268 | 5298 EXFUN (Fsafe_length, 1); |
| 826 | 5299 EXFUN (Fsort, 2); |
| 5300 EXFUN (Fstring_equal, 2); | |
| 5301 EXFUN (Fstring_lessp, 2); | |
| 5302 EXFUN (Fsubstring, 3); | |
| 5303 EXFUN (Fvalid_plist_p, 1); | |
| 5304 | |
| 428 | 5305 Lisp_Object list_sort (Lisp_Object, Lisp_Object, |
| 5306 int (*) (Lisp_Object, Lisp_Object, Lisp_Object)); | |
| 5307 Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 5308 | |
| 5309 void bump_string_modiff (Lisp_Object); | |
| 5310 Lisp_Object memq_no_quit (Lisp_Object, Lisp_Object); | |
| 5311 Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object); | |
| 5312 Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object); | |
| 5313 Lisp_Object rassq_no_quit (Lisp_Object, Lisp_Object); | |
| 5314 Lisp_Object delq_no_quit (Lisp_Object, Lisp_Object); | |
| 5315 Lisp_Object delq_no_quit_and_free_cons (Lisp_Object, Lisp_Object); | |
| 5316 Lisp_Object remassoc_no_quit (Lisp_Object, Lisp_Object); | |
| 5317 Lisp_Object remassq_no_quit (Lisp_Object, Lisp_Object); | |
| 5318 Lisp_Object remrassq_no_quit (Lisp_Object, Lisp_Object); | |
| 5319 | |
|
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4888
diff
changeset
|
5320 int plists_differ (Lisp_Object, Lisp_Object, int, int, int, int); |
| 428 | 5321 Lisp_Object internal_plist_get (Lisp_Object, Lisp_Object); |
| 5322 void internal_plist_put (Lisp_Object *, Lisp_Object, Lisp_Object); | |
| 5323 int internal_remprop (Lisp_Object *, Lisp_Object); | |
| 5324 Lisp_Object external_plist_get (Lisp_Object *, Lisp_Object, | |
| 578 | 5325 int, Error_Behavior); |
| 428 | 5326 void external_plist_put (Lisp_Object *, Lisp_Object, |
| 578 | 5327 Lisp_Object, int, Error_Behavior); |
| 5328 int external_remprop (Lisp_Object *, Lisp_Object, int, Error_Behavior); | |
| 853 | 5329 int internal_equal_trapping_problems (Lisp_Object warning_class, |
| 2367 | 5330 const Ascbyte *warning_string, |
| 853 | 5331 int flags, |
| 5332 struct call_trapping_problems_result *p, | |
| 5333 int retval, | |
| 5334 Lisp_Object obj1, Lisp_Object obj2, | |
| 5335 int depth); | |
| 428 | 5336 int internal_equal (Lisp_Object, Lisp_Object, int); |
| 801 | 5337 int internal_equalp (Lisp_Object obj1, Lisp_Object obj2, int depth); |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5338 Lisp_Object MODULE_API concat2 (Lisp_Object, Lisp_Object); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5339 Lisp_Object MODULE_API concat3 (Lisp_Object, Lisp_Object, Lisp_Object); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5340 Lisp_Object MODULE_API vconcat2 (Lisp_Object, Lisp_Object); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5341 Lisp_Object MODULE_API vconcat3 (Lisp_Object, Lisp_Object, Lisp_Object); |
|
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5342 Lisp_Object MODULE_API nconc2 (Lisp_Object, Lisp_Object); |
|
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4888
diff
changeset
|
5343 int internal_equal_0 (Lisp_Object, Lisp_Object, int, int); |
| 428 | 5344 Lisp_Object bytecode_nconc2 (Lisp_Object *); |
|
4910
6bc1f3f6cf0d
Make canoncase visible to Lisp; use it with chars in internal_equalp.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4906
diff
changeset
|
5345 int bytecode_arithcompare (Lisp_Object obj1, Lisp_Object obj2); |
|
5000
44d7bde26046
fix compile errors, fix revert-buffer bug on binary/Latin 1 files, Mule-ize some files
Ben Wing <ben@xemacs.org>
parents:
4982
diff
changeset
|
5346 void check_losing_bytecode (const Ascbyte *, Lisp_Object); |
| 428 | 5347 |
| 771 | 5348 Lisp_Object add_suffix_to_symbol (Lisp_Object symbol, |
| 2367 | 5349 const Ascbyte *ascii_string); |
| 5350 Lisp_Object add_prefix_to_symbol (const Ascbyte *ascii_string, | |
| 771 | 5351 Lisp_Object symbol); |
| 5352 | |
| 826 | 5353 /* Defined in free-hook.c */ |
| 5354 EXFUN (Freally_free, 1); | |
| 5355 | |
| 428 | 5356 /* Defined in glyphs.c */ |
| 826 | 5357 EXFUN (Fmake_glyph_internal, 1); |
| 5358 | |
| 578 | 5359 Error_Behavior decode_error_behavior_flag (Lisp_Object); |
| 5360 Lisp_Object encode_error_behavior_flag (Error_Behavior); | |
| 428 | 5361 |
| 563 | 5362 /* Defined in glyphs-shared.c */ |
| 5363 void shared_resource_validate (Lisp_Object instantiator); | |
| 5364 Lisp_Object shared_resource_normalize (Lisp_Object inst, | |
| 5365 Lisp_Object console_type, | |
| 5366 Lisp_Object dest_mask, | |
| 5367 Lisp_Object tag); | |
| 5368 extern Lisp_Object Q_resource_type, Q_resource_id; | |
| 5369 | |
| 5370 /* Defined in gui.c */ | |
| 2367 | 5371 DECLARE_DOESNT_RETURN (gui_error (const Ascbyte *reason, |
| 563 | 5372 Lisp_Object frob)); |
| 2367 | 5373 DECLARE_DOESNT_RETURN (gui_error_2 (const Ascbyte *reason, |
| 569 | 5374 Lisp_Object frob0, Lisp_Object frob1)); |
| 428 | 5375 /* Defined in indent.c */ |
| 826 | 5376 EXFUN (Findent_to, 3); |
| 5377 EXFUN (Fvertical_motion, 3); | |
| 5378 | |
| 5379 int byte_spaces_at_point (struct buffer *, Bytebpos); | |
| 665 | 5380 int column_at_point (struct buffer *, Charbpos, int); |
| 793 | 5381 int string_column_at_point (Lisp_Object, Charbpos, int); |
| 428 | 5382 int current_column (struct buffer *); |
| 5383 void invalidate_current_column (void); | |
| 665 | 5384 Charbpos vmotion (struct window *, Charbpos, int, int *); |
| 5385 Charbpos vmotion_pixels (Lisp_Object, Charbpos, int, int, int *); | |
| 428 | 5386 |
| 771 | 5387 /* Defined in insdel.c */ |
| 5388 void set_buffer_point (struct buffer *buf, Charbpos pos, Bytebpos bipos); | |
| 5389 | |
| 826 | 5390 /* Defined in intl.c */ |
| 5391 EXFUN (Fgettext, 1); | |
| 5392 | |
| 428 | 5393 /* Defined in keymap.c */ |
| 826 | 5394 EXFUN (Fdefine_key, 3); |
| 5395 EXFUN (Fkey_description, 1); | |
| 5396 EXFUN (Flookup_key, 3); | |
| 5397 EXFUN (Fmake_sparse_keymap, 1); | |
| 5398 | |
| 793 | 5399 void where_is_to_char (Lisp_Object, Eistring *); |
| 428 | 5400 |
| 5401 /* Defined in lread.c */ | |
| 826 | 5402 EXFUN (Fread, 1); |
| 5403 | |
| 428 | 5404 void ebolify_bytecode_constants (Lisp_Object); |
| 5405 void close_load_descs (void); | |
| 5406 int locate_file (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object *, int); | |
| 5407 EXFUN (Flocate_file_clear_hashing, 1); | |
| 442 | 5408 int isfloat_string (const char *); |
| 1983 | 5409 #ifdef HAVE_RATIO |
| 5410 int isratio_string (const char *); | |
| 5411 #endif | |
| 428 | 5412 |
| 5413 /* Well, I've decided to enable this. -- ben */ | |
| 5414 /* And I've decided to make it work right. -- sb */ | |
| 5415 #define LOADHIST | |
| 5416 /* Define the following symbol to enable load history of dumped files */ | |
| 5417 #define LOADHIST_DUMPED | |
| 5418 /* Define the following symbol to enable load history of C source */ | |
| 5419 #define LOADHIST_BUILTIN | |
| 5420 | |
| 5421 #ifdef LOADHIST /* this is just a stupid idea */ | |
| 5422 #define LOADHIST_ATTACH(x) \ | |
| 5423 do { if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list); } \ | |
| 5424 while (0) | |
| 5425 #else /*! LOADHIST */ | |
| 5426 # define LOADHIST_ATTACH(x) | |
| 5427 #endif /*! LOADHIST */ | |
| 5428 | |
| 826 | 5429 /* Defined in macros.c */ |
| 5430 EXFUN (Fexecute_kbd_macro, 2); | |
| 5431 | |
| 428 | 5432 /* Defined in marker.c */ |
| 826 | 5433 EXFUN (Fcopy_marker, 2); |
| 5434 EXFUN (Fmake_marker, 0); | |
| 5435 EXFUN (Fmarker_buffer, 1); | |
| 5436 EXFUN (Fmarker_position, 1); | |
| 5437 EXFUN (Fset_marker, 3); | |
| 5438 EXFUN (Fset_marker_insertion_type, 2); | |
| 5439 | |
| 5440 Bytebpos byte_marker_position (Lisp_Object); | |
| 665 | 5441 Charbpos marker_position (Lisp_Object); |
| 826 | 5442 void set_byte_marker_position (Lisp_Object, Bytebpos); |
| 665 | 5443 void set_marker_position (Lisp_Object, Charbpos); |
| 428 | 5444 void unchain_marker (Lisp_Object); |
| 5445 Lisp_Object noseeum_copy_marker (Lisp_Object, Lisp_Object); | |
| 5446 Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object); | |
| 5447 #ifdef MEMORY_USAGE_STATS | |
| 5448 int compute_buffer_marker_usage (struct buffer *, struct overhead_stats *); | |
| 5449 #endif | |
| 771 | 5450 void init_buffer_markers (struct buffer *b); |
| 5451 void uninit_buffer_markers (struct buffer *b); | |
| 428 | 5452 |
| 5453 /* Defined in minibuf.c */ | |
| 5454 extern int minibuf_level; | |
| 867 | 5455 Charcount scmp_1 (const Ibyte *, const Ibyte *, Charcount, int); |
| 428 | 5456 #define scmp(s1, s2, len) scmp_1 (s1, s2, len, completion_ignore_case) |
| 5457 extern int completion_ignore_case; | |
| 867 | 5458 int regexp_ignore_completion_p (const Ibyte *, Lisp_Object, |
| 428 | 5459 Bytecount, Bytecount); |
| 5460 Lisp_Object clear_echo_area (struct frame *, Lisp_Object, int); | |
| 5461 Lisp_Object clear_echo_area_from_print (struct frame *, Lisp_Object, int); | |
| 867 | 5462 void echo_area_append (struct frame *, const Ibyte *, Lisp_Object, |
| 428 | 5463 Bytecount, Bytecount, Lisp_Object); |
| 867 | 5464 void echo_area_message (struct frame *, const Ibyte *, Lisp_Object, |
| 428 | 5465 Bytecount, Bytecount, Lisp_Object); |
| 5466 Lisp_Object echo_area_status (struct frame *); | |
| 5467 int echo_area_active (struct frame *); | |
| 5468 Lisp_Object echo_area_contents (struct frame *); | |
| 867 | 5469 void message_internal (const Ibyte *, Lisp_Object, Bytecount, Bytecount); |
| 5470 void message_append_internal (const Ibyte *, Lisp_Object, | |
| 428 | 5471 Bytecount, Bytecount); |
| 1632 | 5472 MODULE_API void message (const char *, ...) PRINTF_ARGS (1, 2); |
| 442 | 5473 void message_append (const char *, ...) PRINTF_ARGS (1, 2); |
| 5474 void message_no_translate (const char *, ...) PRINTF_ARGS (1, 2); | |
| 428 | 5475 void clear_message (void); |
| 5476 | |
| 771 | 5477 /* Defined in mule-charset.c */ |
| 826 | 5478 EXFUN (Fmake_charset, 3); |
| 5479 | |
| 771 | 5480 extern Lisp_Object Ql2r, Qr2l; |
| 5481 | |
| 428 | 5482 /* Defined in print.c */ |
| 826 | 5483 EXFUN (Fdisplay_error, 2); |
| 5484 EXFUN (Ferror_message_string, 1); | |
| 5485 EXFUN (Fprin1, 2); | |
| 5486 EXFUN (Fprin1_to_string, 2); | |
| 5487 EXFUN (Fprinc, 2); | |
| 5488 EXFUN (Fprint, 2); | |
| 5489 | |
|
4394
cacc942c0d0f
Avoid clearing print-gensym-alist inappropriately when printing hash tables.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4355
diff
changeset
|
5490 Lisp_Object prin1_to_string (Lisp_Object, int); |
| 771 | 5491 |
| 5492 /* Lower-level ways to output data: */ | |
| 3085 | 5493 void default_object_printer (Lisp_Object, Lisp_Object, int); |
| 771 | 5494 void print_internal (Lisp_Object, Lisp_Object, int); |
| 428 | 5495 void debug_print (Lisp_Object); |
| 1204 | 5496 void debug_p4 (Lisp_Object obj); |
| 5497 void debug_p3 (Lisp_Object obj); | |
| 5498 void debug_short_backtrace (int); | |
| 5499 void debug_backtrace (void); | |
| 428 | 5500 /* NOTE: Do not call this with the data of a Lisp_String. Use princ. |
| 5501 * Note: stream should be defaulted before calling | |
| 5502 * (eg Qnil means stdout, not Vstandard_output, etc) */ | |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5503 MODULE_API void write_istring (Lisp_Object stream, const Ibyte *str); |
| 771 | 5504 /* Same goes for this function. */ |
|
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
5505 MODULE_API void write_cistring (Lisp_Object stream, const CIbyte *str); |
| 771 | 5506 /* Same goes for this function. */ |
|
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4932
diff
changeset
|
5507 MODULE_API void write_ascstring (Lisp_Object stream, const Ascbyte *str); |
| 428 | 5508 /* Same goes for this function. */ |
| 867 | 5509 void write_string_1 (Lisp_Object stream, const Ibyte *str, Bytecount size); |
| 826 | 5510 void write_eistring (Lisp_Object stream, const Eistring *ei); |
| 771 | 5511 |
| 5512 /* Higher-level (printf-style) ways to output data: */ | |
| 1632 | 5513 MODULE_API void write_fmt_string (Lisp_Object stream, const CIbyte *fmt, ...); |
| 5514 MODULE_API void write_fmt_string_lisp (Lisp_Object stream, const CIbyte *fmt, | |
| 5515 int nargs, ...); | |
| 867 | 5516 void stderr_out (const CIbyte *, ...) PRINTF_ARGS (1, 2); |
| 5517 void stderr_out_lisp (const CIbyte *, int nargs, ...); | |
| 5518 void stdout_out (const CIbyte *, ...) PRINTF_ARGS (1, 2); | |
| 1346 | 5519 void external_out (int dest, const CIbyte *fmt, ...) PRINTF_ARGS (2, 3); |
| 867 | 5520 void debug_out (const CIbyte *, ...) PRINTF_ARGS (1, 2); |
| 1743 | 5521 DECLARE_DOESNT_RETURN (fatal (const CIbyte *, ...)) PRINTF_ARGS(1, 2); |
| 771 | 5522 |
| 5523 /* Internal functions: */ | |
| 1261 | 5524 Lisp_Object canonicalize_printcharfun (Lisp_Object printcharfun); |
| 771 | 5525 void temp_output_buffer_setup (Lisp_Object); |
| 5526 void temp_output_buffer_show (Lisp_Object, Lisp_Object); | |
| 428 | 5527 void print_cons (Lisp_Object, Lisp_Object, int); |
| 5528 void print_vector (Lisp_Object, Lisp_Object, int); | |
| 5529 void print_string (Lisp_Object, Lisp_Object, int); | |
| 771 | 5530 void print_symbol (Lisp_Object, Lisp_Object, int); |
| 5531 void print_float (Lisp_Object, Lisp_Object, int); | |
| 603 | 5532 /* The number of bytes required to store the decimal printed |
| 5533 representation of an integral type. Add a few bytes for truncation, | |
| 5534 optional sign prefix, and null byte terminator. | |
| 614 | 5535 2.40824 == log (256) / log (10). |
| 5536 | |
| 5537 We don't use floating point since Sun cc (buggily?) cannot use | |
| 5538 floating point computations to define a compile-time integral | |
| 5539 constant. */ | |
| 603 | 5540 #define DECIMAL_PRINT_SIZE(integral_type) \ |
| 614 | 5541 (((2410824 * sizeof (integral_type)) / 1000000) + 3) |
| 577 | 5542 void long_to_string (char *, long); |
|
4329
d9eb5ea14f65
Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4134
diff
changeset
|
5543 void ulong_to_bit_string (char *, unsigned long); |
| 428 | 5544 extern int print_escape_newlines; |
| 1632 | 5545 extern MODULE_API int print_readably; |
|
4880
ae81a2c00f4f
try harder to avoid crashing when debug-printing
Ben Wing <ben@xemacs.org>
parents:
4854
diff
changeset
|
5546 extern int in_debug_print; |
| 428 | 5547 Lisp_Object internal_with_output_to_temp_buffer (Lisp_Object, |
| 5548 Lisp_Object (*) (Lisp_Object), | |
| 5549 Lisp_Object, Lisp_Object); | |
| 5550 void float_to_string (char *, double); | |
| 5551 void internal_object_printer (Lisp_Object, Lisp_Object, int); | |
| 4846 | 5552 MODULE_API DECLARE_DOESNT_RETURN (printing_unreadable_object (const CIbyte *, |
| 5553 ...)) | |
| 5554 PRINTF_ARGS (1, 2); | |
| 5555 DECLARE_DOESNT_RETURN (printing_unreadable_lcrecord (Lisp_Object obj, | |
| 5556 const Ibyte *name)); | |
| 428 | 5557 |
| 5558 /* Defined in rangetab.c */ | |
| 826 | 5559 EXFUN (Fclear_range_table, 1); |
| 5560 EXFUN (Fget_range_table, 3); | |
| 2421 | 5561 EXFUN (Fmake_range_table, 1); |
| 826 | 5562 EXFUN (Fput_range_table, 4); |
|
4690
257b468bf2ca
Move the #'query-coding-region implementation to C.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4682
diff
changeset
|
5563 EXFUN (Fcopy_range_table, 1); |
| 826 | 5564 |
| 2421 | 5565 extern Lisp_Object Qstart_closed_end_open; |
| 5566 extern Lisp_Object Qstart_open_end_open; | |
| 5567 extern Lisp_Object Qstart_closed_end_closed; | |
| 5568 extern Lisp_Object Qstart_open_end_closed; | |
| 5569 | |
| 428 | 5570 void put_range_table (Lisp_Object, EMACS_INT, EMACS_INT, Lisp_Object); |
| 5571 int unified_range_table_bytes_needed (Lisp_Object); | |
| 5572 int unified_range_table_bytes_used (void *); | |
| 5573 void unified_range_table_copy_data (Lisp_Object, void *); | |
| 5574 Lisp_Object unified_range_table_lookup (void *, EMACS_INT, Lisp_Object); | |
| 5575 int unified_range_table_nentries (void *); | |
| 5576 void unified_range_table_get_range (void *, int, EMACS_INT *, EMACS_INT *, | |
| 5577 Lisp_Object *); | |
| 5578 | |
| 5579 /* Defined in search.c */ | |
| 826 | 5580 EXFUN (Fmatch_beginning, 1); |
| 5581 EXFUN (Fmatch_end, 1); | |
| 5582 EXFUN (Fskip_chars_backward, 3); | |
| 5583 EXFUN (Fskip_chars_forward, 3); | |
| 5584 EXFUN (Fstring_match, 4); | |
|
4960
45b6288416e3
slight cleanup, move EXFUN of regexp-quote to lisp.h
Ben Wing <ben@xemacs.org>
parents:
4957
diff
changeset
|
5585 EXFUN (Fregexp_quote, 1); |
| 826 | 5586 |
| 428 | 5587 struct re_pattern_buffer; |
| 5588 struct re_registers; | |
| 867 | 5589 Charbpos scan_buffer (struct buffer *, Ichar, Charbpos, Charbpos, EMACS_INT, |
| 826 | 5590 EMACS_INT *, int); |
| 665 | 5591 Charbpos find_next_newline (struct buffer *, Charbpos, int); |
| 5592 Charbpos find_next_newline_no_quit (struct buffer *, Charbpos, int); | |
| 826 | 5593 Bytebpos byte_find_next_newline_no_quit (struct buffer *, Bytebpos, int); |
| 867 | 5594 Bytecount byte_find_next_ichar_in_string (Lisp_Object, Ichar, Bytecount, |
| 826 | 5595 EMACS_INT); |
| 665 | 5596 Charbpos find_before_next_newline (struct buffer *, Charbpos, Charbpos, int); |
| 826 | 5597 struct re_pattern_buffer *compile_pattern (Lisp_Object pattern, |
| 5598 struct re_registers *regp, | |
| 5599 Lisp_Object translate, | |
| 5600 Lisp_Object searchobj, | |
| 5601 struct buffer *searchbuf, | |
| 5602 int posix, Error_Behavior errb); | |
| 867 | 5603 Bytecount fast_string_match (Lisp_Object, const Ibyte *, |
| 428 | 5604 Lisp_Object, Bytecount, |
| 578 | 5605 Bytecount, int, Error_Behavior, int); |
| 428 | 5606 Bytecount fast_lisp_string_match (Lisp_Object, Lisp_Object); |
| 507 | 5607 extern Fixnum warn_about_possibly_incompatible_back_references; |
| 502 | 5608 |
| 428 | 5609 |
| 5610 /* Defined in signal.c */ | |
| 5611 void init_interrupts_late (void); | |
| 5612 | |
| 5613 /* Defined in sound.c */ | |
| 826 | 5614 EXFUN (Fding, 3); |
| 5615 | |
| 428 | 5616 void init_device_sound (struct device *); |
| 2367 | 5617 DECLARE_DOESNT_RETURN (report_sound_error (const Ascbyte *, Lisp_Object)); |
| 428 | 5618 |
| 5619 /* Defined in specifier.c */ | |
| 826 | 5620 EXFUN (Fadd_spec_to_specifier, 5); |
| 5621 EXFUN (Fspecifier_spec_list, 4); | |
| 5622 | |
| 428 | 5623 Lisp_Object specifier_instance (Lisp_Object, Lisp_Object, Lisp_Object, |
| 578 | 5624 Error_Behavior, int, int, Lisp_Object); |
| 428 | 5625 Lisp_Object specifier_instance_no_quit (Lisp_Object, Lisp_Object, Lisp_Object, |
| 578 | 5626 Error_Behavior, int, Lisp_Object); |
| 428 | 5627 |
| 5628 /* Defined in symbols.c */ | |
| 826 | 5629 EXFUN (Fboundp, 1); |
| 5630 EXFUN (Fbuilt_in_variable_type, 1); | |
| 5631 EXFUN (Fdefault_boundp, 1); | |
| 5632 EXFUN (Fdefault_value, 1); | |
| 5633 EXFUN (Ffboundp, 1); | |
| 5634 EXFUN (Ffset, 2); | |
| 5635 EXFUN (Fintern, 2); | |
|
4355
a2af1ff1761f
Provide a DEFAULT argument in #'intern-soft.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4329
diff
changeset
|
5636 EXFUN (Fintern_soft, 3); |
| 826 | 5637 EXFUN (Fkill_local_variable, 1); |
| 5638 EXFUN (Fset, 2); | |
| 5639 EXFUN (Fset_default, 2); | |
| 5640 EXFUN (Fsymbol_function, 1); | |
| 5641 EXFUN (Fsymbol_name, 1); | |
| 5642 EXFUN (Fsymbol_plist, 1); | |
| 5643 EXFUN (Fsymbol_value, 1); | |
| 5644 | |
| 867 | 5645 unsigned int hash_string (const Ibyte *, Bytecount); |
|
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
5646 Lisp_Object intern_istring (const Ibyte *str); |
| 1632 | 5647 MODULE_API Lisp_Object intern (const CIbyte *str); |
| 867 | 5648 Lisp_Object intern_converting_underscores_to_dashes (const CIbyte *str); |
| 5649 Lisp_Object oblookup (Lisp_Object, const Ibyte *, Bytecount); | |
| 428 | 5650 void map_obarray (Lisp_Object, int (*) (Lisp_Object, void *), void *); |
| 5651 Lisp_Object indirect_function (Lisp_Object, int); | |
| 5652 Lisp_Object symbol_value_in_buffer (Lisp_Object, Lisp_Object); | |
| 5653 void kill_buffer_local_variables (struct buffer *); | |
| 5654 int symbol_value_buffer_local_info (Lisp_Object, struct buffer *); | |
| 5655 Lisp_Object find_symbol_value (Lisp_Object); | |
| 5656 Lisp_Object find_symbol_value_quickly (Lisp_Object, int); | |
| 5657 Lisp_Object top_level_value (Lisp_Object); | |
| 5658 void reject_constant_symbols (Lisp_Object sym, Lisp_Object newval, | |
| 5659 int function_p, | |
| 5660 Lisp_Object follow_past_lisp_magic); | |
| 5661 | |
| 5662 /* Defined in syntax.c */ | |
| 665 | 5663 Charbpos scan_words (struct buffer *, Charbpos, int); |
| 826 | 5664 EXFUN (Fchar_syntax, 2); |
| 5665 EXFUN (Fforward_word, 2); | |
| 5666 extern Lisp_Object Vstandard_syntax_table; | |
| 3250 | 5667 void signal_syntax_cache_extent_changed (EXTENT extent); |
| 5668 void signal_syntax_cache_extent_adjust (struct buffer *buf); | |
| 826 | 5669 void init_buffer_syntax_cache (struct buffer *buf); |
| 5670 void mark_buffer_syntax_cache (struct buffer *buf); | |
| 5671 void uninit_buffer_syntax_cache (struct buffer *buf); | |
| 5672 extern Lisp_Object Qsyntax_table; | |
| 428 | 5673 |
| 771 | 5674 /* Defined in sysdep.c */ |
| 5675 long get_random (void); | |
| 5676 void seed_random (long arg); | |
| 5677 | |
| 5678 /* Defined in text.c */ | |
| 867 | 5679 void find_charsets_in_ibyte_string (unsigned char *charsets, |
| 5680 const Ibyte *str, | |
| 771 | 5681 Bytecount len); |
| 867 | 5682 void find_charsets_in_ichar_string (unsigned char *charsets, |
| 5683 const Ichar *str, | |
| 771 | 5684 Charcount len); |
| 867 | 5685 int ibyte_string_displayed_columns (const Ibyte *str, Bytecount len); |
| 5686 int ichar_string_displayed_columns (const Ichar *str, Charcount len); | |
| 5687 Charcount ibyte_string_nonascii_chars (const Ibyte *str, Bytecount len); | |
| 5688 void convert_ibyte_string_into_ichar_dynarr (const Ibyte *str, | |
| 771 | 5689 Bytecount len, |
| 867 | 5690 Ichar_dynarr *dyn); |
| 5691 Charcount convert_ibyte_string_into_ichar_string (const Ibyte *str, | |
| 771 | 5692 Bytecount len, |
| 867 | 5693 Ichar *arr); |
| 5694 void convert_ichar_string_into_ibyte_dynarr (Ichar *arr, int nels, | |
| 5695 Ibyte_dynarr *dyn); | |
| 5696 Ibyte *convert_ichar_string_into_malloced_string (Ichar *arr, int nels, | |
| 771 | 5697 Bytecount *len_out); |
| 867 | 5698 Bytecount copy_text_between_formats (const Ibyte *src, Bytecount srclen, |
| 826 | 5699 Internal_Format srcfmt, |
| 5700 Lisp_Object srcobj, | |
| 867 | 5701 Ibyte *dst, Bytecount dstlen, |
| 826 | 5702 Internal_Format dstfmt, |
| 5703 Lisp_Object dstobj, | |
| 5704 Bytecount *src_used); | |
| 5705 Bytecount copy_buffer_text_out (struct buffer *buf, Bytebpos pos, | |
| 867 | 5706 Bytecount len, Ibyte *dst, Bytecount dstlen, |
| 826 | 5707 Internal_Format dstfmt, Lisp_Object dstobj, |
| 5708 Bytecount *src_used); | |
| 771 | 5709 |
| 5710 /* flags for get_buffer_pos_char(), get_buffer_range_char(), etc. */ | |
| 5711 /* At most one of GB_COERCE_RANGE and GB_NO_ERROR_IF_BAD should be | |
| 5712 specified. At most one of GB_NEGATIVE_FROM_END and GB_NO_ERROR_IF_BAD | |
| 5713 should be specified. */ | |
| 5714 | |
| 5715 #define GB_ALLOW_PAST_ACCESSIBLE (1 << 0) | |
| 5716 #define GB_ALLOW_NIL (1 << 1) | |
| 5717 #define GB_CHECK_ORDER (1 << 2) | |
| 5718 #define GB_COERCE_RANGE (1 << 3) | |
| 5719 #define GB_NO_ERROR_IF_BAD (1 << 4) | |
| 5720 #define GB_NEGATIVE_FROM_END (1 << 5) | |
| 5721 #define GB_HISTORICAL_STRING_BEHAVIOR (GB_NEGATIVE_FROM_END | GB_ALLOW_NIL) | |
| 5722 | |
| 5723 Charbpos get_buffer_pos_char (struct buffer *b, Lisp_Object pos, | |
| 5724 unsigned int flags); | |
| 5725 Bytebpos get_buffer_pos_byte (struct buffer *b, Lisp_Object pos, | |
| 5726 unsigned int flags); | |
| 5727 void get_buffer_range_char (struct buffer *b, Lisp_Object from, Lisp_Object to, | |
| 5728 Charbpos *from_out, Charbpos *to_out, | |
| 5729 unsigned int flags); | |
| 5730 void get_buffer_range_byte (struct buffer *b, Lisp_Object from, Lisp_Object to, | |
| 5731 Bytebpos *from_out, Bytebpos *to_out, | |
| 5732 unsigned int flags); | |
| 5733 Charcount get_string_pos_char (Lisp_Object string, Lisp_Object pos, | |
| 5734 unsigned int flags); | |
| 5735 Bytecount get_string_pos_byte (Lisp_Object string, Lisp_Object pos, | |
| 5736 unsigned int flags); | |
| 5737 void get_string_range_char (Lisp_Object string, Lisp_Object from, | |
| 5738 Lisp_Object to, Charcount *from_out, | |
| 5739 Charcount *to_out, unsigned int flags); | |
| 5740 void get_string_range_byte (Lisp_Object string, Lisp_Object from, | |
| 5741 Lisp_Object to, Bytecount *from_out, | |
| 5742 Bytecount *to_out, unsigned int flags); | |
| 826 | 5743 Charxpos get_buffer_or_string_pos_char (Lisp_Object object, Lisp_Object pos, |
| 5744 unsigned int flags); | |
| 5745 Bytexpos get_buffer_or_string_pos_byte (Lisp_Object object, Lisp_Object pos, | |
| 5746 unsigned int flags); | |
| 771 | 5747 void get_buffer_or_string_range_char (Lisp_Object object, Lisp_Object from, |
| 826 | 5748 Lisp_Object to, Charxpos *from_out, |
| 5749 Charxpos *to_out, unsigned int flags); | |
| 771 | 5750 void get_buffer_or_string_range_byte (Lisp_Object object, Lisp_Object from, |
| 826 | 5751 Lisp_Object to, Bytexpos *from_out, |
| 5752 Bytexpos *to_out, unsigned int flags); | |
| 5753 Charxpos buffer_or_string_accessible_begin_char (Lisp_Object object); | |
| 5754 Charxpos buffer_or_string_accessible_end_char (Lisp_Object object); | |
| 5755 Bytexpos buffer_or_string_accessible_begin_byte (Lisp_Object object); | |
| 5756 Bytexpos buffer_or_string_accessible_end_byte (Lisp_Object object); | |
| 5757 Charxpos buffer_or_string_absolute_begin_char (Lisp_Object object); | |
| 5758 Charxpos buffer_or_string_absolute_end_char (Lisp_Object object); | |
| 5759 Bytexpos buffer_or_string_absolute_begin_byte (Lisp_Object object); | |
| 5760 Bytexpos buffer_or_string_absolute_end_byte (Lisp_Object object); | |
| 5761 Charbpos charbpos_clip_to_bounds (Charbpos lower, Charbpos num, | |
| 5762 Charbpos upper); | |
| 5763 Bytebpos bytebpos_clip_to_bounds (Bytebpos lower, Bytebpos num, | |
| 5764 Bytebpos upper); | |
| 5765 Charxpos charxpos_clip_to_bounds (Charxpos lower, Charxpos num, | |
| 5766 Charxpos upper); | |
| 5767 Bytexpos bytexpos_clip_to_bounds (Bytexpos lower, Bytexpos num, | |
| 5768 Bytexpos upper); | |
| 5769 Charxpos buffer_or_string_clip_to_accessible_char (Lisp_Object object, | |
| 5770 Charxpos pos); | |
| 5771 Bytexpos buffer_or_string_clip_to_accessible_byte (Lisp_Object object, | |
| 5772 Bytexpos pos); | |
| 5773 Charxpos buffer_or_string_clip_to_absolute_char (Lisp_Object object, | |
| 5774 Charxpos pos); | |
| 5775 Bytexpos buffer_or_string_clip_to_absolute_byte (Lisp_Object object, | |
| 5776 Bytexpos pos); | |
| 5777 | |
| 771 | 5778 |
| 5779 #ifdef ENABLE_COMPOSITE_CHARS | |
| 5780 | |
| 867 | 5781 Ichar lookup_composite_char (Ibyte *str, int len); |
| 5782 Lisp_Object composite_char_string (Ichar ch); | |
| 771 | 5783 #endif /* ENABLE_COMPOSITE_CHARS */ |
| 5784 | |
| 5785 EXFUN (Ffind_charset, 1); | |
| 5786 EXFUN (Fget_charset, 1); | |
| 5787 EXFUN (Fcharset_list, 0); | |
| 5788 | |
| 5789 extern Lisp_Object Vcharset_ascii; | |
| 5790 extern Lisp_Object Vcharset_control_1; | |
| 5791 extern Lisp_Object Vcharset_latin_iso8859_1; | |
| 5792 extern Lisp_Object Vcharset_latin_iso8859_2; | |
| 5793 extern Lisp_Object Vcharset_latin_iso8859_3; | |
| 5794 extern Lisp_Object Vcharset_latin_iso8859_4; | |
| 5795 extern Lisp_Object Vcharset_thai_tis620; | |
| 5796 extern Lisp_Object Vcharset_greek_iso8859_7; | |
|
4805
980575c76541
Move the arabic-iso8859-6 character set back to C, otherwise X11 lookup fails.
Aidan Kehoe <kehoea@parhasard.net>
parents:
4744
diff
changeset
|
5797 extern Lisp_Object Vcharset_arabic_iso8859_6; |
| 771 | 5798 extern Lisp_Object Vcharset_hebrew_iso8859_8; |
| 5799 extern Lisp_Object Vcharset_katakana_jisx0201; | |
| 5800 extern Lisp_Object Vcharset_latin_jisx0201; | |
| 5801 extern Lisp_Object Vcharset_cyrillic_iso8859_5; | |
| 5802 extern Lisp_Object Vcharset_latin_iso8859_9; | |
| 3094 | 5803 extern Lisp_Object Vcharset_latin_iso8859_15; |
| 771 | 5804 extern Lisp_Object Vcharset_japanese_jisx0208_1978; |
| 5805 extern Lisp_Object Vcharset_chinese_gb2312; | |
| 5806 extern Lisp_Object Vcharset_japanese_jisx0208; | |
| 5807 extern Lisp_Object Vcharset_korean_ksc5601; | |
| 5808 extern Lisp_Object Vcharset_japanese_jisx0212; | |
| 5809 extern Lisp_Object Vcharset_chinese_cns11643_1; | |
| 5810 extern Lisp_Object Vcharset_chinese_cns11643_2; | |
| 5811 extern Lisp_Object Vcharset_chinese_big5_1; | |
| 5812 extern Lisp_Object Vcharset_chinese_big5_2; | |
| 5813 extern Lisp_Object Vcharset_composite; | |
| 5814 | |
| 867 | 5815 Ichar Lstream_get_ichar_1 (Lstream *stream, int first_char); |
| 5816 int Lstream_fput_ichar (Lstream *stream, Ichar ch); | |
| 5817 void Lstream_funget_ichar (Lstream *stream, Ichar ch); | |
| 5818 | |
| 5819 DECLARE_INLINE_HEADER (Ibyte *qxestrdup (const Ibyte *s)) | |
| 771 | 5820 { |
| 2367 | 5821 return (Ibyte *) xstrdup ((const Chbyte *) s); |
| 771 | 5822 } |
| 5823 | |
| 867 | 5824 DECLARE_INLINE_HEADER (Bytecount qxestrlen (const Ibyte *s)) |
| 771 | 5825 { |
| 2367 | 5826 return strlen ((const Chbyte *) s); |
| 771 | 5827 } |
| 5828 | |
| 867 | 5829 DECLARE_INLINE_HEADER (Charcount qxestrcharlen (const Ibyte *s)) |
| 771 | 5830 { |
| 5831 return bytecount_to_charcount (s, qxestrlen (s)); | |
| 5832 } | |
| 5833 | |
| 867 | 5834 DECLARE_INLINE_HEADER (int qxestrcmp (const Ibyte *s1, |
| 5835 const Ibyte *s2)) | |
| 771 | 5836 { |
| 2367 | 5837 return strcmp ((const Chbyte *) s1, (const Chbyte *) s2); |
| 771 | 5838 } |
| 5839 | |
| 2367 | 5840 DECLARE_INLINE_HEADER (int qxestrcmp_ascii (const Ibyte *s1, |
| 5841 const Ascbyte *s2)) | |
| 771 | 5842 { |
| 2367 | 5843 return strcmp ((const Chbyte *) s1, s2); |
| 771 | 5844 } |
| 5845 | |
| 867 | 5846 DECLARE_INLINE_HEADER (int qxestrncmp (const Ibyte *string1, |
| 5847 const Ibyte *string2, | |
| 771 | 5848 Bytecount count)) |
| 5849 { | |
| 2367 | 5850 return strncmp ((const Chbyte *) string1, (const Chbyte *) string2, |
| 771 | 5851 (size_t) count); |
| 5852 } | |
| 5853 | |
| 2367 | 5854 DECLARE_INLINE_HEADER (int qxestrncmp_ascii (const Ibyte *string1, |
| 5855 const Ascbyte *string2, | |
| 5856 Bytecount count)) | |
| 771 | 5857 { |
| 2367 | 5858 return strncmp ((const Chbyte *) string1, string2, (size_t) count); |
| 771 | 5859 } |
| 5860 | |
| 867 | 5861 DECLARE_INLINE_HEADER (Ibyte *qxestrcpy (Ibyte *strDest, |
| 2367 | 5862 const Ibyte *strSource)) |
| 771 | 5863 { |
| 2367 | 5864 return (Ibyte *) strcpy ((Chbyte *) strDest, (const Chbyte *) strSource); |
| 771 | 5865 } |
| 5866 | |
| 2367 | 5867 DECLARE_INLINE_HEADER (Ibyte *qxestrcpy_ascii (Ibyte *strDest, |
| 5868 const Ascbyte *strSource)) | |
| 771 | 5869 { |
| 2367 | 5870 return (Ibyte *) strcpy ((Chbyte *) strDest, strSource); |
| 771 | 5871 } |
| 5872 | |
| 867 | 5873 DECLARE_INLINE_HEADER (Ibyte *qxestrncpy (Ibyte *strDest, |
| 2367 | 5874 const Ibyte *strSource, |
| 5875 Bytecount count)) | |
| 771 | 5876 { |
| 2367 | 5877 return (Ibyte *) strncpy ((Chbyte *) strDest, (const Chbyte *) strSource, |
| 771 | 5878 (size_t) count); |
| 5879 } | |
| 5880 | |
| 2367 | 5881 DECLARE_INLINE_HEADER (Ibyte *qxestrncpy_ascii (Ibyte *strDest, |
| 5882 const Ascbyte *strSource, | |
| 5883 Bytecount count)) | |
| 771 | 5884 { |
| 2367 | 5885 return (Ibyte *) strncpy ((Chbyte *) strDest, strSource, (size_t) count); |
| 771 | 5886 } |
| 5887 | |
| 867 | 5888 DECLARE_INLINE_HEADER (Ibyte *qxestrcat (Ibyte *strDest, |
| 2367 | 5889 const Ibyte *strSource)) |
| 771 | 5890 { |
| 2367 | 5891 return (Ibyte *) strcat ((Chbyte *) strDest, (const Chbyte *) strSource); |
| 771 | 5892 } |
| 5893 | |
| 2367 | 5894 DECLARE_INLINE_HEADER (Ibyte *qxestrcat_ascii (Ibyte *strDest, |
| 5895 const Ascbyte *strSource)) | |
| 771 | 5896 { |
| 2367 | 5897 return (Ibyte *) strcat ((Chbyte *) strDest, strSource); |
| 771 | 5898 } |
| 5899 | |
| 867 | 5900 DECLARE_INLINE_HEADER (Ibyte *qxestrncat (Ibyte *strDest, |
| 2367 | 5901 const Ibyte *strSource, |
| 5902 Bytecount count)) | |
| 771 | 5903 { |
| 2367 | 5904 return (Ibyte *) strncat ((Chbyte *) strDest, (const Chbyte *) strSource, |
| 771 | 5905 (size_t) count); |
| 5906 } | |
| 5907 | |
| 2367 | 5908 DECLARE_INLINE_HEADER (Ibyte *qxestrncat_ascii (Ibyte *strDest, |
| 5909 const Ascbyte *strSource, | |
| 5910 Bytecount count)) | |
| 771 | 5911 { |
| 2367 | 5912 return (Ibyte *) strncat ((Chbyte *) strDest, strSource, (size_t) count); |
| 771 | 5913 } |
| 5914 | |
| 867 | 5915 DECLARE_INLINE_HEADER (Ibyte *qxestrchr (const Ibyte *s, Ichar c)) |
| 771 | 5916 { |
| 5917 assert (c >= 0 && c <= 255); | |
| 2367 | 5918 return (Ibyte *) strchr ((const Chbyte *) s, c); |
| 771 | 5919 } |
| 5920 | |
| 867 | 5921 DECLARE_INLINE_HEADER (Ibyte *qxestrrchr (const Ibyte *s, Ichar c)) |
| 771 | 5922 { |
| 5923 assert (c >= 0 && c <= 255); | |
| 2367 | 5924 return (Ibyte *) strrchr ((const Chbyte *) s, c); |
| 771 | 5925 } |
| 5926 | |
| 867 | 5927 DECLARE_INLINE_HEADER (Ibyte *qxestrstr (const Ibyte *string1, |
| 2367 | 5928 const Ibyte *string2)) |
| 771 | 5929 { |
| 2367 | 5930 return (Ibyte *) strstr ((const Chbyte *) string1, (const Chbyte *) string2); |
| 771 | 5931 } |
| 5932 | |
| 867 | 5933 DECLARE_INLINE_HEADER (Bytecount qxestrcspn (const Ibyte *string, |
| 5934 const CIbyte *strCharSet)) | |
| 771 | 5935 { |
| 2367 | 5936 return (Bytecount) strcspn ((const Chbyte *) string, strCharSet); |
| 771 | 5937 } |
| 5938 | |
| 867 | 5939 DECLARE_INLINE_HEADER (Bytecount qxestrspn (const Ibyte *string, |
| 5940 const CIbyte *strCharSet)) | |
| 771 | 5941 { |
| 2367 | 5942 return (Bytecount) strspn ((const Chbyte *) string, strCharSet); |
| 771 | 5943 } |
| 5944 | |
| 867 | 5945 DECLARE_INLINE_HEADER (Ibyte *qxestrpbrk (const Ibyte *string, |
| 2367 | 5946 const CIbyte *strCharSet)) |
| 771 | 5947 { |
| 2367 | 5948 return (Ibyte *) strpbrk ((const Chbyte *) string, strCharSet); |
| 771 | 5949 } |
| 5950 | |
| 867 | 5951 DECLARE_INLINE_HEADER (Ibyte *qxestrtok (Ibyte *strToken, |
| 2367 | 5952 const CIbyte *strDelimit)) |
| 771 | 5953 { |
| 2367 | 5954 return (Ibyte *) strtok ((Chbyte *) strToken, strDelimit); |
| 771 | 5955 } |
| 5956 | |
| 867 | 5957 DECLARE_INLINE_HEADER (double qxestrtod (const Ibyte *nptr, |
| 5958 Ibyte **endptr)) | |
| 771 | 5959 { |
| 2367 | 5960 return strtod ((const Chbyte *) nptr, (Chbyte **) endptr); |
| 771 | 5961 } |
| 5962 | |
| 867 | 5963 DECLARE_INLINE_HEADER (long qxestrtol (const Ibyte *nptr, Ibyte **endptr, |
| 771 | 5964 int base)) |
| 5965 { | |
| 2367 | 5966 return strtol ((const Chbyte *) nptr, (Chbyte **) endptr, base); |
| 771 | 5967 } |
| 5968 | |
| 867 | 5969 DECLARE_INLINE_HEADER (unsigned long qxestrtoul (const Ibyte *nptr, |
| 5970 Ibyte **endptr, | |
| 771 | 5971 int base)) |
| 5972 { | |
| 2367 | 5973 return strtoul ((const Chbyte *) nptr, (Chbyte **) endptr, base); |
| 771 | 5974 } |
| 5975 | |
| 867 | 5976 DECLARE_INLINE_HEADER (int qxeatoi (const Ibyte *string)) |
| 771 | 5977 { |
| 2367 | 5978 return atoi ((const Chbyte *) string); |
| 771 | 5979 } |
| 5980 | |
| 1204 | 5981 DECLARE_INLINE_HEADER (Ibyte *qxestrupr (Ibyte *s)) |
| 5982 { | |
| 2367 | 5983 return (Ibyte *) strupr ((Chbyte *) s); |
| 1204 | 5984 } |
| 5985 | |
| 5986 DECLARE_INLINE_HEADER (Ibyte *qxestrlwr (Ibyte *s)) | |
| 5987 { | |
| 2367 | 5988 return (Ibyte *) strlwr ((Chbyte *) s); |
| 1204 | 5989 } |
| 5990 | |
| 867 | 5991 int qxesprintf (Ibyte *buffer, const CIbyte *format, ...) |
| 771 | 5992 PRINTF_ARGS (2, 3); |
| 5993 | |
| 2367 | 5994 DECLARE_INLINE_HEADER (int qxesscanf_ascii_1 (Ibyte *buffer, |
| 5995 const Ascbyte *format, | |
| 5996 void *ptr)) | |
| 5997 { | |
| 5998 /* #### DAMNIT! No vsscanf! */ | |
| 5999 return sscanf ((Chbyte *) buffer, format, ptr); | |
| 6000 } | |
| 6001 | |
| 771 | 6002 /* Do not use POSIX locale routines. Not Mule-correct. */ |
| 6003 #define qxestrcoll DO NOT USE. | |
| 6004 #define qxestrxfrm DO NOT USE. | |
| 6005 | |
| 867 | 6006 int qxestrcasecmp (const Ibyte *s1, const Ibyte *s2); |
| 2367 | 6007 int qxestrcasecmp_ascii (const Ibyte *s1, const Ascbyte *s2); |
| 867 | 6008 int qxestrcasecmp_i18n (const Ibyte *s1, const Ibyte *s2); |
| 2367 | 6009 int ascii_strcasecmp (const Ascbyte *s1, const Ascbyte *s2); |
|
4906
6ef8256a020a
implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents:
4888
diff
changeset
|
6010 int lisp_strcasecmp_ascii (Lisp_Object s1, Lisp_Object s2); |
| 771 | 6011 int lisp_strcasecmp_i18n (Lisp_Object s1, Lisp_Object s2); |
| 867 | 6012 int qxestrncasecmp (const Ibyte *s1, const Ibyte *s2, Bytecount len); |
| 2367 | 6013 int qxestrncasecmp_ascii (const Ibyte *s1, const Ascbyte *s2, |
| 6014 Bytecount len); | |
| 867 | 6015 int qxestrncasecmp_i18n (const Ibyte *s1, const Ibyte *s2, Bytecount len); |
| 2367 | 6016 int ascii_strncasecmp (const Ascbyte *s1, const Ascbyte *s2, |
| 771 | 6017 Bytecount len); |
| 867 | 6018 int qxememcmp (const Ibyte *s1, const Ibyte *s2, Bytecount len); |
| 6019 int qxememcmp4 (const Ibyte *s1, Bytecount len1, | |
| 6020 const Ibyte *s2, Bytecount len2); | |
| 6021 int qxememcasecmp (const Ibyte *s1, const Ibyte *s2, Bytecount len); | |
| 6022 int qxememcasecmp4 (const Ibyte *s1, Bytecount len1, | |
| 6023 const Ibyte *s2, Bytecount len2); | |
| 6024 int qxetextcmp (const Ibyte *s1, Bytecount len1, | |
| 6025 const Ibyte *s2, Bytecount len2); | |
| 6026 int qxetextcmp_matching (const Ibyte *s1, Bytecount len1, | |
| 6027 const Ibyte *s2, Bytecount len2, | |
| 801 | 6028 Charcount *matching); |
| 867 | 6029 int qxetextcasecmp (const Ibyte *s1, Bytecount len1, |
| 6030 const Ibyte *s2, Bytecount len2); | |
| 6031 int qxetextcasecmp_matching (const Ibyte *s1, Bytecount len1, | |
| 6032 const Ibyte *s2, Bytecount len2, | |
| 801 | 6033 Charcount *matching); |
| 771 | 6034 |
| 6035 void buffer_mule_signal_inserted_region (struct buffer *buf, Charbpos start, | |
| 6036 Bytecount bytelength, | |
| 6037 Charcount charlength); | |
| 6038 void buffer_mule_signal_deleted_region (struct buffer *buf, Charbpos start, | |
| 826 | 6039 Charbpos end, Bytebpos byte_start, |
| 6040 Bytebpos byte_end); | |
| 771 | 6041 |
| 2367 | 6042 typedef struct |
| 6043 { | |
| 6044 const char *srctext; | |
| 6045 void *dst; | |
| 6046 Bytecount dst_size; | |
| 6047 } alloca_convert_vals; | |
| 6048 | |
| 6049 typedef struct | |
| 6050 { | |
| 6051 Dynarr_declare (alloca_convert_vals); | |
| 6052 } alloca_convert_vals_dynarr; | |
| 6053 | |
| 6054 extern alloca_convert_vals_dynarr *active_alloca_convert; | |
| 6055 | |
| 6056 MODULE_API int find_pos_of_existing_active_alloca_convert (const char * | |
| 6057 srctext); | |
| 6058 | |
| 771 | 6059 /* Defined in unicode.c */ |
| 1204 | 6060 extern const struct sized_memory_description to_unicode_description; |
| 6061 extern const struct sized_memory_description from_unicode_description; | |
| 771 | 6062 void init_charset_unicode_tables (Lisp_Object charset); |
| 6063 void free_charset_unicode_tables (Lisp_Object charset); | |
| 6064 void recalculate_unicode_precedence (void); | |
| 6065 extern Lisp_Object Qunicode; | |
| 4096 | 6066 extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7, Qutf_32; |
| 771 | 6067 #ifdef MEMORY_USAGE_STATS |
| 6068 Bytecount compute_from_unicode_table_size (Lisp_Object charset, | |
| 6069 struct overhead_stats *stats); | |
| 6070 Bytecount compute_to_unicode_table_size (Lisp_Object charset, | |
| 6071 struct overhead_stats *stats); | |
| 6072 #endif /* MEMORY_USAGE_STATS */ | |
| 6073 | |
| 428 | 6074 /* Defined in undo.c */ |
| 826 | 6075 EXFUN (Fundo_boundary, 0); |
| 6076 | |
| 428 | 6077 Lisp_Object truncate_undo_list (Lisp_Object, int, int); |
| 6078 void record_extent (Lisp_Object, int); | |
| 665 | 6079 void record_insert (struct buffer *, Charbpos, Charcount); |
| 6080 void record_delete (struct buffer *, Charbpos, Charcount); | |
| 6081 void record_change (struct buffer *, Charbpos, Charcount); | |
| 428 | 6082 |
| 6083 /* Defined in unex*.c */ | |
| 814 | 6084 #ifdef WIN32_NATIVE |
| 867 | 6085 int unexec (Ibyte *, Ibyte *, uintptr_t, uintptr_t, uintptr_t); |
| 814 | 6086 #else |
| 6087 int unexec (Extbyte *, Extbyte *, uintptr_t, uintptr_t, uintptr_t); | |
| 6088 #endif | |
| 428 | 6089 #ifdef RUN_TIME_REMAP |
| 6090 int run_time_remap (char *); | |
| 6091 #endif | |
| 6092 | |
| 6093 /* Defined in vm-limit.c */ | |
| 442 | 6094 void memory_warnings (void *, void (*) (const char *)); |
| 428 | 6095 |
| 442 | 6096 /*--------------- prototypes for constant symbols ------------*/ |
| 6097 | |
| 826 | 6098 /* #### We should get rid of this and put the prototypes back up there in |
| 6099 #### the per-file stuff, where they belong. */ | |
| 6100 | |
| 771 | 6101 /* Use the following when you have to add a bunch of symbols. */ |
| 6102 | |
| 6103 /* | |
| 6104 | |
| 6105 (defun redo-symbols (beg end) | |
| 6106 "Snarf any symbols out of the region and print them into a temporary buffer, | |
| 6107 which is displayed when the function finishes. The symbols are laid out with | |
| 6108 `extern Lisp_Object ' before each one, with as many as can fit on one line | |
| 6109 \(the maximum line width is controlled by the constant `max-line-length' in the | |
| 6110 code)." | |
| 6111 (interactive "r") | |
| 6112 (save-excursion | |
| 6113 (goto-char beg) | |
| 6114 (let (syms) | |
| 6115 (while (re-search-forward "\\s-\\(Q[A-Za-z_0-9]+\\)" end t) | |
| 6116 (push (match-string 1) syms)) | |
| 6117 (setq syms (sort syms #'string-lessp)) | |
| 6118 (with-output-to-temp-buffer "*Symbols*" | |
| 6119 (let* ((col 0) | |
| 6120 (start "extern Lisp_Object ") | |
| 6121 (startlen (length start)) | |
| 6122 ;; with a default-width frame of 80 chars, you can only fit | |
| 6123 ;; 79 before wrapping. you can see this to a lower value if | |
| 6124 ;; you don't want it right up against the right margin. | |
| 6125 (max-line-length 79)) | |
| 6126 (dolist (sym syms) | |
| 6127 (cond (;; if something already on line (this will always be the | |
| 6128 ;; case except the very first iteration), see what | |
| 6129 ;; space we've got. (need to take into account 2 | |
| 6130 ;; for the comma+space, 1 for the semicolon at the | |
| 6131 ;; end.) if enough space, do it. | |
| 6132 (and (> col 0) (< (+ col (length sym) 2) | |
| 6133 (1- max-line-length))) | |
| 6134 (princ ", ") | |
| 6135 (princ sym) | |
| 6136 (incf col 2) | |
| 6137 (incf col (length sym))) | |
| 6138 (t | |
| 6139 ;; either we're first iteration or we ran out of space. | |
| 6140 ;; if the latter, terminate the previous line. this | |
| 6141 ;; loop is written on purpose so that it always prints | |
| 6142 ;; at least one item, even if that would go over. | |
| 6143 (when (> col 0) | |
| 6144 (princ ";\n") | |
| 6145 (setq col 0)) | |
| 6146 (princ start) | |
| 6147 (incf col startlen) | |
| 6148 (princ sym) | |
| 6149 (incf col (length sym))))) | |
| 6150 ;; finally terminate the last line. | |
| 6151 (princ ";\n")))))) | |
| 6152 | |
| 6153 */ | |
| 6154 | |
| 4932 | 6155 extern Lisp_Object Qactivate_menubar_hook, Qand_optional, Qand_rest, Qautoload, |
| 6156 Qbackground, Qbackground_pixmap, Qblinking, Qbuffer_glyph_p, Qbuffer_live_p, | |
| 6157 Qcall_interactively, Qcategory_designator_p, | |
| 6158 Qcategory_table_value_p, Qcdr, Qcolor_pixmap_image_instance_p, Qcommandp, | |
| 6159 Qcompletion_ignore_case, Qconsole_live_p, Qconst_specifier, Qcurrent_menubar, | |
| 6160 Qdefun, Qdevice_live_p, Qdim, Qdirection, Qdisabled, Qdisabled_command_hook, | |
| 6161 Qdisplay_table, Qdll_error, Qend_open, Qerror_lacks_explanatory_string, | |
| 6162 Qevent_live_p, Qexit, Qextent_live_p, Qexternal_debugging_output, Qfeaturep, | |
| 6163 Qfile_error, Qfile_name_sans_extension, Qfinal, Qforeground, Qformat, | |
| 6164 Qframe_live_p, Qgraphic, Qgui_error, Qicon_glyph_p, Qidentity, Qinhibit_quit, | |
| 6165 Qinhibit_read_only, Qinteractive, Qlayout, Qload, Qlong_name, Qmacro, | |
| 6166 Qmakunbound, Qmark, Qmodule, Qmono_pixmap_image_instance_p, | |
| 6167 Qmouse_leave_buffer_hook, Qnative_layout, Qnetwork_error, | |
| 6168 Qnothing_image_instance_p, Qpoint, Qpointer_glyph_p, | |
| 6169 Qpointer_image_instance_p, Qprint_length, Qprint_string_length, Qprogn, | |
| 6170 Qread_char, Qread_from_minibuffer, Qreally_early_error_handler, | |
| 6171 Qregion_beginning, Qregion_end, Qregistries, Qreverse_direction_charset, | |
| 6172 Qrun_hooks, Qsans_modifiers, Qsave_buffers_kill_emacs, Qself_insert_command, | |
| 6173 Qself_insert_defer_undo, Qsequencep, Qset, Qshort_name, Qsound_error, | |
| 6174 Qstandard_input, Qstandard_output, Qstart_open, Qstring_lessp, Qsubwindow, | |
| 6175 Qsubwindow_image_instance_p, Qtext_image_instance_p, Qtop_level, Qunderline, | |
| 6176 Quser_files_and_directories, Qvalues, Qvariable_documentation, | |
| 6177 Qvariable_domain, Qwindow_live_p, Qyes_or_no_p; | |
| 6178 | |
| 6179 extern MODULE_API Lisp_Object Qprocess_error, Qt, Qunbound; | |
| 1632 | 6180 |
| 442 | 6181 #define SYMBOL(fou) extern Lisp_Object fou |
| 1632 | 6182 #define SYMBOL_MODULE_API(fou) extern MODULE_API Lisp_Object fou |
| 442 | 6183 #define SYMBOL_KEYWORD(la_cle_est_fou) extern Lisp_Object la_cle_est_fou |
| 6184 #define SYMBOL_GENERAL(tout_le_monde, est_fou) \ | |
| 6185 extern Lisp_Object tout_le_monde | |
| 6186 | |
| 6187 #include "general-slots.h" | |
| 6188 | |
| 6189 #undef SYMBOL | |
| 1632 | 6190 #undef SYMBOL_MODULE_API |
| 442 | 6191 #undef SYMBOL_KEYWORD |
| 6192 #undef SYMBOL_GENERAL | |
| 6193 | |
| 6194 /*--------------- prototypes for variables of type Lisp_Object ------------*/ | |
| 6195 | |
| 826 | 6196 /* #### We should get rid of this and put the prototypes back up there in |
| 6197 #### the per-file stuff, where they belong. */ | |
| 6198 | |
| 446 | 6199 extern Lisp_Object Vactivate_menubar_hook; |
| 6200 extern Lisp_Object Vautoload_queue, Vblank_menubar; | |
| 771 | 6201 extern Lisp_Object Vcommand_history; |
| 428 | 6202 extern Lisp_Object Vcommand_line_args, Vconfigure_info_directory; |
| 6203 extern Lisp_Object Vconfigure_site_directory, Vconfigure_site_module_directory; | |
| 6204 extern Lisp_Object Vconsole_list, Vcontrolling_terminal; | |
|
4921
17362f371cc2
add more byte-code assertions and better failure output
Ben Wing <ben@xemacs.org>
parents:
4914
diff
changeset
|
6205 extern Lisp_Object Vcurrent_load_list; |
| 428 | 6206 extern Lisp_Object Vcurrent_mouse_event, Vcurrent_prefix_arg, Vdata_directory; |
| 434 | 6207 extern Lisp_Object Vdirectory_sep_char, Vdisabled_command_hook; |
| 6208 extern Lisp_Object Vdoc_directory, Vinternal_doc_file_name; | |
| 428 | 6209 extern Lisp_Object Vecho_area_buffer, Vemacs_major_version; |
| 6210 extern Lisp_Object Vemacs_minor_version, Vexec_directory, Vexec_path; | |
| 6211 extern Lisp_Object Vexecuting_macro, Vfeatures, Vfile_domain; | |
| 1927 | 6212 extern Lisp_Object Vinvocation_directory, Vinvocation_name; |
| 771 | 6213 extern Lisp_Object Vlast_command, Vlast_command_char; |
| 428 | 6214 extern Lisp_Object Vlast_command_event, Vlast_input_event; |
| 2548 | 6215 extern Lisp_Object Vload_file_name_internal, Vload_history; |
| 428 | 6216 extern Lisp_Object Vload_path, Vmark_even_if_inactive, Vmenubar_configuration; |
| 6217 extern Lisp_Object Vminibuf_preprompt, Vminibuf_prompt, Vminibuffer_zero; | |
| 6218 extern Lisp_Object Vmodule_directory, Vmswindows_downcase_file_names; | |
| 6219 extern Lisp_Object Vmswindows_get_true_file_attributes, Vobarray; | |
| 6220 extern Lisp_Object Vprint_length, Vprint_level, Vprocess_environment; | |
| 6221 extern Lisp_Object Vrecent_keys_ring, Vshell_file_name, Vsite_directory; | |
| 6222 extern Lisp_Object Vsite_module_directory; | |
| 6223 extern Lisp_Object Vstandard_input, Vstandard_output, Vstdio_str; | |
| 771 | 6224 extern Lisp_Object Vsynchronous_sounds, Vsystem_name; |
| 428 | 6225 extern Lisp_Object Vthis_command_keys, Vunread_command_event; |
| 6226 extern Lisp_Object Vx_initial_argv_list; | |
| 6227 | |
| 1927 | 6228 extern MODULE_API Lisp_Object Vinhibit_quit, Vquit_flag; |
| 6229 | |
| 1743 | 6230 END_C_DECLS |
| 1650 | 6231 |
| 440 | 6232 #endif /* INCLUDED_lisp_h_ */ |
