comm.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #define LB 2048
  5. int one;
  6. int two;
  7. int three;
  8. char *ldr[3];
  9. Biobuf *ib1;
  10. Biobuf *ib2;
  11. Biobuf *openfil(char*);
  12. int rd(Biobuf*, char*);
  13. void wr(char*, int);
  14. void copy(Biobuf*, char*, int);
  15. int compare(char*, char*);
  16. void
  17. main(int argc, char *argv[])
  18. {
  19. int l;
  20. char lb1[LB],lb2[LB];
  21. ldr[0] = "";
  22. ldr[1] = "\t";
  23. ldr[2] = "\t\t";
  24. l = 2;
  25. ARGBEGIN{
  26. case '1':
  27. if(!one) {
  28. one = 1;
  29. ldr[1][0] =
  30. ldr[2][l--] = '\0';
  31. }
  32. break;
  33. case '2':
  34. if(!two) {
  35. two = 1;
  36. ldr[2][l--] = '\0';
  37. }
  38. break;
  39. case '3':
  40. three = 1;
  41. break;
  42. default:
  43. goto Usage;
  44. }ARGEND
  45. if(argc < 2) {
  46. Usage:
  47. fprint(2, "usage: comm [-123] file1 file2\n");
  48. exits("usage");
  49. }
  50. ib1 = openfil(argv[0]);
  51. ib2 = openfil(argv[1]);
  52. if(rd(ib1,lb1) < 0){
  53. if(rd(ib2,lb2) < 0)
  54. exits(0);
  55. copy(ib2,lb2,2);
  56. }
  57. if(rd(ib2,lb2) < 0)
  58. copy(ib1,lb1,1);
  59. for(;;){
  60. switch(compare(lb1,lb2)) {
  61. case 0:
  62. wr(lb1,3);
  63. if(rd(ib1,lb1) < 0) {
  64. if(rd(ib2,lb2) < 0)
  65. exits(0);
  66. copy(ib2,lb2,2);
  67. }
  68. if(rd(ib2,lb2) < 0)
  69. copy(ib1,lb1,1);
  70. continue;
  71. case 1:
  72. wr(lb1,1);
  73. if(rd(ib1,lb1) < 0)
  74. copy(ib2,lb2,2);
  75. continue;
  76. case 2:
  77. wr(lb2,2);
  78. if(rd(ib2,lb2) < 0)
  79. copy(ib1,lb1,1);
  80. continue;
  81. }
  82. }
  83. }
  84. int
  85. rd(Biobuf *file, char *buf)
  86. {
  87. int i, c;
  88. i = 0;
  89. while((c = Bgetc(file)) != Beof) {
  90. *buf = c;
  91. if(c == '\n' || i > LB-2) {
  92. *buf = '\0';
  93. return 0;
  94. }
  95. i++;
  96. buf++;
  97. }
  98. return -1;
  99. }
  100. void
  101. wr(char *str, int n)
  102. {
  103. switch(n){
  104. case 1:
  105. if(one)
  106. return;
  107. break;
  108. case 2:
  109. if(two)
  110. return;
  111. break;
  112. case 3:
  113. if(three)
  114. return;
  115. }
  116. print("%s%s\n", ldr[n-1],str);
  117. }
  118. void
  119. copy(Biobuf *ibuf, char *lbuf, int n)
  120. {
  121. do
  122. wr(lbuf,n);
  123. while(rd(ibuf,lbuf) >= 0);
  124. exits(0);
  125. }
  126. int
  127. compare(char *a, char *b)
  128. {
  129. while(*a == *b){
  130. if(*a == '\0')
  131. return 0;
  132. a++;
  133. b++;
  134. }
  135. if(*a < *b)
  136. return 1;
  137. return 2;
  138. }
  139. Biobuf*
  140. openfil(char *s)
  141. {
  142. Biobuf *b;
  143. if(s[0]=='-' && s[1]==0)
  144. s = "/fd/0";
  145. b = Bopen(s, OREAD);
  146. if(b)
  147. return b;
  148. fprint(2,"comm: cannot open %s: %r\n",s);
  149. exits("open");
  150. return 0; /* shut up ken */
  151. }