substring.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <stddef.h>
  2. #include <misc/debug.h>
  3. #include <misc/memref.h>
  4. static void build_substring_backtrack_table (MemRef str, size_t *out_table)
  5. {
  6. ASSERT(str.len > 0)
  7. size_t x = 0;
  8. for (size_t i = 1; i < str.len; i++) {
  9. out_table[i] = x;
  10. while (x > 0 && str.ptr[i] != str.ptr[x]) {
  11. x = out_table[x];
  12. }
  13. if (str.ptr[i] == str.ptr[x]) {
  14. x++;
  15. }
  16. }
  17. }
  18. static int find_substring (MemRef text, MemRef word, const size_t *table, size_t *out_position)
  19. {
  20. ASSERT(word.len > 0)
  21. size_t x = 0;
  22. for (size_t i = 0; i < text.len; i++) {
  23. while (x > 0 && text.ptr[i] != word.ptr[x]) {
  24. x = table[x];
  25. }
  26. if (text.ptr[i] == word.ptr[x]) {
  27. if (x + 1 == word.len) {
  28. *out_position = i - x;
  29. return 1;
  30. }
  31. x++;
  32. }
  33. }
  34. return 0;
  35. }
  36. static void build_substring_backtrack_table_reverse (MemRef str, size_t *out_table)
  37. {
  38. ASSERT(str.len > 0)
  39. size_t x = 0;
  40. for (size_t i = 1; i < str.len; i++) {
  41. out_table[i] = x;
  42. while (x > 0 && str.ptr[str.len - 1 - i] != str.ptr[str.len - 1 - x]) {
  43. x = out_table[x];
  44. }
  45. if (str.ptr[str.len - 1 - i] == str.ptr[str.len - 1 - x]) {
  46. x++;
  47. }
  48. }
  49. }
  50. static int find_substring_reverse (MemRef text, MemRef word, const size_t *table, size_t *out_position)
  51. {
  52. ASSERT(word.len > 0)
  53. size_t x = 0;
  54. for (size_t i = 0; i < text.len; i++) {
  55. while (x > 0 && text.ptr[text.len - 1 - i] != word.ptr[word.len - 1 - x]) {
  56. x = table[x];
  57. }
  58. if (text.ptr[text.len - 1 - i] == word.ptr[word.len - 1 - x]) {
  59. if (x + 1 == word.len) {
  60. *out_position = (text.len - 1 - i);
  61. return 1;
  62. }
  63. x++;
  64. }
  65. }
  66. return 0;
  67. }