home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume12 / cake / part02 / error.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-14  |  2.4 KB  |  135 lines

  1. /*
  2. **    Error handling module.
  3. */
  4.  
  5. static    char
  6. rcs_id[] = "$Header: /mip/zs/src/sys/cake/RCS/error.c,v 1.15 87/10/05 20:14:20 zs Exp $";
  7.  
  8. #include    "cake.h"
  9.  
  10. /*
  11. **    This function prints out the history of errors
  12. **    that prevent the proper update of the given node.
  13. */
  14.  
  15. trace_errs(node)
  16. reg    Node    *node;
  17. {
  18.     reg    List    *ptr;
  19.     reg    Node    *bnode;
  20.  
  21.     if (on_node(node, nf_TRACED))
  22.         return;
  23.  
  24.     set_node(node, nf_TRACED);
  25.     for_list (ptr, node->n_badguys)
  26.     {
  27.         bnode = (Node *) ldata(ptr);
  28.         trace_errs(bnode);
  29.     }
  30.  
  31.     if (strdiff(node->n_name, CHASEROOT))
  32.         printf("%s", node->n_msg);
  33. }
  34.  
  35. /*
  36. **    This function adds msg to the list of error messages
  37. **    to be printed by trace_errs for the given node.
  38. */
  39.  
  40. add_error(node, msg, badguys, iserror)
  41. reg    Node    *node;
  42. reg    char    *msg;
  43. reg    List    *badguys;
  44. reg    int    iserror;
  45. {
  46.     char    buf[MAXSIZE];
  47.  
  48.     if (node->n_msg == NULL)
  49.         node->n_msg = "";
  50.  
  51.     if (iserror)
  52.         set_node(node, nf_ERR);
  53.  
  54.     sprintf(buf, "%scake: %s\n", node->n_msg, msg);
  55.     if (strlen(buf) >= MAXSIZE)
  56.     {
  57.         fprintf(stderr, "cake internal error: buffer overflow in add_error\n");
  58.         exit_cake(FALSE);
  59.     }
  60.  
  61.     node->n_msg = new_name(buf);
  62.     node->n_badguys = addlist(node->n_badguys, badguys);
  63. }
  64.  
  65. char *
  66. find_circle(name)
  67. reg    char    *name;
  68. {
  69.     extern    int    goal_stackp;
  70.     extern    char    *goal_stack[];
  71.     char        buf[MAXSIZE];
  72.     reg    int    i;
  73.  
  74.     cdebug("stackp = %d\n", goal_stackp);
  75.     cdebug("looking for %s\n", goal_stack[goal_stackp-1]);
  76.  
  77.     if (goal_stack[goal_stackp-1] == name)
  78.         return "directly";
  79.  
  80.     for (i = 0; i < goal_stackp; i++)
  81.     {
  82.         cdebug("checking %d: %s\n", i, goal_stack[i]);
  83.         if (goal_stack[i] == name)
  84.         {
  85.             cdebug("hit\n");
  86.             strcpy(buf, "through");
  87.             for (; i < goal_stackp; i++)
  88.             {
  89.                 strcat(buf, " ");
  90.                 strcat(buf, goal_stack[i]);
  91.             }
  92.  
  93.             if (strlen(buf) >= MAXSIZE)
  94.             {
  95.                 fprintf(stderr, "cake internal error: buffer overflow in find_circle\n");
  96.                 exit_cake(FALSE);
  97.             }
  98.  
  99.             return new_name(buf);
  100.         }
  101.     }
  102.  
  103.     fprintf(stderr, "cake internal error: no circularity in find_circle\n");
  104.     exit_cake(TRUE);
  105.     return "";        /* to satisfy lint */
  106. }
  107.  
  108. char *
  109. list_names(list)
  110. reg    List    *list;        /* of Node    */
  111. {
  112.     reg    List    *ptr;
  113.     reg    Node    *node;
  114.     reg    char    *sep;
  115.     char        buf[MAXSIZE];
  116.  
  117.     buf[0] = '\0';
  118.     sep = "";
  119.     for_list (ptr, list)
  120.     {
  121.         node = (Node *) ldata(ptr);
  122.         strcat(buf, sep);
  123.         strcat(buf, node->n_name);
  124.         sep = " ";
  125.     }
  126.  
  127.     if (strlen(buf) >= MAXSIZE)
  128.     {
  129.         fprintf(stderr, "cake internal error: buffer overflow in list_names\n");
  130.         exit_cake(FALSE);
  131.     }
  132.  
  133.     return new_name(buf);
  134. }
  135.