PATHS.ob07 3.2 KB

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