2 * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interr.c,v 1.10 2009/06/11 16:04:01 rtoy Rel $
4 * Stuff to handle internal errors.
16 #include "internals.h"
22 /* Lossage handler. */
25 default_lossage_handler(void)
30 static void (*lossage_handler) (void) = default_lossage_handler;
33 set_lossage_handler(void handler(void))
35 lossage_handler = handler;
45 vfprintf(stderr, fmt, ap);
53 /* Internal error handler for when the Lisp error system doesn't exist. */
55 static char *errors[] = ERRORS;
58 internal_error(os_context_t * context)
60 unsigned char *ptr = arch_internal_error_arguments(context);
61 int len, scoffset, sc, offset, ch;
64 printf("Error: %s\n", errors[*ptr++]);
69 if (scoffset == 253) {
72 } else if (scoffset == 254) {
73 scoffset = ptr[0] + ptr[1] * 256;
76 } else if (scoffset == 255) {
77 scoffset = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24);
82 offset = scoffset >> 5;
84 printf(" SC: %d, Offset: %d", sc, offset);
87 case sc_DescriptorReg:
89 brief_print(SC_REG(context, offset));
93 ch = SC_REG(context, offset);
113 if (ch < 32 || ch > 127)
114 printf("\\%03o", ch);
116 printf("\t'%c'\n", ch);
121 #ifdef sc_WordPointerReg
122 case sc_WordPointerReg:
124 printf("\t0x%08lx\n", SC_REG(context, offset));
127 printf("\t%ld\n", SC_REG(context, offset));
130 printf("\t%lu\n", SC_REG(context, offset));
135 printf("\t%g\n", *(float *) &context->sc_fpregs[offset]);
140 printf("\t%g\n", *(double *) &context->sc_fpregs[offset]);
145 printf("\t%Lg\n", *(long double *) &context->sc_fpregs[offset]);
161 /* Utility routines used by random pieces of code. */
165 /* The Unicode replacement character code */
166 #define REPLACEMENT_CODE 0xfffd
169 * Convert a unicode code point to a set of utf8-encoded octets to
170 * standard output. This is the algorithm used by the Lisp utf8
171 * encoder in src/code/extfmts.lisp.
174 utf8(int code, int len)
179 int init = 0xff & (0x7e << j);
183 * (ldb (byte j p) code): Extract j bits from position p of the code
185 c = (code >> p) & ((1 << j) - 1);
189 for (k = 0; k < len; ++k) {
191 /* (ldb (byte 6 p) code) */
192 c = (code >> p) & ((1 << 6) - 1);
198 * Test if code is a surrogate. Returns true if so. If the code is a
199 * surrogate, then type indicates if it is a high (0) or low (1)
200 * surrogate. If not a surrogate, type is not modified. If type is
201 * NULL, then no type is returned.
204 surrogatep(int code, int *type)
208 if ((code >> 11) == 0x1b) {
211 *type = (code >> 10) & 1;
221 * Convert one or two utf16 code units into a code point. utf16
222 * points to the string, len is the length of the string. The
223 * codepoint is returned and the number of code units consumed is
224 * returned in consumed.
227 utf16_codepoint(unsigned short int* utf16, int len, int* consumed)
229 int codepoint = REPLACEMENT_CODE;
230 int code_unit = *utf16;
235 * If the current code unit is not a surrogate, we're done.
236 * Otherwise process the surrogate. If this is a high (leading)
237 * surrogate and the next code unit is a low (trailing) surrogate,
238 * compute the code point. Otherwise we have a bare surrogate or
239 * an invalid surrogate sequence, so just return the replacement
243 if (surrogatep(code_unit, &code_type)) {
244 if (code_type == 0 && len > 0) {
245 int next_unit = utf16[1];
247 if (surrogatep(next_unit, &next_type)) {
248 if (next_type == 1) {
249 /* High followed by low surrogate */
250 codepoint = ((code_unit - 0xd800) << 10) + next_unit + 0x2400;
256 codepoint = code_unit;
264 * Send the utf-16 Lisp unicode string to standard output as a
265 * utf8-encoded sequence of octets.
268 utf16_output(unsigned short int* utf16, int len)
272 int code = utf16_codepoint(utf16, len, &consumed);
274 /* Output the codepoint */
277 } else if (code < 0x800) {
279 } else if (code < 0x10000) {
281 } else if (code < 0x110000) {
285 * This shouldn't happen, but if it does we don't want to
286 * signal any kind of error so just output a question mark
287 * so we can continue.
299 * debug_print is used by %primitive print to output a string.
302 debug_print(lispobj object)
306 printf("%s\n", (char *) (((struct vector *) PTR(object))->data));
309 if (Pointerp(object)) {
310 struct vector *lisp_string = (struct vector*) PTR(object);
312 if ((unsigned long) lisp_string->header == type_SimpleString) {
313 unsigned short int* lisp_chars;
316 len = lisp_string->length >> 2;
317 lisp_chars = (unsigned short int*) lisp_string->data;
319 utf16_output(lisp_chars, len);
328 * We shouldn't actually ever get here because %primitive
329 * print is only supposed to take strings. But if we do, it's
330 * useful to print something out anyway.
333 printf("obj @0x%lx: ", (unsigned long) object);