FileSystem.monkey2 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #Import "<mojo>"
  2. Class DataConversion
  3. Method StringToInt:Int(val:String)
  4. Return Int(val)
  5. End
  6. Method IntToString:String(val:Int)
  7. Return String(val)
  8. End
  9. End
  10. Class FileSystem Extends DataConversion
  11. Field fileData:String=""
  12. Field index:StringMap<FileStream>
  13. Field _header:String="MKYDATA"
  14. Method LoadAll:Void()
  15. Local numFiles:Int=0
  16. Local stream:FileStream
  17. Local len:Int=0
  18. Local ptri:Int=0
  19. ' Self.fileData=LoadState() '********************************************************* fix this ****************
  20. Self.index=New StringMap<FileStream>
  21. If(Self.fileData.Length>0)
  22. If(Self.fileData.StartsWith(Self._header))
  23. Self.index.Clear()
  24. ptri+=Self._header.Length
  25. numFiles=Self.StringToInt(Self.fileData.Mid(ptri,3)) '.[ptr..ptr+3])
  26. ptri+=3
  27. If(numFiles>0)
  28. For Local n:Int=1 To numFiles
  29. stream=New FileStream()
  30. len=Int(Self.fileData.Mid(ptri,3)) ',[ptr..ptr+3])
  31. ptri+=3
  32. If(len>0)
  33. stream.filename=Self.fileData.Mid(ptri,len) '[ptr..ptr+len]
  34. ptri+=len
  35. End
  36. len=Int(Self.fileData.Mid(ptri,3)) '[ptr..ptr+3])
  37. ptri+=3
  38. If(len>0)
  39. stream.data=Self.fileData.Mid(ptri,len) '[ptr..ptr+len]
  40. ptri+=len
  41. End
  42. Self.index.Add(stream.filename,stream)
  43. End
  44. End
  45. End
  46. Else
  47. ' SaveState("") '********************************** fix this *********************************************8
  48. End
  49. End
  50. Method New()
  51. Self.LoadAll()
  52. End
  53. Method FileExists:Bool(filename:String)
  54. filename=filename.ToLower()
  55. If(Self.index.Contains(filename))
  56. Return True
  57. Else
  58. Return False
  59. End
  60. End
  61. Method ReadFile:FileStream(filename:String)
  62. filename=filename.ToLower()
  63. Local f:FileStream
  64. f=Self.index.Get(filename)
  65. f.fileptr=0
  66. Return f
  67. End
  68. Method WriteFile:FileStream(filename:String)
  69. Local f:FileStream= New FileStream()
  70. f.filename=filename.ToLower()
  71. f.fileptr=0
  72. Self.index.Add(f.filename.ToLower(),f)
  73. Return f
  74. End
  75. Method SaveAll:Void()
  76. Local f:FileStream
  77. Self.fileData=Self._header
  78. Self.fileData=Self.fileData+Self.IntToString(Self.index.Count())
  79. If(Self.index.Count()>0)
  80. For f = Eachin Self.index.Values
  81. Self.fileData=Self.fileData+Self.IntToString(f.filename.Length)
  82. If(f.filename.Length>0)
  83. Self.fileData=Self.fileData+f.filename
  84. End
  85. Self.fileData=Self.fileData+Self.IntToString(f.data.Length)
  86. If(f.data.Length>0)
  87. Self.fileData=Self.fileData+f.data
  88. End
  89. End
  90. End
  91. ' SaveState(Self.fileData) '************************* fix ***************************
  92. End
  93. End
  94. Class FileStream Extends DataConversion
  95. Field filename:String=""
  96. Field data:String=""
  97. Field fileptr:Int=0
  98. Method ReadString:String()
  99. Local result:String=""
  100. Local strLen:Int=Int(Self.data.Mid(Self.fileptr,3)) '[Self.fileptr..Self.fileptr+3])
  101. Self.fileptr+=3
  102. If(strLen>0)
  103. result=Self.data.Mid(Self.fileptr,strLen) '[Self.fileptr..Self.fileptr+strLen]
  104. Self.fileptr+=strLen
  105. End
  106. Return result
  107. End
  108. Method ReadInt:Int()
  109. Local result:String=""
  110. result=Self.data.Mid(Self.fileptr,3) '[Self.fileptr..Self.fileptr+3]
  111. Self.fileptr+=3
  112. Return Int(result)
  113. End
  114. Method WriteString:Void(val:String)
  115. Self.data=Self.data+Self.IntToString(val.Length)
  116. If(val.Length>0)
  117. Self.data=Self.data+val
  118. End
  119. End
  120. Method WriteInt:Void(val:Int)
  121. Self.data=Self.data+Self.IntToString(val)
  122. End
  123. End