recursiveloop.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2007-2009 Russ Cox. All Rights Reserved.
  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. static int
  6. recursiveloop(char *pc, const char *sp, Subject *input, const char **subp, int nsubp)
  7. {
  8. const char *old;
  9. int off;
  10. re1_5_stack_chk();
  11. for(;;) {
  12. if(inst_is_consumer(*pc)) {
  13. // If we need to match a character, but there's none left, it's fail
  14. if(sp >= input->end)
  15. return 0;
  16. }
  17. switch(*pc++) {
  18. case Char:
  19. if(*sp != *pc++)
  20. return 0;
  21. case Any:
  22. sp++;
  23. continue;
  24. case Class:
  25. case ClassNot:
  26. if (!_re1_5_classmatch(pc, sp))
  27. return 0;
  28. pc += *(unsigned char*)pc * 2 + 1;
  29. sp++;
  30. continue;
  31. case NamedClass:
  32. if (!_re1_5_namedclassmatch(pc, sp))
  33. return 0;
  34. pc++;
  35. sp++;
  36. continue;
  37. case Match:
  38. return 1;
  39. case Jmp:
  40. off = (signed char)*pc++;
  41. pc = pc + off;
  42. continue;
  43. case Split:
  44. off = (signed char)*pc++;
  45. if(recursiveloop(pc, sp, input, subp, nsubp))
  46. return 1;
  47. pc = pc + off;
  48. continue;
  49. case RSplit:
  50. off = (signed char)*pc++;
  51. if(recursiveloop(pc + off, sp, input, subp, nsubp))
  52. return 1;
  53. continue;
  54. case Save:
  55. off = (unsigned char)*pc++;
  56. if(off >= nsubp) {
  57. continue;
  58. }
  59. old = subp[off];
  60. subp[off] = sp;
  61. if(recursiveloop(pc, sp, input, subp, nsubp))
  62. return 1;
  63. subp[off] = old;
  64. return 0;
  65. case Bol:
  66. if(sp != input->begin)
  67. return 0;
  68. continue;
  69. case Eol:
  70. if(sp != input->end)
  71. return 0;
  72. continue;
  73. }
  74. re1_5_fatal("recursiveloop");
  75. }
  76. }
  77. int
  78. re1_5_recursiveloopprog(ByteProg *prog, Subject *input, const char **subp, int nsubp, int is_anchored)
  79. {
  80. return recursiveloop(HANDLE_ANCHORED(prog->insts, is_anchored), input->begin, input, subp, nsubp);
  81. }