p.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #define DEF 22 /* lines in chunk: 3*DEF == 66, #lines per nroff page */
  5. Biobuf *cons;
  6. Biobuf bout;
  7. int pglen = DEF;
  8. void printfile(int);
  9. void
  10. main(int argc, char *argv[])
  11. {
  12. int n;
  13. int f;
  14. if((cons = Bopen("/dev/cons", OREAD)) == 0) {
  15. fprint(2, "p: can't open /dev/cons\n");
  16. exits("missing /dev/cons");
  17. }
  18. Binit(&bout, 1, OWRITE);
  19. n = 0;
  20. while(argc > 1) {
  21. --argc; argv++;
  22. if(*argv[0] == '-'){
  23. pglen = atoi(&argv[0][1]);
  24. if(pglen <= 0)
  25. pglen = DEF;
  26. } else {
  27. n++;
  28. f = open(argv[0], OREAD);
  29. if(f < 0){
  30. fprint(2, "p: can't open %s\n", argv[0]);
  31. continue;
  32. }
  33. printfile(f);
  34. }
  35. }
  36. if(n == 0)
  37. printfile(0);
  38. exits(0);
  39. }
  40. void
  41. printfile(int f)
  42. {
  43. int i, j, n;
  44. char *s, *cmd;
  45. Biobuf *b;
  46. b = malloc(sizeof(Biobuf));
  47. Binit(b, f, OREAD);
  48. for(;;){
  49. for(i=1; i <= pglen; i++) {
  50. s = Brdline(b, '\n');
  51. if(s == 0){
  52. n = Blinelen(b);
  53. if(n > 0) /* line too long for Brdline */
  54. for(j=0; j<n; j++)
  55. Bputc(&bout, Bgetc(b));
  56. else /* true EOF */
  57. return;
  58. }else{
  59. Bwrite(&bout, s, Blinelen(b)-1);
  60. if(i < pglen)
  61. Bwrite(&bout, "\n", 1);
  62. }
  63. }
  64. Bflush(&bout);
  65. getcmd:
  66. cmd = Brdline(cons, '\n');
  67. if(cmd == 0 || *cmd == 'q')
  68. exits(0);
  69. cmd[Blinelen(cons)-1] = 0;
  70. if(*cmd == '!'){
  71. if(fork() == 0){
  72. dup(Bfildes(cons), 0);
  73. execl("/bin/rc", "rc", "-c", cmd+1, 0);
  74. }
  75. waitpid();
  76. goto getcmd;
  77. }
  78. }
  79. }