Bug Summary

File:backend/dvi/mdvi-lib/dviread.c
Warning:line 396, column 25
This statement is never executed

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name dviread.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/backend/dvi/mdvi-lib -fcoverage-compilation-dir=/rootdir/backend/dvi/mdvi-lib -resource-dir /usr/lib/llvm-21/lib/clang/21 -D HAVE_CONFIG_H -I . -I ../../.. -D PIC -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/15/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker security.ArrayBound -analyzer-checker unix.cstring.NotNullTerminated -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2026-04-22-072351-52771-1 -x c dviread.c
1/*
2 * Copyright (C) 2000, Matias Atria
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19#include <config.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <stdarg.h>
23#include <string.h>
24#include <math.h>
25#include <errno(*__errno_location ()).h>
26#include <unistd.h>
27#include <fcntl.h>
28
29#include "mdvi.h"
30#include "private.h"
31#include "color.h"
32
33typedef int (*DviCommand) __PROTO((DviContext *, int))(DviContext *, int);
34
35#define DVICMDDEF(x)static int x (DviContext *, int) static int x __PROTO((DviContext *, int))(DviContext *, int)
36
37DVICMDDEF(set_char)static int set_char (DviContext *, int);
38DVICMDDEF(set_rule)static int set_rule (DviContext *, int);
39DVICMDDEF(no_op)static int no_op (DviContext *, int);
40DVICMDDEF(push)static int push (DviContext *, int);
41DVICMDDEF(pop)static int pop (DviContext *, int);
42DVICMDDEF(move_right)static int move_right (DviContext *, int);
43DVICMDDEF(move_down)static int move_down (DviContext *, int);
44DVICMDDEF(move_w)static int move_w (DviContext *, int);
45DVICMDDEF(move_x)static int move_x (DviContext *, int);
46DVICMDDEF(move_y)static int move_y (DviContext *, int);
47DVICMDDEF(move_z)static int move_z (DviContext *, int);
48DVICMDDEF(sel_font)static int sel_font (DviContext *, int);
49DVICMDDEF(sel_fontn)static int sel_fontn (DviContext *, int);
50DVICMDDEF(special)static int special (DviContext *, int);
51DVICMDDEF(def_font)static int def_font (DviContext *, int);
52DVICMDDEF(undefined)static int undefined (DviContext *, int);
53DVICMDDEF(unexpected)static int unexpected (DviContext *, int);
54
55static const DviCommand dvi_commands[] = {
56 set_char, set_char, set_char, set_char,
57 set_char, set_char, set_char, set_char,
58 set_char, set_char, set_char, set_char,
59 set_char, set_char, set_char, set_char,
60 set_char, set_char, set_char, set_char,
61 set_char, set_char, set_char, set_char,
62 set_char, set_char, set_char, set_char,
63 set_char, set_char, set_char, set_char,
64 set_char, set_char, set_char, set_char,
65 set_char, set_char, set_char, set_char,
66 set_char, set_char, set_char, set_char,
67 set_char, set_char, set_char, set_char,
68 set_char, set_char, set_char, set_char,
69 set_char, set_char, set_char, set_char,
70 set_char, set_char, set_char, set_char,
71 set_char, set_char, set_char, set_char,
72 set_char, set_char, set_char, set_char,
73 set_char, set_char, set_char, set_char,
74 set_char, set_char, set_char, set_char,
75 set_char, set_char, set_char, set_char,
76 set_char, set_char, set_char, set_char,
77 set_char, set_char, set_char, set_char,
78 set_char, set_char, set_char, set_char,
79 set_char, set_char, set_char, set_char,
80 set_char, set_char, set_char, set_char,
81 set_char, set_char, set_char, set_char,
82 set_char, set_char, set_char, set_char,
83 set_char, set_char, set_char, set_char,
84 set_char, set_char, set_char, set_char,
85 set_char, set_char, set_char, set_char,
86 set_char, set_char, set_char, set_char,
87 set_char, set_char, set_char, set_char, /* 0 - 127 */
88 set_char, set_char, set_char, set_char, /* 128 - 131 */
89 set_rule, /* 132 */
90 set_char, set_char, set_char, set_char, /* 133 - 136 */
91 set_rule, /* 137 */
92 no_op, /* 138 */
93 unexpected, /* 139 (BOP) */
94 unexpected, /* 140 (EOP) */
95 push, /* 141 */
96 pop, /* 142 */
97 move_right, move_right, move_right, move_right, /* 143 - 146 */
98 move_w, move_w, move_w, move_w, move_w, /* 147 - 151 */
99 move_x, move_x, move_x, move_x, move_x, /* 152 - 156 */
100 move_down, move_down, move_down, move_down, /* 157 - 160 */
101 move_y, move_y, move_y, move_y, move_y, /* 161 - 165 */
102 move_z, move_z, move_z, move_z, move_z, /* 166 - 170 */
103 sel_font, sel_font, sel_font, sel_font,
104 sel_font, sel_font, sel_font, sel_font,
105 sel_font, sel_font, sel_font, sel_font,
106 sel_font, sel_font, sel_font, sel_font,
107 sel_font, sel_font, sel_font, sel_font,
108 sel_font, sel_font, sel_font, sel_font,
109 sel_font, sel_font, sel_font, sel_font,
110 sel_font, sel_font, sel_font, sel_font,
111 sel_font, sel_font, sel_font, sel_font,
112 sel_font, sel_font, sel_font, sel_font,
113 sel_font, sel_font, sel_font, sel_font,
114 sel_font, sel_font, sel_font, sel_font,
115 sel_font, sel_font, sel_font, sel_font,
116 sel_font, sel_font, sel_font, sel_font,
117 sel_font, sel_font, sel_font, sel_font,
118 sel_font, sel_font, sel_font, sel_font, /* 171 - 234 */
119 sel_fontn, sel_fontn, sel_fontn, sel_fontn, /* 235 - 238 */
120 special, special, special, special, /* 239 - 242 */
121 def_font, def_font, def_font, def_font, /* 243 - 246 */
122 unexpected, /* 247 (PRE) */
123 unexpected, /* 248 (POST) */
124 unexpected, /* 249 (POST_POST) */
125 undefined, undefined, undefined,
126 undefined, undefined, undefined /* 250 - 255 */
127};
128
129#define DVI_BUFLEN4096 4096
130
131static int mdvi_run_macro(DviContext *dvi, Uchar *macro, size_t len);
132
133static void
134dummy_draw_glyph (DviContext *dvi GNUC_UNUSED__attribute__ ((__unused__)),
135 DviFontChar *ch GNUC_UNUSED__attribute__ ((__unused__)),
136 int x GNUC_UNUSED__attribute__ ((__unused__)),
137 int y GNUC_UNUSED__attribute__ ((__unused__)))
138{
139}
140
141static void
142dummy_draw_rule (DviContext *dvi GNUC_UNUSED__attribute__ ((__unused__)),
143 int x GNUC_UNUSED__attribute__ ((__unused__)),
144 int y GNUC_UNUSED__attribute__ ((__unused__)),
145 Uint w GNUC_UNUSED__attribute__ ((__unused__)),
146 Uint h GNUC_UNUSED__attribute__ ((__unused__)),
147 int f GNUC_UNUSED__attribute__ ((__unused__)))
148{
149}
150
151static int
152dummy_alloc_colors (void *a GNUC_UNUSED__attribute__ ((__unused__)),
153 Ulong *b GNUC_UNUSED__attribute__ ((__unused__)),
154 int c GNUC_UNUSED__attribute__ ((__unused__)),
155 Ulong d GNUC_UNUSED__attribute__ ((__unused__)),
156 Ulong e GNUC_UNUSED__attribute__ ((__unused__)),
157 double f GNUC_UNUSED__attribute__ ((__unused__)),
158 int g GNUC_UNUSED__attribute__ ((__unused__)))
159{
160 return -1;
161}
162
163static void *
164dummy_create_image (void *a GNUC_UNUSED__attribute__ ((__unused__)),
165 Uint b GNUC_UNUSED__attribute__ ((__unused__)),
166 Uint c GNUC_UNUSED__attribute__ ((__unused__)),
167 Uint d GNUC_UNUSED__attribute__ ((__unused__)))
168{
169 return NULL((void*)0);
170}
171
172static void
173dummy_free_image (void *a GNUC_UNUSED__attribute__ ((__unused__)))
174{
175}
176
177static void
178dummy_dev_destroy (void *a GNUC_UNUSED__attribute__ ((__unused__)))
179{
180}
181
182static void
183dummy_dev_putpixel (void *a GNUC_UNUSED__attribute__ ((__unused__)),
184 int x GNUC_UNUSED__attribute__ ((__unused__)),
185 int y GNUC_UNUSED__attribute__ ((__unused__)),
186 Ulong c GNUC_UNUSED__attribute__ ((__unused__)))
187{
188}
189
190static void
191dummy_dev_refresh (DviContext *a GNUC_UNUSED__attribute__ ((__unused__)),
192 void *b GNUC_UNUSED__attribute__ ((__unused__)))
193{
194}
195
196static void
197dummy_dev_set_color (void *a GNUC_UNUSED__attribute__ ((__unused__)),
198 Ulong b GNUC_UNUSED__attribute__ ((__unused__)),
199 Ulong c GNUC_UNUSED__attribute__ ((__unused__)))
200{
201}
202
203/* functions to report errors */
204static void dvierr(DviContext *dvi, const char *format, ...)
205{
206 va_list ap;
207
208 va_start(ap, format)__builtin_va_start(ap, format);
209 fprintf(stderrstderr, "%s[%d]: Error: ",
210 dvi->filename, dvi->currpage);
211 vfprintf(stderrstderr, format, ap);
212 va_end(ap)__builtin_va_end(ap);
213}
214
215static void dviwarn(DviContext *dvi, const char *format, ...)
216{
217 va_list ap;
218
219 fprintf(stderrstderr, "%s[%d]: Warning: ",
220 dvi->filename, dvi->currpage);
221 va_start(ap, format)__builtin_va_start(ap, format);
222 vfprintf(stderrstderr, format, ap);
223 va_end(ap)__builtin_va_end(ap);
224}
225
226#define NEEDBYTES(d,n)((d)->buffer.pos + (n) > (d)->buffer.length) \
227 ((d)->buffer.pos + (n) > (d)->buffer.length)
228
229static int get_bytes(DviContext *dvi, size_t n)
230{
231 /*
232 * caller wants to read `n' bytes from dvi->buffer + dvi->pos.
233 * Make sure there is enough data to satisfy the request
234 */
235 if(NEEDBYTES(dvi, n)((dvi)->buffer.pos + (n) > (dvi)->buffer.length)) {
236 size_t required;
237 int newlen;
238
239 if(dvi->buffer.frozen || dvi->in == NULL((void*)0) || feof(dvi->in)) {
240 /* this is EOF */
241 dviwarn(dvi, _("unexpected EOF\n")gettext("unexpected EOF\n"));
242 return -1;
243 }
244 /* get more data */
245 if(dvi->buffer.data == NULL((void*)0)) {
246 /* first allocation */
247 dvi->buffer.size = Max(DVI_BUFLEN, n)(((4096) > (n)) ? (4096) : (n));
248 dvi->buffer.data = (Uchar *)mdvi_malloc(dvi->buffer.size);
249 dvi->buffer.length = 0;
250 dvi->buffer.frozen = 0;
251 } else if(dvi->buffer.pos < dvi->buffer.length) {
252 /* move whatever we want to keep */
253 dvi->buffer.length -= dvi->buffer.pos;
254 memmove(dvi->buffer.data,
255 dvi->buffer.data + dvi->buffer.pos,
256 dvi->buffer.length);
257 } else {
258 /* we can discard all the data in this buffer */
259 dvi->buffer.length = 0;
260 }
261
262 required = n - dvi->buffer.length;
263 if(required > dvi->buffer.size - dvi->buffer.length) {
264 /* need to allocate more memory */
265 dvi->buffer.size = dvi->buffer.length + required + 128;
266 dvi->buffer.data = (Uchar *)xresize(dvi->buffer.data,(char *)mdvi_realloc((dvi->buffer.data), (dvi->buffer.size
) * sizeof(char))
267 char, dvi->buffer.size)(char *)mdvi_realloc((dvi->buffer.data), (dvi->buffer.size
) * sizeof(char))
;
268 }
269 /* now read into the buffer */
270 newlen = fread(dvi->buffer.data + dvi->buffer.length,
271 1, dvi->buffer.size - dvi->buffer.length, dvi->in);
272 if(newlen == -1) {
273 mdvi_error("%s: %s\n", dvi->filename, strerror(errno(*__errno_location ())));
274 return -1;
275 }
276 dvi->buffer.length += newlen;
277 dvi->buffer.pos = 0;
278 }
279 return 0;
280}
281
282/* only relative forward seeks are supported by this function */
283static int dskip(DviContext *dvi, long offset)
284{
285 ASSERT(offset > 0)do { if(!(offset > 0)) mdvi_crash("%s:%d: Assertion %s failed\n"
, "dviread.c", 285, "offset > 0"); } while(0)
;
286
287 if(NEEDBYTES(dvi, offset)((dvi)->buffer.pos + (offset) > (dvi)->buffer.length
)
&& get_bytes(dvi, offset) == -1)
288 return -1;
289 dvi->buffer.pos += offset;
290 return 0;
291}
292
293/* DVI I/O functions (note: here `n' must be <= 4) */
294static long dsgetn(DviContext *dvi, size_t n)
295{
296 long val;
297
298 if(NEEDBYTES(dvi, n)((dvi)->buffer.pos + (n) > (dvi)->buffer.length) && get_bytes(dvi, n) == -1)
299 return -1;
300 val = msgetn(dvi->buffer.data + dvi->buffer.pos, n);
301 dvi->buffer.pos += n;
302 return val;
303}
304
305static int dread(DviContext *dvi, char *buffer, size_t len)
306{
307 if(NEEDBYTES(dvi, len)((dvi)->buffer.pos + (len) > (dvi)->buffer.length) && get_bytes(dvi, len) == -1)
308 return -1;
309 memcpy(buffer, dvi->buffer.data + dvi->buffer.pos, len)bcopy ((dvi->buffer.data + dvi->buffer.pos), (buffer), (
len))
;
310 dvi->buffer.pos += len;
311 return 0;
312}
313
314static long dugetn(DviContext *dvi, size_t n)
315{
316 long val;
317
318 if(NEEDBYTES(dvi, n)((dvi)->buffer.pos + (n) > (dvi)->buffer.length) && get_bytes(dvi, n) == -1)
319 return -1;
320 val = mugetn(dvi->buffer.data + dvi->buffer.pos, n);
321 dvi->buffer.pos += n;
322 return val;
323}
324
325static long dtell(DviContext *dvi)
326{
327 return dvi->depth ?
328 dvi->buffer.pos :
329 ftell(dvi->in) - dvi->buffer.length + dvi->buffer.pos;
330}
331
332static void dreset(DviContext *dvi)
333{
334 if(!dvi->buffer.frozen && dvi->buffer.data)
335 mdvi_free(dvi->buffer.data);
336 dvi->buffer.data = NULL((void*)0);
337 dvi->buffer.size = 0;
338 dvi->buffer.length = 0;
339 dvi->buffer.pos = 0;
340}
341
342#define dsget1(d)dsgetn((d), 1) dsgetn((d), 1)
343#define dsget2(d)dsgetn((d), 2) dsgetn((d), 2)
344#define dsget3(d)dsgetn((d), 3) dsgetn((d), 3)
345#define dsget4(d)dsgetn((d), 4) dsgetn((d), 4)
346#define duget1(d)dugetn((d), 1) dugetn((d), 1)
347#define duget2(d)dugetn((d), 2) dugetn((d), 2)
348#define duget3(d)dugetn((d), 3) dugetn((d), 3)
349#define duget4(d)dugetn((d), 4) dugetn((d), 4)
350
351#ifndef NODEBUG
352static void dviprint(DviContext *dvi, const char *command, int sub, const char *fmt, ...)
353{
354 int i;
355 va_list ap;
356
357 printf("%s: ", dvi->filename);
358 for(i = 0; i < dvi->depth; i++)
359 printf(" ");
360 printf("%4lu: %s", dtell(dvi), command);
361 if(sub >= 0) printf("%d", sub);
362 if(*fmt) printf(": ");
363 va_start(ap, fmt)__builtin_va_start(ap, fmt);
364 vprintf(fmt, ap);
365 va_end(ap)__builtin_va_end(ap);
366}
367#define SHOWCMD(x)if(_mdvi_debug_mask & (1 << 0)) do { dviprint x; } while
(0)
\
368 if(_mdvi_debug_mask & DBG_OPCODE(1 << 0)) do { dviprint x; } while(0)
369#else
370#define SHOWCMD(x)if(_mdvi_debug_mask & (1 << 0)) do { dviprint x; } while
(0)
do { } while(0)
371#endif
372
373int mdvi_find_tex_page(DviContext *dvi, int tex_page)
374{
375 int i;
376
377 for(i = 0; i < dvi->npages; i++)
378 if(dvi->pagemap[i][1] == tex_page)
379 return i;
380 return -1;
381}
382
383/* page sorting functions */
384static int sort_up(const void *p1, const void *p2)
385{
386 return ((long *)p1)[1] - ((long *)p2)[1];
387}
388static int sort_down(const void *p1, const void *p2)
389{
390 return ((long *)p2)[1] - ((long *)p1)[1];
391}
392static int
393sort_random (const void *p1 GNUC_UNUSED__attribute__ ((__unused__)),
394 const void *p2 GNUC_UNUSED__attribute__ ((__unused__)))
395{
396 return (rand() % 1) ? -1 : 1;
This statement is never executed
397}
398static int sort_dvi_up(const void *p1, const void *p2)
399{
400 return ((long *)p1)[0] - ((long *)p2)[0];
401}
402static int sort_dvi_down(const void *p1, const void *p2)
403{
404 return ((long *)p1)[0] - ((long *)p2)[0];
405}
406
407void mdvi_sort_pages(DviContext *dvi, DviPageSort type)
408{
409 int (*sortfunc) __PROTO((const void *, const void *))(const void *, const void *);
410
411 switch(type) {
412 case MDVI_PAGE_SORT_UP:
413 sortfunc = sort_up;
414 break;
415 case MDVI_PAGE_SORT_DOWN:
416 sortfunc = sort_down;
417 break;
418 case MDVI_PAGE_SORT_RANDOM:
419 sortfunc = sort_random;
420 break;
421 case MDVI_PAGE_SORT_DVI_UP:
422 sortfunc = sort_dvi_up;
423 break;
424 case MDVI_PAGE_SORT_DVI_DOWN:
425 sortfunc = sort_dvi_down;
426 break;
427 case MDVI_PAGE_SORT_NONE:
428 default:
429 sortfunc = NULL((void*)0);
430 break;
431 }
432
433 if(sortfunc)
434 qsort(dvi->pagemap, dvi->npages, sizeof(PageNum), sortfunc);
435}
436
437static DviFontRef *define_font(DviContext *dvi, int op)
438{
439 Int32 arg;
440 Int32 scale;
441 Int32 dsize;
442 Int32 checksum;
443 int hdpi;
444 int vdpi;
445 int n;
446 char *name;
447 DviFontRef *ref;
448
449 arg = dugetn(dvi, op - DVI_FNT_DEF1243 + 1);
450 checksum = duget4(dvi)dugetn((dvi), 4);
451 scale = duget4(dvi)dugetn((dvi), 4);
452 dsize = duget4(dvi)dugetn((dvi), 4);
453 hdpi = FROUND(dvi->params.mag * dvi->params.dpi * scale / dsize)(int)((dvi->params.mag * dvi->params.dpi * scale / dsize
) + 0.5)
;
454 vdpi = FROUND(dvi->params.mag * dvi->params.vdpi * scale / dsize)(int)((dvi->params.mag * dvi->params.vdpi * scale / dsize
) + 0.5)
;
455 n = duget1(dvi)dugetn((dvi), 1) + duget1(dvi)dugetn((dvi), 1);
456 name = mdvi_malloc(n + 1);
457 dread(dvi, name, n);
458 name[n] = 0;
459 DEBUG((DBG_FONTS, "requesting font %d = `%s' at %.1fpt (%dx%d dpi)\n",__debug ((1 << 1), "requesting font %d = `%s' at %.1fpt (%dx%d dpi)\n"
, arg, name, (double)scale / (dvi->params.tfm_conv * 0x100000
), hdpi, vdpi)
460 arg, name, (double)scale / (dvi->params.tfm_conv * 0x100000),__debug ((1 << 1), "requesting font %d = `%s' at %.1fpt (%dx%d dpi)\n"
, arg, name, (double)scale / (dvi->params.tfm_conv * 0x100000
), hdpi, vdpi)
461 hdpi, vdpi))__debug ((1 << 1), "requesting font %d = `%s' at %.1fpt (%dx%d dpi)\n"
, arg, name, (double)scale / (dvi->params.tfm_conv * 0x100000
), hdpi, vdpi)
;
462 ref = font_reference(&dvi->params, arg, name, checksum, hdpi, vdpi, scale);
463 if(ref == NULL((void*)0)) {
464 mdvi_error(_("could not load font `%s'\n")gettext("could not load font `%s'\n"), name);
465 mdvi_free(name);
466 return NULL((void*)0);
467 }
468 mdvi_free(name);
469 return ref;
470}
471
472static char *opendvi(const char *name)
473{
474 int len;
475 char *file;
476
477 len = strlen(name);
478 /* if file ends with .dvi and it exists, that's it */
479 if(len >= 4 && STREQ(name+len-4, ".dvi")(((name+len-4) != ((void*)0)) && ((".dvi") != ((void*
)0)) && (strcmp (name+len-4, ".dvi") == 0))
) {
480 DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", name))__debug ((1 << 3)|(1 << 2), "opendvi: Trying `%s'\n"
, name)
;
481 if(access(name, R_OK4) == 0)
482 return mdvi_strdup(name);
483 }
484
485 /* try appending .dvi */
486 file = mdvi_malloc(len + 5);
487 strcpy(file, name);
488 strcpy(file+len, ".dvi");
489 DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", file))__debug ((1 << 3)|(1 << 2), "opendvi: Trying `%s'\n"
, file)
;
490 if(access(file, R_OK4) == 0)
491 return file;
492 /* try the given name */
493 file[len] = 0;
494 DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", file))__debug ((1 << 3)|(1 << 2), "opendvi: Trying `%s'\n"
, file)
;
495 if(access(file, R_OK4) == 0)
496 return file;
497 mdvi_free(file);
498 return NULL((void*)0);
499}
500
501int mdvi_reload(DviContext *dvi, DviParams *np)
502{
503 DviContext *newdvi;
504 DviParams *pars;
505
506 /* close our file */
507 if(dvi->in) {
508 fclosekpse_fclose_trace(dvi->in);
509 dvi->in = NULL((void*)0);
510 }
511
512 pars = np ? np : &dvi->params;
513 DEBUG((DBG_DVI, "%s: reloading\n", dvi->filename))__debug ((1 << 3), "%s: reloading\n", dvi->filename);
514
515 /* load it again */
516 newdvi = mdvi_init_context(pars, dvi->pagesel, dvi->filename);
517 if(newdvi == NULL((void*)0)) {
518 mdvi_warning(_("could not reload `%s'\n")gettext("could not reload `%s'\n"), dvi->filename);
519 return -1;
520 }
521
522 /* drop all our font references */
523 font_drop_chain(dvi->fonts);
524 /* destroy our font map */
525 if(dvi->fontmap)
526 mdvi_free(dvi->fontmap);
527 dvi->currfont = NULL((void*)0);
528
529 /* and use the ones we just loaded */
530 dvi->fonts = newdvi->fonts;
531 dvi->fontmap = newdvi->fontmap;
532 dvi->nfonts = newdvi->nfonts;
533
534 /* copy the new information */
535 dvi->params = newdvi->params;
536 dvi->num = newdvi->num;
537 dvi->den = newdvi->den;
538 dvi->dvimag = newdvi->dvimag;
539 dvi->dviconv = newdvi->dviconv;
540 dvi->dvivconv = newdvi->dvivconv;
541 dvi->modtime = newdvi->modtime;
542
543 if(dvi->fileid) mdvi_free(dvi->fileid);
544 dvi->fileid = newdvi->fileid;
545
546 dvi->dvi_page_w = newdvi->dvi_page_w;
547 dvi->dvi_page_h = newdvi->dvi_page_h;
548
549 mdvi_free(dvi->pagemap);
550 dvi->pagemap = newdvi->pagemap;
551 dvi->npages = newdvi->npages;
552 if(dvi->currpage > dvi->npages-1)
553 dvi->currpage = 0;
554
555 mdvi_free(dvi->stack);
556 dvi->stack = newdvi->stack;
557 dvi->stacksize = newdvi->stacksize;
558
559 /* remove fonts that are not being used anymore */
560 font_free_unused(&dvi->device);
561
562 mdvi_free(newdvi->filename);
563 mdvi_free(newdvi);
564
565 DEBUG((DBG_DVI, "%s: reload successful\n", dvi->filename))__debug ((1 << 3), "%s: reload successful\n", dvi->filename
)
;
566 if(dvi->device.refresh)
567 dvi->device.refresh(dvi, dvi->device.device_data);
568
569 return 0;
570}
571
572/* function to change parameters ia DVI context
573 * The DVI context is modified ONLY if this function is successful */
574int mdvi_configure(DviContext *dvi, DviParamCode option, ...)
575{
576 va_list ap;
577 int reset_all;
578 int reset_font;
579 DviParams np;
580
581 va_start(ap, option)__builtin_va_start(ap, option);
582
583 reset_font = 0;
584 reset_all = 0;
585 np = dvi->params; /* structure copy */
586 while(option != MDVI_PARAM_LAST) {
587 switch(option) {
588 case MDVI_SET_DPI:
589 np.dpi = np.vdpi = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
590 reset_all = 1;
591 break;
592 case MDVI_SET_XDPI:
593 np.dpi = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
594 reset_all = 1;
595 break;
596 case MDVI_SET_YDPI:
597 np.vdpi = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
598 break;
599 case MDVI_SET_SHRINK:
600 np.hshrink = np.vshrink = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
601 reset_font = MDVI_FONTSEL_GREY(1 << 1)|MDVI_FONTSEL_BITMAP(1 << 0);
602 break;
603 case MDVI_SET_XSHRINK:
604 np.hshrink = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
605 reset_font = MDVI_FONTSEL_GREY(1 << 1)|MDVI_FONTSEL_BITMAP(1 << 0);
606 break;
607 case MDVI_SET_YSHRINK:
608 np.vshrink = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
609 reset_font = MDVI_FONTSEL_GREY(1 << 1)|MDVI_FONTSEL_BITMAP(1 << 0);
610 break;
611 case MDVI_SET_ORIENTATION:
612 np.orientation = va_arg(ap, DviOrientation)__builtin_va_arg(ap, DviOrientation);
613 reset_font = MDVI_FONTSEL_GLYPH(1 << 2);
614 break;
615 case MDVI_SET_GAMMA:
616 np.gamma = va_arg(ap, double)__builtin_va_arg(ap, double);
617 reset_font = MDVI_FONTSEL_GREY(1 << 1);
618 break;
619 case MDVI_SET_DENSITY:
620 np.density = va_arg(ap, Uint)__builtin_va_arg(ap, Uint);
621 reset_font = MDVI_FONTSEL_BITMAP(1 << 0);
622 break;
623 case MDVI_SET_MAGNIFICATION:
624 np.mag = va_arg(ap, double)__builtin_va_arg(ap, double);
625 reset_all = 1;
626 break;
627 case MDVI_SET_DRIFT:
628 np.hdrift = np.vdrift = va_arg(ap, int)__builtin_va_arg(ap, int);
629 break;
630 case MDVI_SET_HDRIFT:
631 np.hdrift = va_arg(ap, int)__builtin_va_arg(ap, int);
632 break;
633 case MDVI_SET_VDRIFT:
634 np.vdrift = va_arg(ap, int)__builtin_va_arg(ap, int);
635 break;
636 case MDVI_SET_FOREGROUND:
637 np.fg = va_arg(ap, Ulong)__builtin_va_arg(ap, Ulong);
638 reset_font = MDVI_FONTSEL_GREY(1 << 1);
639 break;
640 case MDVI_SET_BACKGROUND:
641 np.bg = va_arg(ap, Ulong)__builtin_va_arg(ap, Ulong);
642 reset_font = MDVI_FONTSEL_GREY(1 << 1);
643 break;
644 default:
645 break;
646 }
647 option = va_arg(ap, DviParamCode)__builtin_va_arg(ap, DviParamCode);
648 }
649 va_end(ap)__builtin_va_end(ap);
650
651 /* check that all values make sense */
652 if(np.dpi <= 0 || np.vdpi <= 0)
653 return -1;
654 if(np.mag <= 0.0)
655 return -1;
656 if(np.density < 0)
657 return -1;
658 if(np.hshrink < 1 || np.vshrink < 1)
659 return -1;
660 if(np.hdrift < 0 || np.vdrift < 0)
661 return -1;
662 if(np.fg == np.bg)
663 return -1;
664
665 /*
666 * If the dpi or the magnification change, we basically have to reload
667 * the DVI file again from scratch.
668 */
669
670 if(reset_all)
671 return (mdvi_reload(dvi, &np) == 0);
672
673 if(np.hshrink != dvi->params.hshrink) {
674 np.conv = dvi->dviconv;
675 if(np.hshrink)
676 np.conv /= np.hshrink;
677 }
678 if(np.vshrink != dvi->params.vshrink) {
679 np.vconv = dvi->dvivconv;
680 if(np.vshrink)
681 np.vconv /= np.vshrink;
682 }
683
684 if(reset_font) {
685 font_reset_chain_glyphs(&dvi->device, dvi->fonts, reset_font);
686 }
687 dvi->params = np;
688 if((reset_font & MDVI_FONTSEL_GLYPH(1 << 2)) && dvi->device.refresh) {
689 dvi->device.refresh(dvi, dvi->device.device_data);
690 return 0;
691 }
692
693 return 1;
694}
695/*
696 * Read the initial data from the DVI file. If something is wrong with the
697 * file, we just spit out an error message and refuse to load the file,
698 * without giving any details. This makes sense because DVI files are ok
699 * 99.99% of the time, and dvitype(1) can be used to check the other 0.01%.
700 */
701DviContext *mdvi_init_context(DviParams *par, DviPageSpec *spec, const char *file)
702{
703 FILE *p;
704 Int32 arg;
705 int op;
706 long offset;
707 int n;
708 DviContext *dvi;
709 char *filename;
710 int pagecount;
711
712 /*
713 * 1. Open the file and initialize the DVI context
714 */
715
716 filename = opendvi(file);
717 if(filename == NULL((void*)0)) {
718 perror(file);
719 return NULL((void*)0);
720 }
721 p = fopenkpse_fopen_trace(filename, "rb");
722 if(p == NULL((void*)0)) {
723 perror(file);
724 mdvi_free(filename);
725 return NULL((void*)0);
726 }
727 dvi = xalloc(DviContext)(DviContext *)mdvi_malloc(sizeof(DviContext));
728 memzero(dvi, sizeof(DviContext))memset((dvi), 0, (sizeof(DviContext)));
729 dvi->pagemap = NULL((void*)0);
730 dvi->filename = filename;
731 dvi->stack = NULL((void*)0);
732 dvi->modtime = get_mtime(fileno(p));
733 dvi->buffer.data = NULL((void*)0);
734 dvi->pagesel = spec;
735 dvi->in = p; /* now we can use the dget*() functions */
736
737 /*
738 * 2. Read the preamble, extract scaling information, and
739 * setup the DVI parameters.
740 */
741
742 if(fuget1(p)((unsigned)getc(p)) != DVI_PRE247)
743 goto bad_dvi;
744 if((arg = fuget1(p)((unsigned)getc(p))) != DVI_ID2) {
745 mdvi_error(_("%s: unsupported DVI format (version %u)\n")gettext("%s: unsupported DVI format (version %u)\n"),
746 file, arg);
747 goto error; /* jump to the end of this routine,
748 * where we handle errors */
749 }
750 /* get dimensions */
751 dvi->num = fuget4(p)fugetn((p), 4);
752 dvi->den = fuget4(p)fugetn((p), 4);
753 dvi->dvimag = fuget4(p)fugetn((p), 4);
754
755 /* check that these numbers make sense */
756 if(!dvi->num || !dvi->den || !dvi->dvimag)
757 goto bad_dvi;
758
759 dvi->params.mag =
760 (par->mag > 0 ? par->mag : (double)dvi->dvimag / 1000.0);
761 dvi->params.hdrift = par->hdrift;
762 dvi->params.vdrift = par->vdrift;
763 dvi->params.dpi = par->dpi ? par->dpi : MDVI_DPI600;
764 dvi->params.vdpi = par->vdpi ? par->vdpi : par->dpi;
765 dvi->params.hshrink = par->hshrink;
766 dvi->params.vshrink = par->vshrink;
767 dvi->params.density = par->density;
768 dvi->params.gamma = par->gamma;
769 dvi->params.conv = (double)dvi->num / dvi->den;
770 dvi->params.conv *= (dvi->params.dpi / 254000.0) * dvi->params.mag;
771 dvi->params.vconv = (double)dvi->num / dvi->den;
772 dvi->params.vconv *= (dvi->params.vdpi / 254000.0) * dvi->params.mag;
773 dvi->params.tfm_conv = (25400000.0 / dvi->num) *
774 ((double)dvi->den / 473628672) / 16.0;
775 dvi->params.flags = par->flags;
776 dvi->params.orientation = par->orientation;
777 dvi->params.fg = par->fg;
778 dvi->params.bg = par->bg;
779
780 /* initialize colors */
781 dvi->curr_fg = par->fg;
782 dvi->curr_bg = par->bg;
783 dvi->color_stack = NULL((void*)0);
784 dvi->color_top = 0;
785 dvi->color_size = 0;
786
787 /* pixel conversion factors */
788 dvi->dviconv = dvi->params.conv;
789 dvi->dvivconv = dvi->params.vconv;
790 if(dvi->params.hshrink)
791 dvi->params.conv /= dvi->params.hshrink;
792 if(dvi->params.vshrink)
793 dvi->params.vconv /= dvi->params.vshrink;
794
795 /* get the comment from the preamble */
796 n = fuget1(p)((unsigned)getc(p));
797 dvi->fileid = mdvi_malloc(n + 1);
798 fread(dvi->fileid, 1, n, p);
799 dvi->fileid[n] = 0;
800 DEBUG((DBG_DVI, "%s: %s\n", filename, dvi->fileid))__debug ((1 << 3), "%s: %s\n", filename, dvi->fileid
)
;
801
802 /*
803 * 3. Read postamble, extract page information (number of
804 * pages, dimensions) and stack depth.
805 */
806
807 /* jump to the end of the file */
808 if(fseek(p, (long)-1, SEEK_END2) == -1)
809 goto error;
810 for(n = 0; (op = fuget1(p)((unsigned)getc(p))) == DVI_TRAILER223; n++)
811 if(fseek(p, (long)-2, SEEK_CUR1) < 0)
812 break;
813 if(op != arg || n < 4)
814 goto bad_dvi;
815 /* get the pointer to postamble */
816 fseek(p, (long)-5, SEEK_CUR1);
817 arg = fuget4(p)fugetn((p), 4);
818 /* jump to it */
819 fseek(p, (long)arg, SEEK_SET0);
820 if(fuget1(p)((unsigned)getc(p)) != DVI_POST248)
821 goto bad_dvi;
822 offset = fuget4(p)fugetn((p), 4);
823 if(dvi->num != fuget4(p)fugetn((p), 4) || dvi->den != fuget4(p)fugetn((p), 4) ||
824 dvi->dvimag != fuget4(p)fugetn((p), 4))
825 goto bad_dvi;
826 dvi->dvi_page_h = fuget4(p)fugetn((p), 4);
827 dvi->dvi_page_w = fuget4(p)fugetn((p), 4);
828 dvi->stacksize = fuget2(p)fugetn((p), 2);
829 dvi->npages = fuget2(p)fugetn((p), 2);
830 DEBUG((DBG_DVI, "%s: from postamble: stack depth %d, %d page%s\n",__debug ((1 << 3), "%s: from postamble: stack depth %d, %d page%s\n"
, filename, dvi->stacksize, dvi->npages, dvi->npages
> 1 ? "s" : "")
831 filename, dvi->stacksize, dvi->npages, dvi->npages > 1 ? "s" : ""))__debug ((1 << 3), "%s: from postamble: stack depth %d, %d page%s\n"
, filename, dvi->stacksize, dvi->npages, dvi->npages
> 1 ? "s" : "")
;
832
833 /*
834 * 4. Process font definitions.
835 */
836
837 /* process font definitions */
838 dvi->nfonts = 0;
839 dvi->fontmap = NULL((void*)0);
840 /*
841 * CAREFUL: here we need to use the dvi->buffer, but it might leave the
842 * the file cursor in the wrong position after reading fonts (because of
843 * buffering). It's ok, though, because after the font definitions we read
844 * the page offsets, and we fseek() to the relevant part of the file with
845 * SEEK_SET. Nothing is read after the page offsets.
846 */
847 while((op = duget1(dvi)dugetn((dvi), 1)) != DVI_POST_POST249) {
848 DviFontRef *ref;
849
850 if(op == DVI_NOOP138)
851 continue;
852 else if(op < DVI_FNT_DEF1243 || op > DVI_FNT_DEF4246)
853 goto error;
854 ref = define_font(dvi, op);
855 if(ref == NULL((void*)0))
856 goto error;
857 ref->next = dvi->fonts;
858 dvi->fonts = ref;
859 dvi->nfonts++;
860 }
861 /* we don't need the buffer anymore */
862 dreset(dvi);
863
864 if(op != DVI_POST_POST249)
865 goto bad_dvi;
866 font_finish_definitions(dvi);
867 DEBUG((DBG_DVI, "%s: %d font%s required by this job\n",__debug ((1 << 3), "%s: %d font%s required by this job\n"
, filename, dvi->nfonts, dvi->nfonts > 1 ? "s" : "")
868 filename, dvi->nfonts, dvi->nfonts > 1 ? "s" : ""))__debug ((1 << 3), "%s: %d font%s required by this job\n"
, filename, dvi->nfonts, dvi->nfonts > 1 ? "s" : "")
;
869 dvi->findref = font_find_mapped;
870
871 /*
872 * 5. Build the page map.
873 */
874
875 dvi->pagemap = xnalloc(PageNum, dvi->npages)(PageNum *)mdvi_calloc((dvi->npages), sizeof(PageNum));
876 memzero(dvi->pagemap, sizeof(PageNum) * dvi->npages)memset((dvi->pagemap), 0, (sizeof(PageNum) * dvi->npages
))
;
877
878 n = dvi->npages - 1;
879 pagecount = n;
880 while(offset != -1) {
881 int i;
882 PageNum page;
883
884 fseek(p, offset, SEEK_SET0);
885 op = fuget1(p)((unsigned)getc(p));
886 if(op != DVI_BOP139 || n < 0)
887 goto bad_dvi;
888 for(i = 1; i <= 10; i++)
889 page[i] = fsget4(p)fsgetn((p), 4);
890 page[0] = offset;
891 offset = fsget4(p)fsgetn((p), 4);
892 /* check if the page is selected */
893 if(spec && mdvi_page_selected(spec, page, n) == 0) {
894 DEBUG((DBG_DVI, "Page %d (%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld) ignored by request\n",__debug ((1 << 3), "Page %d (%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld) ignored by request\n"
, n, page[1], page[2], page[3], page[4], page[5], page[6], page
[7], page[8], page[9], page[10])
895 n, page[1], page[2], page[3], page[4], page[5],__debug ((1 << 3), "Page %d (%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld) ignored by request\n"
, n, page[1], page[2], page[3], page[4], page[5], page[6], page
[7], page[8], page[9], page[10])
896 page[6], page[7], page[8], page[9], page[10]))__debug ((1 << 3), "Page %d (%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld) ignored by request\n"
, n, page[1], page[2], page[3], page[4], page[5], page[6], page
[7], page[8], page[9], page[10])
;
897 } else {
898 memcpy(&dvi->pagemap[pagecount], page, sizeof(PageNum))bcopy ((page), (&dvi->pagemap[pagecount]), (sizeof(PageNum
)))
;
899 pagecount--;
900 }
901 n--;
902 }
903 pagecount++;
904 if(pagecount >= dvi->npages) {
905 mdvi_error(_("no pages selected\n")gettext("no pages selected\n"));
906 goto error;
907 }
908 if(pagecount) {
909 DEBUG((DBG_DVI, "%d of %d pages selected\n",__debug ((1 << 3), "%d of %d pages selected\n", dvi->
npages - pagecount, dvi->npages)
910 dvi->npages - pagecount, dvi->npages))__debug ((1 << 3), "%d of %d pages selected\n", dvi->
npages - pagecount, dvi->npages)
;
911 dvi->npages -= pagecount;
912 memmove(dvi->pagemap, &dvi->pagemap[pagecount],
913 dvi->npages * sizeof(PageNum));
914 }
915
916 /*
917 * 6. Setup stack, initialize device functions
918 */
919
920 dvi->curr_layer = 0;
921 dvi->stack = xnalloc(DviState, dvi->stacksize + 8)(DviState *)mdvi_calloc((dvi->stacksize + 8), sizeof(DviState
))
;
922
923 dvi->device.draw_glyph = dummy_draw_glyph;
924 dvi->device.draw_rule = dummy_draw_rule;
925 dvi->device.alloc_colors = dummy_alloc_colors;
926 dvi->device.create_image = dummy_create_image;
927 dvi->device.free_image = dummy_free_image;
928 dvi->device.dev_destroy = dummy_dev_destroy;
929 dvi->device.put_pixel = dummy_dev_putpixel;
930 dvi->device.refresh = dummy_dev_refresh;
931 dvi->device.set_color = dummy_dev_set_color;
932 dvi->device.device_data = NULL((void*)0);
933
934 DEBUG((DBG_DVI, "%s read successfully\n", filename))__debug ((1 << 3), "%s read successfully\n", filename);
935 return dvi;
936
937bad_dvi:
938 mdvi_error(_("%s: File corrupted, or not a DVI file\n")gettext("%s: File corrupted, or not a DVI file\n"), file);
939error:
940 /* if we came from the font definitions, this will be non-trivial */
941 dreset(dvi);
942 mdvi_destroy_context(dvi);
943 return NULL((void*)0);
944}
945
946void mdvi_destroy_context(DviContext *dvi)
947{
948 if(dvi->device.dev_destroy)
949 dvi->device.dev_destroy(dvi->device.device_data);
950 /* release all fonts */
951 if(dvi->fonts) {
952 font_drop_chain(dvi->fonts);
953 font_free_unused(&dvi->device);
954 }
955 if(dvi->fontmap)
956 mdvi_free(dvi->fontmap);
957 if(dvi->filename)
958 mdvi_free(dvi->filename);
959 if(dvi->stack)
960 mdvi_free(dvi->stack);
961 if(dvi->pagemap)
962 mdvi_free(dvi->pagemap);
963 if(dvi->fileid)
964 mdvi_free(dvi->fileid);
965 if(dvi->in)
966 fclosekpse_fclose_trace(dvi->in);
967 if(dvi->buffer.data && !dvi->buffer.frozen)
968 mdvi_free(dvi->buffer.data);
969 if(dvi->color_stack)
970 mdvi_free(dvi->color_stack);
971
972 mdvi_free(dvi);
973}
974
975void mdvi_setpage(DviContext *dvi, int pageno)
976{
977 if(pageno < 0)
978 pageno = 0;
979 if(pageno > dvi->npages-1)
980 pageno = dvi->npages - 1;
981 dvi->currpage = pageno;
982}
983
984static int mdvi_run_macro(DviContext *dvi, Uchar *macro, size_t len)
985{
986 DviFontRef *curr, *fonts;
987 DviBuffer saved_buffer;
988 FILE *saved_file;
989 int opcode;
990 int oldtop;
991
992 dvi->depth++;
993 push(dvi, DVI_PUSH141);
994 dvi->pos.w = 0;
995 dvi->pos.x = 0;
996 dvi->pos.y = 0;
997 dvi->pos.z = 0;
998
999 /* save our state */
1000 curr = dvi->currfont;
1001 fonts = dvi->fonts;
1002 saved_buffer = dvi->buffer;
1003 saved_file = dvi->in;
1004 dvi->currfont = curr->ref->subfonts;
1005 dvi->fonts = curr->ref->subfonts;
1006 dvi->buffer.data = macro;
1007 dvi->buffer.pos = 0;
1008 dvi->buffer.length = len;
1009 dvi->buffer.frozen = 1;
1010 dvi->in = NULL((void*)0);
1011 oldtop = dvi->stacktop;
1012
1013 /* execute commands */
1014 while((opcode = duget1(dvi)dugetn((dvi), 1)) != DVI_EOP140) {
1015 if(dvi_commands[opcode](dvi, opcode) < 0)
1016 break;
1017 }
1018 if(opcode != DVI_EOP140)
1019 dviwarn(dvi, _("%s: vf macro had errors\n")gettext("%s: vf macro had errors\n"),
1020 curr->ref->fontname);
1021 if(dvi->stacktop != oldtop)
1022 dviwarn(dvi, _("%s: stack not empty after vf macro\n")gettext("%s: stack not empty after vf macro\n"),
1023 curr->ref->fontname);
1024
1025 /* restore things */
1026 pop(dvi, DVI_POP142);
1027 dvi->currfont = curr;
1028 dvi->fonts = fonts;
1029 dvi->buffer = saved_buffer;
1030 dvi->in = saved_file;
1031 dvi->depth--;
1032
1033 return (opcode != DVI_EOP140 ? -1 : 0);
1034}
1035
1036int mdvi_dopage(DviContext *dvi, int pageno)
1037{
1038 int op;
1039 int ppi;
1040 int reloaded = 0;
1041
1042again:
1043 if(dvi->in == NULL((void*)0)) {
1044 /* try reopening the file */
1045 dvi->in = fopenkpse_fopen_trace(dvi->filename, "rb");
1046 if(dvi->in == NULL((void*)0)) {
1047 mdvi_warning(_("%s: could not reopen file (%s)\n")gettext("%s: could not reopen file (%s)\n"),
1048 dvi->filename,
1049 strerror(errno(*__errno_location ())));
1050 return -1;
1051 }
1052 DEBUG((DBG_FILES, "reopen(%s) -> Ok\n", dvi->filename))__debug ((1 << 2), "reopen(%s) -> Ok\n", dvi->filename
)
;
1053 }
1054
1055 /* check if we need to reload the file */
1056 if(!reloaded && get_mtime(fileno(dvi->in)) > dvi->modtime) {
1057 mdvi_reload(dvi, &dvi->params);
1058 /* we have to reopen the file, again */
1059 reloaded = 1;
1060 goto again;
1061 }
1062
1063 if(pageno < 0 || pageno > dvi->npages-1) {
1064 mdvi_error(_("%s: page %d out of range\n")gettext("%s: page %d out of range\n"),
1065 dvi->filename, pageno);
1066 return -1;
1067 }
1068
1069 fseek(dvi->in, (long)dvi->pagemap[pageno][0], SEEK_SET0);
1070 if((op = fuget1(dvi->in)((unsigned)getc(dvi->in))) != DVI_BOP139) {
1071 mdvi_error(_("%s: bad offset at page %d\n")gettext("%s: bad offset at page %d\n"),
1072 dvi->filename, pageno+1);
1073 return -1;
1074 }
1075
1076 /* skip bop */
1077 fseek(dvi->in, (long)44, SEEK_CUR1);
1078
1079 /* reset state */
1080 dvi->currfont = NULL((void*)0);
1081 memzero(&dvi->pos, sizeof(DviState))memset((&dvi->pos), 0, (sizeof(DviState)));
1082 dvi->stacktop = 0;
1083 dvi->currpage = pageno;
1084 dvi->curr_layer = 0;
1085
1086 if(dvi->buffer.data && !dvi->buffer.frozen)
1087 mdvi_free(dvi->buffer.data);
1088
1089 /* reset our buffer */
1090 dvi->buffer.data = NULL((void*)0);
1091 dvi->buffer.length = 0;
1092 dvi->buffer.pos = 0;
1093 dvi->buffer.frozen = 0;
1094
1095#if 0 /* make colors survive page breaks */
1096 /* reset color stack */
1097 mdvi_reset_color(dvi);
1098#endif
1099
1100 /* set max horizontal and vertical drift (from dvips) */
1101 if(dvi->params.hdrift < 0) {
1102 ppi = dvi->params.dpi / dvi->params.hshrink; /* shrunk pixels per inch */
1103 if(ppi < 600)
1104 dvi->params.hdrift = ppi / 100;
1105 else if(ppi < 1200)
1106 dvi->params.hdrift = ppi / 200;
1107 else
1108 dvi->params.hdrift = ppi / 400;
1109 }
1110 if(dvi->params.vdrift < 0) {
1111 ppi = dvi->params.vdpi / dvi->params.vshrink; /* shrunk pixels per inch */
1112 if(ppi < 600)
1113 dvi->params.vdrift = ppi / 100;
1114 else if(ppi < 1200)
1115 dvi->params.vdrift = ppi / 200;
1116 else
1117 dvi->params.vdrift = ppi / 400;
1118 }
1119
1120 dvi->params.thinsp = FROUND(0.025 * dvi->params.dpi / dvi->params.conv)(int)((0.025 * dvi->params.dpi / dvi->params.conv) + 0.5
)
;
1121 dvi->params.vsmallsp = FROUND(0.025 * dvi->params.vdpi / dvi->params.vconv)(int)((0.025 * dvi->params.vdpi / dvi->params.vconv) + 0.5
)
;
1122
1123 /* execute all the commands in the page */
1124 while((op = duget1(dvi)dugetn((dvi), 1)) != DVI_EOP140) {
1125 if(dvi_commands[op](dvi, op) < 0)
1126 break;
1127 }
1128
1129 fflush(stdoutstdout);
1130 fflush(stderrstderr);
1131 if(op != DVI_EOP140)
1132 return -1;
1133 if(dvi->stacktop)
1134 dviwarn(dvi, _("stack not empty at end of page\n")gettext("stack not empty at end of page\n"));
1135 return 0;
1136}
1137
1138static int inline move_vertical(DviContext *dvi, int amount)
1139{
1140 int rvv;
1141
1142 dvi->pos.v += amount;
1143 rvv = vpixel_round(dvi, dvi->pos.v)(int)((dvi)->params.vconv * (dvi->pos.v) + 0.5);
1144 if(!dvi->params.vdrift)
1145 return rvv;
1146 if(amount > dvi->params.vsmallsp || amount <= -dvi->params.vsmallsp)
1147 return rvv;
1148 else {
1149 int newvv;
1150
1151 newvv = dvi->pos.vv + vpixel_round(dvi, amount)(int)((dvi)->params.vconv * (amount) + 0.5);
1152 if(rvv - newvv > dvi->params.vdrift)
1153 return rvv - dvi->params.vdrift;
1154 else if(newvv - rvv > dvi->params.vdrift)
1155 return rvv + dvi->params.vdrift;
1156 else
1157 return newvv;
1158 }
1159}
1160
1161static int inline move_horizontal(DviContext *dvi, int amount)
1162{
1163 int rhh;
1164
1165 dvi->pos.h += amount;
1166 rhh = pixel_round(dvi, dvi->pos.h)(int)((dvi)->params.conv * (dvi->pos.h) + 0.5);
1167 if(!dvi->params.hdrift)
1168 return rhh;
1169 else if(amount > dvi->params.thinsp || amount <= -6 * dvi->params.thinsp)
1170 return rhh;
1171 else {
1172 int newhh;
1173
1174 newhh = dvi->pos.hh + pixel_round(dvi, amount)(int)((dvi)->params.conv * (amount) + 0.5);
1175 if(rhh - newhh > dvi->params.hdrift)
1176 return rhh - dvi->params.hdrift;
1177 else if(newhh - rhh > dvi->params.hdrift)
1178 return rhh + dvi->params.hdrift;
1179 else
1180 return newhh;
1181 }
1182}
1183
1184static void inline fix_after_horizontal(DviContext *dvi)
1185{
1186 int rhh;
1187
1188 rhh = pixel_round(dvi, dvi->pos.h)(int)((dvi)->params.conv * (dvi->pos.h) + 0.5);
1189 if(!dvi->params.hdrift)
1190 dvi->pos.hh = rhh;
1191 else if(rhh - dvi->pos.hh > dvi->params.hdrift)
1192 dvi->pos.hh = rhh - dvi->params.hdrift;
1193 else if(dvi->pos.hh - rhh > dvi->params.hdrift)
1194 dvi->pos.hh = rhh + dvi->params.hdrift;
1195}
1196
1197/* commands */
1198
1199#define DBGSUM(a,b,c)(a), (b) > 0 ? '+' : '-', (b) > 0 ? (b) : -(b), (c) \
1200 (a), (b) > 0 ? '+' : '-', \
1201 (b) > 0 ? (b) : -(b), (c)
1202
1203static void draw_shrink_rule (DviContext *dvi, int x, int y, Uint w, Uint h, int f)
1204{
1205 Ulong fg, bg;
1206
1207 fg = dvi->curr_fg;
1208 bg = dvi->curr_bg;
1209
1210 mdvi_push_color (dvi, fg, bg);
1211 dvi->device.draw_rule(dvi, x, y, w, h, f);
1212 mdvi_pop_color (dvi);
1213
1214 return;
1215}
1216
1217/*
1218 * The only commands that actually draw something are:
1219 * set_char, set_rule
1220 */
1221
1222static void draw_box(DviContext *dvi, DviFontChar *ch)
1223{
1224 DviGlyph *glyph = NULL((void*)0);
1225 int x, y, w, h;
1226
1227 if(!MDVI_GLYPH_UNSET(ch->shrunk.data)((ch->shrunk.data) == ((void*)0)))
1228 glyph = &ch->shrunk;
1229 else if(!MDVI_GLYPH_UNSET(ch->grey.data)((ch->grey.data) == ((void*)0)))
1230 glyph = &ch->grey;
1231 else if(!MDVI_GLYPH_UNSET(ch->glyph.data)((ch->glyph.data) == ((void*)0)))
1232 glyph = &ch->glyph;
1233 if(glyph == NULL((void*)0))
1234 return;
1235 x = glyph->x;
1236 y = glyph->y;
1237 w = glyph->w;
1238 h = glyph->h;
1239 /* this is bad -- we have to undo the orientation */
1240 switch(dvi->params.orientation) {
1241 case MDVI_ORIENT_TBLR:
1242 break;
1243 case MDVI_ORIENT_TBRL:
1244 x = w - x;
1245 break;
1246 case MDVI_ORIENT_BTLR:
1247 y = h - y;
1248 break;
1249 case MDVI_ORIENT_BTRL:
1250 x = w - x;
1251 y = h - y;
1252 break;
1253 case MDVI_ORIENT_RP90:
1254 SWAPINT(w, h)({ int _s = w; w = h; h = _s; });
1255 SWAPINT(x, y)({ int _s = x; x = y; y = _s; });
1256 x = w - x;
1257 break;
1258 case MDVI_ORIENT_RM90:
1259 SWAPINT(w, h)({ int _s = w; w = h; h = _s; });
1260 SWAPINT(x, y)({ int _s = x; x = y; y = _s; });
1261 y = h - y;
1262 break;
1263 case MDVI_ORIENT_IRP90:
1264 SWAPINT(w, h)({ int _s = w; w = h; h = _s; });
1265 SWAPINT(x, y)({ int _s = x; x = y; y = _s; });
1266 break;
1267 case MDVI_ORIENT_IRM90:
1268 SWAPINT(w, h)({ int _s = w; w = h; h = _s; });
1269 SWAPINT(x, y)({ int _s = x; x = y; y = _s; });
1270 x = w - x;
1271 y = h - y;
1272 break;
1273 }
1274
1275 draw_shrink_rule(dvi, dvi->pos.hh - x, dvi->pos.vv - y, w, h, 1);
1276}
1277
1278int set_char(DviContext *dvi, int opcode)
1279{
1280 int num;
1281 int h;
1282 int hh;
1283 DviFontChar *ch;
1284 DviFont *font;
1285
1286 if(opcode < 128)
1287 num = opcode;
1288 else
1289 num = dugetn(dvi, opcode - DVI_SET1128 + 1);
1290 if(dvi->currfont == NULL((void*)0)) {
1291 dvierr(dvi, _("no default font set yet\n")gettext("no default font set yet\n"));
1292 return -1;
1293 }
1294 font = dvi->currfont->ref;
1295 ch = font_get_glyph(dvi, font, num);
1296 if(ch == NULL((void*)0) || ch->missing) {
1297 /* try to display something anyway */
1298 ch = FONTCHAR(font, num)(((num) < font->loc || (num) > font->hic || !(font
)->chars) ? ((void*)0) : &font->chars[(num) - (font
)->loc])
;
1299 if(!glyph_present(ch)((ch) && (ch)->offset)) {
1300 dviwarn(dvi,
1301 _("requested character %d does not exist in `%s'\n")gettext("requested character %d does not exist in `%s'\n"),
1302 num, font->fontname);
1303 return 0;
1304 }
1305 draw_box(dvi, ch);
1306 } else if(dvi->curr_layer <= dvi->params.layer) {
1307 if(ISVIRTUAL(font)((font)->search.info->getglyph == ((void*)0)))
1308 mdvi_run_macro(dvi, (Uchar *)font->private +
1309 ch->offset, ch->width);
1310 else if(ch->width && ch->height)
1311 dvi->device.draw_glyph(dvi, ch,
1312 dvi->pos.hh, dvi->pos.vv);
1313 }
1314 if(opcode >= DVI_PUT1133 && opcode <= DVI_PUT4136) {
1315 SHOWCMD((dvi, "putchar", opcode - DVI_PUT1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"putchar", opcode - 133 + 1, "char %d (%s)\n", num, dvi->
currfont->ref->fontname); } while(0)
1316 "char %d (%s)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"putchar", opcode - 133 + 1, "char %d (%s)\n", num, dvi->
currfont->ref->fontname); } while(0)
1317 num, dvi->currfont->ref->fontname))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"putchar", opcode - 133 + 1, "char %d (%s)\n", num, dvi->
currfont->ref->fontname); } while(0)
;
1318 } else {
1319 h = dvi->pos.h + ch->tfmwidth;
1320 hh = dvi->pos.hh + pixel_round(dvi, ch->tfmwidth)(int)((dvi)->params.conv * (ch->tfmwidth) + 0.5);
1321 SHOWCMD((dvi, "setchar", num, "(%d,%d) h:=%d%c%d=%d, hh:=%d (%s)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"setchar", num, "(%d,%d) h:=%d%c%d=%d, hh:=%d (%s)\n", dvi->
pos.hh, dvi->pos.vv, (dvi->pos.h), (ch->tfmwidth) >
0 ? '+' : '-', (ch->tfmwidth) > 0 ? (ch->tfmwidth) :
-(ch->tfmwidth), (h), hh, font->fontname); } while(0)
1322 dvi->pos.hh, dvi->pos.vv,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"setchar", num, "(%d,%d) h:=%d%c%d=%d, hh:=%d (%s)\n", dvi->
pos.hh, dvi->pos.vv, (dvi->pos.h), (ch->tfmwidth) >
0 ? '+' : '-', (ch->tfmwidth) > 0 ? (ch->tfmwidth) :
-(ch->tfmwidth), (h), hh, font->fontname); } while(0)
1323 DBGSUM(dvi->pos.h, ch->tfmwidth, h), hh,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"setchar", num, "(%d,%d) h:=%d%c%d=%d, hh:=%d (%s)\n", dvi->
pos.hh, dvi->pos.vv, (dvi->pos.h), (ch->tfmwidth) >
0 ? '+' : '-', (ch->tfmwidth) > 0 ? (ch->tfmwidth) :
-(ch->tfmwidth), (h), hh, font->fontname); } while(0)
1324 font->fontname))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"setchar", num, "(%d,%d) h:=%d%c%d=%d, hh:=%d (%s)\n", dvi->
pos.hh, dvi->pos.vv, (dvi->pos.h), (ch->tfmwidth) >
0 ? '+' : '-', (ch->tfmwidth) > 0 ? (ch->tfmwidth) :
-(ch->tfmwidth), (h), hh, font->fontname); } while(0)
;
1325 dvi->pos.h = h;
1326 dvi->pos.hh = hh;
1327 fix_after_horizontal(dvi);
1328 }
1329
1330 return 0;
1331}
1332
1333int set_rule(DviContext *dvi, int opcode)
1334{
1335 Int32 a, b;
1336 int h, w;
1337
1338 a = dsget4(dvi)dsgetn((dvi), 4);
1339 b = dsget4(dvi)dsgetn((dvi), 4); w = rule_round(dvi, b)(int)((dvi)->params.conv * (b) + 0.99999);
1340 if(a > 0 && b > 0) {
1341 h = vrule_round(dvi, a)(int)((dvi)->params.vconv * (a) + 0.99999);
1342 SHOWCMD((dvi, opcode == DVI_SET_RULE ? "setrule" : "putrule", -1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
opcode == 132 ? "setrule" : "putrule", -1, "width %d, height %d (%dx%d pixels)\n"
, b, a, w, h); } while(0)
1343 "width %d, height %d (%dx%d pixels)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
opcode == 132 ? "setrule" : "putrule", -1, "width %d, height %d (%dx%d pixels)\n"
, b, a, w, h); } while(0)
1344 b, a, w, h))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
opcode == 132 ? "setrule" : "putrule", -1, "width %d, height %d (%dx%d pixels)\n"
, b, a, w, h); } while(0)
;
1345 /* the `draw' functions expect the origin to be at the top left
1346 * corner of the rule, not the bottom left, as in DVI files */
1347 if(dvi->curr_layer <= dvi->params.layer) {
1348 draw_shrink_rule(dvi,
1349 dvi->pos.hh, dvi->pos.vv - h + 1, w, h, 1);
1350 }
1351 } else {
1352 SHOWCMD((dvi, opcode == DVI_SET_RULE ? "setrule" : "putrule", -1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
opcode == 132 ? "setrule" : "putrule", -1, "(moving left only, by %d)\n"
, b); } while(0)
1353 "(moving left only, by %d)\n", b))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
opcode == 132 ? "setrule" : "putrule", -1, "(moving left only, by %d)\n"
, b); } while(0)
;
1354 }
1355
1356 if(opcode == DVI_SET_RULE132) {
1357 dvi->pos.h += b;
1358 dvi->pos.hh += w;
1359 fix_after_horizontal(dvi);
1360 }
1361 return 0;
1362}
1363
1364int no_op(DviContext *dvi, int opcode GNUC_UNUSED__attribute__ ((__unused__)))
1365{
1366 SHOWCMD((dvi, "noop", -1, ""))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"noop", -1, ""); } while(0)
;
1367 return 0;
1368}
1369
1370int push(DviContext *dvi, int opcode GNUC_UNUSED__attribute__ ((__unused__)))
1371{
1372 if(dvi->stacktop == dvi->stacksize) {
1373 if(!dvi->depth)
1374 dviwarn(dvi, _("enlarging stack\n")gettext("enlarging stack\n"));
1375 dvi->stacksize += 8;
1376 dvi->stack = xresize(dvi->stack,(DviState *)mdvi_realloc((dvi->stack), (dvi->stacksize)
* sizeof(DviState))
1377 DviState, dvi->stacksize)(DviState *)mdvi_realloc((dvi->stack), (dvi->stacksize)
* sizeof(DviState))
;
1378 }
1379 memcpy(&dvi->stack[dvi->stacktop], &dvi->pos, sizeof(DviState))bcopy ((&dvi->pos), (&dvi->stack[dvi->stacktop
]), (sizeof(DviState)))
;
1380 SHOWCMD((dvi, "push", -1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"push", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1381 "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"push", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1382 dvi->stacktop,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"push", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1383 dvi->pos.h, dvi->pos.v, dvi->pos.w, dvi->pos.x,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"push", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1384 dvi->pos.y, dvi->pos.z, dvi->pos.hh, dvi->pos.vv))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"push", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
;
1385 dvi->stacktop++;
1386 return 0;
1387}
1388
1389int pop(DviContext *dvi, int opcode GNUC_UNUSED__attribute__ ((__unused__)))
1390{
1391 if(dvi->stacktop == 0) {
1392 dvierr(dvi, _("stack underflow\n")gettext("stack underflow\n"));
1393 return -1;
1394 }
1395 memcpy(&dvi->pos, &dvi->stack[dvi->stacktop-1], sizeof(DviState))bcopy ((&dvi->stack[dvi->stacktop-1]), (&dvi->
pos), (sizeof(DviState)))
;
1396 SHOWCMD((dvi, "pop", -1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"pop", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1397 "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"pop", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1398 dvi->stacktop,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"pop", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1399 dvi->pos.h, dvi->pos.v, dvi->pos.w, dvi->pos.x,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"pop", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
1400 dvi->pos.y, dvi->pos.z, dvi->pos.hh, dvi->pos.vv))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"pop", -1, "level %d: (h=%d,v=%d,w=%d,x=%d,y=%d,z=%d,hh=%d,vv=%d)\n"
, dvi->stacktop, dvi->pos.h, dvi->pos.v, dvi->pos
.w, dvi->pos.x, dvi->pos.y, dvi->pos.z, dvi->pos.
hh, dvi->pos.vv); } while(0)
;
1401 dvi->stacktop--;
1402 return 0;
1403}
1404
1405int move_right(DviContext *dvi, int opcode)
1406{
1407 Int32 arg;
1408 int h, hh;
1409
1410 arg = dsgetn(dvi, opcode - DVI_RIGHT1143 + 1);
1411 h = dvi->pos.h;
1412 hh = move_horizontal(dvi, arg);
1413 SHOWCMD((dvi, "right", opcode - DVI_RIGHT1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"right", opcode - 143 + 1, "%d h:=%d%c%d=%d, hh:=%d\n", arg,
(h), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg)
, (dvi->pos.h), hh); } while(0)
1414 "%d h:=%d%c%d=%d, hh:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"right", opcode - 143 + 1, "%d h:=%d%c%d=%d, hh:=%d\n", arg,
(h), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg)
, (dvi->pos.h), hh); } while(0)
1415 arg, DBGSUM(h, arg, dvi->pos.h), hh))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"right", opcode - 143 + 1, "%d h:=%d%c%d=%d, hh:=%d\n", arg,
(h), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg)
, (dvi->pos.h), hh); } while(0)
;
1416 dvi->pos.hh = hh;
1417 return 0;
1418}
1419
1420int move_down(DviContext *dvi, int opcode)
1421{
1422 Int32 arg;
1423 int v, vv;
1424
1425 arg = dsgetn(dvi, opcode - DVI_DOWN1157 + 1);
1426 v = dvi->pos.v;
1427 vv = move_vertical(dvi, arg);
1428 SHOWCMD((dvi, "down", opcode - DVI_DOWN1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"down", opcode - 157 + 1, "%d v:=%d%c%d=%d, vv:=%d\n", arg, (
v), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg), (
dvi->pos.v), vv); } while(0)
1429 "%d v:=%d%c%d=%d, vv:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"down", opcode - 157 + 1, "%d v:=%d%c%d=%d, vv:=%d\n", arg, (
v), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg), (
dvi->pos.v), vv); } while(0)
1430 arg, DBGSUM(v, arg, dvi->pos.v), vv))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"down", opcode - 157 + 1, "%d v:=%d%c%d=%d, vv:=%d\n", arg, (
v), (arg) > 0 ? '+' : '-', (arg) > 0 ? (arg) : -(arg), (
dvi->pos.v), vv); } while(0)
;
1431 dvi->pos.vv = vv;
1432 return 0;
1433}
1434
1435int move_w(DviContext *dvi, int opcode)
1436{
1437 int h, hh;
1438
1439 if(opcode != DVI_W0147)
1440 dvi->pos.w = dsgetn(dvi, opcode - DVI_W0147);
1441 h = dvi->pos.h;
1442 hh = move_horizontal(dvi, dvi->pos.w);
1443 SHOWCMD((dvi, "w", opcode - DVI_W0,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"w", opcode - 147, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
w, (h), (dvi->pos.w) > 0 ? '+' : '-', (dvi->pos.w) >
0 ? (dvi->pos.w) : -(dvi->pos.w), (dvi->pos.h), hh)
; } while(0)
1444 "%d h:=%d%c%d=%d, hh:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"w", opcode - 147, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
w, (h), (dvi->pos.w) > 0 ? '+' : '-', (dvi->pos.w) >
0 ? (dvi->pos.w) : -(dvi->pos.w), (dvi->pos.h), hh)
; } while(0)
1445 dvi->pos.w, DBGSUM(h, dvi->pos.w, dvi->pos.h), hh))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"w", opcode - 147, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
w, (h), (dvi->pos.w) > 0 ? '+' : '-', (dvi->pos.w) >
0 ? (dvi->pos.w) : -(dvi->pos.w), (dvi->pos.h), hh)
; } while(0)
;
1446 dvi->pos.hh = hh;
1447 return 0;
1448}
1449
1450int move_x(DviContext *dvi, int opcode)
1451{
1452 int h, hh;
1453
1454 if(opcode != DVI_X0152)
1455 dvi->pos.x = dsgetn(dvi, opcode - DVI_X0152);
1456 h = dvi->pos.h;
1457 hh = move_horizontal(dvi, dvi->pos.x);
1458 SHOWCMD((dvi, "x", opcode - DVI_X0,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"x", opcode - 152, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
x, (h), (dvi->pos.x) > 0 ? '+' : '-', (dvi->pos.x) >
0 ? (dvi->pos.x) : -(dvi->pos.x), (dvi->pos.h), hh)
; } while(0)
1459 "%d h:=%d%c%d=%d, hh:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"x", opcode - 152, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
x, (h), (dvi->pos.x) > 0 ? '+' : '-', (dvi->pos.x) >
0 ? (dvi->pos.x) : -(dvi->pos.x), (dvi->pos.h), hh)
; } while(0)
1460 dvi->pos.x, DBGSUM(h, dvi->pos.x, dvi->pos.h), hh))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"x", opcode - 152, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
x, (h), (dvi->pos.x) > 0 ? '+' : '-', (dvi->pos.x) >
0 ? (dvi->pos.x) : -(dvi->pos.x), (dvi->pos.h), hh)
; } while(0)
;
1461 dvi->pos.hh = hh;
1462 return 0;
1463}
1464
1465int move_y(DviContext *dvi, int opcode)
1466{
1467 int v, vv;
1468
1469 if(opcode != DVI_Y0161)
1470 dvi->pos.y = dsgetn(dvi, opcode - DVI_Y0161);
1471 v = dvi->pos.v;
1472 vv = move_vertical(dvi, dvi->pos.y);
1473 SHOWCMD((dvi, "y", opcode - DVI_Y0,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"y", opcode - 161, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
y, (v), (dvi->pos.y) > 0 ? '+' : '-', (dvi->pos.y) >
0 ? (dvi->pos.y) : -(dvi->pos.y), (dvi->pos.v), vv)
; } while(0)
1474 "%d h:=%d%c%d=%d, hh:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"y", opcode - 161, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
y, (v), (dvi->pos.y) > 0 ? '+' : '-', (dvi->pos.y) >
0 ? (dvi->pos.y) : -(dvi->pos.y), (dvi->pos.v), vv)
; } while(0)
1475 dvi->pos.y, DBGSUM(v, dvi->pos.y, dvi->pos.v), vv))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"y", opcode - 161, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
y, (v), (dvi->pos.y) > 0 ? '+' : '-', (dvi->pos.y) >
0 ? (dvi->pos.y) : -(dvi->pos.y), (dvi->pos.v), vv)
; } while(0)
;
1476 dvi->pos.vv = vv;
1477 return 0;
1478}
1479
1480int move_z(DviContext *dvi, int opcode)
1481{
1482 int v, vv;
1483
1484 if(opcode != DVI_Z0166)
1485 dvi->pos.z = dsgetn(dvi, opcode - DVI_Z0166);
1486 v = dvi->pos.v;
1487 vv = move_vertical(dvi, dvi->pos.z);
1488 SHOWCMD((dvi, "z", opcode - DVI_Z0,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"z", opcode - 166, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
z, (v), (dvi->pos.z) > 0 ? '+' : '-', (dvi->pos.z) >
0 ? (dvi->pos.z) : -(dvi->pos.z), (dvi->pos.v), vv)
; } while(0)
1489 "%d h:=%d%c%d=%d, hh:=%d\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"z", opcode - 166, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
z, (v), (dvi->pos.z) > 0 ? '+' : '-', (dvi->pos.z) >
0 ? (dvi->pos.z) : -(dvi->pos.z), (dvi->pos.v), vv)
; } while(0)
1490 dvi->pos.z, DBGSUM(v, dvi->pos.z, dvi->pos.v), vv))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"z", opcode - 166, "%d h:=%d%c%d=%d, hh:=%d\n", dvi->pos.
z, (v), (dvi->pos.z) > 0 ? '+' : '-', (dvi->pos.z) >
0 ? (dvi->pos.z) : -(dvi->pos.z), (dvi->pos.v), vv)
; } while(0)
;
1491 dvi->pos.vv = vv;
1492 return 0;
1493}
1494
1495int sel_font(DviContext *dvi, int opcode)
1496{
1497 DviFontRef *ref;
1498 int ndx;
1499
1500 ndx = opcode - DVI_FNT_NUM0171;
1501 if(dvi->depth)
1502 ref = font_find_flat(dvi, ndx);
1503 else
1504 ref = dvi->findref(dvi, ndx);
1505 if(ref == NULL((void*)0)) {
1506 dvierr(dvi, _("font %d is not defined\n")gettext("font %d is not defined\n"),
1507 opcode - DVI_FNT_NUM0171);
1508 return -1;
1509 }
1510 SHOWCMD((dvi, "fntnum", opcode - DVI_FNT_NUM0,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntnum", opcode - 171, "current font is %s\n", ref->ref->
fontname); } while(0)
1511 "current font is %s\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntnum", opcode - 171, "current font is %s\n", ref->ref->
fontname); } while(0)
1512 ref->ref->fontname))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntnum", opcode - 171, "current font is %s\n", ref->ref->
fontname); } while(0)
;
1513 dvi->currfont = ref;
1514 return 0;
1515}
1516
1517int sel_fontn(DviContext *dvi, int opcode)
1518{
1519 Int32 arg;
1520 DviFontRef *ref;
1521
1522 arg = dugetn(dvi, opcode - DVI_FNT1235 + 1);
1523 if(dvi->depth)
1524 ref = font_find_flat(dvi, arg);
1525 else
1526 ref = dvi->findref(dvi, arg);
1527 if(ref == NULL((void*)0)) {
1528 dvierr(dvi, _("font %d is not defined\n")gettext("font %d is not defined\n"), arg);
1529 return -1;
1530 }
1531 SHOWCMD((dvi, "fnt", opcode - DVI_FNT1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fnt", opcode - 235 + 1, "current font is %s (id %d)\n", ref
->ref->fontname, arg); } while(0)
1532 "current font is %s (id %d)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fnt", opcode - 235 + 1, "current font is %s (id %d)\n", ref
->ref->fontname, arg); } while(0)
1533 ref->ref->fontname, arg))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fnt", opcode - 235 + 1, "current font is %s (id %d)\n", ref
->ref->fontname, arg); } while(0)
;
1534 dvi->currfont = ref;
1535 return 0;
1536}
1537
1538int special(DviContext *dvi, int opcode)
1539{
1540 char *s;
1541 Int32 arg;
1542
1543 arg = dugetn(dvi, opcode - DVI_XXX1239 + 1);
1544 if (arg <= 0) {
1545 dvierr(dvi, _("malformed special length\n")gettext("malformed special length\n"));
1546 return -1;
1547 }
1548 s = mdvi_malloc(arg + 1);
1549 dread(dvi, s, arg);
1550 s[arg] = 0;
1551 mdvi_do_special(dvi, s);
1552 SHOWCMD((dvi, "XXXX", opcode - DVI_XXX1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"XXXX", opcode - 239 + 1, "[%s]", s); } while(0)
1553 "[%s]", s))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"XXXX", opcode - 239 + 1, "[%s]", s); } while(0)
;
1554 mdvi_free(s);
1555 return 0;
1556}
1557
1558int def_font(DviContext *dvi, int opcode)
1559{
1560 DviFontRef *ref;
1561 Int32 arg;
1562
1563 arg = dugetn(dvi, opcode - DVI_FNT_DEF1243 + 1);
1564 if(dvi->depth)
1565 ref = font_find_flat(dvi, arg);
1566 else
1567 ref = dvi->findref(dvi, arg);
1568 /* skip the rest */
1569 dskip(dvi, 12);
1570 dskip(dvi, duget1(dvi)dugetn((dvi), 1) + duget1(dvi)dugetn((dvi), 1));
1571 if(ref == NULL((void*)0)) {
1572 dvierr(dvi, _("font %d is not defined in postamble\n")gettext("font %d is not defined in postamble\n"), arg);
1573 return -1;
1574 }
1575 SHOWCMD((dvi, "fntdef", opcode - DVI_FNT_DEF1 + 1,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntdef", opcode - 243 + 1, "%d -> %s (%d links)\n", ref->
fontid, ref->ref->fontname, ref->ref->links); } while
(0)
1576 "%d -> %s (%d links)\n",if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntdef", opcode - 243 + 1, "%d -> %s (%d links)\n", ref->
fontid, ref->ref->fontname, ref->ref->links); } while
(0)
1577 ref->fontid, ref->ref->fontname,if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntdef", opcode - 243 + 1, "%d -> %s (%d links)\n", ref->
fontid, ref->ref->fontname, ref->ref->links); } while
(0)
1578 ref->ref->links))if(_mdvi_debug_mask & (1 << 0)) do { dviprint (dvi,
"fntdef", opcode - 243 + 1, "%d -> %s (%d links)\n", ref->
fontid, ref->ref->fontname, ref->ref->links); } while
(0)
;
1579 return 0;
1580}
1581
1582int unexpected(DviContext *dvi, int opcode)
1583{
1584 dvierr(dvi, _("unexpected opcode %d\n")gettext("unexpected opcode %d\n"), opcode);
1585 return -1;
1586}
1587
1588int undefined(DviContext *dvi, int opcode)
1589{
1590 dvierr(dvi, _("undefined opcode %d\n")gettext("undefined opcode %d\n"), opcode);
1591 return -1;
1592}
1593