t17.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "a.h"
  2. /*
  3. * 17. Environment switching.
  4. */
  5. typedef struct Env Env;
  6. struct Env
  7. {
  8. int s;
  9. int s0;
  10. int f;
  11. int f0;
  12. int fi;
  13. int ad;
  14. int ce;
  15. int v;
  16. int v0;
  17. int ls;
  18. int ls0;
  19. int it;
  20. /* - ta */
  21. /* - tc */
  22. /* - lc */
  23. /* - ul */
  24. /* - cu */
  25. /* - cc */
  26. /* - c2 */
  27. /* - nh */
  28. /* - hy */
  29. /* - hc */
  30. /* - lt */
  31. /* - nm */
  32. /* - nn */
  33. /* - mc */
  34. };
  35. Env defenv =
  36. {
  37. 10,
  38. 10,
  39. 1,
  40. 1,
  41. 1,
  42. 1,
  43. 0,
  44. 12,
  45. 12,
  46. 0,
  47. 0,
  48. 0,
  49. };
  50. Env env[3];
  51. Env *evstack[20];
  52. int nevstack;
  53. void
  54. saveenv(Env *e)
  55. {
  56. e->s = getnr(L(".s"));
  57. e->s0 = getnr(L(".s0"));
  58. e->f = getnr(L(".f"));
  59. e->f0 = getnr(L(".f0"));
  60. e->fi = getnr(L(".fi"));
  61. e->ad = getnr(L(".ad"));
  62. e->ce = getnr(L(".ce"));
  63. e->v = getnr(L(".v"));
  64. e->v0 = getnr(L(".v0"));
  65. e->ls = getnr(L(".ls"));
  66. e->ls0 = getnr(L(".ls0"));
  67. e->it = getnr(L(".it"));
  68. }
  69. void
  70. restoreenv(Env *e)
  71. {
  72. nr(L(".s"), e->s);
  73. nr(L(".s0"), e->s0);
  74. nr(L(".f"), e->f);
  75. nr(L(".f0"), e->f0);
  76. nr(L(".fi"), e->fi);
  77. nr(L(".ad"), e->ad);
  78. nr(L(".ce"), e->ce);
  79. nr(L(".v"), e->v);
  80. nr(L(".v0"), e->v0);
  81. nr(L(".ls"), e->ls);
  82. nr(L(".ls0"), e->ls0);
  83. nr(L(".it"), e->it);
  84. nr(L(".ev"), e-env);
  85. runmacro1(L("font"));
  86. }
  87. void
  88. r_ev(int argc, Rune **argv)
  89. {
  90. int i;
  91. Env *e;
  92. if(argc == 1){
  93. if(nevstack <= 0){
  94. if(verbose) warn(".ev stack underflow");
  95. return;
  96. }
  97. restoreenv(evstack[--nevstack]);
  98. return;
  99. }
  100. if(nevstack >= nelem(evstack))
  101. sysfatal(".ev stack overflow");
  102. i = eval(argv[1]);
  103. if(i < 0 || i > 2){
  104. warn(".ev bad environment %d", i);
  105. i = 0;
  106. }
  107. e = &env[getnr(L(".ev"))];
  108. saveenv(e);
  109. evstack[nevstack++] = e;
  110. restoreenv(&env[i]);
  111. }
  112. void
  113. t17init(void)
  114. {
  115. int i;
  116. for(i=0; i<nelem(env); i++)
  117. env[i] = defenv;
  118. addreq(L("ev"), r_ev, -1);
  119. }