Mercurial > hg > xemacs-beta
annotate src/vdb-posix.c @ 5908:6174848f3e6c
Use parse_integer() in read_atom(); support bases with ratios like integers
src/ChangeLog addition:
2015-05-08 Aidan Kehoe <kehoea@parhasard.net>
* data.c (init_errors_once_early):
Move the Qunsupported_type here from numbers.c, so it's available
when the majority of our types are not supported.
* general-slots.h: Add it here, too.
* number.c: Remove the definition of Qunsupported_type from here.
* lread.c (read_atom):
Check if the first character could reflect a rational, if so, call
parse_integer(), don't check the syntax of the other
characters. This allows us to accept the non-ASCII digit
characters too.
If that worked partially, but not completely, and the next char is
a slash, try to parse as a ratio.
If that fails, try isfloat_string(), but only if the first
character could plausibly be part of a float.
Otherwise, treat as a symbol.
* lread.c (read_rational):
Rename from read_integer. Handle ratios with the same radix
specification as was used for integers.
* lread.c (read1):
Rename read_integer in this function. Support the Common Lisp
#NNNrMMM syntax for parsing a number MMM of arbitrary radix NNN.
man/ChangeLog addition:
2015-05-08 Aidan Kehoe <kehoea@parhasard.net>
* lispref/numbers.texi (Numbers):
Describe the newly-supported arbitrary-base syntax for rationals
(integers and ratios). Describe that ratios can take the same base
specification as integers, something also new.
tests/ChangeLog addition:
2015-05-08 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-reader-tests.el:
Check the arbitrary-base integer reader syntax support, just
added. Check the reader base support for ratios, just added.
Check the non-ASCII-digit support in the reader, just added.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 09 May 2015 00:40:57 +0100 |
parents | 308d34e9f07d |
children |
rev | line source |
---|---|
3092 | 1 /* Virtual diry bit implementation for XEmacs. |
2 Copyright (C) 2005 Marcus Crestani. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5091
diff
changeset
|
6 XEmacs is free software: you can redistribute it and/or modify it |
3092 | 7 under the terms of the GNU General Public License as published by the |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5091
diff
changeset
|
8 Free Software Foundation, either version 3 of the License, or (at your |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5091
diff
changeset
|
9 option) any later version. |
3092 | 10 |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5091
diff
changeset
|
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
3092 | 18 |
19 /* Synched up with: Not in FSF. */ | |
20 | |
21 #include <config.h> | |
22 #include "lisp.h" | |
23 #include "gc.h" | |
24 #include "mc-alloc.h" | |
25 #include "vdb.h" | |
26 | |
27 #include <errno.h> | |
28 #include <signal.h> | |
29 #include <sys/mman.h> | |
30 | |
31 #if defined (HAVE_SIGACTION) | |
32 # if defined (HAVE_STRUCT_SIGINFO_SI_ADDR) | |
33 # define FAULT_HANDLER_ARGUMENTS \ | |
34 int signum, struct siginfo *siginfo, void *UNUSED (ctx) | |
35 # define GET_FAULT_ADDRESS siginfo->si_addr | |
36 # elif defined (HAVE_SIGINFO_T_SI_ADDR) | |
37 # define FAULT_HANDLER_ARGUMENTS \ | |
38 int signum, siginfo_t *siginfo, void *UNUSED (ctx) | |
39 # define GET_FAULT_ADDRESS siginfo->si_addr | |
40 # endif | |
41 # define USE_SIGACTION | |
42 # define FAULT_HANDLER_REMOVE_HANDLER | |
43 #elif defined (HAVE_SIGNAL) | |
44 # define FAULT_HANDLER_ARGUMENTS int signum, struct sigcontext sc | |
45 # define GET_FAULT_ADDRESS (void *) sc.cr2 | |
46 # define USE_SIGNAL | |
47 #endif | |
48 | |
49 | |
50 #ifdef USE_SIGACTION | |
51 struct sigaction act, segv_oact, bus_oact; | |
52 #endif /* USE_SIGACTION */ | |
53 | |
54 #ifdef USE_SIGNAL | |
55 sighandler_t segv_oact, bus_oact; | |
56 #endif /* USE_SIGNAL */ | |
57 | |
58 void vdb_remove_signal_handler (void); | |
59 | |
60 void | |
61 vdb_fault_handler (FAULT_HANDLER_ARGUMENTS) | |
62 { | |
63 if (write_barrier_enabled | |
64 && (fault_on_protected_page (GET_FAULT_ADDRESS))) | |
65 { | |
66 vdb_designate_modified (GET_FAULT_ADDRESS); | |
67 unprotect_page_and_mark_dirty (GET_FAULT_ADDRESS); | |
68 #ifdef FAULT_HANDLER_REINSTALL_HANDLER | |
69 vdb_install_signal_handler (); | |
70 #endif /* FAULT_HANDLER_REINSTALL_HANDLER */ | |
71 } | |
72 else /* default sigsegv handler */ | |
73 { | |
5091 | 74 const Ascbyte *signal_name = ""; |
3092 | 75 if (signum == SIGSEGV) |
76 signal_name = "SIGSEGV"; | |
77 else if (signum == SIGBUS) | |
78 signal_name = "SIGBUS"; | |
79 else | |
80 ABORT (); /* something weird happened: wrong signal caught */ | |
3519 | 81 fprintf (stderr, "\n\nFatal Error: Received %s (%d) for address %p\n", |
82 signal_name, signum, (void *) GET_FAULT_ADDRESS); | |
3092 | 83 #ifdef FAULT_HANDLER_CALL_PREVIOUS_HANDLER |
84 if (signum == SIGSEGV) | |
85 segv_oact (signum); | |
86 else if (signum == SIGBUS) | |
87 bus_oact (signum); | |
88 #endif /* FAULT_HANDLER_CALL_PREVIOUS_HANDLER */ | |
89 #ifdef FAULT_HANDLER_REMOVE_HANDLER | |
90 vdb_remove_signal_handler (); | |
91 #endif /* FAULT_HANDLER_REMOVE_HANDLER */ | |
92 } | |
93 } | |
94 | |
95 void | |
96 vdb_remove_signal_handler (void) | |
97 { | |
98 #ifdef USE_SIGACTION | |
99 sigaction(SIGSEGV, &segv_oact, 0); | |
100 sigaction(SIGBUS, &bus_oact, 0); | |
101 #endif /* USE_SIGACTION */ | |
102 #ifdef USE_SIGNAL | |
103 signal (SIGSEGV, segv_oact); | |
104 signal (SIGBUS, bus_oact); | |
105 #endif | |
106 } | |
107 | |
108 void | |
109 vdb_install_signal_handler (void) | |
110 { | |
111 /* See init_signals_very_early () in signal.c. */ | |
112 if (noninteractive && !initialized) | |
113 { | |
114 allow_incremental_gc = 0; | |
115 return; | |
116 } | |
117 | |
118 #ifdef USE_SIGACTION | |
3307 | 119 memset(&act, 0, sizeof(struct sigaction)); |
3092 | 120 act.sa_sigaction = vdb_fault_handler; |
121 sigemptyset (&act.sa_mask); | |
122 act.sa_flags = SA_SIGINFO; | |
123 sigaction (SIGSEGV, &act, &segv_oact); | |
124 sigaction (SIGBUS, &act, &bus_oact); | |
125 allow_incremental_gc = 1; | |
126 #endif /* USE_SIGACTION */ | |
127 #ifdef USE_SIGNAL | |
128 segv_oact = signal (SIGSEGV, (void (*)(int)) vdb_fault_handler); | |
129 bus_oact = signal (SIGBUS, (void (*)(int)) vdb_fault_handler); | |
130 #endif /* USE_SIGNAL */ | |
131 } | |
132 | |
133 void | |
134 vdb_protect (void *ptr, EMACS_INT len) | |
135 { | |
136 if (mprotect (ptr, len, PROT_READ)) | |
137 { | |
138 perror ("Couldn't mprotect"); | |
139 ABORT (); | |
140 } | |
141 } | |
142 | |
143 void | |
144 vdb_unprotect (void *ptr, EMACS_INT len) | |
145 { | |
146 if (mprotect (ptr, len, PROT_READ | PROT_WRITE)) | |
147 { | |
148 perror ("Couldn't mprotect"); | |
149 ABORT (); | |
150 } | |
151 } |