2
0

RelativeFiles64.Mod 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. MODULE RelativeFiles64; (** AUTHOR "fof"; PURPOSE ""; **)
  2. IMPORT Files := Files64,UTF8Strings, Commands;
  3. TYPE PathName=ARRAY 272 OF CHAR;
  4. FileSystem = OBJECT(Files.FileSystem)
  5. VAR relTo: PathName; fs: Files.FileSystem;
  6. PROCEDURE &InitFileSystem*( relTo: ARRAY OF CHAR; fs: Files.FileSystem);
  7. VAR ch: CHAR;i: SIZE; full: Files.FileName; flags: SET;
  8. BEGIN
  9. SELF.fs := fs;
  10. INCL(flags,Files.NeedsPrefix);
  11. i :=0; ch := 0X;
  12. WHILE(relTo[i] # 0X) DO
  13. ch := relTo[i];
  14. INC(i);
  15. END;
  16. IF (ch = "/") & (i>1) THEN relTo[i-1] := 0X END; (* remove ending "/" *)
  17. IF fs.prefix # "" THEN
  18. RemovePrefix(relTo);
  19. END;
  20. IF fs.Has(relTo,full,flags) THEN
  21. COPY(full,SELF.relTo);
  22. ELSE (* should never happen, but as a fallback: *)
  23. COPY(relTo,SELF.relTo);
  24. END;
  25. END InitFileSystem;
  26. PROCEDURE MakeRel(VAR name,new: ARRAY OF CHAR);
  27. BEGIN
  28. COPY(relTo,new);
  29. RemovePrefix(name);
  30. IF name[0] # "/" THEN UTF8Strings.Append("/",new); END;
  31. UTF8Strings.Append(name,new);
  32. END MakeRel;
  33. PROCEDURE New0* (name: ARRAY OF CHAR): Files.File;
  34. VAR new: PathName;
  35. BEGIN
  36. MakeRel(name,new); RETURN fs.New0(new);
  37. END New0;
  38. PROCEDURE Old0* (name: ARRAY OF CHAR): Files.File;
  39. VAR new: PathName;
  40. BEGIN
  41. (* Out.String("Old0, called with:"); Out.String(name); Out.Ln; *)
  42. MakeRel(name,new);
  43. (* Out.String("Old0, calling with:"); Out.String(new); Out.Ln; *)
  44. RETURN fs.Old0(new);
  45. END Old0;
  46. PROCEDURE CreateDirectory0* (name: ARRAY OF CHAR; VAR res: WORD);
  47. VAR new: PathName;
  48. BEGIN
  49. MakeRel(name,new); fs.CreateDirectory0(new,res);
  50. END CreateDirectory0;
  51. PROCEDURE Delete0* (name: ARRAY OF CHAR; VAR key: LONGINT; VAR res: WORD);
  52. VAR new: PathName;
  53. BEGIN
  54. MakeRel(name,new); fs.Delete0(new,key,res);
  55. END Delete0;
  56. PROCEDURE Enumerate0* (mask: ARRAY OF CHAR; flags: SET; enum: Files.Enumerator);
  57. VAR new: PathName;
  58. BEGIN
  59. MakeRel(mask,new);
  60. fs.Enumerate0(new,flags,enum);
  61. END Enumerate0;
  62. PROCEDURE FileKey* (name: ARRAY OF CHAR): LONGINT;
  63. VAR new: PathName;
  64. BEGIN
  65. (*Out.String("FileKey, called with:"); Out.String(name); Out.Ln; *)
  66. MakeRel(name,new);
  67. (*Out.String("FileKey, calling with:"); Out.String(new); Out.Ln;*)
  68. RETURN fs.FileKey(new);
  69. END FileKey;
  70. PROCEDURE RemoveDirectory0* (name: ARRAY OF CHAR; force: BOOLEAN; VAR key: LONGINT; VAR res: WORD);
  71. VAR new: PathName;
  72. BEGIN
  73. MakeRel(name,new); fs.RemoveDirectory0(new,force,key,res);
  74. END RemoveDirectory0;
  75. PROCEDURE Rename0* (old, new: ARRAY OF CHAR; f: Files.File; VAR res: WORD);
  76. VAR old1,new1: PathName;
  77. BEGIN
  78. MakeRel(old,old1); MakeRel(new,new1);fs.Rename0(old1,new1,f,res);
  79. END Rename0;
  80. END FileSystem;
  81. PROCEDURE RemovePrefix(VAR name: ARRAY OF CHAR);
  82. VAR i,j: SIZE;
  83. BEGIN
  84. WHILE(name[i] # 0X) & (name[i] # ":") DO
  85. INC(i);
  86. END;
  87. IF name[i] = ":" THEN
  88. j := 0; INC(i);
  89. WHILE(name[i] # 0X) DO
  90. name[j] := name[i]; INC(i);INC(j);
  91. END;
  92. name[j] := 0X;
  93. END;
  94. END RemovePrefix;
  95. (** NewFS - Create a new filesystem relative to a Windows path. does not protect paths higher than relTo! (xyz:/../../.. could be used) *)
  96. PROCEDURE NewFS*(context : Files.Parameters);
  97. VAR str,prefix,name, full: ARRAY 256 OF CHAR; fs: FileSystem; rel: Files.FileSystem; ft: Files.FileSystemTable; flags:SET;
  98. BEGIN
  99. IF context.arg.GetString(str) THEN
  100. Files.SplitName(str,prefix,name);
  101. IF prefix # "" THEN
  102. rel := Files.This(prefix);
  103. ELSE
  104. Files.GetList(ft);
  105. rel := ft[0];
  106. END;
  107. IF rel # NIL THEN
  108. IF rel.Has(str,full,flags) THEN
  109. NEW(fs,str,rel);
  110. Files.Add(fs, context.prefix);
  111. ELSE
  112. context.error.String("file system does not contain "); context.error.String(str); context.error.Ln;
  113. END;
  114. ELSE
  115. context.out.String("file system could not be found: "); context.out.String(str); context.out.Ln;
  116. context.result := Commands.CommandError;
  117. END;
  118. END;
  119. END NewFS;
  120. END RelativeFiles64.
  121. System.Free RelativeFiles64 ~
  122. FSTools64.Mount Work RelativeFiles64 ./ ~
  123. FSTools64.Unmount Test ~
  124. System.Directory src:/*