dsktool 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. data/bin/dskexplorer.rb +15 -4
  2. data/bin/dskexplorer.rb~ +275 -0
  3. data/bin/dsktool.rb +1 -1
  4. data/bin/dsktool.rb~ +150 -0
  5. data/lib/DSK.rb~ +134 -0
  6. data/test/tc_dos_disks.rb~ +79 -0
  7. metadata +65 -252
  8. data/doc/classes/AppleSoftFile.src/M000011.html +0 -18
  9. data/doc/classes/AppleSoftFile.src/M000012.html +0 -18
  10. data/doc/classes/AppleSoftFile.src/M000013.html +0 -18
  11. data/doc/classes/AppleSoftFile.src/M000014.html +0 -18
  12. data/doc/classes/AppleSoftFile.src/M000020.html +0 -18
  13. data/doc/classes/AppleSoftFile.src/M000021.html +0 -18
  14. data/doc/classes/AppleSoftFile.src/M000022.html +0 -18
  15. data/doc/classes/AppleSoftFile.src/M000026.html +0 -18
  16. data/doc/classes/AppleSoftFile.src/M000027.html +0 -18
  17. data/doc/classes/AppleSoftFile.src/M000028.html +0 -18
  18. data/doc/classes/BinaryFile.src/M000023.html +0 -18
  19. data/doc/classes/BinaryFile.src/M000024.html +0 -18
  20. data/doc/classes/BinaryFile.src/M000025.html +0 -18
  21. data/doc/classes/BinaryFile.src/M000026.html +0 -19
  22. data/doc/classes/BinaryFile.src/M000029.html +0 -18
  23. data/doc/classes/BinaryFile.src/M000030.html +0 -18
  24. data/doc/classes/BinaryFile.src/M000031.html +0 -19
  25. data/doc/classes/BinaryFile.src/M000039.html +0 -18
  26. data/doc/classes/BinaryFile.src/M000040.html +0 -18
  27. data/doc/classes/BinaryFile.src/M000041.html +0 -19
  28. data/doc/classes/BinaryFile.src/M000045.html +0 -18
  29. data/doc/classes/BinaryFile.src/M000046.html +0 -18
  30. data/doc/classes/BinaryFile.src/M000047.html +0 -19
  31. data/doc/classes/CatalogServlet.html +0 -146
  32. data/doc/classes/CatalogServlet.src/M000015.html +0 -20
  33. data/doc/classes/CatalogServlet.src/M000021.html +0 -20
  34. data/doc/classes/D65.src/M000009.html +0 -18
  35. data/doc/classes/D65.src/M000010.html +0 -18
  36. data/doc/classes/D65.src/M000011.html +0 -64
  37. data/doc/classes/D65.src/M000018.html +0 -18
  38. data/doc/classes/D65.src/M000019.html +0 -64
  39. data/doc/classes/D65.src/M000024.html +0 -18
  40. data/doc/classes/D65.src/M000025.html +0 -64
  41. data/doc/classes/DOSDisk.src/M000014.html +0 -20
  42. data/doc/classes/DOSDisk.src/M000015.html +0 -20
  43. data/doc/classes/DOSDisk.src/M000016.html +0 -19
  44. data/doc/classes/DOSDisk.src/M000017.html +0 -76
  45. data/doc/classes/DOSDisk.src/M000023.html +0 -20
  46. data/doc/classes/DOSDisk.src/M000024.html +0 -19
  47. data/doc/classes/DOSDisk.src/M000025.html +0 -76
  48. data/doc/classes/DOSDisk.src/M000029.html +0 -20
  49. data/doc/classes/DOSDisk.src/M000030.html +0 -19
  50. data/doc/classes/DOSDisk.src/M000031.html +0 -76
  51. data/doc/classes/DOSFile.src/M000026.html +0 -22
  52. data/doc/classes/DOSFile.src/M000027.html +0 -22
  53. data/doc/classes/DOSFile.src/M000028.html +0 -17
  54. data/doc/classes/DOSFile.src/M000029.html +0 -18
  55. data/doc/classes/DOSFile.src/M000032.html +0 -22
  56. data/doc/classes/DOSFile.src/M000033.html +0 -17
  57. data/doc/classes/DOSFile.src/M000034.html +0 -18
  58. data/doc/classes/DOSFile.src/M000042.html +0 -22
  59. data/doc/classes/DOSFile.src/M000043.html +0 -18
  60. data/doc/classes/DOSFile.src/M000044.html +0 -18
  61. data/doc/classes/DOSFile.src/M000048.html +0 -22
  62. data/doc/classes/DOSFile.src/M000049.html +0 -18
  63. data/doc/classes/DOSFile.src/M000050.html +0 -18
  64. data/doc/classes/DOSFile.src/M000051.html +0 -31
  65. data/doc/classes/DSK.src/M000021.html +0 -19
  66. data/doc/classes/DSK.src/M000022.html +0 -18
  67. data/doc/classes/DSK.src/M000023.html +0 -40
  68. data/doc/classes/DSK.src/M000024.html +0 -23
  69. data/doc/classes/DSK.src/M000027.html +0 -18
  70. data/doc/classes/DSK.src/M000028.html +0 -22
  71. data/doc/classes/DSK.src/M000029.html +0 -22
  72. data/doc/classes/DSK.src/M000030.html +0 -34
  73. data/doc/classes/DSK.src/M000031.html +0 -19
  74. data/doc/classes/DSK.src/M000032.html +0 -18
  75. data/doc/classes/DSK.src/M000033.html +0 -18
  76. data/doc/classes/DSK.src/M000034.html +0 -22
  77. data/doc/classes/DSK.src/M000035.html +0 -22
  78. data/doc/classes/DSK.src/M000036.html +0 -34
  79. data/doc/classes/DSK.src/M000037.html +0 -19
  80. data/doc/classes/DSK.src/M000038.html +0 -18
  81. data/doc/classes/DSK.src/M000039.html +0 -40
  82. data/doc/classes/DSK.src/M000040.html +0 -23
  83. data/doc/classes/DirectoryServlet.html +0 -146
  84. data/doc/classes/DirectoryServlet.src/M000017.html +0 -20
  85. data/doc/classes/DirectoryServlet.src/M000023.html +0 -20
  86. data/doc/classes/IntegerBasicFile.src/M000006.html +0 -18
  87. data/doc/classes/IntegerBasicFile.src/M000007.html +0 -18
  88. data/doc/classes/IntegerBasicFile.src/M000008.html +0 -18
  89. data/doc/classes/IntegerBasicFile.src/M000012.html +0 -18
  90. data/doc/classes/IntegerBasicFile.src/M000013.html +0 -18
  91. data/doc/classes/IntegerBasicFile.src/M000014.html +0 -18
  92. data/doc/classes/IntegerBasicFile.src/M000018.html +0 -18
  93. data/doc/classes/IntegerBasicFile.src/M000019.html +0 -18
  94. data/doc/classes/IntegerBasicFile.src/M000020.html +0 -18
  95. data/doc/classes/RDoc.html +0 -141
  96. data/doc/classes/RDoc.src/M000032.html +0 -40
  97. data/doc/classes/RDoc.src/M000033.html +0 -40
  98. data/doc/classes/RDoc.src/M000038.html +0 -40
  99. data/doc/classes/RDoc.src/M000048.html +0 -40
  100. data/doc/classes/RDoc.src/M000055.html +0 -40
  101. data/doc/classes/SCAsmFile.html +0 -226
  102. data/doc/classes/SCAsmFile.src/M000025.html +0 -18
  103. data/doc/classes/SCAsmFile.src/M000026.html +0 -18
  104. data/doc/classes/SCAsmFile.src/M000027.html +0 -18
  105. data/doc/classes/SCAsmFile.src/M000028.html +0 -36
  106. data/doc/classes/SCAsmFile.src/M000035.html +0 -18
  107. data/doc/classes/SCAsmFile.src/M000036.html +0 -18
  108. data/doc/classes/SCAsmFile.src/M000037.html +0 -18
  109. data/doc/classes/SCAsmFile.src/M000038.html +0 -36
  110. data/doc/classes/SCAsmFile.src/M000041.html +0 -18
  111. data/doc/classes/SCAsmFile.src/M000042.html +0 -18
  112. data/doc/classes/SCAsmFile.src/M000043.html +0 -18
  113. data/doc/classes/SCAsmFile.src/M000044.html +0 -36
  114. data/doc/classes/ShowFileServlet.html +0 -146
  115. data/doc/classes/ShowFileServlet.src/M000026.html +0 -21
  116. data/doc/classes/ShowFileServlet.src/M000032.html +0 -22
  117. data/doc/classes/TestDOSDisks.src/M000004.html +0 -41
  118. data/doc/classes/TestDOSDisks.src/M000005.html +0 -27
  119. data/doc/classes/TestDOSDisks.src/M000006.html +0 -24
  120. data/doc/classes/TestDOSDisks.src/M000007.html +0 -19
  121. data/doc/classes/TestDOSDisks.src/M000008.html +0 -19
  122. data/doc/classes/TestDOSDisks.src/M000009.html +0 -25
  123. data/doc/classes/TestDOSDisks.src/M000010.html +0 -41
  124. data/doc/classes/TestDOSDisks.src/M000011.html +0 -27
  125. data/doc/classes/TestDOSDisks.src/M000012.html +0 -24
  126. data/doc/classes/TestDOSDisks.src/M000013.html +0 -19
  127. data/doc/classes/TestDOSDisks.src/M000014.html +0 -19
  128. data/doc/classes/TestDOSDisks.src/M000015.html +0 -25
  129. data/doc/classes/TestDOSDisks.src/M000016.html +0 -41
  130. data/doc/classes/TestDOSDisks.src/M000017.html +0 -27
  131. data/doc/classes/TestDisassembly.src/M000007.html +0 -19
  132. data/doc/classes/TestDisassembly.src/M000008.html +0 -19
  133. data/doc/classes/TestDisassembly.src/M000009.html +0 -19
  134. data/doc/classes/TestDisassembly.src/M000016.html +0 -19
  135. data/doc/classes/TestDisassembly.src/M000022.html +0 -19
  136. data/doc/classes/TextFile.src/M000029.html +0 -18
  137. data/doc/classes/TextFile.src/M000030.html +0 -18
  138. data/doc/classes/TextFile.src/M000031.html +0 -18
  139. data/doc/classes/TextFile.src/M000032.html +0 -20
  140. data/doc/classes/TextFile.src/M000035.html +0 -18
  141. data/doc/classes/TextFile.src/M000036.html +0 -18
  142. data/doc/classes/TextFile.src/M000037.html +0 -20
  143. data/doc/classes/TextFile.src/M000045.html +0 -18
  144. data/doc/classes/TextFile.src/M000046.html +0 -18
  145. data/doc/classes/TextFile.src/M000047.html +0 -20
  146. data/doc/classes/TextFile.src/M000052.html +0 -18
  147. data/doc/classes/TextFile.src/M000053.html +0 -18
  148. data/doc/classes/TextFile.src/M000054.html +0 -20
  149. data/doc/dot/f_0.dot +0 -58
  150. data/doc/dot/f_0.png +0 -0
  151. data/doc/dot/f_1.dot +0 -14
  152. data/doc/dot/f_1.png +0 -0
  153. data/doc/dot/f_2.dot +0 -23
  154. data/doc/dot/f_2.png +0 -0
  155. data/doc/dot/f_3.dot +0 -32
  156. data/doc/dot/f_3.png +0 -0
  157. data/doc/dot/f_4.dot +0 -88
  158. data/doc/dot/f_4.png +0 -0
  159. data/doc/dot/f_5.dot +0 -23
  160. data/doc/dot/f_5.png +0 -0
  161. data/doc/dot/f_6.dot +0 -30
  162. data/doc/dot/f_6.png +0 -0
  163. data/doc/dot/f_7.dot +0 -32
  164. data/doc/dot/f_7.png +0 -0
  165. data/doc/dot/f_8.dot +0 -32
  166. data/doc/dot/f_8.png +0 -0
  167. data/doc/dot/f_9.dot +0 -14
  168. data/doc/dot/f_9.png +0 -0
  169. data/doc/dot/m_0_0.dot +0 -30
  170. data/doc/dot/m_0_0.png +0 -0
  171. data/doc/dot/m_6_0.dot +0 -30
  172. data/doc/dot/m_6_0.png +0 -0
  173. data/doc/files/bin/dskexplorer_rb.html +0 -339
  174. data/doc/files/bin/dskexplorer_rb.src/M000001.html +0 -21
  175. data/doc/files/bin/dskexplorer_rb.src/M000002.html +0 -21
  176. data/doc/files/bin/dskexplorer_rb.src/M000003.html +0 -22
  177. data/doc/files/bin/dskexplorer_rb.src/M000004.html +0 -19
  178. data/doc/files/bin/dskexplorer_rb.src/M000005.html +0 -20
  179. data/doc/files/bin/dskexplorer_rb.src/M000006.html +0 -22
  180. data/doc/files/bin/dskexplorer_rb.src/M000007.html +0 -20
  181. data/doc/files/bin/dskexplorer_rb.src/M000008.html +0 -43
  182. data/doc/files/bin/dskexplorer_rb.src/M000009.html +0 -55
  183. data/doc/files/bin/dskexplorer_rb.src/M000010.html +0 -43
  184. data/doc/files/bin/dskexplorer_rb.src/M000011.html +0 -34
  185. data/doc/files/bin/dskserver_rb.html +0 -247
  186. data/doc/files/bin/dskserver_rb.src/M000001.html +0 -22
  187. data/doc/files/bin/dskserver_rb.src/M000002.html +0 -19
  188. data/doc/files/bin/dskserver_rb.src/M000003.html +0 -62
  189. data/doc/files/bin/dskserver_rb.src/M000004.html +0 -39
  190. data/doc/files/bin/dskserver_rb.src/M000005.html +0 -26
  191. data/doc/files/lib/rdoc_patch_rb.html +0 -114
  192. data/test/white_11a.dsk +0 -0
data/bin/dskexplorer.rb CHANGED
@@ -1,16 +1,21 @@
1
1
  #!/usr/bin/ruby
2
- # dskserver.rb
2
+ # dskexplorer.rb
3
3
  #
4
4
  # == Synopsis
5
5
  # A web-based DSK file explorer
6
6
  #
7
7
  # == Usage
8
- # dskserver.rb [switches]
8
+ # dskexplorer.rb [switches]
9
9
  #
10
10
  # -h | --help display this message
11
11
  # -p | --port PORT_NUMBER port number to listen on (default is 6052)
12
12
  # -r | --root ROOT_DIR root directory to explore from (default is current directory)
13
13
  # -v | --version show version number
14
+ #
15
+ # Examples
16
+ # dskexplorer.rb -r http://www.apple2.org.za/mirrors/
17
+ # dskexplorer.rb -r c:\downloads\apple2\ -p 8080
18
+
14
19
 
15
20
  #make sure the relevant folder with our libraries is in the require path
16
21
  lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
@@ -18,14 +23,14 @@ $:.unshift(lib_path) unless $:.include?(lib_path)
18
23
 
19
24
  require 'optparse'
20
25
  require 'rdoc_patch' #RDoc::usage patched to work under gem executables
21
- DSKSERVER_VERSION="0.1.0"
26
+ dskexplorer_VERSION="0.1.0"
22
27
 
23
28
  @listening_port=6502
24
29
  @@root_directory="."
25
30
  opts=OptionParser.new
26
31
  opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
27
32
  opts.on("-v","--version") do
28
- puts File.basename($0)+" "+DSKSERVER_VERSION
33
+ puts File.basename($0)+" "+dskexplorer_VERSION
29
34
  exit
30
35
  end
31
36
  opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
@@ -62,6 +67,7 @@ def common_header
62
67
  end
63
68
  def common_footer
64
69
  "
70
+ <p><i>this is alpha software - please send feedback using the <a href=http://rubyforge.org/tracker/?group_id=3844> dsktool.rb forum</a><p>
65
71
  "
66
72
  end
67
73
 
@@ -226,6 +232,8 @@ class ShowFileServlet < HTTPServlet::AbstractServlet
226
232
  end
227
233
  end
228
234
 
235
+
236
+
229
237
  s=HTTPServer.new(
230
238
  :Port=>@listening_port
231
239
  )
@@ -235,6 +243,9 @@ s.mount("/dir",DirectoryServlet)
235
243
  s.mount("/catalog",CatalogServlet)
236
244
  s.mount("/showfile",ShowFileServlet)
237
245
 
246
+ #default page - for now, just redirect to the default dir page
247
+ s.mount("/",DirectoryServlet)
248
+
238
249
  puts "point your browser at http://localhost:#{@listening_port}/"
239
250
  s.start
240
251
 
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/ruby
2
+ # dskserver.rb
3
+ #
4
+ # == Synopsis
5
+ # A web-based DSK file explorer
6
+ #
7
+ # == Usage
8
+ # dskserver.rb [switches]
9
+ #
10
+ # -h | --help display this message
11
+ # -p | --port PORT_NUMBER port number to listen on (default is 6052)
12
+ # -r | --root ROOT_DIR root directory to explore from (default is current directory)
13
+ # -v | --version show version number
14
+ #
15
+ # Examples
16
+ # dskexplorer.rb -r http://www.apple2.org.za/mirrors/
17
+ # dskexplorer.rb -r c:\downloads\apple2\ -p 8080
18
+
19
+
20
+ #make sure the relevant folder with our libraries is in the require path
21
+ lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
22
+ $:.unshift(lib_path) unless $:.include?(lib_path)
23
+
24
+ require 'optparse'
25
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
26
+ DSKSERVER_VERSION="0.1.0"
27
+
28
+ @listening_port=6502
29
+ @@root_directory="."
30
+ opts=OptionParser.new
31
+ opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
32
+ opts.on("-v","--version") do
33
+ puts File.basename($0)+" "+DSKSERVER_VERSION
34
+ exit
35
+ end
36
+ opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
37
+ opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
38
+
39
+ filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
40
+
41
+ require 'webrick'
42
+ require 'DSK'
43
+ include WEBrick
44
+
45
+ @@uri_cache={}
46
+ @@dsk_cache={}
47
+ def get_uri_from_cache(uri)
48
+ if @@uri_cache[uri].nil? then
49
+ @@uri_cache[uri]=open(uri).read
50
+ end
51
+ @@uri_cache[uri]
52
+ end
53
+
54
+ def get_dsk_from_cache(uri)
55
+ if @@dsk_cache[uri].nil? then
56
+ @@dsk_cache[uri]=DSK.read(uri)
57
+ end
58
+ @@dsk_cache[uri]
59
+ end
60
+
61
+ def common_header
62
+ "
63
+ <html>
64
+ <body>
65
+ <B>DSK Explorer</b><br>
66
+ "
67
+ end
68
+ def common_footer
69
+ "
70
+ <p><i>this is alpha software - please send feedback using the <a href=http://rubyforge.org/tracker/?group_id=3844> dsktool.rb forum</a><p>
71
+ "
72
+ end
73
+
74
+ def root_dir_is_website?
75
+ require 'hpricot'
76
+ require 'open-uri'
77
+ @@root_directory=~/^http[s]?:/?true : false
78
+ end
79
+ def make_absolute_path(relative_path)
80
+ if root_dir_is_website? then
81
+ @@root_directory+uri_encode(relative_path)
82
+ else
83
+ @@root_directory+relative_path
84
+ end
85
+ end
86
+
87
+ def uri_encode(s)
88
+ #standard URI.escape appears to miss some important characters
89
+ require 'uri'
90
+ URI.escape(s).sub("[","%5b").sub("]","%5d")
91
+ end
92
+ def get_directories_and_files(relative_path)
93
+ directories=[]
94
+ dsk_files=[]
95
+ absolute_path=make_absolute_path(relative_path)
96
+ if root_dir_is_website? then
97
+ html=get_uri_from_cache(absolute_path)
98
+ doc=Hpricot(html)
99
+ doc.search("a[@href]").each do |a|
100
+ href=URI.unescape(a.attributes["href"])
101
+ if (href=~/\w\/$/)
102
+ if !(href=~/^\//) then #directories end with a /, but skip absolute paths
103
+ directories<<(href)
104
+ end
105
+ elsif DSK.is_dsk_file?(href) then
106
+ dsk_files<<(href)
107
+ end
108
+ end
109
+ else
110
+ if File.exist?(absolute_path) && (File.stat(absolute_path).directory?) then
111
+ dir=Dir.new(absolute_path)
112
+ dir.each do |f|
113
+ directories<<f if (f[0].chr!=".") && (File.stat(absolute_path+"/"+f).directory?)
114
+ dsk_files<<f if (DSK.is_dsk_file?(f))
115
+ end
116
+ end
117
+ end
118
+ [directories,dsk_files]
119
+ end
120
+
121
+ def make_navigation_path(relative_path,filename=nil)
122
+ path_parts=relative_path.split("/")
123
+ #make the cookie-crumb-trail
124
+ partial_path=""
125
+ s="<a href=/dir/>#{@@root_directory}</a>"
126
+ path_parts.each do |p|
127
+ if p.length>0 then
128
+ partial_path+="/#{p}"
129
+ if DSK.is_dsk_file?(partial_path) then
130
+ s+="/<a href=/catalog#{uri_encode(partial_path)}>#{p}</a>"
131
+ else
132
+ s+="/<a href=/dir#{uri_encode(partial_path)}>#{p}</a>"
133
+ end
134
+ end
135
+ end
136
+
137
+ if !filename.nil? then
138
+ s+="/<a href=/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(filename)}>#{filename}</a>"
139
+ end
140
+
141
+
142
+ #show the contents of the current directory
143
+ directories,dsk_files=get_directories_and_files(relative_path)
144
+
145
+ #list out the directories
146
+
147
+ s+="<ul>"
148
+ #s+="<li>[dir] <a href=/#{uri_encode('/dir/'+File.dirname(relative_path))}>..</a>\n"
149
+ directories.sort.each do |d|
150
+ s+="<li>[dir] <a href=/dir/#{uri_encode(relative_path)}/#{uri_encode(d)}>#{d}</a>\n"
151
+ end
152
+
153
+ #list out the DSK files
154
+ dsk_files.sort.each do |f|
155
+ s+="<li>[dsk] <a href=/catalog/#{uri_encode(relative_path)}/#{uri_encode(f)}>#{f}</a> [ <a href=#{uri_encode(@@root_directory+relative_path+'/'+f)}>download</a> ]\n"
156
+ end
157
+ s+="</ul>"
158
+
159
+ s
160
+ end
161
+ def make_catalog(relative_path)
162
+ s="<p>"
163
+ begin
164
+ absolute_path=make_absolute_path(relative_path)
165
+ dsk=get_dsk_from_cache(absolute_path)
166
+ if (dsk.is_dos33?) then
167
+ s+="<table>\n<th>TYPE</th><th>SECTORS</th><th>NAME</th></tr>\n"
168
+ dsk.files.each_value do |f|
169
+ display_url="/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(f.filename)}"
170
+ s+="<td>#{f.file_type}</td><td>#{sprintf('%03d',f.sector_count)}</td><td>#{f.filename}</td>"
171
+ s+="<td><a href=#{display_url}&mode=hex>hex dump</a></td>"
172
+ if f.file_type=="T" then
173
+ s+="<td><a href=#{display_url}&mode=text>text</a></td>"
174
+ else
175
+ s+="<td><a href=#{display_url}&mode=list>listing</a></td>"
176
+ end
177
+
178
+ s+="</tr>\n"
179
+ end
180
+ s+="</table>"
181
+ else
182
+ s+="<i>not DOS 3.3 format</i>"
183
+ end
184
+ rescue Exception => exception
185
+ s+="<i>ERROR:#{exception}</i>"
186
+ end
187
+ s
188
+ end
189
+ def show_file(relative_path,filename,display_mode)
190
+ absolute_path=make_absolute_path(relative_path)
191
+ dsk=get_dsk_from_cache(absolute_path)
192
+ file=dsk.files[filename]
193
+ if file.nil? then
194
+ s="<i>#{filename} not found</i>"
195
+ else
196
+ s="<hl><pre>"
197
+ if display_mode=="hex" then
198
+ s+=file.hex_dump
199
+ elsif display_mode=="list" && file.file_type=='B'
200
+ then s+=file.disassembly
201
+ else
202
+ s+= file.to_s
203
+ end
204
+ s+="\n</pre><hl>"
205
+ end
206
+ s
207
+ end
208
+
209
+ class DirectoryServlet < HTTPServlet::AbstractServlet
210
+ def do_GET(req,res)
211
+ relative_path=URI.unescape(req.path).sub(/^\/dir/,"")
212
+ res['Content-Type']="text/html"
213
+ res.body=common_header+make_navigation_path(relative_path)+common_footer
214
+ end
215
+ end
216
+
217
+ class CatalogServlet < HTTPServlet::AbstractServlet
218
+ def do_GET(req,res)
219
+ relative_path=URI.unescape(req.path).sub(/^\/catalog/,"")
220
+ res['Content-Type']="text/html"
221
+ res.body=common_header+make_navigation_path(relative_path)+make_catalog(relative_path)+common_footer
222
+ end
223
+ end
224
+
225
+ class ShowFileServlet < HTTPServlet::AbstractServlet
226
+ def do_GET(req,res)
227
+ relative_path=URI.unescape(req.path).sub(/^\/showfile/,"")
228
+ filename=URI.unescape(req.query['filename'])
229
+ display_mode=req.query['mode']
230
+ res['Content-Type']="text/html"
231
+ res.body=common_header+make_navigation_path(relative_path,filename)+show_file(relative_path,filename,display_mode)+common_footer
232
+ end
233
+ end
234
+
235
+
236
+
237
+ s=HTTPServer.new(
238
+ :Port=>@listening_port
239
+ )
240
+ trap("INT") {s.shutdown}
241
+
242
+ s.mount("/dir",DirectoryServlet)
243
+ s.mount("/catalog",CatalogServlet)
244
+ s.mount("/showfile",ShowFileServlet)
245
+
246
+ #default page - for now, just redirect to the default dir page
247
+ s.mount("/",DirectoryServlet)
248
+
249
+ puts "point your browser at http://localhost:#{@listening_port}/"
250
+ s.start
251
+
252
+ # == Author
253
+ # Jonno Downes (jonno@jamtronix.com)
254
+ #
255
+ # == Copyright
256
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
257
+ #
258
+ #Permission is hereby granted, free of charge, to any person obtaining
259
+ #a copy of this software and associated documentation files (the
260
+ #"Software"), to deal in the Software without restriction, including
261
+ #without limitation the rights to use, copy, modify, merge, publish,
262
+ #distribute, sublicense, and/or sell copies of the Software, and to
263
+ #permit persons to whom the Software is furnished to do so, subject to
264
+ #the following conditions:
265
+ #
266
+ # The above copyright notice and this permission notice shall be
267
+ # included in all copies or substantial portions of the Software.
268
+ #
269
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
270
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
271
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
272
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
273
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
274
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
275
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/dsktool.rb CHANGED
@@ -33,7 +33,7 @@
33
33
  # dsktool.rb -x DOS3MASTR.dsk.gz -o /tmp/DOS3MASTR/
34
34
  # dsktool.rb -c http://jamtronix.com/dsks/apshai.dsk.gz
35
35
 
36
- DSKTOOL_VERSION="0.1.5"
36
+ DSKTOOL_VERSION="0.1.6"
37
37
 
38
38
  #make sure the relevant folder with our libraries is in the require path
39
39
  lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
data/bin/dsktool.rb~ ADDED
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/ruby
2
+ # dsktool.rb
3
+ #
4
+ # == Synopsis
5
+ #
6
+ # Manipulate DSK format files (as used by Apple 2 emulators)
7
+ #
8
+ # == Usage
9
+ #
10
+ # dsktool.rb [switches] <filename.dsk>
11
+ # -c | --catalog display catalog
12
+ # -e | --extract FILENAME extract file by name (either to stdout,
13
+ # or file specified by --output)
14
+ # -h | --help display this message
15
+ # -d | --dump FILENAME hex dump
16
+ # -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
17
+ # -o | --output FILENAME specify name to save extracted file as
18
+ # -r | --raw don't convert basic files to ASCII
19
+ # -x | --explode extract all files
20
+ # -v | --version show version number
21
+ #
22
+ # Currently only works with DOS 3.3 format DSK images
23
+ # Will uncompress gzipped files (with extension .gz)
24
+ # input files can be URLs
25
+ #
26
+ # examples:
27
+ # dsktool.rb -c DOS3MASTR.dsk.gz
28
+ # dsktool.rb -l FID DOS3MASTR.dsk
29
+ # dsktool.rb --list fid -o fid.lst DOS3MASTR.dsk
30
+ # dsktool.rb --extract "COLOR DEMOSOFT" DOS3MASTR.dsk
31
+ # dsktool.rb -e HELLO -o HELLO.bas DOS3MASTR.dsk
32
+ # dsktool.rb -x DOS3MASTR.dsk.gz
33
+ # dsktool.rb -x DOS3MASTR.dsk.gz -o /tmp/DOS3MASTR/
34
+ # dsktool.rb -c http://jamtronix.com/dsks/apshai.dsk.gz
35
+
36
+ DSKTOOL_VERSION="0.1.5"
37
+
38
+ #make sure the relevant folder with our libraries is in the require path
39
+ lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
40
+ $:.unshift(lib_path) unless $:.include?(lib_path)
41
+
42
+ require 'optparse'
43
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
44
+
45
+ catalog=false
46
+ explode=false
47
+ output_filename=nil
48
+ extract_filename=nil
49
+ extract_mode=:default
50
+ explode_directory=nil
51
+ opts=OptionParser.new
52
+ opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
53
+ opts.on("-v","--version") do
54
+ puts File.basename($0)+" "+DSKTOOL_VERSION
55
+ exit
56
+ end
57
+ opts.on("-r","--raw") {extract_mode=:raw}
58
+ opts.on("-c","--catalog") {catalog=true}
59
+ opts.on("-x","--explode") {explode=true}
60
+ opts.on("-l","--list FILENAME",String) do |val|
61
+ extract_filename=val.upcase
62
+ extract_mode=:list
63
+ end
64
+ opts.on("-d","--dump FILENAME",String) do |val|
65
+ extract_filename=val.upcase
66
+ extract_mode=:hex
67
+ end
68
+ opts.on("-e","--extract FILENAME",String) {|val| extract_filename=val.upcase}
69
+ opts.on("-o","--output FILENAME",String) {|val| output_filename=val}
70
+ filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
71
+ RDoc::usage_from_file(__FILE__,'Usage') if (filename.nil?)
72
+
73
+
74
+ require 'DSK'
75
+ dsk=DSK.read(filename)
76
+ output_file= case
77
+ when (output_filename.nil?) || (explode) then STDOUT
78
+ else File.open(output_filename,"wb")
79
+ end
80
+
81
+ if(catalog) then
82
+ if (dsk.is_dos33?) then
83
+ dsk.dump_catalog
84
+ else
85
+ puts "#{filename} is not in DOS 3.3 format"
86
+ end
87
+ end
88
+
89
+ if(explode) then
90
+ output_dir=output_filename.nil??File.basename(filename,".*"):output_filename
91
+ if !(File.exists?(output_dir)) then
92
+ Dir.mkdir(output_dir)
93
+ end
94
+
95
+ dsk.files.each_value do |f|
96
+ if (raw_mode) then
97
+ output_filename=output_dir+"/"+f.filename+".raw"
98
+ File.open(output_filename,"wb") <<f.contents
99
+ else
100
+ output_filename=output_dir+"/"+f.filename+f.file_extension
101
+ File.open(output_filename,"wb") <<f
102
+ end
103
+ end
104
+ end
105
+
106
+
107
+ if (!extract_filename.nil?) then
108
+ file=dsk.files[extract_filename]
109
+ if file.nil? then
110
+ puts "'#{extract_filename}' not found in #{filename}"
111
+ else
112
+ output_file<< case extract_mode
113
+ when :raw then file.contents
114
+ when :hex then file.hex_dump
115
+ when :list then
116
+ if file.instance_of?(BinaryFile)
117
+ file.disassembly
118
+ else
119
+ puts "'#{extract_filename}' is not a binary file"
120
+ exit
121
+ end
122
+ else file.to_s
123
+ end
124
+ end
125
+ end
126
+
127
+ # == Author
128
+ # Jonno Downes (jonno@jamtronix.com)
129
+ #
130
+ # == Copyright
131
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
132
+ #
133
+ #Permission is hereby granted, free of charge, to any person obtaining
134
+ #a copy of this software and associated documentation files (the
135
+ #"Software"), to deal in the Software without restriction, including
136
+ #without limitation the rights to use, copy, modify, merge, publish,
137
+ #distribute, sublicense, and/or sell copies of the Software, and to
138
+ #permit persons to whom the Software is furnished to do so, subject to
139
+ #the following conditions:
140
+ #
141
+ # The above copyright notice and this permission notice shall be
142
+ # included in all copies or substantial portions of the Software.
143
+ #
144
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
145
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
146
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
147
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
148
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
149
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
150
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.