Subversion Repositories Kolibri OS

Rev

Rev 7983 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2018-2021, 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 := pos1;
  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. END split;
  50.  
  51.  
  52. PROCEDURE RelPath* (absolute, relative: ARRAY OF CHAR; VAR res: ARRAY OF CHAR);
  53. VAR
  54.     i, j: INTEGER;
  55.     error: BOOLEAN;
  56.  
  57. BEGIN
  58.     COPY(absolute, res);
  59.     i := LENGTH(res) - 1;
  60.     WHILE (i >= 0) & (res[i] # slash) DO
  61.         DEC(i)
  62.     END;
  63.  
  64.     INC(i);
  65.     res[i] := 0X;
  66.  
  67.     error := FALSE;
  68.     j := 0;
  69.     WHILE (relative[j] = ".") & (relative[j + 1] = slash) DO
  70.         INC(j, 2)
  71.     ELSIF relative[j] = slash DO
  72.         INC(j)
  73.     END;
  74.  
  75.     WHILE ~error & (relative[j] # 0X) DO
  76.         IF (relative[j] = ".") & (relative[j + 1] = ".") & (relative[j + 2] = slash) & (i > 0) & (res[i - 1] = slash) THEN
  77.             DEC(i, 2);
  78.             WHILE (i >= 0) & (res[i] # slash) DO
  79.                 DEC(i)
  80.             END;
  81.             IF i < 0 THEN
  82.                 error := TRUE
  83.             ELSE
  84.                 INC(i);
  85.                 INC(j, 3)
  86.             END
  87.         ELSE
  88.             res[i] := relative[j];
  89.             INC(i);
  90.             INC(j)
  91.         END
  92.     END;
  93.  
  94.     IF error THEN
  95.         COPY(relative, res)
  96.     ELSE
  97.         res[i] := 0X
  98.     END
  99.  
  100. END RelPath;
  101.  
  102.  
  103. PROCEDURE DelSlashes* (VAR path: ARRAY OF CHAR);
  104. VAR
  105.     i, j, k: INTEGER;
  106.     c: CHAR;
  107.  
  108. BEGIN
  109.     i := 0;
  110.     j := 0;
  111.     k := 0;
  112.     REPEAT
  113.         c := path[j];
  114.         INC(j);
  115.         IF c = slash THEN
  116.             INC(k)
  117.         ELSE
  118.             k := 0
  119.         END;
  120.         IF k <= 1 THEN
  121.             path[i] := c;
  122.             INC(i)
  123.         END
  124.     UNTIL c = 0X;
  125.  
  126.     i := 0;
  127.     j := 0;
  128.     REPEAT
  129.         c := path[j];
  130.         INC(j);
  131.         path[i] := c;
  132.         INC(i);
  133.         IF (c = slash) & (path[j] = ".") & (path[j + 1] = slash) THEN
  134.             INC(j, 2)
  135.         END
  136.     UNTIL c = 0X
  137. END DelSlashes;
  138.  
  139.  
  140. PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
  141.     RETURN UTILS.isRelative(path)
  142. END isRelative;
  143.  
  144.  
  145. PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
  146. BEGIN
  147.     UTILS.GetCurrentDirectory(path)
  148. END GetCurrentDirectory;
  149.  
  150.  
  151. END PATHS.