home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Icon 8.1 / msm-2 / runtime.sit / err_msg.r < prev    next >
Encoding:
Text File  |  1992-09-19  |  4.5 KB  |  177 lines  |  [TEXT/MPS ]

  1. /*
  2.  * err_msg.r -- err_msg, irunerr, drunerr
  3.  */
  4.  
  5. hidden novalue err_txt Params((int n));
  6.  
  7. extern struct errtab errtab[];        /* error numbers and messages */
  8.  
  9. /*
  10.  * err_msg - print run-time error message, performing trace back if required.
  11.  *  This function underlies the rtt runerr() construct.
  12.  */
  13. novalue err_msg(n, v)
  14. int n;
  15. dptr v;
  16. {
  17.    register struct errtab *p;
  18. #ifdef PresentationManager
  19.    char outbuf[512];
  20.    int oblength = 0;
  21. #endif                    /* PresentationManager */
  22.  
  23.    if (n == 0) {
  24.       k_errornumber = t_errornumber;
  25.       k_errorvalue = t_errorvalue;
  26.       have_errval = t_have_val;
  27.       }
  28.    else {
  29.       k_errornumber = n;
  30.       if (v == NULL) {
  31.          k_errorvalue = nulldesc;
  32.          have_errval = 0;
  33.          }
  34.       else {
  35.          k_errorvalue = *v;
  36.          have_errval = 1;
  37.          }
  38.       }
  39.  
  40.    k_errortext = "";
  41.    for (p = errtab; p->err_no > 0; p++)
  42.       if (p->err_no == k_errornumber) {
  43.          k_errortext = p->errmsg;
  44.          break;
  45.          }
  46.  
  47. #ifdef EventMon
  48.    EVVal((word)k_errornumber,E_Error);
  49. #endif                    /* EventMon */
  50.  
  51. #ifdef Xver
  52. xver(imain.17)
  53. #endif                                          /* Xver */
  54.  
  55. #ifndef Xver
  56.    if (pfp != NULL) {
  57.       if (IntVal(kywd_err) == 0 || !err_conv) {
  58. #ifndef PresentationManager
  59.          fprintf(stderr, "\nRun-time error %d\n", k_errornumber);
  60. #else                    /* PresentationManager */
  61.          oblength = sprintf(outbuf, "Run-time error %d\n", k_errornumber);
  62. #endif                    /* PresentationManager */
  63. #if COMPILER
  64.          if (line_info)
  65.             fprintf(stderr, "File %s; Line %d\n", file_name, line_num);
  66. #else                    /* COMPILER */
  67. #ifndef PresentationManager
  68.          fprintf(stderr, "File %s; Line %ld\n", findfile(ipc.opnd),
  69.             (long)findline(ipc.opnd));
  70. #else                    /* PresentationManager */
  71.          oblength += sprintf(&outbuf[oblength], "File %s; Line %ld\n",
  72.                              findfile(ipc.opnd), (long)findline(ipc.opnd));
  73. #endif                                  /* PresentationManager */
  74. #endif                    /* COMPILER */
  75.          }
  76.       else {
  77.          IntVal(kywd_err)--;
  78.          return;
  79.          }
  80.       }
  81.    else
  82. #ifndef PresentationManager
  83.       fprintf(stderr, "\nRun-time error %d in startup code\n", n);
  84.    fprintf(stderr, "%s\n", k_errortext);
  85. #else                    /* PresentationManager */
  86.       oblength = sprintf(outbuf, "Run-time error %d in startup code\n", n);
  87.    oblength += sprintf(&outbuf[oblength], "%s\n", k_errortext);
  88. #endif                                  /* PresentationManager */
  89. #endif                                          /* Xver */
  90.  
  91. /* for now, this is where we'll end the error processing.  We'll have
  92.    to write some support routines for traceback and outimage */
  93. #ifdef PresentationManager
  94.   /* XXX for now, just throw up a little window - later, expand this
  95.      into a more formal dialog box with a trace button, etc */
  96.   /* make a beep */
  97.   WinAlarm(HWND_DESKTOP, WA_ERROR);
  98.   /* show the box */
  99.   WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, outbuf, "Run Time Error",
  100.                 0, MB_OK | MB_ERROR | MB_APPLMODAL);
  101.   /* get out of town */
  102.   c_exit(ErrorExit);
  103. #else                                   /* PresentationManager */
  104.    if (have_errval) {
  105.       fprintf(stderr, "offending value: ");
  106.       outimage(stderr, &k_errorvalue, 0);
  107.       putc('\n', stderr);
  108.       }
  109.  
  110. /*
  111.  * Close out event monitoring, if enabled.
  112.  */
  113. #ifdef MemMon
  114.    EVTerm (k_errornumber, k_errortext);
  115. #endif                    /* MemMon */
  116.  
  117. #ifdef TraceBack
  118.    if (!debug_info)
  119.       c_exit(ErrorExit);
  120.  
  121.    if (pfp == NULL) {        /* skip if start-up problem */
  122.       if (dodump)
  123.          abort();
  124.       c_exit(ErrorExit);
  125.       }
  126.  
  127.    fprintf(stderr, "Trace back:\n");
  128.  
  129.    tracebk(pfp, argp);
  130. #endif                    /* TraceBack */
  131.    fflush(stderr);
  132.  
  133. #ifdef Xver
  134. xver(imain.18)
  135. #endif                                  /* Xver */
  136.  
  137.    if (dodump)
  138.       abort();
  139.    c_exit(ErrorExit);
  140. #endif                    /* PresentationManager */
  141. }
  142.  
  143. /*
  144.  * irunerr - print an error message when the offending value is a C_integer
  145.  *  rather than a descriptor.
  146.  */
  147. novalue irunerr(n, v)
  148. int n;
  149. C_integer v;
  150.    {
  151.    t_errornumber = n;
  152.    IntVal(t_errorvalue) = v;
  153.    t_errorvalue.dword = D_Integer;
  154.    t_have_val = 1;
  155.    err_msg(0,NULL);
  156.    }
  157.  
  158. /*
  159.  * drunerr - print an error message when the offending value is a C double
  160.  *  rather than a descriptor.
  161.  */
  162. novalue drunerr(n, v)
  163. int n;
  164. double v;
  165.    {
  166.    union block *bp;
  167.  
  168.    bp = (union block *)alcreal(v);
  169.    if (bp != NULL) {
  170.       t_errornumber = n;
  171.       BlkLoc(t_errorvalue) = bp;
  172.       t_errorvalue.dword = D_Real;
  173.       t_have_val = 1;
  174.       }
  175.    err_msg(0,NULL);
  176.    }
  177.