check.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Check structures for make.
  3. *
  4. * $Header$
  5. */
  6. #include <stdio.h>
  7. #include "h.h"
  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. for (mp = macrohead; mp; mp = mp->m_next)
  21. fprintf(stderr, "%s = %s\n", mp->m_name, mp->m_val);
  22. fputc('\n', stderr);
  23. for (np = namehead.n_next; np; np = np->n_next)
  24. {
  25. if (np->n_flag & N_DOUBLE)
  26. fprintf(stderr, "%s::\n", np->n_name);
  27. else
  28. fprintf(stderr, "%s:\n", np->n_name);
  29. if (np == firstname)
  30. fprintf(stderr, "(MAIN NAME)\n");
  31. for (lp = np->n_line; lp; lp = lp->l_next)
  32. {
  33. fputc(':', stderr);
  34. for (dp = lp->l_dep; dp; dp = dp->d_next)
  35. fprintf(stderr, " %s", dp->d_name->n_name);
  36. fputc('\n', stderr);
  37. for (cp = lp->l_cmd; cp; cp = cp->c_next)
  38. #ifdef os9
  39. fprintf(stderr, "- %s\n", cp->c_cmd);
  40. #else
  41. fprintf(stderr, "-\t%s\n", cp->c_cmd);
  42. #endif
  43. fputc('\n', stderr);
  44. }
  45. fputc('\n', stderr);
  46. }
  47. }
  48. /*
  49. * Recursive routine that does the actual checking.
  50. */
  51. void
  52. check(np)
  53. struct name * np;
  54. {
  55. register struct depend * dp;
  56. register struct line * lp;
  57. if (np->n_flag & N_MARK)
  58. fatal("Circular dependency from %s", np->n_name);
  59. np->n_flag |= N_MARK;
  60. for (lp = np->n_line; lp; lp = lp->l_next)
  61. for (dp = lp->l_dep; dp; dp = dp->d_next)
  62. check(dp->d_name);
  63. np->n_flag &= ~N_MARK;
  64. }
  65. /*
  66. * Look for circular dependancies.
  67. * ie.
  68. * a: b
  69. * b: a
  70. * is a circular dep
  71. */
  72. void
  73. circh()
  74. {
  75. register struct name * np;
  76. for (np = namehead.n_next; np; np = np->n_next)
  77. check(np);
  78. }
  79. /*
  80. * Check the target .PRECIOUS, and mark its dependentd as precious
  81. */
  82. void
  83. precious()
  84. {
  85. register struct depend * dp;
  86. register struct line * lp;
  87. register struct name * np;
  88. if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG))
  89. return;
  90. for (lp = np->n_line; lp; lp = lp->l_next)
  91. for (dp = lp->l_dep; dp; dp = dp->d_next)
  92. dp->d_name->n_flag |= N_PREC;
  93. }