home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / k / make / !make_c_check < prev    next >
Encoding:
Text File  |  1992-12-07  |  2.7 KB  |  112 lines

  1. /* > c.check
  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(void)
  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 check(struct name *np)
  55. {
  56.         register struct depend *        dp;
  57.         register struct line *          lp;
  58.  
  59.  
  60.         if (np->n_flag & N_MARK)
  61.                 fatal("Circular dependency from %s",(int) np->n_name);
  62.  
  63.         np->n_flag |= N_MARK;
  64.  
  65.         for (lp = np->n_line; lp; lp = lp->l_next)
  66.                 for (dp = lp->l_dep; dp; dp = dp->d_next)
  67.                         check(dp->d_name);
  68.  
  69.         np->n_flag &= ~N_MARK;
  70. }
  71.  
  72.  
  73. /*
  74.  *      Look for circular dependancies.
  75.  *      ie.
  76.  *              a: b
  77.  *              b: a
  78.  *      is a circular dep
  79.  */
  80. void
  81. circh(void)
  82. {
  83.         register struct name *  np;
  84.  
  85.  
  86.         for (np = namehead.n_next; np; np = np->n_next)
  87.                 check(np);
  88. }
  89.  
  90.  
  91. /*
  92.  *      Check the target .PRECIOUS, and mark its dependentd as precious
  93.  */
  94. void
  95. precious(void)
  96. {
  97.         register struct depend *        dp;
  98.         register struct line *          lp;
  99.         register struct name *          np;
  100.  
  101.  
  102.         if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG))
  103.                 return;
  104.  
  105.         for (lp = np->n_line; lp; lp = lp->l_next)
  106.                 for (dp = lp->l_dep; dp; dp = dp->d_next)
  107.                         dp->d_name->n_flag |= N_PREC;
  108. }
  109.  
  110.  
  111.  
  112.