t10.c 1.9 KB

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