From f7a16467834a363f345c751768127b3199d52c78 Mon Sep 17 00:00:00 2001
From: wlott <wlott>
Date: Thu, 30 Aug 1990 16:39:00 +0000
Subject: [PATCH] Changed the internal error reporting stuff to be able to deal
 with the more complicated internal error format.

---
 ldb/test.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 86 insertions(+), 6 deletions(-)

diff --git a/ldb/test.c b/ldb/test.c
index 3d7b564ea..6bd34a698 100644
--- a/ldb/test.c
+++ b/ldb/test.c
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/test.c,v 1.6 1990/07/01 04:49:00 wlott Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/test.c,v 1.7 1990/08/30 16:39:00 wlott Exp $ */
 /* Extra random routines for testing stuff. */
 
 #include <signal.h>
@@ -25,7 +25,7 @@ struct sigcontext *context;
 {
     int mask;
     unsigned long *ptr, bad_inst;
-    char *cptr;
+    unsigned char *cptr;
 
     printf("Hit with %s, code = %d, context = 0x%x\n", signames[signal], code, context);
 
@@ -48,10 +48,90 @@ struct sigcontext *context;
 
             case trap_Error:
             case trap_Cerror:
-                cptr = (char *)(ptr+1);
-                printf("Error: %s\n", errors[*cptr]);
-                while (*++cptr != 0)
-                    printf("    R%d: 0x%x\n", *cptr, context->sc_regs[*cptr]);
+                cptr = (unsigned char *)(ptr+1);
+                if (*cptr == 0xff) {
+                    int len, scoffset, sc, offset, ch;
+
+                    cptr++;
+                    len = *cptr++;
+                    printf("Error: %s\n", errors[*cptr++]);
+                    len--;
+                    while (len > 0) {
+                        scoffset = *cptr++;
+                        len--;
+                        if (scoffset == 253) {
+                            scoffset = *cptr++;
+                            len--;
+                        }
+                        else if (scoffset == 254) {
+                            scoffset = cptr[0] + cptr[1]*256;
+                            cptr += 2;
+                            len -= 2;
+                        }
+                        else if (scoffset == 255) {
+                            scoffset = cptr[0] + (cptr[1]<<8) +
+                                (cptr[2]<<16) + (cptr[3]<<24);
+                            cptr += 4;
+                            len -= 4;
+                        }
+                        sc = scoffset & 0x1f;
+                        offset = scoffset >> 5;
+
+                        printf("    SC: %d, Offset: %d", sc, offset);
+                        switch (sc) {
+                          case 16: /* Any reg */
+                          case 17: /* Descriptor reg */
+                            putchar('\t');
+                            brief_print(context->sc_regs[offset]);
+                            break;
+                          case 18: /* base char reg */
+                            ch = context->sc_regs[offset];
+                            switch (ch) {
+                              case '\n': printf("\t'\\n'\n"); break;
+                              case '\b': printf("\t'\\b'\n"); break;
+                              case '\t': printf("\t'\\t'\n"); break;
+                              case '\r': printf("\t'\\r'\n"); break;
+                              default:
+                                if (ch < 32 || ch > 127)
+                                    printf("\\%03o", ch);
+                                else
+                                    printf("\t'%c'\n", ch);
+                                break;
+                            }
+                            break;
+                          case 19: /* sap reg */
+                            printf("\t0x%08x\n", context->sc_regs[offset]);
+                            break;
+                          case 20: /* signed reg */
+                            printf("\t%ld\n", context->sc_regs[offset]);
+                            break;
+                          case 21: /* unsigned reg */
+                            printf("\t%lu\n", context->sc_regs[offset]);
+                            break;
+                          case 22: /* non-descr reg */
+                          case 23: /* interior reg */
+                            printf("\t???\n");
+                            break;
+                          case 24: /* single-float reg */
+                            printf("\t%g\n",
+                                   *(float *)&context->sc_fpregs[offset]);
+                            break;
+                          case 25: /* double-float reg */
+                            printf("\t%g\n",
+                                   *(double *)&context->sc_fpregs[offset]);
+                            break;
+                          default:
+                            printf("\t???\n");
+                            break;
+                        }
+                    }
+                }
+                else {
+                    printf("Error: %s\n", errors[*cptr]);
+                    while (*++cptr != 0)
+                        printf("    R%d: 0x%x\n", *cptr,
+                               context->sc_regs[*cptr]);
+                }
                 if (code == trap_Cerror) {
                     printf("Hit a break.  Use ``exit'' to continue.\n");
                     if (context->sc_cause & CAUSE_BD)
-- 
GitLab