t17.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include "a.h"
  10. /*
  11. * 17. Environment switching.
  12. */
  13. typedef struct Env Env;
  14. struct Env
  15. {
  16. int s;
  17. int s0;
  18. int f;
  19. int f0;
  20. int fi;
  21. int ad;
  22. int ce;
  23. int v;
  24. int v0;
  25. int ls;
  26. int ls0;
  27. int it;
  28. /* - ta */
  29. /* - tc */
  30. /* - lc */
  31. /* - ul */
  32. /* - cu */
  33. /* - cc */
  34. /* - c2 */
  35. /* - nh */
  36. /* - hy */
  37. /* - hc */
  38. /* - lt */
  39. /* - nm */
  40. /* - nn */
  41. /* - mc */
  42. };
  43. Env defenv =
  44. {
  45. 10,
  46. 10,
  47. 1,
  48. 1,
  49. 1,
  50. 1,
  51. 0,
  52. 12,
  53. 12,
  54. 0,
  55. 0,
  56. 0,
  57. };
  58. Env env[3];
  59. Env *evstack[20];
  60. int nevstack;
  61. void
  62. saveenv(Env *e)
  63. {
  64. e->s = getnr(L(".s"));
  65. e->s0 = getnr(L(".s0"));
  66. e->f = getnr(L(".f"));
  67. e->f0 = getnr(L(".f0"));
  68. e->fi = getnr(L(".fi"));
  69. e->ad = getnr(L(".ad"));
  70. e->ce = getnr(L(".ce"));
  71. e->v = getnr(L(".v"));
  72. e->v0 = getnr(L(".v0"));
  73. e->ls = getnr(L(".ls"));
  74. e->ls0 = getnr(L(".ls0"));
  75. e->it = getnr(L(".it"));
  76. }
  77. void
  78. restoreenv(Env *e)
  79. {
  80. nr(L(".s"), e->s);
  81. nr(L(".s0"), e->s0);
  82. nr(L(".f"), e->f);
  83. nr(L(".f0"), e->f0);
  84. nr(L(".fi"), e->fi);
  85. nr(L(".ad"), e->ad);
  86. nr(L(".ce"), e->ce);
  87. nr(L(".v"), e->v);
  88. nr(L(".v0"), e->v0);
  89. nr(L(".ls"), e->ls);
  90. nr(L(".ls0"), e->ls0);
  91. nr(L(".it"), e->it);
  92. nr(L(".ev"), e-env);
  93. runmacro1(L("font"));
  94. }
  95. void
  96. r_ev(int argc, Rune **argv)
  97. {
  98. int i;
  99. Env *e;
  100. if(argc == 1){
  101. if(nevstack <= 0){
  102. if(verbose) warn(".ev stack underflow");
  103. return;
  104. }
  105. restoreenv(evstack[--nevstack]);
  106. return;
  107. }
  108. if(nevstack >= nelem(evstack))
  109. sysfatal(".ev stack overflow");
  110. i = eval(argv[1]);
  111. if(i < 0 || i > 2){
  112. warn(".ev bad environment %d", i);
  113. i = 0;
  114. }
  115. e = &env[getnr(L(".ev"))];
  116. saveenv(e);
  117. evstack[nevstack++] = e;
  118. restoreenv(&env[i]);
  119. }
  120. void
  121. t17init(void)
  122. {
  123. int i;
  124. for(i=0; i<nelem(env); i++)
  125. env[i] = defenv;
  126. addreq(L("ev"), r_ev, -1);
  127. }