PATHS.ob07 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2018-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE PATHS;
  7. IMPORT STRINGS, UTILS;
  8. CONST
  9. slash = UTILS.slash;
  10. PATHLEN = 2048;
  11. TYPE
  12. PATH* = ARRAY PATHLEN OF CHAR;
  13. PROCEDURE split* (fname: ARRAY OF CHAR; VAR path, name, ext: ARRAY OF CHAR);
  14. VAR
  15. pos1, pos2, len: INTEGER;
  16. BEGIN
  17. len := LENGTH(fname);
  18. pos1 := len - 1;
  19. pos2 := pos1;
  20. STRINGS.search(fname, pos1, slash, FALSE);
  21. STRINGS.search(fname, pos2, ".", FALSE);
  22. path := fname;
  23. path[pos1 + 1] := 0X;
  24. IF (pos2 = -1) OR (pos2 < pos1) THEN
  25. pos2 := len
  26. END;
  27. INC(pos1);
  28. STRINGS.copy(fname, name, pos1, 0, pos2 - pos1);
  29. name[pos2 - pos1] := 0X;
  30. STRINGS.copy(fname, ext, pos2, 0, len - pos2);
  31. ext[len - pos2] := 0X
  32. END split;
  33. PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
  34. VAR
  35. i, j: INTEGER;
  36. error: BOOLEAN;
  37. BEGIN
  38. COPY(absolute, res);
  39. i := LENGTH(res) - 1;
  40. WHILE (i >= 0) & (res[i] # slash) DO
  41. DEC(i)
  42. END;
  43. INC(i);
  44. res[i] := 0X;
  45. error := FALSE;
  46. j := 0;
  47. WHILE (relative[j] = ".") & (relative[j + 1] = slash) DO
  48. INC(j, 2)
  49. ELSIF relative[j] = slash DO
  50. INC(j)
  51. END;
  52. WHILE ~error & (relative[j] # 0X) DO
  53. IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN
  54. DEC(i, 2);
  55. WHILE (i >= 0) & (res[i] # slash) DO
  56. DEC(i)
  57. END;
  58. IF i < 0 THEN
  59. error := TRUE
  60. ELSE
  61. INC(i);
  62. INC(j, 3)
  63. END
  64. ELSE
  65. res[i] := relative[j];
  66. INC(i);
  67. INC(j)
  68. END
  69. END;
  70. IF error THEN
  71. COPY(relative, res)
  72. ELSE
  73. res[i] := 0X
  74. END
  75. END RelPath;
  76. PROCEDURE DelSlashes* (VAR path: ARRAY OF CHAR);
  77. VAR
  78. i, j, k: INTEGER;
  79. c: CHAR;
  80. BEGIN
  81. i := 0;
  82. j := 0;
  83. k := 0;
  84. REPEAT
  85. c := path[j];
  86. INC(j);
  87. IF c = slash THEN
  88. INC(k)
  89. ELSE
  90. k := 0
  91. END;
  92. IF k <= 1 THEN
  93. path[i] := c;
  94. INC(i)
  95. END
  96. UNTIL c = 0X;
  97. i := 0;
  98. j := 0;
  99. REPEAT
  100. c := path[j];
  101. INC(j);
  102. path[i] := c;
  103. INC(i);
  104. IF (c = slash) & (path[j] = ".") & (path[j + 1] = slash) THEN
  105. INC(j, 2)
  106. END
  107. UNTIL c = 0X
  108. END DelSlashes;
  109. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  110. RETURN UTILS.isRelative(path)
  111. END isRelative;
  112. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  113. BEGIN
  114. UTILS.GetCurrentDirectory(path)
  115. END GetCurrentDirectory;
  116. END PATHS.