Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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