dump.c 1.1 KB

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