t10.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. * 10. Input and Output Conventions and Character Translation.
  12. */
  13. /* set escape character */
  14. void
  15. r_ec(int argc, Rune **argv)
  16. {
  17. if(argc == 1)
  18. backslash = '\\';
  19. else
  20. backslash = argv[1][0];
  21. }
  22. /* turn off escape character */
  23. void
  24. r_eo(int argc, Rune **argv)
  25. {
  26. USED(argc);
  27. USED(argv);
  28. backslash = -2;
  29. }
  30. /* continuous underline (same as ul in troff) for the next N lines */
  31. /* set underline font */
  32. void
  33. g_uf(int argc, Rune **argv)
  34. {
  35. USED(argc);
  36. USED(argv);
  37. }
  38. /* set control character */
  39. void
  40. r_cc(int argc, Rune **argv)
  41. {
  42. if(argc == 1)
  43. dot = '.';
  44. else
  45. dot = argv[1][0];
  46. }
  47. /* set no-break control character */
  48. void
  49. r_c2(int argc, Rune **argv)
  50. {
  51. if(argc == 1)
  52. tick = '\'';
  53. else
  54. tick = argv[1][0];
  55. }
  56. /* output translation */
  57. int
  58. e_bang(void)
  59. {
  60. Rune *line;
  61. line = readline(CopyMode);
  62. out(line);
  63. outrune('\n');
  64. free(line);
  65. return 0;
  66. }
  67. int
  68. e_X(void)
  69. {
  70. int c;
  71. while((c = getrune()) >= 0 && c != '\'' && c != '\n')
  72. outrune(c);
  73. if(c == '\n'){
  74. warn("newline in %CX'...'", backslash);
  75. outrune(c);
  76. }
  77. if(c < 0)
  78. warn("eof in %CX'...'", backslash);
  79. return 0;
  80. }
  81. int
  82. e_quote(void)
  83. {
  84. int c;
  85. if(inputmode&ArgMode){
  86. /* Leave \" around for argument parsing */
  87. ungetrune('"');
  88. return '\\';
  89. }
  90. while((c = getrune()) >= 0 && c != '\n')
  91. ;
  92. return '\n';
  93. }
  94. int
  95. e_newline(void)
  96. {
  97. return 0;
  98. }
  99. int
  100. e_e(void)
  101. {
  102. return backslash;
  103. }
  104. void
  105. r_comment(Rune *name)
  106. {
  107. int c;
  108. USED(name);
  109. while((c = getrune()) >= 0 && c != '\n')
  110. ;
  111. }
  112. void
  113. t10init(void)
  114. {
  115. addreq(L("ec"), r_ec, -1);
  116. addreq(L("eo"), r_eo, 0);
  117. addreq(L("lg"), r_nop, -1);
  118. addreq(L("cc"), r_cc, -1);
  119. addreq(L("c2"), r_c2, -1);
  120. addreq(L("tr"), r_warn, -1);
  121. addreq(L("ul"), r_nop, -1);
  122. addraw(L("\\\""), r_comment);
  123. addesc('!', e_bang, 0);
  124. addesc('X', e_X, 0);
  125. addesc('\"', e_quote, CopyMode|ArgMode);
  126. addesc('\n', e_newline, CopyMode|ArgMode|HtmlMode);
  127. addesc('e', e_e, 0);
  128. }