home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tools / make / make_pd / check.c next >
Encoding:
C/C++ Source or Header  |  1987-01-10  |  2.2 KB  |  116 lines

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