mtx-dvi.lua /size: 10 Kb    last modification: 2020-07-01 14:35
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-- This is just a tool that I use for checking dvi issues in LuaTeX and it has
10-- no real use otherwise. When needed (or on request) I can extend this script.
11-- Speed is hardly an issue and I didn't spend much time on generalizing the
12-- code either.
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), -- p
341        readcardinal4(f), -- num
342        readcardinal4(f), -- den
343        readcardinal4(f), -- mag
344        readcardinal4(f), -- l
345        readcardinal4(f), -- u
346        readcardinal2(f), -- s
347        readcardinal2(f)  -- t
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    -- now 223's follow
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