Converters.txt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. MODULE Converters;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Converters.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Meta, Files, Stores, Dialog;
  5. CONST
  6. (* hints *)
  7. importAll* = 0; (* can import all file types *)
  8. canceled = 8;
  9. TYPE
  10. Importer* = PROCEDURE (f: Files.File; OUT s: Stores.Store);
  11. Exporter* = PROCEDURE (s: Stores.Store; f: Files.File);
  12. Converter* = POINTER TO RECORD
  13. next-: Converter;
  14. imp-, exp-: Dialog.String;
  15. storeType-: Stores.TypeName;
  16. fileType-: Files.Type;
  17. opts-: SET
  18. END;
  19. ImpVal = RECORD (Meta.Value) p: Importer END;
  20. ExpVal = RECORD (Meta.Value) p: Exporter END;
  21. VAR
  22. list-: Converter;
  23. doc: Converter;
  24. PROCEDURE GetCommand (name: Dialog.String; VAR val: Meta.Value; VAR ok: BOOLEAN);
  25. VAR i: Meta.Item;
  26. BEGIN
  27. Meta.LookupPath(name, i);
  28. IF (i.obj = Meta.procObj) OR (i.obj = Meta.varObj) & (i.typ = Meta.procTyp) THEN
  29. i.GetVal(val, ok)
  30. ELSE ok := FALSE
  31. END
  32. END GetCommand;
  33. PROCEDURE Register* (imp, exp: Dialog.String; storeType: Stores.TypeName; fileType: Files.Type; opts: SET);
  34. VAR e, f: Converter;
  35. BEGIN
  36. ASSERT((imp # "") OR (exp # ""), 20); ASSERT(fileType # "", 21);
  37. NEW(e); e.next := NIL;
  38. e.imp := imp; e.exp := exp; e.fileType := fileType; e.storeType := storeType; e.opts := opts;
  39. IF (storeType = "") & (doc = NIL) THEN doc := e END;
  40. IF list = NIL THEN list := e
  41. ELSE f := list;
  42. WHILE f.next # NIL DO f := f.next END;
  43. f.next := e
  44. END
  45. END Register;
  46. PROCEDURE Import* (loc: Files.Locator; name: Files.Name; VAR conv: Converter; OUT s: Stores.Store);
  47. VAR file: Files.File; val: ImpVal; ok: BOOLEAN;
  48. BEGIN
  49. ASSERT(loc # NIL, 20); ASSERT(name # "", 21);
  50. file := Files.dir.Old(loc, name, Files.shared); s := NIL;
  51. IF file # NIL THEN
  52. IF conv = NIL THEN
  53. conv := list;
  54. WHILE (conv # NIL) & ((conv.fileType # file.type) OR (conv.imp = "")) DO conv := conv.next END;
  55. IF conv = NIL THEN
  56. conv := list; WHILE (conv # NIL) & ~(importAll IN conv.opts) DO conv := conv.next END
  57. END
  58. ELSE ASSERT(conv.imp # "", 22)
  59. END;
  60. IF conv # NIL THEN
  61. GetCommand(conv.imp, val, ok);
  62. IF ok THEN val.p(file, s)
  63. ELSE Dialog.ShowMsg("#System:ConverterFailed")
  64. END
  65. ELSE Dialog.ShowMsg("#System:NoConverterFound")
  66. END
  67. END
  68. END Import;
  69. PROCEDURE Export* (loc: Files.Locator; name: Files.Name; conv: Converter; s: Stores.Store);
  70. VAR res: INTEGER; file: Files.File; val: ExpVal; ok: BOOLEAN;
  71. BEGIN
  72. ASSERT(s # NIL, 20); ASSERT(~(s IS Stores.Alien), 21);
  73. ASSERT(loc # NIL, 22); ASSERT(name # "", 23);
  74. file := Files.dir.New(loc, Files.ask); (* fileLoc := loc; *)
  75. IF file # NIL THEN
  76. IF conv = NIL THEN
  77. conv := doc
  78. ELSE ASSERT(conv.exp # "", 24)
  79. END;
  80. GetCommand(conv.exp, val, ok);
  81. IF ok THEN
  82. val.p(s, file);
  83. IF loc.res # canceled THEN
  84. file.Register(name, conv.fileType, Files.ask, res); loc.res := res
  85. END
  86. ELSE Dialog.ShowMsg("#System:ConverterFailed"); loc.res := canceled
  87. END
  88. END
  89. END Export;
  90. BEGIN
  91. list := NIL
  92. END Converters.