dump.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <ctype.h>
  5. #include "dat.h"
  6. #include "protos.h"
  7. static void
  8. p_compile(Filter *)
  9. {
  10. }
  11. static int
  12. p_filter(Filter *, Msg *)
  13. {
  14. return 0;
  15. }
  16. static char tohex[16] = {
  17. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  18. 'a', 'b', 'c', 'd', 'e', 'f'
  19. };
  20. static int
  21. p_seprint(Msg *m)
  22. {
  23. int c, i, n, isstring;
  24. uchar *ps = m->ps;
  25. char *p = m->p;
  26. char *e = m->e;
  27. n = m->pe - ps;
  28. if(n > Nflag)
  29. n = Nflag;
  30. isstring = 1;
  31. for(i = 0; i < n; i++){
  32. c = ps[i];
  33. if(!isprint(c) && !isspace(c)){
  34. isstring = 0;
  35. break;
  36. }
  37. }
  38. if(isstring){
  39. for(i = 0; i < n && p+1<e; i++){
  40. c = ps[i];
  41. switch(c){
  42. case '\t':
  43. *p++ = '\\';
  44. *p++ = 't';
  45. break;
  46. case '\r':
  47. *p++ = '\\';
  48. *p++ = 'r';
  49. break;
  50. case '\n':
  51. *p++ = '\\';
  52. *p++ = 'n';
  53. break;
  54. default:
  55. *p++ = c;
  56. }
  57. }
  58. } else {
  59. for(i = 0; i < n && p+1<e; i++){
  60. c = ps[i];
  61. *p++ = tohex[c>>4];
  62. *p++ = tohex[c&0xf];
  63. }
  64. }
  65. m->pr = nil;
  66. m->p = p;
  67. m->ps = ps;
  68. return 0;
  69. }
  70. Proto dump =
  71. {
  72. "dump",
  73. p_compile,
  74. p_filter,
  75. p_seprint,
  76. nil,
  77. nil,
  78. nil,
  79. defaultframer,
  80. };