RelativeFileSystem.Mod 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. MODULE RelativeFileSystem ; (** AUTHOR "fof"; PURPOSE ""; **)
  2. IMPORT Files,UTF8Strings;
  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: LONGINT;
  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. COPY(relTo,SELF.relTo);
  21. END InitFileSystem;
  22. PROCEDURE MakeRel(VAR name,new: ARRAY OF CHAR);
  23. BEGIN
  24. COPY(relTo,new);
  25. RemovePrefix(name);
  26. IF name[0] # "/" THEN UTF8Strings.Append("/",new); END;
  27. UTF8Strings.Append(name,new);
  28. END MakeRel;
  29. PROCEDURE New0 (name: ARRAY OF CHAR): Files.File;
  30. VAR new: PathName;
  31. BEGIN
  32. MakeRel(name,new); RETURN fs.New0(new);
  33. END New0;
  34. PROCEDURE Old0 (name: ARRAY OF CHAR): Files.File;
  35. VAR new: PathName;
  36. BEGIN
  37. (* Out.String("Old0, called with:"); Out.String(name); Out.Ln; *)
  38. MakeRel(name,new);
  39. (* Out.String("Old0, calling with:"); Out.String(new); Out.Ln; *)
  40. RETURN fs.Old0(new);
  41. END Old0;
  42. PROCEDURE CreateDirectory0 (name: ARRAY OF CHAR; VAR res: LONGINT);
  43. VAR new: PathName;
  44. BEGIN
  45. MakeRel(name,new); fs.CreateDirectory0(new,res);
  46. END CreateDirectory0;
  47. PROCEDURE Delete0 (name: ARRAY OF CHAR; VAR key, res: LONGINT);
  48. VAR new: PathName;
  49. BEGIN
  50. MakeRel(name,new); fs.Delete0(new,key,res);
  51. END Delete0;
  52. PROCEDURE Enumerate0 (mask: ARRAY OF CHAR; flags: SET; enum: Files.Enumerator);
  53. VAR new: PathName;
  54. BEGIN
  55. MakeRel(mask,new);
  56. fs.Enumerate0(new,flags,enum);
  57. END Enumerate0;
  58. PROCEDURE FileKey (name: ARRAY OF CHAR): LONGINT;
  59. VAR new: PathName;
  60. BEGIN
  61. (*Out.String("FileKey, called with:"); Out.String(name); Out.Ln; *)
  62. MakeRel(name,new);
  63. (*Out.String("FileKey, calling with:"); Out.String(new); Out.Ln;*)
  64. RETURN fs.FileKey(new);
  65. END FileKey;
  66. PROCEDURE RemoveDirectory0 (name: ARRAY OF CHAR; force: BOOLEAN; VAR key, res: LONGINT);
  67. VAR new: PathName;
  68. BEGIN
  69. MakeRel(name,new); fs.RemoveDirectory0(new,force,key,res);
  70. END RemoveDirectory0;
  71. PROCEDURE Rename0 (old, new: ARRAY OF CHAR; f: Files.File; VAR res: LONGINT);
  72. VAR old1,new1: PathName;
  73. BEGIN
  74. MakeRel(old,old1); MakeRel(new,new1);fs.Rename0(old1,new1,f,res);
  75. END Rename0;
  76. END FileSystem;
  77. PROCEDURE RemovePrefix(VAR name: ARRAY OF CHAR);
  78. VAR i,j: LONGINT;
  79. BEGIN
  80. WHILE(name[i] # 0X) & (name[i] # ":") DO
  81. INC(i);
  82. END;
  83. IF name[i] = ":" THEN
  84. j := 0; INC(i);
  85. WHILE(name[i] # 0X) DO
  86. name[j] := name[i]; INC(i);INC(j);
  87. END;
  88. name[j] := 0X;
  89. END;
  90. END RemovePrefix;
  91. (** NewFS - Create a new filesystem relative to a Windows path. does not protect paths higher than relTo! (xyz:/../../.. could be used) *)
  92. PROCEDURE NewFS*(context : Files.Parameters);
  93. VAR str,prefix,name: ARRAY 256 OF CHAR; fs: FileSystem; rel: Files.FileSystem; ft: Files.FileSystemTable;
  94. BEGIN
  95. IF context.arg.GetString(str) THEN
  96. Files.SplitName(str,prefix,name);
  97. IF prefix # "" THEN
  98. rel := Files.This(prefix);
  99. ELSE
  100. Files.GetList(ft);
  101. rel := ft[0];
  102. END;
  103. IF rel # NIL THEN
  104. NEW(fs,str,rel);
  105. Files.Add(fs, context.prefix);
  106. ELSE
  107. context.out.String("file system could not be found: "); context.out.String(str); context.out.Ln;
  108. END;
  109. END;
  110. END NewFS;
  111. END RelativeFileSystem.
  112. SystemTools.Free RelativeFileSystem ~
  113. FSTools.Mount Work RelativeFileSystem ./ ~
  114. FSTools.Unmount Test ~
  115. System.Directory src:/*