home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / make / CHECK.C next >
Encoding:
C/C++ Source or Header  |  1996-09-01  |  2.1 KB  |  111 lines

  1. /*
  2.  *    Check structures for make.
  3.  */
  4.  
  5. #include "h.h"
  6.  
  7.  
  8. /*
  9.  *    Prints out the structures as defined in memory.  Good for check
  10.  *    that you make file does what you want (and for debugging make).
  11.  */
  12. void
  13. prt()
  14. {
  15.     register struct name *        np;
  16.     register struct depend *    dp;
  17.     register struct line *        lp;
  18.     register struct cmd *        cp;
  19.     register struct macro *        mp;
  20.  
  21.  
  22.     for (mp = macrohead; mp; mp = mp->m_next)
  23.         fprintf(stderr, "%s = %s\n", mp->m_name, mp->m_val);
  24.  
  25.     fputc('\n', stderr);
  26.  
  27.     for (np = namehead.n_next; np; np = np->n_next)
  28.     {
  29.         if (np->n_flag & N_DOUBLE)
  30.             fprintf(stderr, "%s::\n", np->n_name);
  31.         else
  32.             fprintf(stderr, "%s:\n", np->n_name);
  33.         if (np == firstname)
  34.             fprintf(stderr, "(MAIN NAME)\n");
  35.         for (lp = np->n_line; lp; lp = lp->l_next)
  36.         {
  37.             fputc(':', stderr);
  38.             for (dp = lp->l_dep; dp; dp = dp->d_next)
  39.                 fprintf(stderr, " %s", dp->d_name->n_name);
  40.             fputc('\n', stderr);
  41.  
  42.             for (cp = lp->l_cmd; cp; cp = cp->c_next)
  43.                 fprintf(stderr, "-\t%s\n", cp->c_cmd);
  44.             fputc('\n', stderr);
  45.         }
  46.         fputc('\n', stderr);
  47.     }
  48. }
  49.  
  50.  
  51. /*
  52.  *    Recursive routine that does the actual checking.
  53.  */
  54. void
  55. check(np)
  56. struct name *        np;
  57. {
  58.     register struct depend *    dp;
  59.     register struct line *        lp;
  60.  
  61.  
  62.     if (np->n_flag & N_MARK)
  63.         fatal("Circular dependency from %s", np->n_name);
  64.  
  65.     np->n_flag |= N_MARK;
  66.  
  67.     for (lp = np->n_line; lp; lp = lp->l_next)
  68.         for (dp = lp->l_dep; dp; dp = dp->d_next)
  69.             check(dp->d_name);
  70.  
  71.     np->n_flag &= ~N_MARK;
  72. }
  73.  
  74.  
  75. /*
  76.  *    Look for circular dependancies.
  77.  *    ie.
  78.  *        a: b
  79.  *        b: a
  80.  *    is a circular dep
  81.  */
  82. void
  83. circh()
  84. {
  85.     register struct name *    np;
  86.  
  87.  
  88.     for (np = namehead.n_next; np; np = np->n_next)
  89.         check(np);
  90. }
  91.  
  92.  
  93. /*
  94.  *    Check the target .PRECIOUS, and mark its dependentd as precious
  95.  */
  96. void
  97. precious()
  98. {
  99.     register struct depend *    dp;
  100.     register struct line *        lp;
  101.     register struct name *        np;
  102.  
  103.  
  104.     if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG))
  105.         return;
  106.  
  107.     for (lp = np->n_line; lp; lp = lp->l_next)
  108.         for (dp = lp->l_dep; dp; dp = dp->d_next)
  109.             dp->d_name->n_flag |= N_PREC;
  110. }
  111.