PATHS.ob07 3.1 KB

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