dsktool 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/bin/dskexplorer.rb +264 -0
  2. data/bin/dsktool.rb +34 -61
  3. data/doc/classes/AppleSoftFile.html +16 -16
  4. data/doc/classes/AppleSoftFile.src/M000020.html +18 -0
  5. data/doc/classes/AppleSoftFile.src/M000021.html +18 -0
  6. data/doc/classes/AppleSoftFile.src/M000022.html +18 -0
  7. data/doc/classes/AppleSoftFile.src/M000026.html +18 -0
  8. data/doc/classes/AppleSoftFile.src/M000027.html +18 -0
  9. data/doc/classes/AppleSoftFile.src/M000028.html +18 -0
  10. data/doc/classes/BinaryFile.html +16 -16
  11. data/doc/classes/BinaryFile.src/M000039.html +18 -0
  12. data/doc/classes/BinaryFile.src/M000040.html +18 -0
  13. data/doc/classes/BinaryFile.src/M000041.html +19 -0
  14. data/doc/classes/BinaryFile.src/M000045.html +18 -0
  15. data/doc/classes/BinaryFile.src/M000046.html +18 -0
  16. data/doc/classes/BinaryFile.src/M000047.html +19 -0
  17. data/doc/classes/CatalogServlet.html +146 -0
  18. data/doc/classes/CatalogServlet.src/M000015.html +20 -0
  19. data/doc/classes/CatalogServlet.src/M000021.html +20 -0
  20. data/doc/classes/D65.html +11 -11
  21. data/doc/classes/D65.src/M000018.html +18 -0
  22. data/doc/classes/D65.src/M000019.html +64 -0
  23. data/doc/classes/D65.src/M000024.html +18 -0
  24. data/doc/classes/D65.src/M000025.html +64 -0
  25. data/doc/classes/DOSDisk.html +16 -16
  26. data/doc/classes/DOSDisk.src/M000023.html +20 -0
  27. data/doc/classes/DOSDisk.src/M000024.html +19 -0
  28. data/doc/classes/DOSDisk.src/M000025.html +76 -0
  29. data/doc/classes/DOSDisk.src/M000029.html +20 -0
  30. data/doc/classes/DOSDisk.src/M000030.html +19 -0
  31. data/doc/classes/DOSDisk.src/M000031.html +76 -0
  32. data/doc/classes/DOSFile.html +32 -17
  33. data/doc/classes/DOSFile.src/M000042.html +22 -0
  34. data/doc/classes/DOSFile.src/M000043.html +18 -0
  35. data/doc/classes/DOSFile.src/M000044.html +18 -0
  36. data/doc/classes/DOSFile.src/M000048.html +22 -0
  37. data/doc/classes/DOSFile.src/M000049.html +18 -0
  38. data/doc/classes/DOSFile.src/M000050.html +18 -0
  39. data/doc/classes/DOSFile.src/M000051.html +31 -0
  40. data/doc/classes/DSK.html +54 -36
  41. data/doc/classes/DSK.src/M000027.html +18 -0
  42. data/doc/classes/DSK.src/M000028.html +22 -0
  43. data/doc/classes/DSK.src/M000029.html +22 -0
  44. data/doc/classes/DSK.src/M000030.html +34 -0
  45. data/doc/classes/DSK.src/M000031.html +19 -0
  46. data/doc/classes/DSK.src/M000032.html +18 -0
  47. data/doc/classes/DSK.src/M000033.html +18 -0
  48. data/doc/classes/DSK.src/M000034.html +22 -0
  49. data/doc/classes/DSK.src/M000035.html +22 -0
  50. data/doc/classes/DSK.src/M000036.html +34 -0
  51. data/doc/classes/DSK.src/M000037.html +19 -0
  52. data/doc/classes/DSK.src/M000038.html +18 -0
  53. data/doc/classes/DSK.src/M000039.html +40 -0
  54. data/doc/classes/DSK.src/M000040.html +23 -0
  55. data/doc/classes/DirectoryServlet.html +146 -0
  56. data/doc/classes/DirectoryServlet.src/M000017.html +20 -0
  57. data/doc/classes/DirectoryServlet.src/M000023.html +20 -0
  58. data/doc/classes/IntegerBasicFile.html +16 -16
  59. data/doc/classes/IntegerBasicFile.src/M000012.html +18 -0
  60. data/doc/classes/IntegerBasicFile.src/M000013.html +18 -0
  61. data/doc/classes/IntegerBasicFile.src/M000014.html +18 -0
  62. data/doc/classes/IntegerBasicFile.src/M000018.html +18 -0
  63. data/doc/classes/IntegerBasicFile.src/M000019.html +18 -0
  64. data/doc/classes/IntegerBasicFile.src/M000020.html +18 -0
  65. data/doc/classes/RDoc.html +6 -6
  66. data/doc/classes/RDoc.src/M000048.html +40 -0
  67. data/doc/classes/RDoc.src/M000055.html +40 -0
  68. data/doc/classes/SCAsmFile.html +21 -21
  69. data/doc/classes/SCAsmFile.src/M000035.html +18 -0
  70. data/doc/classes/SCAsmFile.src/M000036.html +18 -0
  71. data/doc/classes/SCAsmFile.src/M000037.html +18 -0
  72. data/doc/classes/SCAsmFile.src/M000038.html +36 -0
  73. data/doc/classes/SCAsmFile.src/M000041.html +18 -0
  74. data/doc/classes/SCAsmFile.src/M000042.html +18 -0
  75. data/doc/classes/SCAsmFile.src/M000043.html +18 -0
  76. data/doc/classes/SCAsmFile.src/M000044.html +36 -0
  77. data/doc/classes/ShowFileServlet.html +146 -0
  78. data/doc/classes/ShowFileServlet.src/M000026.html +21 -0
  79. data/doc/classes/ShowFileServlet.src/M000032.html +22 -0
  80. data/doc/classes/TestDOSDisks.html +41 -26
  81. data/doc/classes/TestDOSDisks.src/M000006.html +24 -0
  82. data/doc/classes/TestDOSDisks.src/M000007.html +19 -0
  83. data/doc/classes/TestDOSDisks.src/M000008.html +19 -0
  84. data/doc/classes/TestDOSDisks.src/M000009.html +25 -0
  85. data/doc/classes/TestDOSDisks.src/M000010.html +41 -0
  86. data/doc/classes/TestDOSDisks.src/M000011.html +27 -0
  87. data/doc/classes/TestDOSDisks.src/M000012.html +24 -0
  88. data/doc/classes/TestDOSDisks.src/M000013.html +19 -0
  89. data/doc/classes/TestDOSDisks.src/M000014.html +19 -0
  90. data/doc/classes/TestDOSDisks.src/M000015.html +25 -0
  91. data/doc/classes/TestDOSDisks.src/M000016.html +41 -0
  92. data/doc/classes/TestDOSDisks.src/M000017.html +27 -0
  93. data/doc/classes/TestDisassembly.html +6 -6
  94. data/doc/classes/TestDisassembly.src/M000016.html +19 -0
  95. data/doc/classes/TestDisassembly.src/M000022.html +19 -0
  96. data/doc/classes/TextFile.html +16 -16
  97. data/doc/classes/TextFile.src/M000045.html +18 -0
  98. data/doc/classes/TextFile.src/M000046.html +18 -0
  99. data/doc/classes/TextFile.src/M000047.html +20 -0
  100. data/doc/classes/TextFile.src/M000052.html +18 -0
  101. data/doc/classes/TextFile.src/M000053.html +18 -0
  102. data/doc/classes/TextFile.src/M000054.html +20 -0
  103. data/doc/created.rid +1 -1
  104. data/doc/dot/f_0.dot +44 -16
  105. data/doc/dot/f_0.png +0 -0
  106. data/doc/dot/f_1.dot +1 -10
  107. data/doc/dot/f_1.png +0 -0
  108. data/doc/dot/f_2.dot +4 -13
  109. data/doc/dot/f_2.png +0 -0
  110. data/doc/dot/f_3.dot +8 -64
  111. data/doc/dot/f_3.png +0 -0
  112. data/doc/dot/f_4.dot +69 -4
  113. data/doc/dot/f_4.png +0 -0
  114. data/doc/dot/f_5.dot +4 -13
  115. data/doc/dot/f_5.png +0 -0
  116. data/doc/dot/f_6.dot +15 -17
  117. data/doc/dot/f_6.png +0 -0
  118. data/doc/dot/f_7.dot +19 -1
  119. data/doc/dot/f_7.png +0 -0
  120. data/doc/dot/f_8.dot +32 -0
  121. data/doc/dot/f_8.png +0 -0
  122. data/doc/dot/f_9.dot +14 -0
  123. data/doc/dot/f_9.png +0 -0
  124. data/doc/dot/m_6_0.dot +30 -0
  125. data/doc/dot/m_6_0.png +0 -0
  126. data/doc/files/bin/dskexplorer_rb.html +339 -0
  127. data/doc/files/bin/dskexplorer_rb.src/M000001.html +21 -0
  128. data/doc/files/bin/dskexplorer_rb.src/M000002.html +21 -0
  129. data/doc/files/bin/dskexplorer_rb.src/M000003.html +22 -0
  130. data/doc/files/bin/dskexplorer_rb.src/M000004.html +19 -0
  131. data/doc/files/bin/dskexplorer_rb.src/M000005.html +20 -0
  132. data/doc/files/bin/dskexplorer_rb.src/M000006.html +22 -0
  133. data/doc/files/bin/dskexplorer_rb.src/M000007.html +20 -0
  134. data/doc/files/bin/dskexplorer_rb.src/M000008.html +43 -0
  135. data/doc/files/bin/dskexplorer_rb.src/M000009.html +55 -0
  136. data/doc/files/bin/dskexplorer_rb.src/M000010.html +43 -0
  137. data/doc/files/bin/dskexplorer_rb.src/M000011.html +34 -0
  138. data/doc/files/bin/dskserver_rb.html +247 -0
  139. data/doc/files/bin/dskserver_rb.src/M000001.html +22 -0
  140. data/doc/files/bin/dskserver_rb.src/M000002.html +19 -0
  141. data/doc/files/bin/dskserver_rb.src/M000003.html +62 -0
  142. data/doc/files/bin/dskserver_rb.src/M000004.html +39 -0
  143. data/doc/files/bin/dskserver_rb.src/M000005.html +26 -0
  144. data/doc/files/bin/dsktool_rb.html +8 -5
  145. data/doc/files/lib/D65_rb.html +1 -1
  146. data/doc/files/lib/DOSDisk_rb.html +2 -2
  147. data/doc/files/lib/DOSFile_rb.html +2 -2
  148. data/doc/files/lib/DSK_rb.html +2 -2
  149. data/doc/files/lib/rdoc_patch_rb.html +114 -0
  150. data/doc/files/test/tc_disassembly_rb.html +1 -1
  151. data/doc/files/test/tc_dos_disks_rb.html +2 -2
  152. data/doc/files/test/ts_test_all_rb.html +1 -1
  153. data/doc/fr_class_index.html +3 -0
  154. data/doc/fr_file_index.html +2 -0
  155. data/doc/fr_method_index.html +55 -38
  156. data/doc/index.html +1 -1
  157. data/doc/rdoc-style.css +208 -0
  158. data/lib/DOSDisk.rb +2 -2
  159. data/lib/DOSFile.rb +21 -3
  160. data/lib/DSK.rb +6 -1
  161. data/lib/rdoc_patch.rb +32 -0
  162. data/test/tc_dos_disks.rb +13 -2
  163. data/test/white_11a.dsk +0 -0
  164. metadata +134 -4
@@ -0,0 +1,264 @@
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
+ #make sure the relevant folder with our libraries is in the require path
16
+ lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
17
+ $:.unshift(lib_path) unless $:.include?(lib_path)
18
+
19
+ require 'optparse'
20
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
21
+ DSKSERVER_VERSION="0.1.0"
22
+
23
+ @listening_port=6502
24
+ @@root_directory="."
25
+ opts=OptionParser.new
26
+ opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
27
+ opts.on("-v","--version") do
28
+ puts File.basename($0)+" "+DSKSERVER_VERSION
29
+ exit
30
+ end
31
+ opts.on("-p","--port PORT_NUMBER",Integer) {|val| @listening_port=val%0xFFFF}
32
+ opts.on("-r","--root ROOT_DIR",String) {|val| @@root_directory=val}
33
+
34
+ filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
35
+
36
+ require 'webrick'
37
+ require 'DSK'
38
+ include WEBrick
39
+
40
+ @@uri_cache={}
41
+ @@dsk_cache={}
42
+ def get_uri_from_cache(uri)
43
+ if @@uri_cache[uri].nil? then
44
+ @@uri_cache[uri]=open(uri).read
45
+ end
46
+ @@uri_cache[uri]
47
+ end
48
+
49
+ def get_dsk_from_cache(uri)
50
+ if @@dsk_cache[uri].nil? then
51
+ @@dsk_cache[uri]=DSK.read(uri)
52
+ end
53
+ @@dsk_cache[uri]
54
+ end
55
+
56
+ def common_header
57
+ "
58
+ <html>
59
+ <body>
60
+ <B>DSK Explorer</b><br>
61
+ "
62
+ end
63
+ def common_footer
64
+ "
65
+ "
66
+ end
67
+
68
+ def root_dir_is_website?
69
+ require 'hpricot'
70
+ require 'open-uri'
71
+ @@root_directory=~/^http[s]?:/?true : false
72
+ end
73
+ def make_absolute_path(relative_path)
74
+ if root_dir_is_website? then
75
+ @@root_directory+uri_encode(relative_path)
76
+ else
77
+ @@root_directory+relative_path
78
+ end
79
+ end
80
+
81
+ def uri_encode(s)
82
+ #standard URI.escape appears to miss some important characters
83
+ require 'uri'
84
+ URI.escape(s).sub("[","%5b").sub("]","%5d")
85
+ end
86
+ def get_directories_and_files(relative_path)
87
+ directories=[]
88
+ dsk_files=[]
89
+ absolute_path=make_absolute_path(relative_path)
90
+ if root_dir_is_website? then
91
+ html=get_uri_from_cache(absolute_path)
92
+ doc=Hpricot(html)
93
+ doc.search("a[@href]").each do |a|
94
+ href=URI.unescape(a.attributes["href"])
95
+ if (href=~/\w\/$/)
96
+ if !(href=~/^\//) then #directories end with a /, but skip absolute paths
97
+ directories<<(href)
98
+ end
99
+ elsif DSK.is_dsk_file?(href) then
100
+ dsk_files<<(href)
101
+ end
102
+ end
103
+ else
104
+ if File.exist?(absolute_path) && (File.stat(absolute_path).directory?) then
105
+ dir=Dir.new(absolute_path)
106
+ dir.each do |f|
107
+ directories<<f if (f[0].chr!=".") && (File.stat(absolute_path+"/"+f).directory?)
108
+ dsk_files<<f if (DSK.is_dsk_file?(f))
109
+ end
110
+ end
111
+ end
112
+ [directories,dsk_files]
113
+ end
114
+
115
+ def make_navigation_path(relative_path,filename=nil)
116
+ path_parts=relative_path.split("/")
117
+ #make the cookie-crumb-trail
118
+ partial_path=""
119
+ s="<a href=/dir/>#{@@root_directory}</a>"
120
+ path_parts.each do |p|
121
+ if p.length>0 then
122
+ partial_path+="/#{p}"
123
+ if DSK.is_dsk_file?(partial_path) then
124
+ s+="/<a href=/catalog#{uri_encode(partial_path)}>#{p}</a>"
125
+ else
126
+ s+="/<a href=/dir#{uri_encode(partial_path)}>#{p}</a>"
127
+ end
128
+ end
129
+ end
130
+
131
+ if !filename.nil? then
132
+ s+="/<a href=/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(filename)}>#{filename}</a>"
133
+ end
134
+
135
+
136
+ #show the contents of the current directory
137
+ directories,dsk_files=get_directories_and_files(relative_path)
138
+
139
+ #list out the directories
140
+
141
+ s+="<ul>"
142
+ #s+="<li>[dir] <a href=/#{uri_encode('/dir/'+File.dirname(relative_path))}>..</a>\n"
143
+ directories.sort.each do |d|
144
+ s+="<li>[dir] <a href=/dir/#{uri_encode(relative_path)}/#{uri_encode(d)}>#{d}</a>\n"
145
+ end
146
+
147
+ #list out the DSK files
148
+ dsk_files.sort.each do |f|
149
+ 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"
150
+ end
151
+ s+="</ul>"
152
+
153
+ s
154
+ end
155
+ def make_catalog(relative_path)
156
+ s="<p>"
157
+ begin
158
+ absolute_path=make_absolute_path(relative_path)
159
+ dsk=get_dsk_from_cache(absolute_path)
160
+ if (dsk.is_dos33?) then
161
+ s+="<table>\n<th>TYPE</th><th>SECTORS</th><th>NAME</th></tr>\n"
162
+ dsk.files.each_value do |f|
163
+ display_url="/showfile/#{uri_encode(relative_path)+'?filename='+uri_encode(f.filename)}"
164
+ s+="<td>#{f.file_type}</td><td>#{sprintf('%03d',f.sector_count)}</td><td>#{f.filename}</td>"
165
+ s+="<td><a href=#{display_url}&mode=hex>hex dump</a></td>"
166
+ if f.file_type=="T" then
167
+ s+="<td><a href=#{display_url}&mode=text>text</a></td>"
168
+ else
169
+ s+="<td><a href=#{display_url}&mode=list>listing</a></td>"
170
+ end
171
+
172
+ s+="</tr>\n"
173
+ end
174
+ s+="</table>"
175
+ else
176
+ s+="<i>not DOS 3.3 format</i>"
177
+ end
178
+ rescue Exception => exception
179
+ s+="<i>ERROR:#{exception}</i>"
180
+ end
181
+ s
182
+ end
183
+ def show_file(relative_path,filename,display_mode)
184
+ absolute_path=make_absolute_path(relative_path)
185
+ dsk=get_dsk_from_cache(absolute_path)
186
+ file=dsk.files[filename]
187
+ if file.nil? then
188
+ s="<i>#{filename} not found</i>"
189
+ else
190
+ s="<hl><pre>"
191
+ if display_mode=="hex" then
192
+ s+=file.hex_dump
193
+ elsif display_mode=="list" && file.file_type=='B'
194
+ then s+=file.disassembly
195
+ else
196
+ s+= file.to_s
197
+ end
198
+ s+="\n</pre><hl>"
199
+ end
200
+ s
201
+ end
202
+
203
+ class DirectoryServlet < HTTPServlet::AbstractServlet
204
+ def do_GET(req,res)
205
+ relative_path=URI.unescape(req.path).sub(/^\/dir/,"")
206
+ res['Content-Type']="text/html"
207
+ res.body=common_header+make_navigation_path(relative_path)+common_footer
208
+ end
209
+ end
210
+
211
+ class CatalogServlet < HTTPServlet::AbstractServlet
212
+ def do_GET(req,res)
213
+ relative_path=URI.unescape(req.path).sub(/^\/catalog/,"")
214
+ res['Content-Type']="text/html"
215
+ res.body=common_header+make_navigation_path(relative_path)+make_catalog(relative_path)+common_footer
216
+ end
217
+ end
218
+
219
+ class ShowFileServlet < HTTPServlet::AbstractServlet
220
+ def do_GET(req,res)
221
+ relative_path=URI.unescape(req.path).sub(/^\/showfile/,"")
222
+ filename=URI.unescape(req.query['filename'])
223
+ display_mode=req.query['mode']
224
+ res['Content-Type']="text/html"
225
+ res.body=common_header+make_navigation_path(relative_path,filename)+show_file(relative_path,filename,display_mode)+common_footer
226
+ end
227
+ end
228
+
229
+ s=HTTPServer.new(
230
+ :Port=>@listening_port
231
+ )
232
+ trap("INT") {s.shutdown}
233
+
234
+ s.mount("/dir",DirectoryServlet)
235
+ s.mount("/catalog",CatalogServlet)
236
+ s.mount("/showfile",ShowFileServlet)
237
+
238
+ puts "point your browser at http://localhost:#{@listening_port}/"
239
+ s.start
240
+
241
+ # == Author
242
+ # Jonno Downes (jonno@jamtronix.com)
243
+ #
244
+ # == Copyright
245
+ # Copyright (c) 2007 Jonno Downes (jonno@jamtronix.com)
246
+ #
247
+ #Permission is hereby granted, free of charge, to any person obtaining
248
+ #a copy of this software and associated documentation files (the
249
+ #"Software"), to deal in the Software without restriction, including
250
+ #without limitation the rights to use, copy, modify, merge, publish,
251
+ #distribute, sublicense, and/or sell copies of the Software, and to
252
+ #permit persons to whom the Software is furnished to do so, subject to
253
+ #the following conditions:
254
+ #
255
+ # The above copyright notice and this permission notice shall be
256
+ # included in all copies or substantial portions of the Software.
257
+ #
258
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
259
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
260
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
261
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
262
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
263
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
264
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/dsktool.rb CHANGED
@@ -11,7 +11,8 @@
11
11
  # -c | --catalog display catalog
12
12
  # -e | --extract FILENAME extract file by name (either to stdout,
13
13
  # or file specified by --output)
14
- # -h | --help display this message
14
+ # -h | --help display this message
15
+ # -d | --dump FILENAME hex dump
15
16
  # -l | --list FILENAME monitor style listing (disassembles 65C02 opcodes)
16
17
  # -o | --output FILENAME specify name to save extracted file as
17
18
  # -r | --raw don't convert basic files to ASCII
@@ -29,73 +30,51 @@
29
30
  # dsktool.rb --extract "COLOR DEMOSOFT" DOS3MASTR.dsk
30
31
  # dsktool.rb -e HELLO -o HELLO.bas DOS3MASTR.dsk
31
32
  # dsktool.rb -x DOS3MASTR.dsk.gz
33
+ # dsktool.rb -x DOS3MASTR.dsk.gz -o /tmp/DOS3MASTR/
32
34
  # dsktool.rb -c http://jamtronix.com/dsks/apshai.dsk.gz
33
35
 
34
- DSKTOOL_VERSION="0.1.4"
36
+ DSKTOOL_VERSION="0.1.5"
35
37
 
36
- require 'optparse'
37
- require 'rdoc/usage'
38
-
39
- #due to a bug in rdoc, RDoc.usage won't work correctly when run from a gem executable
40
- # see http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/211297
41
- # Display usage from the given file
42
- def RDoc.usage_from_file(input_file, *args)
43
- comment = File.open(input_file) do |file|
44
- RDoc.find_comment(file)
45
- end
46
- comment = comment.gsub(/^\s*#/, '')
47
-
48
- markup = SM::SimpleMarkup.new
49
- flow_convertor = SM::ToFlow.new
50
-
51
- flow = markup.convert(comment, flow_convertor)
52
-
53
- format = "plain"
54
-
55
- unless args.empty?
56
- flow = extract_sections(flow, args)
57
- end
58
-
59
- options = RI::Options.instance
60
- if args = ENV["RI"]
61
- options.parse(args.split)
62
- end
63
- formatter = options.formatter.new(options, "")
64
- formatter.display_flow(flow)
65
- exit
66
- end
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)
67
41
 
42
+ require 'optparse'
43
+ require 'rdoc_patch' #RDoc::usage patched to work under gem executables
68
44
 
69
45
  catalog=false
70
46
  explode=false
71
- raw_mode=false
72
47
  output_filename=nil
73
48
  extract_filename=nil
74
- list_filename=nil
49
+ extract_mode=:default
75
50
  explode_directory=nil
76
51
  opts=OptionParser.new
77
52
  opts.on("-h","--help") {RDoc::usage_from_file(__FILE__)}
78
53
  opts.on("-v","--version") do
79
- puts "dsktool.rb "+DSKTOOL_VERSION
54
+ puts File.basename($0)+" "+DSKTOOL_VERSION
80
55
  exit
81
56
  end
82
- opts.on("-r","--raw") {raw_mode=true}
57
+ opts.on("-r","--raw") {extract_mode=:raw}
83
58
  opts.on("-c","--catalog") {catalog=true}
84
59
  opts.on("-x","--explode") {explode=true}
85
- opts.on("-l","--list FILENAME",String) {|val| list_filename=val.upcase}
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
86
68
  opts.on("-e","--extract FILENAME",String) {|val| extract_filename=val.upcase}
87
69
  opts.on("-o","--output FILENAME",String) {|val| output_filename=val}
88
70
  filename=opts.parse(ARGV)[0] rescue RDoc::usage_from_file(__FILE__,'Usage')
89
71
  RDoc::usage_from_file(__FILE__,'Usage') if (filename.nil?)
90
72
 
91
- #make sure the relevant folder with our libraries is in the require path
92
- lib_path=File.expand_path(File.dirname(__FILE__)+"//..//lib")
93
- $:.unshift(lib_path) unless $:.include?(lib_path)
94
73
 
95
74
  require 'DSK'
96
75
  dsk=DSK.read(filename)
97
76
  output_file= case
98
- when (output_filename.nil?) then STDOUT
77
+ when (output_filename.nil?) || (explode) then STDOUT
99
78
  else File.open(output_filename,"wb")
100
79
  end
101
80
 
@@ -108,7 +87,7 @@ if(catalog) then
108
87
  end
109
88
 
110
89
  if(explode) then
111
- output_dir=File.basename(filename,".*")
90
+ output_dir=output_filename.nil??File.basename(filename,".*"):output_filename
112
91
  if !(File.exists?(output_dir)) then
113
92
  Dir.mkdir(output_dir)
114
93
  end
@@ -129,24 +108,18 @@ if (!extract_filename.nil?) then
129
108
  file=dsk.files[extract_filename]
130
109
  if file.nil? then
131
110
  puts "'#{extract_filename}' not found in #{filename}"
132
- else
133
- if (raw_mode) then
134
- output_file<<file.contents
135
- else
136
- output_file<<file
137
- end
138
- end
139
- end
140
-
141
- if (!list_filename.nil?) then
142
- file=dsk.files[list_filename]
143
- if file.nil? then
144
- puts "'#{list_filename}' not found in #{filename}"
145
- else
146
- if file.instance_of?(BinaryFile)
147
- output_file<<file.disassembly
148
- else
149
- puts "'#{list_filename}' is not a binary file"
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
150
123
  end
151
124
  end
152
125
  end
@@ -88,7 +88,7 @@
88
88
  <area shape="RECT" coords="256,5,328,53" href="DOSFile.html" alt="DOSFile">
89
89
  <area shape="RECT" coords="456,101,528,149" href="TextFile.html" alt="TextFile">
90
90
  </map>
91
- <img src="../dot/f_3.png" usemap="#map" border=0 alt="TopLevel">
91
+ <img src="../dot/f_4.png" usemap="#map" border=0 alt="TopLevel">
92
92
  </div>
93
93
 
94
94
  <div id="description">
@@ -119,9 +119,9 @@ Applesoft file format:
119
119
  <h3 class="section-bar">Methods</h3>
120
120
 
121
121
  <div class="name-list">
122
- <a href="#M000014">file_extension</a>&nbsp;&nbsp;
123
- <a href="#M000012">file_type</a>&nbsp;&nbsp;
124
- <a href="#M000013">to_s</a>&nbsp;&nbsp;
122
+ <a href="#M000028">file_extension</a>&nbsp;&nbsp;
123
+ <a href="#M000026">file_type</a>&nbsp;&nbsp;
124
+ <a href="#M000027">to_s</a>&nbsp;&nbsp;
125
125
  </div>
126
126
  </div>
127
127
 
@@ -156,12 +156,12 @@ Applesoft file format:
156
156
  <div id="methods">
157
157
  <h3 class="section-bar">Public Instance methods</h3>
158
158
 
159
- <div id="method-M000014" class="method-detail">
160
- <a name="M000014"></a>
159
+ <div id="method-M000028" class="method-detail">
160
+ <a name="M000028"></a>
161
161
 
162
162
  <div class="method-heading">
163
- <a href="AppleSoftFile.src/M000014.html" target="Code" class="method-signature"
164
- onclick="popupCode('AppleSoftFile.src/M000014.html');return false;">
163
+ <a href="AppleSoftFile.src/M000028.html" target="Code" class="method-signature"
164
+ onclick="popupCode('AppleSoftFile.src/M000028.html');return false;">
165
165
  <span class="method-name">file_extension</span><span class="method-args">()</span>
166
166
  </a>
167
167
  </div>
@@ -170,12 +170,12 @@ Applesoft file format:
170
170
  </div>
171
171
  </div>
172
172
 
173
- <div id="method-M000012" class="method-detail">
174
- <a name="M000012"></a>
173
+ <div id="method-M000026" class="method-detail">
174
+ <a name="M000026"></a>
175
175
 
176
176
  <div class="method-heading">
177
- <a href="AppleSoftFile.src/M000012.html" target="Code" class="method-signature"
178
- onclick="popupCode('AppleSoftFile.src/M000012.html');return false;">
177
+ <a href="AppleSoftFile.src/M000026.html" target="Code" class="method-signature"
178
+ onclick="popupCode('AppleSoftFile.src/M000026.html');return false;">
179
179
  <span class="method-name">file_type</span><span class="method-args">()</span>
180
180
  </a>
181
181
  </div>
@@ -184,12 +184,12 @@ Applesoft file format:
184
184
  </div>
185
185
  </div>
186
186
 
187
- <div id="method-M000013" class="method-detail">
188
- <a name="M000013"></a>
187
+ <div id="method-M000027" class="method-detail">
188
+ <a name="M000027"></a>
189
189
 
190
190
  <div class="method-heading">
191
- <a href="AppleSoftFile.src/M000013.html" target="Code" class="method-signature"
192
- onclick="popupCode('AppleSoftFile.src/M000013.html');return false;">
191
+ <a href="AppleSoftFile.src/M000027.html" target="Code" class="method-signature"
192
+ onclick="popupCode('AppleSoftFile.src/M000027.html');return false;">
193
193
  <span class="method-name">to_s</span><span class="method-args">()</span>
194
194
  </a>
195
195
  </div>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>file_type (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 272</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">file_type</span>
15
+ <span class="ruby-value str">&quot;A&quot;</span>
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>to_s (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 276</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>
15
+ <span class="ruby-identifier">buffer_as_applesoft_file</span>(<span class="ruby-ivar">@contents</span>)
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>file_extension (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 280</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">file_extension</span>
15
+ <span class="ruby-value str">&quot;.bas&quot;</span>
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>file_type (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 289</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">file_type</span>
15
+ <span class="ruby-value str">&quot;A&quot;</span>
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>to_s (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 293</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>
15
+ <span class="ruby-identifier">buffer_as_applesoft_file</span>(<span class="ruby-ivar">@contents</span>)
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>file_extension (AppleSoftFile)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/DOSFile.rb, line 297</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">file_extension</span>
15
+ <span class="ruby-value str">&quot;.bas&quot;</span>
16
+ <span class="ruby-keyword kw">end</span></pre>
17
+ </body>
18
+ </html>