dumpcode.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2014 Paul Sokolovsky.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. #include "re1.5.h"
  5. void re1_5_dumpcode(ByteProg *prog)
  6. {
  7. int pc = 0;
  8. char *code = prog->insts;
  9. while (pc < prog->bytelen) {
  10. printf("%2d: ", pc);
  11. switch(code[pc++]) {
  12. default:
  13. assert(0);
  14. // re1_5_fatal("printprog");
  15. case Split:
  16. printf("split %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
  17. pc++;
  18. break;
  19. case RSplit:
  20. printf("rsplit %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
  21. pc++;
  22. break;
  23. case Jmp:
  24. printf("jmp %d (%d)\n", pc + (signed char)code[pc] + 1, (signed char)code[pc]);
  25. pc++;
  26. break;
  27. case Char:
  28. printf("char %c\n", code[pc++]);
  29. break;
  30. case Any:
  31. printf("any\n");
  32. break;
  33. case Class:
  34. case ClassNot: {
  35. int num = code[pc];
  36. printf("class%s %d", (code[pc - 1] == ClassNot ? "not" : ""), num);
  37. pc++;
  38. while (num--) {
  39. printf(" 0x%02x-0x%02x", code[pc], code[pc + 1]);
  40. pc += 2;
  41. }
  42. printf("\n");
  43. break;
  44. }
  45. case NamedClass:
  46. printf("namedclass %c\n", code[pc++]);
  47. break;
  48. case Match:
  49. printf("match\n");
  50. break;
  51. case Save:
  52. printf("save %d\n", (unsigned char)code[pc++]);
  53. break;
  54. case Bol:
  55. printf("assert bol\n");
  56. break;
  57. case Eol:
  58. printf("assert eol\n");
  59. break;
  60. }
  61. }
  62. printf("Bytes: %d, insts: %d\n", prog->bytelen, prog->len);
  63. }