env.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "mk.h"
  2. enum {
  3. ENVQUANTA=10
  4. };
  5. Envy *envy;
  6. static int nextv;
  7. static char *myenv[] =
  8. {
  9. "target",
  10. "stem",
  11. "prereq",
  12. "pid",
  13. "nproc",
  14. "newprereq",
  15. "alltarget",
  16. "newmember",
  17. "stem0", /* must be in order from here */
  18. "stem1",
  19. "stem2",
  20. "stem3",
  21. "stem4",
  22. "stem5",
  23. "stem6",
  24. "stem7",
  25. "stem8",
  26. "stem9",
  27. 0,
  28. };
  29. void
  30. initenv(void)
  31. {
  32. char **p;
  33. for(p = myenv; *p; p++)
  34. symlook(*p, S_INTERNAL, (void *)"");
  35. readenv(); /* o.s. dependent */
  36. }
  37. static void
  38. envinsert(char *name, Word *value)
  39. {
  40. static int envsize;
  41. if (nextv >= envsize) {
  42. envsize += ENVQUANTA;
  43. envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy));
  44. }
  45. envy[nextv].name = name;
  46. envy[nextv++].values = value;
  47. }
  48. static void
  49. envupd(char *name, Word *value)
  50. {
  51. Envy *e;
  52. for(e = envy; e->name; e++)
  53. if(strcmp(name, e->name) == 0){
  54. delword(e->values);
  55. e->values = value;
  56. return;
  57. }
  58. e->name = name;
  59. e->values = value;
  60. envinsert(0,0);
  61. }
  62. static void
  63. ecopy(Symtab *s)
  64. {
  65. char **p;
  66. if(symlook(s->name, S_NOEXPORT, 0))
  67. return;
  68. for(p = myenv; *p; p++)
  69. if(strcmp(*p, s->name) == 0)
  70. return;
  71. envinsert(s->name, s->u.ptr);
  72. }
  73. void
  74. execinit(void)
  75. {
  76. char **p;
  77. nextv = 0;
  78. for(p = myenv; *p; p++)
  79. envinsert(*p, stow(""));
  80. symtraverse(S_VAR, ecopy);
  81. envinsert(0, 0);
  82. }
  83. Envy*
  84. buildenv(Job *j, int slot)
  85. {
  86. char **p, *cp, *qp;
  87. Word *w, *v, **l;
  88. int i;
  89. char buf[256];
  90. envupd("target", wdup(j->t));
  91. if(j->r->attr&REGEXP)
  92. envupd("stem",newword(""));
  93. else
  94. envupd("stem", newword(j->stem));
  95. envupd("prereq", wdup(j->p));
  96. snprint(buf, sizeof buf, "%d", getpid());
  97. envupd("pid", newword(buf));
  98. snprint(buf, sizeof buf, "%d", slot);
  99. envupd("nproc", newword(buf));
  100. envupd("newprereq", wdup(j->np));
  101. envupd("alltarget", wdup(j->at));
  102. l = &v;
  103. v = w = wdup(j->np);
  104. while(w){
  105. cp = strchr(w->s, '(');
  106. if(cp){
  107. qp = strchr(cp+1, ')');
  108. if(qp){
  109. *qp = 0;
  110. strcpy(w->s, cp+1);
  111. l = &w->next;
  112. w = w->next;
  113. continue;
  114. }
  115. }
  116. *l = w->next;
  117. free(w->s);
  118. free(w);
  119. w = *l;
  120. }
  121. envupd("newmember", v);
  122. /* update stem0 -> stem9 */
  123. for(p = myenv; *p; p++)
  124. if(strcmp(*p, "stem0") == 0)
  125. break;
  126. for(i = 0; *p; i++, p++){
  127. if((j->r->attr&REGEXP) && j->match[i])
  128. envupd(*p, newword(j->match[i]));
  129. else
  130. envupd(*p, newword(""));
  131. }
  132. return envy;
  133. }