p.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 - %r\n", argv[0]);
  31. continue;
  32. }
  33. printfile(f);
  34. close(f);
  35. }
  36. }
  37. if(n == 0)
  38. printfile(0);
  39. exits(0);
  40. }
  41. void
  42. printfile(int f)
  43. {
  44. int i, j, n;
  45. char *s, *cmd;
  46. Biobuf *b;
  47. b = malloc(sizeof(Biobuf));
  48. Binit(b, f, OREAD);
  49. for(;;){
  50. for(i=1; i <= pglen; i++) {
  51. s = Brdline(b, '\n');
  52. if(s == 0){
  53. n = Blinelen(b);
  54. if(n > 0) /* line too long for Brdline */
  55. for(j=0; j<n; j++)
  56. Bputc(&bout, Bgetc(b));
  57. else{ /* true EOF */
  58. free(b);
  59. return;
  60. }
  61. }else{
  62. Bwrite(&bout, s, Blinelen(b)-1);
  63. if(i < pglen)
  64. Bwrite(&bout, "\n", 1);
  65. }
  66. }
  67. Bflush(&bout);
  68. getcmd:
  69. cmd = Brdline(cons, '\n');
  70. if(cmd == 0 || *cmd == 'q')
  71. exits(0);
  72. cmd[Blinelen(cons)-1] = 0;
  73. if(*cmd == '!'){
  74. if(fork() == 0){
  75. dup(Bfildes(cons), 0);
  76. execl("/bin/rc", "rc", "-c", cmd+1, nil);
  77. }
  78. waitpid();
  79. goto getcmd;
  80. }
  81. }
  82. }