utils.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. char* find_common_prefix(const char* s1, const char* s2) {
  5. int min_length = strlen(s1) < strlen(s2) ? strlen(s1) : strlen(s2);
  6. char* prefix = (char*)malloc(min_length + 1);
  7. int prefix_len = 0;
  8. for (int i = 0; i < min_length; i++) {
  9. if (s1[i] == s2[i]) {
  10. prefix[prefix_len++] = s1[i];
  11. } else {
  12. break;
  13. }
  14. }
  15. prefix[prefix_len] = '\0';
  16. return prefix;
  17. }
  18. char* find_common_suffix(const char* s1, const char* s2) {
  19. int len1 = strlen(s1);
  20. int len2 = strlen(s2);
  21. int min_length = len1 < len2 ? len1 : len2;
  22. char* suffix = (char*)malloc(min_length + 1);
  23. int suffix_len = 0;
  24. for (int i = 1; i <= min_length; i++) {
  25. if (s1[len1 - i] == s2[len2 - i] && !isalnum(s1[len1 - i])) {
  26. suffix[min_length - suffix_len - 1] = s1[len1 - i];
  27. suffix_len++;
  28. } else {
  29. break;
  30. }
  31. }
  32. // Shift the suffix to the beginning of the allocated memory
  33. if (suffix_len > 0) {
  34. memmove(suffix, suffix + (min_length - suffix_len), suffix_len);
  35. }
  36. suffix[suffix_len] = '\0';
  37. return suffix;
  38. }
  39. char* extract_intermediate_diff(const char* curr, const char* old) {
  40. char* suffix = find_common_suffix(curr, old);
  41. int curr_len = strlen(curr);
  42. int suffix_len = strlen(suffix);
  43. int prefix_len;
  44. char* result;
  45. // Create temporary strings without the suffix
  46. char* curr_no_suffix = (char*)malloc(curr_len + 1);
  47. strcpy(curr_no_suffix, curr);
  48. curr_no_suffix[curr_len - suffix_len] = '\0';
  49. char* old_no_suffix = (char*)malloc(strlen(old) + 1);
  50. strcpy(old_no_suffix, old);
  51. old_no_suffix[strlen(old) - suffix_len] = '\0';
  52. char* prefix = find_common_prefix(curr_no_suffix, old_no_suffix);
  53. prefix_len = strlen(prefix);
  54. // Extract the difference
  55. result = (char*)malloc(curr_len - prefix_len - suffix_len + 1);
  56. strncpy(result, curr_no_suffix + prefix_len, curr_len - prefix_len - suffix_len);
  57. result[curr_len - prefix_len - suffix_len] = '\0';
  58. // Clean up
  59. free(suffix);
  60. free(prefix);
  61. free(curr_no_suffix);
  62. free(old_no_suffix);
  63. return result;
  64. }
  65. int* find_all_indices(const char* string, const char* substring, int* count) {
  66. int string_len = strlen(string);
  67. int substr_len = strlen(substring);
  68. int capacity = 10;
  69. int* indices = (int*)malloc(capacity * sizeof(int));
  70. *count = 0;
  71. for (int i = 0; i <= string_len - substr_len; i++) {
  72. if (strncmp(string + i, substring, substr_len) == 0) {
  73. if (*count >= capacity) {
  74. capacity *= 2;
  75. indices = (int*)realloc(indices, capacity * sizeof(int));
  76. }
  77. indices[(*count)++] = i;
  78. }
  79. }
  80. return indices;
  81. }