1if not modules then modules = { } end modules ['mtx-dvi'] = {
2 version = 1.001,
3 comment = "companion to mtxrun.lua",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9
10
11
12
13
14local formatters = string.formatters
15local byte = string.byte
16
17local P, R, S, C, Cc, Ct, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Ct, lpeg.Cmt
18local lpegmatch = lpeg.match
19
20local readbyte = utilities.files.readbyte
21local readcardinal1 = utilities.files.readcardinal1
22local readcardinal2 = utilities.files.readcardinal2
23local readcardinal3 = utilities.files.readcardinal3
24local readcardinal4 = utilities.files.readcardinal4
25local readinteger1 = utilities.files.readinteger1
26local readinteger2 = utilities.files.readinteger2
27local readinteger3 = utilities.files.readinteger3
28local readinteger4 = utilities.files.readinteger4
29local readstring = utilities.files.readstring
30
31local helpinfo = [[
32<?xml version="1.0"?>
33<application>
34 <metadata>
35 <entry name="name">mtx-dvi</entry>
36 <entry name="detail">ConTeXt DVI Helpers</entry>
37 <entry name="version">0.01</entry>
38 </metadata>
39 <flags>
40 <category name="basic">
41 <subcategory>
42 <flag name="list"><short>list dvi commands</short></flag>
43 </subcategory>
44 </category>
45 </flags>
46</application>
47]]
48
49local application = logs.application {
50 name = "mtx-dvi",
51 banner = "ConTeXt DVI Helpers 0.10",
52 helpinfo = helpinfo,
53}
54
55local report = application.report
56
57local f_set_char_fast = formatters["set char fast %C"]
58local f_set_char = formatters["set char %C"]
59local f_set_rule = formatters["set rule height=%p width=%p (%s %s)"]
60local f_put_char = formatters["put char %C"]
61local f_put_rule = formatters["put rule height=%p width=%p (%s %s)"]
62local f_set_font = formatters["set font %i"]
63local f_set_font_fast = formatters["set font fast %i"]
64local f_right = formatters["right %p (%s)"]
65local f_right_w = formatters["right w"]
66local f_right_x = formatters["right x"]
67local f_right_w_set = formatters["right set w %p (%s)"]
68local f_right_x_set = formatters["right set x %p (%s)"]
69local f_down = formatters["down %p (%s)"]
70local f_down_y = formatters["down y"]
71local f_down_z = formatters["down z"]
72local f_down_y_set = formatters["down set y %p (%s)"]
73local f_down_z_set = formatters["down set z %p (%s)"]
74local f_page_begin = formatters["page begin (% t) %i"]
75local f_page_end = formatters["page end"]
76local f_nop = formatters["nop"]
77local f_push = formatters["push %i"]
78local f_pop = formatters["pop %i"]
79local f_special = formatters["special %s"]
80local f_preamble = formatters["preamble version=%s numerator=%s denominator=%s mag=%s comment=%s"]
81local f_postamble_begin = formatters["postamble"]
82local f_postamble_end = formatters["postamble end offset=%s version=%s"]
83local f_define_font = formatters["define font k=%i checksum=%i scale=%p designsize=%p area=%s name=%s"]
84
85local currentdepth = 0
86local usedprinter = (logs and logs.writer) or (texio and texio.write_nl) or print
87
88local handler = { } for i=0,255 do handler[i] = false end
89
90local function define_font(f,size)
91 local k = size == 1 and readcardinal1(f)
92 or size == 2 and readcardinal2(f)
93 or size == 3 and readcardinal3(f)
94 or readcardinal4(f)
95 local c = readcardinal4(f)
96 local s = readcardinal4(f)
97 local d = readcardinal4(f)
98 local a = readcardinal1(f)
99 local l = readcardinal1(f)
100 local a = readstring(f,a)
101 local l = readstring(f,l)
102 usedprinter(f_define_font(k,c,s,d,area,name))
103end
104
105handler[000] = function(f,b)
106 usedprinter(f_set_char_fast(b))
107end
108
109handler[128] = function(f)
110 usedprinter(f_set_char(readcardinal1(f)))
111end
112handler[129] = function(f)
113 usedprinter(f_set_char(readcardinal2(f)))
114end
115handler[130] = function(f)
116 usedprinter(f_set_char(readcardinal3(f)))
117end
118handler[131] = function(f)
119 usedprinter(f_set_char(readcardinal4(f)))
120end
121
122handler[132] = function(f)
123 usedprinter(f_set_rule(readinteger4(f),readinteger4(f)))
124end
125
126handler[133] = function(f)
127 usedprinter(f_put_char(readcardinal1(f)))
128end
129handler[134] = function(f)
130 usedprinter(f_put_char(readcardinal2(f)))
131end
132handler[135] = function(f)
133 usedprinter(f_put_char(readcardinal3(f)))
134end
135handler[136] = function(f)
136 usedprinter(f_put_char(readcardinal4(f)))
137end
138
139handler[137] = function(f)
140 usedprinter(f_put_rule(readinteger4(f),readinteger4(f)))
141end
142
143handler[138] = function(f)
144 usedprinter(f_nop())
145end
146
147handler[139] = function(f)
148 local pages = { }
149 for i=0,9 do
150 pages[i] = readinteger4(f)
151 end
152 usedprinter(f_page_begin(pages,readinteger4(f)))
153end
154handler[140] = function()
155 usedprinter(f_page_end())
156end
157
158handler[141] = function()
159 currentdepth = currentdepth + 1
160 usedprinter(f_push(currentdepth))
161end
162handler[142] = function()
163 usedprinter(f_pop(currentdepth))
164 currentdepth = currentdepth - 1
165end
166
167handler[143] = function(f)
168 local d = readinteger1(f)
169 usedprinter(f_right(d,d))
170end
171handler[144] = function(f)
172 local d = readinteger2(f)
173 usedprinter(f_right(d,d))
174end
175handler[145] = function(f)
176 local d = readinteger3(f)
177 usedprinter(f_right(d,d))
178end
179handler[146] = function(f)
180 local d = readinteger4(f)
181 usedprinter(f_right(d,d))
182end
183
184handler[147] = function()
185 usedprinter(f_right_w())
186end
187
188handler[148] = function(f)
189 local d = readinteger1(f)
190 usedprinter(f_right_w_set(d,d))
191end
192handler[149] = function(f)
193 local d = readinteger2(f)
194 usedprinter(f_right_w_set(d,d))
195end
196handler[150] = function(f)
197 local d = readinteger3(f)
198 usedprinter(f_right_w_set(d,d))
199end
200handler[151] = function(f)
201 local d = readinteger4(f)
202 usedprinter(f_right_w_set(d,d))
203end
204
205handler[152] = function()
206 handlers.right_x()
207end
208
209handler[153] = function(f)
210 local d = readinteger1(f)
211 usedprinter(f_right_x_set(d,d))
212end
213handler[154] = function(f)
214 local d = readinteger2(f)
215 usedprinter(f_right_x_set(d,d))
216end
217handler[155] = function(f)
218 local d = readinteger3(f)
219 usedprinter(f_right_x_set(d,d))
220end
221handler[156] = function(f)
222 local d = readinteger4(f)
223 usedprinter(f_right_x_set(d,d))
224end
225
226handler[157] = function(f)
227 local d = readinteger1(f)
228 usedprinter(f_down(d,d))
229end
230
231handler[158] = function(f)
232 local d = readinteger2(f)
233 usedprinter(f_down(d,d))
234end
235handler[159] = function(f)
236 local d = readinteger3(f)
237 usedprinter(f_down(d,d))
238end
239handler[160] = function(f)
240 local d = readinteger4(f)
241 usedprinter(f_down(d,d))
242end
243handler[161] = function()
244 usedprinter(f_down_y())
245end
246
247handler[162] = function(f)
248 local d = readinteger1(f)
249 usedprinter(f_down_y_set(d,d))
250end
251handler[163] = function(f)
252 local d = readinteger2(f)
253 usedprinter(f_down_y_set(d,d))
254end
255handler[164] = function(f)
256 local d = readinteger3(f)
257 usedprinter(f_down_y_set(d,d))
258end
259handler[165] = function(f)
260 local d = readinteger4(f)
261 usedprinter(f_down_y_set(d,d))
262end
263
264handler[166] = function()
265 handlers.down_z()
266end
267
268handler[167] = function(f)
269 local d = readinteger1(f)
270 usedprinter(f_down_z_set(d,d))
271end
272handler[168] = function(f)
273 local d = readinteger2(f)
274 usedprinter(f_down_z_set(d,d))
275end
276handler[169] = function(f)
277 local d = readinteger3(f)
278 usedprinter(f_down_z_set(d,d))
279end
280handler[170] = function(f)
281 local d = readinteger4(f)
282 usedprinter(f_down_z_set(d,d))
283end
284
285handler[171] = function(f,b)
286 usedprinter(f_set_font_fast(b))
287end
288
289handler[235] = function(f)
290 usedprinter(f_set_font(readcardinal1(f)))
291end
292handler[236] = function(f)
293 usedprinter(f_set_font(readcardinal2(f)))
294end
295handler[237] = function(f)
296 usedprinter(f_set_font(readcardinal3(f)))
297end
298handler[238] = function(f)
299 usedprinter(f_set_font(readcardinal4(f)))
300end
301
302handler[239] = function(f)
303 usedprinter(f_special(readstring(readcardinal1(f))))
304end
305handler[240] = function(f)
306 usedprinter(f_special(readstring(readcardinal2(f))))
307end
308handler[241] = function(f)
309 usedprinter(f_special(readstring(readcardinal3(f))))
310end
311handler[242] = function(f)
312 usedprinter(f_special(readstring(readcardinal4(f))))
313end
314
315handler[243] = function(f)
316 define_font(f,1)
317end
318handler[244] = function(f)
319 define_font(f,2)
320end
321handler[245] = function(f)
322 define_font(f,3)
323end
324handler[246] = function(f)
325 define_font(f,4)
326end
327
328handler[247] = function(f)
329 usedprinter(f_preamble(
330 readcardinal1(f),
331 readcardinal4(f),
332 readcardinal4(f),
333 readcardinal4(f),
334 readstring(f,readcardinal1(f))
335 ))
336end
337
338handler[248] = function(f)
339 usedprinter(f_postamble_begin(
340 readcardinal4(f),
341 readcardinal4(f),
342 readcardinal4(f),
343 readcardinal4(f),
344 readcardinal4(f),
345 readcardinal4(f),
346 readcardinal2(f),
347 readcardinal2(f)
348 ))
349 while true do
350 local b = readbyte(f)
351 if b == 249 then
352 break
353 else
354 handler[b](f,b)
355 end
356 end
357 usedprinter(f_postamble_end(
358 readcardinal4(f),
359 readcardinal1(f)
360 ))
361
362end
363
364handler[250] = function()
365end
366
367for i= 1,127 do handler[i] = handler[ 0] end
368for i= 172,234 do handler[i] = handler[171] end
369for i= 251,255 do handler[i] = handler[250] end
370
371scripts = scripts or { }
372scripts.dvi = scripts.dvi or { }
373
374function scripts.dvi.list(filename,printer)
375 currentdepth = 0
376 local f = io.open(filename)
377 if f then
378 local filesize = f:seek("end")
379 local position = 0
380 f:seek("set",position)
381 local format = formatters["%0" .. #tostring(filesize) .. "i : %s"]
382 local flush = printer or usedprinter
383 usedprinter = function(str)
384 flush(format(position,str))
385 position = f:seek()
386 end
387 while true do
388 local b = readbyte(f)
389 if b == 223 then
390 return
391 else
392 handler[b](f,b)
393 end
394 end
395 f:close()
396 else
397 report("invalid filename %a",filename)
398 end
399end
400
401local filename = environment.files[1] or ""
402
403if filename == "" then
404 application.help()
405elseif environment.argument("list") then
406 scripts.dvi.list(filename)
407elseif environment.argument("exporthelp") then
408 application.export(environment.argument("exporthelp"),filename)
409else
410 application.help()
411end
412 |