normalize_path.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "api.h"
  2. #include "pal_debug.h"
  3. #include "pal_defs.h"
  4. #include "pal_error.h"
  5. static int strcmp(const char* a, const char* b) {
  6. for (; *a && *b && *a == *b; a++, b++)
  7. ;
  8. return *a - *b;
  9. }
  10. static const char* get_norm_path_cases[][2] = {
  11. {"/", "/"},
  12. {"/a/b/c", "/a/b/c"},
  13. {"/a/../b", "/b"},
  14. {"/../a", "/a"},
  15. {"/../../../../../a", "/a"},
  16. {"/../a/../../b", "/b"},
  17. {"/../..a/b", "/..a/b"},
  18. {"/a/..", "/"},
  19. {"/a/.", "/a"},
  20. {"/.//a//./b", "/a/b"},
  21. {"///////.////////////./", "/"},
  22. {"/...././a/../././.../b/.....", "/..../.../b/....."},
  23. {"a/b/c", "a/b/c"},
  24. {"a/../b", "b"},
  25. {"../a", "../a"},
  26. {"../../../../../a", "../../../../../a"},
  27. {"../a/../../b", "../../b"},
  28. {"../..a/b", "../..a/b"},
  29. {"a/..", ""},
  30. {"a/.", "a"},
  31. };
  32. static const char* get_base_name_cases[][2] = {
  33. {"/", ""}, {"/a", "a"}, {"/a/b/c", "c"}, {"/..a/b", "b"},
  34. {"", ""}, {"../a", "a"}, {"../../../../../a", "a"}, {"..a/b", "b"},
  35. {"a/b/c", "c"},
  36. };
  37. #define ARR_LEN(x) (sizeof(x) / sizeof((x)[0]))
  38. #define print_err(name, i, ...) \
  39. do { \
  40. pal_printf("%s: case %lu (\"%s\") ", name, i, cases[i][0]); \
  41. pal_printf(__VA_ARGS__); \
  42. } while (0)
  43. static const char* (*cases)[2];
  44. static size_t cases_len;
  45. static int (*func_to_test)(const char*, char*, size_t*);
  46. static const char* func_name;
  47. static int run_test(void) {
  48. char buf[URI_MAX] = {0};
  49. for (size_t i = 0; i < cases_len; i++) {
  50. size_t size = sizeof(buf);
  51. int ret = func_to_test(cases[i][0], buf, &size);
  52. if (ret < 0) {
  53. print_err(func_name, i, "failed with error: %s\n", pal_strerror(ret));
  54. return 1;
  55. }
  56. if (strlen(buf) != size) {
  57. print_err(func_name, i, "returned wrong size: %zu\n", size);
  58. return 1;
  59. }
  60. if (strcmp(cases[i][1], buf) != 0) {
  61. print_err(func_name, i, "returned: \"%s\", instead of: \"%s\"\n", buf, cases[i][1]);
  62. return 1;
  63. }
  64. }
  65. return 0;
  66. }
  67. int main(void) {
  68. cases = get_norm_path_cases;
  69. cases_len = ARR_LEN(get_norm_path_cases);
  70. func_to_test = get_norm_path;
  71. func_name = "get_norm_path";
  72. if (run_test()) {
  73. return 1;
  74. }
  75. cases = get_base_name_cases;
  76. cases_len = ARR_LEN(get_base_name_cases);
  77. func_to_test = get_base_name;
  78. func_name = "get_base_name";
  79. if (run_test()) {
  80. return 1;
  81. }
  82. pal_printf("Success!\n");
  83. return 0;
  84. }