summaryrefslogtreecommitdiff
path: root/systems/unix/tex-fpc/xdvi/macxdvi.h
blob: c72024fa51fbc41fc6f1b5cb71c005170a872a44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
/*========================================================================*\

Copyright (c) 1990-2004  Paul Vojta

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

NOTE:
	xdvi is based on prior work, as noted in the modification history
	in xdvi.c.

\*========================================================================*/
 /* helbig changed this file to make it work on Mac OS X */
 /* it defined XOPEN_SOURCE,  which causes NSIG to be not defined,
    which breaks signal.h included by event.c */

/*
 *	Written by Eric C. Cooper, CMU
 */

#ifndef	XDVI_H
#define	XDVI_H

/********************************
 *	The C environment	*
 *******************************/

#ifdef __hpux
/* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED
 * leads to poll() not realizing that a file descriptor is writable in psgs.c.
 */
#define	_HPUX_SOURCE	1
#else
#undef _XOPEN_SOURCE		/* needed because of imake */
#define	_XOPEN_SOURCE_EXTENDED	1
#define	__EXTENSIONS__	1	/* needed to get struct timeval on SunOS 5.5 */
#define	_SVID_SOURCE	1	/* needed to get S_IFLNK in glibc */
#define	_BSD_SOURCE	1	/* needed to get F_SETOWN in glibc-2.1.3 */
#endif

#include "config.h"

/* Some O/S dependent kludges. */
#ifdef _AIX
#define _ALL_SOURCE 1
#endif

/* If xmkmf is broken and there's a symlink from /usr/include/X11 to the right
 * place, then there will be no -I... argument on the cc command line for the
 * X include files.  Since gcc version 3 and higher sets __STDC__ to 0 when
 * including system header files on some platforms, we may end up with
 * NeedFunctionPrototypes set to 0 when it should be 1.  So, let's force the
 * issue.
 */

#if __STDC__ && !defined(FUNCPROTO)
# define FUNCPROTO (-1)
#endif

#if STDC_HEADERS
# include <stddef.h>
# include <stdlib.h>
	/* the following works around the wchar_t problem */
# include <X11/X.h>
# if HAVE_X11_XOSDEFS_H
#  include <X11/Xosdefs.h>
# endif
# ifdef X_NOT_STDC_ENV
#  undef X_NOT_STDC_ENV
#  undef X_WCHAR
#  include <X11/Xlib.h>
#  define X_NOT_STDC_ENV
# endif
#endif

#include <X11/Xlib.h>	/* include Xfuncs.h, if available */
#include <X11/Xutil.h>	/* needed for XDestroyImage */
#include <X11/Xos.h>

#if	XlibSpecificationRelease >= 5
#include <X11/Xfuncs.h>
#endif

#undef	TOOLKIT

#if XAW || MOTIF

#define	TOOLKIT	1
#include <X11/Intrinsic.h>
#if (defined(VMS) && (XtSpecificationRelease <= 4)) || defined(lint)
# include <X11/IntrinsicP.h>
#endif
#if MOTIF
# include <Xm/Xm.h>
# ifndef MOTIF_TIMERS	/* see comment in events.c */
#  define MOTIF_TIMERS (XmVERSION >= 2)
# endif
#endif

#else /* not TOOLKIT */

#define	XtNumber(arr)	(sizeof(arr)/sizeof(arr[0]))
#define	XtWindow(win)	(win)
typedef	unsigned long	Pixel;
typedef	char		Boolean;
typedef	unsigned int	Dimension;
#undef	BUTTONS
#undef	EXTRA_APP_DEFAULTS

#endif /* not TOOLKIT */

#if EXTRA_APP_DEFAULTS && !SELFAUTO
#define	SELFAUTO 1
#endif

#if SELFAUTO && !defined(DEFAULT_CONFIG_PATH)
#define	DEFAULT_CONFIG_PATH	\
		".:$SELFAUTOLOC:$SELFAUTODIR:$SELFAUTOPARENT:$SELFAUTODIR/share/texmf/web2c:$SELFAUTOPARENT/share/texmf/web2c:$SELFAUTODIR/texmf/web2c:$SELFAUTOPARENT/texmf/web2c:$TETEXDIR:$TEXMF/web2c"
#endif

#undef CFGFILE				/* no cheating */

#if defined(DEFAULT_CONFIG_PATH)
#define	CFGFILE	1
#endif

typedef	char		Bool3;		/* Yes/No/Maybe */

#define	True	1
#define	False	0
#define	Maybe	2

#ifdef	VMS
#include <string.h>
#define	index	strchr
#define	rindex	strrchr
#define	bzero(a, b)	(void) memset ((void *) (a), 0, (size_t) (b))
#define bcopy(a, b, c)  (void) memmove ((void *) (b), (void *) (a), (size_t) (c))
#endif

#include <stdio.h>
#include <setjmp.h>

#if HAVE_UNISTD_H
#include <unistd.h>
#endif

#if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
# if HAVE_SYS_NDIR_H
#  include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
#  include <sys/dir.h>
# endif
# if HAVE_NDIR_H
#  include <ndir.h>
# endif
#endif

#ifndef	NeedFunctionPrototypes
#if	__STDC__
#define	NeedFunctionPrototypes	1
#else	/* STDC */
#define	NeedFunctionPrototypes	0
#endif	/* STDC */
#endif	/* NeedFunctionPrototypes */

#if	NeedFunctionPrototypes
#define	ARGS(x)	x
#else
#define	ARGS(x)	()
#endif

#ifndef KPATHSEA

/* These macros munge function declarations to make them work in both
   cases.  The P?H macros are used for declarations, the P?C for
   definitions.  See <ansidecl.h> from the GNU C library.  P1H(void)
   also works for definitions of routines which take no args.  */

#if NeedFunctionPrototypes	/* Don't use __STDC__ here (gcc + SunOS 4) */

#define	P1H(p1) (p1)
#define	P2H(p1, p2) (p1, p2)

#define	P1C(t1,n1)(t1 n1)
#define	P2C(t1,n1, t2,n2)(t1 n1, t2 n2)
#define	P3C(t1,n1, t2,n2, t3,n3)(t1 n1, t2 n2, t3 n3)
#define	P4C(t1,n1, t2,n2, t3,n3, t4,n4)(t1 n1, t2 n2, t3 n3, t4 n4)

#else /* not NeedFunctionPrototypes */

#define	P1H(p1) ()
#define	P2H(p1, p2) ()

#define	P1C(t1,n1) (n1) t1 n1;
#define	P2C(t1,n1, t2,n2) (n1,n2) t1 n1; t2 n2;
#define	P3C(t1,n1, t2,n2, t3,n3) (n1,n2,n3) t1 n1; t2 n2; t3 n3;
#define	P4C(t1,n1, t2,n2, t3,n3, t4,n4) (n1,n2,n3,n4) \
		t1 n1; t2 n2; t3 n3; t4 n4;

#endif /* not NeedFunctionPrototypes */

#endif /* not KPATHSEA */

#ifndef	NeedWidePrototypes
#define	NeedWidePrototypes	NeedFunctionPrototypes
#endif

#ifndef	NeedVarargsPrototypes
#define	NeedVarargsPrototypes	NeedFunctionPrototypes
#endif

#if NeedVarargsPrototypes
#define	VARGS(x)	x
#else
#define	VARGS(x)	()
#endif

#ifndef	_XFUNCPROTOBEGIN
#define	_XFUNCPROTOBEGIN
#define	_XFUNCPROTOEND
#endif

#ifndef	_Xconst
#if	__STDC__
#define	_Xconst	const
#else	/* STDC */
#define	_Xconst
#endif	/* STDC */
#endif	/* _Xconst */

#ifndef	VOLATILE
#if	__STDC__ || (defined(__stdc__) && defined(__convex__))
#define	VOLATILE	volatile
#else
#define	VOLATILE	/* nothing */
#endif
#endif

#ifndef	NORETURN
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)
#  define NORETURN	__attribute__((__noreturn__))
# else
#  define NORETURN	/* nothing */
# endif
#endif

#ifndef UNUSED
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
#  define UNUSED	__attribute__((__unused__))
# else
#  define UNUSED	/* nothing */
# endif
#endif

#ifndef	OPEN_MODE
#ifndef	VMS
#define	OPEN_MODE	"r"
#else	/* VMS */
#define	OPEN_MODE	"r", "ctx=stm"
#endif	/* VMS */
#endif	/* OPEN_MODE */

#ifndef	VMS
#define	OPEN_MODE_ARGS	_Xconst char *
#else
#define	OPEN_MODE_ARGS	_Xconst char *, _Xconst char *
#endif

#define	Printf	(void) printf
#define	Puts	(void) puts
#define	Fprintf	(void) fprintf
#define	Sprintf	(void) sprintf
#define	Fseek	(void) fseek
#define	Fread	(void) fread
#define	Fputs	(void) fputs
#define	Putc	(void) putc
#define	Putchar	(void) putchar
#define	Fclose	(void) fclose
#define	Fflush	(void) fflush
#define	Strcat	(void) strcat
#define	Strcpy	(void) strcpy

/********************************
 *	 Types and data		*
 *******************************/

#ifndef	EXTERN
#define	EXTERN	extern
#define	INIT(x)
#endif

#define	MAXDIM		32767

typedef	unsigned char	ubyte;

#if	NeedWidePrototypes
typedef	unsigned int	wide_ubyte;
typedef	int		wide_bool;
#define	WIDENINT	(int)
#else
typedef	ubyte		wide_ubyte;
typedef	Boolean		wide_bool;
#define	WIDENINT
#endif

#if defined(MAKETEXPK) && !defined(MKTEXPK)
#define	MKTEXPK 1
#endif

/*
 *	pixel_conv is currently used only for converting absolute positions
 *	to pixel values; although normally it should be
 *		((int) ((x) / shrink_factor + (1 << 15) >> 16)),
 *	the rounding is achieved instead by moving the constant 1 << 15 to
 *	PAGE_OFFSET in dvi-draw.c.
 */
#define	pixel_conv(x)		((int) ((x) / shrink_factor >> 16))
#define	pixel_round(x)		((int) ROUNDUP(x, shrink_factor << 16))
#define	spell_conv0(n, f)	((long) (n * f))
#define	spell_conv(n)		spell_conv0(n, dimconv)

#define	BMUNIT			unsigned BMTYPE
#define	BMBITS			(8 * BMBYTES)

#define	ADD(a, b)	((BMUNIT *) (((char *) a) + b))
#define	SUB(a, b)	((BMUNIT *) (((char *) a) - b))

extern	BMUNIT	bit_masks[BMBITS + 1];

struct frame {
	struct framedata {
		long dvi_h, dvi_v, w, x, y, z;
		int pxl_v;
	} data;
	struct frame *next, *prev;
};

#ifndef	TEXXET
typedef	long	(*set_char_proc) ARGS((wide_ubyte));
#else
typedef	void	(*set_char_proc) ARGS((wide_ubyte, wide_ubyte));
#endif

typedef	void	(*home_proc) ARGS((wide_bool));

struct drawinf {	/* this information is saved when using virtual fonts */
	struct framedata data;
	struct font	*fontp;
	set_char_proc	set_char_p;
	int		tn_table_len;
	struct font	**tn_table;
	struct tn	*tn_head;
	ubyte		*pos, *end;
	struct font	*virtual;
#ifdef	TEXXET
	int		dir;
#endif
};

EXTERN	struct drawinf	currinf;

/* entries below with the characters 'dvi' in them are actually stored in
   scaled pixel units */

#define DVI_H   currinf.data.dvi_h
#define PXL_H   pixel_conv(currinf.data.dvi_h)
#define DVI_V   currinf.data.dvi_v
#define PXL_V   currinf.data.pxl_v
#define WW      currinf.data.w
#define XX      currinf.data.x
#define YY      currinf.data.y
#define ZZ      currinf.data.z
#define ROUNDUP(x,y) (((x)+(y)-1)/(y))

EXTERN	int	current_page;
EXTERN	int	total_pages;
EXTERN	int	pageno_correct	INIT(1);
EXTERN	long	magnification;
EXTERN	double	dimconv;
EXTERN	double	tpic_conv;
EXTERN	int	n_files_left	INIT(32767);	/* for LRU closing of fonts */
EXTERN	unsigned int	page_w, page_h;

#if	defined(GS_PATH) && !defined(PS_GS)
#define	PS_GS	1
#endif

#if	defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS)
#define	PS	1
#else
#define	PS	0
#endif

EXTERN	int	scanned_page;		/* last page prescanned */

#if PS
EXTERN	int	scanned_page_ps;	/* last page scanned for PS specials */
EXTERN	int	scanned_page_ps_bak;	/* save the above if PS is turned off */
#endif

#if COLOR
EXTERN	int	scanned_page_color;	/* last page scanned for color spcls */
#endif

EXTERN	int	scanned_page_reset;	/* number to reset the above to */

/*
 * The following is set when we're prescanning before opening up the windows,
 * and we hit a PostScript header file.  We can't start up gs until we get
 * a window to associate the process to, so we have to prescan twice.
 */
#if PS_GS
EXTERN	Boolean	gs_postpone_prescan	INIT(False);
#endif

/*
 * Per-page data in DVI file, indexed by page number - 1.
 * Offset is initialized in prepare_pages().
 * Page size is initialized while prescanning.
 */
struct per_page {
	long	offset;
	unsigned int	pw, ph;	/* page size */
	unsigned int	ww, wh;	/* window size */
};

EXTERN	struct per_page		*page_info;

/*
 * Set if the -paper option overrides papersize specials.
 */
EXTERN	Boolean			ignore_papersize_specials	INIT(False);

/*
 * Mechanism for reducing repeated warning about specials, lost characters, etc.
 */
EXTERN	Boolean	warn_spec_now;

/*
 * If we're in the middle of a PSFIG special.
 */
EXTERN	Boolean	psfig_begun	INIT(False);

/*
 * Page on which to draw box from forward source special searching.
 */
EXTERN	int	source_fwd_box_page	INIT(-1);	/* -1 means no box */

/*
 * Information on deferred source operation.  See do_pages() for meaning.
 */
EXTERN	_Xconst char	*source_forward_string	INIT(NULL);
EXTERN	int		source_reverse_x, source_reverse_y;
EXTERN	int		source_show_all;


/*
 * Bitmap structure for raster ops.
 */
struct bitmap {
	unsigned short	w, h;		/* width and height in pixels */
	short		bytes_wide;	/* scan-line width in bytes */
	char		*bits;		/* pointer to the bits */
};

/*
 * Per-character information.
 * There is one of these for each character in a font (raster fonts only).
 * All fields are filled in at font definition time,
 * except for the bitmap, which is "faulted in"
 * when the character is first referenced.
 */
struct glyph {
	long addr;		/* address of bitmap in font file */
	long dvi_adv;		/* DVI units to move reference point */
	short x, y;		/* x and y offset in pixels */
	struct bitmap bitmap;	/* bitmap for character */
	short x2, y2;		/* x and y offset in pixels (shrunken bitmap) */
#if GREY
# if COLOR
	struct fgrec *fg;	/* fgrec for which these pixmaps are valid */
# endif
	XImage *image2;
	char *pixmap2;
	char *pixmap2_t;
#endif /* GREY */
	struct bitmap bitmap2;	/* shrunken bitmap for character */
};

/*
 * Per-character information for virtual fonts
 */
struct macro {
	ubyte	*pos;		/* address of first byte of macro */
	ubyte	*end;		/* address of last+1 byte */
	long	dvi_adv;	/* DVI units to move reference point */
	Boolean	free_me;	/* if free(pos) should be called when */
				/* freeing space */
};

/*
 * The layout of a font information block.
 * There is one of these for every loaded font or magnification thereof.
 * Duplicates are eliminated:  this is necessary because of possible recursion
 * in virtual fonts.
 *
 * Also note the strange units.  The design size is in 1/2^20 point
 * units (also called micro-points), and the individual character widths
 * are in the TFM file in 1/2^20 ems units, i.e., relative to the design size.
 *
 * We then change the sizes to SPELL units (unshrunk pixel / 2^16).
 */

#define	NOMAGSTP (-29999)

typedef	void (*read_char_proc) ARGS((struct font *, wide_ubyte));

struct font {
	struct font *next;		/* link to next font info block */
	char *fontname;			/* name of font */
	float fsize;			/* size information (dots per inch) */
	int magstepval;			/* magstep number * two, or NOMAGSTP */
	FILE *file;			/* open font file or NULL */
	char *filename;			/* name of font file */
	long checksum;			/* checksum */
	unsigned short timestamp;	/* for LRU management of fonts */
	ubyte flags;			/* flags byte (see values below) */
	ubyte maxchar;			/* largest character code */
	double dimconv;			/* size conversion factor */
	set_char_proc set_char_p;	/* proc used to set char */
		/* these fields are used by (loaded) raster fonts */
	read_char_proc read_char;	/* function to read bitmap */
	struct glyph *glyph;
		/* these fields are used by (loaded) virtual fonts */
	struct font **vf_table;		/* list of fonts used by this vf */
	struct tn *vf_chain;		/* ditto, if TeXnumber >= VFTABLELEN */
	struct font *first_font;	/* first font defined */
	struct macro *macro;
		/* I suppose the above could be put into a union, but we */
		/* wouldn't save all that much space. */
};

#define	FONT_IN_USE	1	/* used for housekeeping */
#define	FONT_LOADED	2	/* if font file has been read */
#define	FONT_VIRTUAL	4	/* if font is virtual */

#define	TNTABLELEN	30	/* length of TeXnumber array (dvi file) */
#define	VFTABLELEN	5	/* length of TeXnumber array (virtual fonts) */

struct tn {
	struct tn *next;		/* link to next TeXnumber info block */
	int TeXnumber;			/* font number (in DVI file) */
	struct font *fontp;		/* pointer to the rest of the info */
};

EXTERN	struct font	*tn_table[TNTABLELEN];
EXTERN	struct font	*font_head	INIT(NULL);
EXTERN	struct tn	*tn_head	INIT(NULL);
EXTERN	ubyte		maxchar;
EXTERN	unsigned short	current_timestamp INIT(0);

/*
 *	Command line flags.
 */

extern	struct _resource {
#if TOOLKIT && CFGFILE
	_Xconst char	*progname;
#endif
#if TOOLKIT
	int		shrinkfactor;
	_Xconst char	*main_translations;
	_Xconst char	*wheel_translations;
	int		dvips_hang;
	int		dvips_fail_hang;
#endif
	int		wheel_unit;
	int		_density;
#ifdef	GREY
	float		_gamma;
#endif
	int		_pixels_per_inch;
	_Xconst	char	*sidemargin;
	_Xconst	char	*topmargin;
	_Xconst	char	*xoffset;
	_Xconst	char	*yoffset;
	_Xconst	char	*paper;
	_Xconst	char	*_alt_font;
#ifdef MKTEXPK
	Boolean		makepk;
#endif
	_Xconst	char	*mfmode;
	_Xconst char	*editor;
	_Xconst char	*src_pos;
	Boolean		src_fork;
	Boolean		_list_fonts;
	Boolean		reverse;
	Boolean		_warn_spec;
	Boolean		_hush_chars;
	Boolean		_hush_chk;
	Boolean		safer;
#if defined(VMS) || !defined(TOOLKIT)
	_Xconst	char	*fore_color;
	_Xconst	char	*back_color;
#endif
	Pixel		_fore_Pixel;
	Pixel		_back_Pixel;
#ifdef TOOLKIT
	Pixel		_brdr_Pixel;
	Pixel		_hl_Pixel;
	Pixel		_cr_Pixel;
#endif
	_Xconst	char	*icon_geometry;
	Boolean		keep_flag;
	Boolean		copy;
	Boolean		thorough;
#if PS
	/* default is to use DPS, then NEWS, then GhostScript;
	 * we will figure out later on which one we will use */
	Boolean		_postscript;
	Boolean		allow_shell;
#ifdef	PS_DPS
	Boolean		useDPS;
#endif
#ifdef	PS_NEWS
	Boolean		useNeWS;
#endif
#ifdef	PS_GS
	Boolean		useGS;
	Boolean		gs_safer;
	Boolean		gs_alpha;
	_Xconst	char	*gs_path;
	_Xconst	char	*gs_palette;
#endif
#endif	/* PS */
	Boolean		prescan;
	_Xconst	char	*debug_arg;
	Boolean		version_flag;
#if BUTTONS
	Boolean		expert;
	_Xconst char	*button_translations;
	int		shrinkbutton[9];
	Dimension	btn_side_spacing;
	Dimension	btn_top_spacing;
	Dimension	btn_between_spacing;
	Dimension	btn_between_extra;
	Dimension	btn_border_width;
#endif
	_Xconst	char	*mg_arg[5];
#if COLOR
	Boolean		_use_color;
#endif
#ifdef	GREY
	Boolean		_use_grey;
	Bool3		install;
#endif
#if TOOLKIT
	_Xconst char	*dvips_path;
#endif
} resource;

/* As a convenience, we define the field names without leading underscores
 * to point to the field of the above record.  Here are the global ones;
 * the local ones are defined in each module.  */

#define	density		resource._density
#define	pixels_per_inch	resource._pixels_per_inch
#define	alt_font	resource._alt_font
#define	list_fonts	resource._list_fonts
#define	warn_spec	resource._warn_spec
#define	hush_chars	resource._hush_chars
#define	hush_chk	resource._hush_chk
#if COLOR
#define	use_color	resource._use_color
#endif
#ifdef  GREY
#define	use_grey	resource._use_grey
#endif

#ifndef TOOLKIT
EXTERN	Pixel		brdr_Pixel;
#endif

#if GREY
EXTERN	Pixel		plane_masks[4];
#endif

#if GREY || COLOR
EXTERN	XColor		color_data[2];
#define	fore_color_data		color_data[0]
#define	back_color_data		color_data[1]
#endif

#if COLOR

struct rgb {
	unsigned short	r, g, b;
};

struct pagecolor {
	struct rgb	bg;
	unsigned int	stacksize;
	_Xconst struct rgb *colorstack;
};

/* Information on background color and initial color stack for each page.  */
EXTERN	struct pagecolor	*page_colors	INIT(NULL);

/* The initial color stack is gotten from the pagecolor record for a page.  */
EXTERN	_Xconst struct rgb	*color_bottom;
EXTERN	unsigned int		color_bot_size;	/* number of entries */

/* Additions to the runtime color stack on a given page are stored in a linked
   list.  "struct colorframe" is defined in special.c.  */
EXTERN	struct colorframe	*rcs_top;

/* Color states.  */
EXTERN	struct rgb	fg_initial;	/* Initial fg (from command line) */
EXTERN	struct rgb	bg_initial;	/* Initial bg */

/*
 * For each (foreground, background) color pair, we keep information (depending
 * on the color model).  It is organized as a linked list of linked lists,
 * with background color more significant.
 */

struct bgrec {
	struct bgrec	*next;
	struct rgb	color;
	struct fgrec	*fg_head;
	Boolean		pixel_good;	/* if the pixel entry is valid */
	Pixel		pixel;
};

struct fgrec {
	struct fgrec	*next;
	struct rgb	color;
	Boolean		pixel_good;	/* if the pixel entry is valid */
	Pixel		pixel;
#if GREY
	Boolean		palette_good;	/* if the palette entry is valid */
	Pixel		palette[16];	/* non-TrueColor only */
#endif
};

EXTERN	struct bgrec	*bg_head	INIT(NULL);	/* head of list */
EXTERN	struct bgrec	*bg_current	INIT(NULL);	/* current bg value */
EXTERN	struct fgrec	*fg_current;			/* current fg value */
EXTERN	struct fgrec	*fg_active	INIT(NULL);	/* where the GCs are */

/* List of allocated colors (to be deallocated upon document change) */
EXTERN	Pixel		*color_list;			/* list of colors */
EXTERN	unsigned int	color_list_len	INIT(0);	/* current len of list*/
EXTERN	unsigned int	color_list_max	INIT(0);	/* allocated size */

/* Whether the color situation has been warned about.  */
EXTERN	Boolean		color_warned	INIT(False);

/* Cursor color (for XRecolorCursor).  */
extern	XColor		cr_Color;

#endif /* COLOR */

extern	struct	mg_size_rec {
	int		w;
	int		h;
}
	mg_size[5];

EXTERN	int		debug		INIT(0);

#define	DBG_BITMAP	1
#define	DBG_DVI		2
#define	DBG_PK		4
#define	DBG_BATCH	8
#define	DBG_EVENT	16
#define	DBG_OPEN	32
#define	DBG_PS		64
#define	DBG_CLIENT	128
#define	DBG_ALL		(~DBG_BATCH)

EXTERN	int		offset_x, offset_y;
EXTERN	unsigned int	unshrunk_paper_w, unshrunk_paper_h;
EXTERN	unsigned int	unshrunk_page_w, unshrunk_page_h;

EXTERN	char		*dvi_name	INIT(NULL);	/* dvi file name */
EXTERN	FILE		*dvi_file;		/* user's file */
EXTERN	time_t		dvi_time;		/* last modification time */
EXTERN	ino_t		dvi_inode;		/* used for source specials */
EXTERN	unsigned char	*dvi_property;		/* for setting in window */
EXTERN	size_t		dvi_property_length;
#if TOOLKIT
EXTERN	Boolean		titles_are_stale INIT(True);
						/* replace icon/window titles */
#endif
EXTERN	_Xconst char	*prog;
EXTERN	int		bak_shrink;		/* last shrink factor != 1 */
EXTERN	Dimension	window_w, window_h;
EXTERN	XImage		*image;
EXTERN	int		backing_store;
EXTERN	int		home_x, home_y;

EXTERN	Display		*DISP;
EXTERN	Screen		*SCRN;
#if TOOLKIT
extern	XtActionsRec	Actions[];
extern	Cardinal	num_actions;
#endif
#if XAW
EXTERN	XtAccelerators	accels_cr, accels_cr_click;
#endif
#ifdef GREY
EXTERN	Visual		*our_visual;
EXTERN	unsigned int	our_depth;
EXTERN	Colormap	our_colormap;
#else
#define	our_depth	(unsigned int) DefaultDepthOfScreen(SCRN)
#define	our_visual	DefaultVisualOfScreen(SCRN)
#define	our_colormap	DefaultColormapOfScreen(SCRN)
#endif
EXTERN	GC		ruleGC;
EXTERN	GC		foreGC, highGC;
EXTERN	GC		foreGC2;
EXTERN	GC		copyGC;
EXTERN	Boolean		copy;

EXTERN	Cursor		redraw_cursor, ready_cursor, drag_cursor[3];

#if TOOLKIT
struct xdvi_action {
	struct xdvi_action *next;
	XtActionProc	proc;
	Cardinal	num_params;
	String		param;
};

struct wheel_acts {
	struct wheel_acts *next;
	Modifiers	mask;
	Modifiers	value;
	struct _LateBindings *late_bindings;
	unsigned int	button;
	struct xdvi_action *action;
};

EXTERN	struct wheel_acts	*wheel_actions;
#endif

#if MOTIF && BUTTONS
EXTERN	XtTranslations	wheel_trans_table	INIT(NULL);
#endif

#ifdef	GREY
EXTERN	Pixel		*pixeltbl;
EXTERN	Pixel		*pixeltbl_t;
#endif	/* GREY */

/*
 *	Flag values and masks for event_flags
 */

#define	EV_IDLE		(1<<0)	/* non-event */
#define	EV_CURSOR	(1<<1)	/* cursor needs to revert back to ready */
#define	EV_EXPOSE	(1<<2)	/* expose occurred somewhere */
#define	EV_MAG_MOVE	(1<<3)	/* magnifier moved */
#define	EV_MAG_GONE	(1<<4)	/* magnifier gone while being drawn */
#define	EV_ACK		(1<<5)	/* used internally */
#define	EV_SRC		(1<<6)	/* source special operation is pending */
#define	EV_NEWPAGE	(1<<7)	/* new page requested */
#define	EV_PS_TOGGLE	(1<<8)	/* PostScript toggled on or off */
#define	EV_NEWDOC	(1<<9)	/* new dvi file requested */
#define	EV_TERM		(1<<10)	/* quit */
#define	EV_MAXPLUS1	(1<<11)

#define	EV_GE_IDLE		(EV_MAXPLUS1 - EV_IDLE)
#define	EV_GT_IDLE		(EV_MAXPLUS1 - EV_CURSOR)
#define	EV_GE_CURSOR		(EV_MAXPLUS1 - EV_CURSOR)
#define	EV_GE_EXPOSE		(EV_MAXPLUS1 - EV_EXPOSE)
#define	EV_GE_MAG_MOVE		(EV_MAXPLUS1 - EV_MAG_MOVE)
#define	EV_GE_MAG_GONE		(EV_MAXPLUS1 - EV_MAG_GONE)
#define	EV_GE_ACK		(EV_MAXPLUS1 - EV_ACK)
#define	EV_GE_NEWPAGE		(EV_MAXPLUS1 - EV_NEWPAGE)
#define	EV_GE_PS_TOGGLE		(EV_MAXPLUS1 - EV_PS_TOGGLE)
#define	EV_GE_NEWDOC		(EV_MAXPLUS1 - EV_NEWDOC)
#define	EV_GE_TERM		(EV_MAXPLUS1 - EV_TERM)

#define	EV_NOWAIT		EV_GE_IDLE

EXTERN	unsigned int	ev_flags	INIT(EV_IDLE);
EXTERN	VOLATILE int	event_counter	INIT(0);
EXTERN	jmp_buf		canit_env;

struct	xchild {
	struct xchild	*next;		/* link to next in list */
	pid_t		pid;		/* pid of process, or 0 */
	Boolean		killable;	/* if can be killed with SIGKILL */
	void	(*proc) ARGS((int));	/* procedure to call */
};

struct	xio {
	struct xio	*next;		/* link to next in list */
	int		fd;		/* file descriptor */
	int		xio_events;	/* same as in struct pollfd (can't call
					   it events because poll.h on AIX
					   defines events to something else) */
#if HAVE_POLL
	struct pollfd	*pfd;
#endif
	void	(*read_proc) ARGS((void));	/* call to read */
	void	(*write_proc) ARGS((void));	/* call to write */
};

struct	xtimer {
	struct xtimer	*next;		/* link to next in chain */
	struct timeval	when;		/* when to call the routine */
	void	(*proc) ARGS((struct xtimer *));	/* procedure to call */
#if MOTIF_TIMERS
	XtTimerCallbackProc xt_proc;		/* additional data for Xm */
	XtPointer	closure;
#endif
};

#if MOTIF_TIMERS
# define TIMER_INIT(proc)	{NULL, {0, 0}, proc, NULL, NULL}
#else
# define TIMER_INIT(proc)	{NULL, {0, 0}, proc}
#endif

struct	WindowRec {
	Window		win;
	int		shrinkfactor;
	int		base_x, base_y;
	unsigned int	width, height;
	int	min_x, max_x, min_y, max_y;	/* for pending expose events */
};

extern	struct WindowRec mane, alt, currwin;
EXTERN	int		min_x, max_x, min_y, max_y;
EXTERN	Boolean		drawing_mag	INIT(False);

#define	shrink_factor	currwin.shrinkfactor

#if TOOLKIT
EXTERN	Widget		top_level	INIT(0);
EXTERN	Widget		vport_widget, draw_widget, clip_widget;
# if MOTIF
EXTERN	Widget		shrink_button[4];
EXTERN	Widget		x_bar, y_bar;	/* horizontal and vert. scroll bars */
# endif
# if BUTTONS
EXTERN	Widget		form_widget;
EXTERN	int		xtra_wid	INIT(0);
extern	_Xconst char	default_button_config[]; /* defined in events.c */
#  if XAW
EXTERN	Widget		panel_widget;
EXTERN	Cursor		panel_cursor	INIT(0);
#  endif
# endif
#else /* not TOOLKIT */
EXTERN	Window		top_level	INIT(0);

#define	BAR_WID		12	/* width of darkened area */
#define	BAR_THICK	15	/* gross amount removed */
#endif /* not TOOLKIT */

#if XAW
#define	WARN(t, s)	(void) warning_popup(s, "OK", NULL)
#define	WARN1(t, s, s1)	(void) warning_popup_long(s, "OK", NULL, s1)
#define	WARN2(t, s, s1, s2) (void) warning_popup_long(s, "OK", NULL, s1, s2)
#elif MOTIF
#define	WARN(t, s)	(void) warning_popup(s, t, NULL, NULL)
#define	WARN1(t, s, s1)	(void) warning_popup_long(s, t, NULL, NULL, s1)
#define	WARN2(t, s, s1, s2) (void) warning_popup_long(s, t, NULL, NULL, s1, s2)
#elif CC_K_AND_R
#define	WARN(t, s)	(void) fputs(s "\n", stderr)
#define	WARN1(t, s, s1)	(void) fprintf(stderr, s "\n", s1)
#else
#define	WARN(t, s)	(void) (fputs(s, stderr), putc('\n', stderr))
#define	WARN1(t, s, s1)	(void) (fprintf(stderr, s, s1), putc('\n', stderr))
#endif

/*
 * If a popup is popped up before the main window, then the main window is
 * likely to cover it.  So we have to postpone popping them up until after
 * realizing the main window.  It is not workable to pop them up immediately
 * and then raise them later, due to unpredictable window manager behavior.
 */

#if TOOLKIT
EXTERN	Boolean		postpone_popups		INIT(True);
EXTERN	size_t		n_init_popups		INIT(0);
EXTERN	Widget		*init_popups;
EXTERN	size_t		alloc_init_popups	INIT(0);
#endif

/*
 * Structure to use for status popups.
 */

#if TOOLKIT
struct status_popup {
	Widget	shell;
	Widget	label;
	int	expected_type;
	Boolean	popped;
	Boolean	spurious;
};
#endif

EXTERN	char	*ffline	INIT(NULL);	/* an array used by filefind to store */
					/* the file name being formed.  */
					/* It expands as needed. */
					/* Also used elsewhere.  */
EXTERN	size_t	ffline_len INIT(0);	/* current length of ffline[] */

/*
 *	Used by the geometry-scanning routines.
 *	It passes pointers to routines to be called at certain
 *	points in the dvi file, and other information.
 */

struct geom_info {
	void	(*geom_box)	ARGS((struct geom_info *,
				  long, long, long, long));
	void	(*geom_special)	ARGS((struct geom_info *, _Xconst char *));
	jmp_buf	done_env;
	void	*geom_data;
};

typedef	void	(*mouse_proc)	ARGS((XEvent *));
extern	void	null_mouse	ARGS((XEvent *));

EXTERN	mouse_proc	mouse_motion	INIT(null_mouse);
EXTERN	mouse_proc	mouse_release	INIT(null_mouse);

/* Used for source special lookup (forward search) and for window manager
   delete protocol (toolkit only).  */

#if XAW
EXTERN	Atom	atoms[5];
#elif MOTIF
EXTERN	Atom	atoms[4];
#else
EXTERN	Atom	atoms[3];
#endif

#define	ATOM_XDVI_WINDOWS	(atoms[0])
#define	ATOM_DVI_FILE		(atoms[1])
#define	ATOM_SRC_GOTO		(atoms[2])
#if TOOLKIT
#define	XA_WM_DELETE_WINDOW	(atoms[3])
#endif
#if XAW
#define	XA_WM_PROTOCOLS		(atoms[4])
#endif

#ifdef	SELFAUTO
EXTERN	_Xconst	char	*argv0;		/* argv[0] */
#endif

#if	PS

extern	struct psprocs	{
	void	(*toggle)	ARGS((void));
	void	(*destroy)	ARGS((void));
	void	(*interrupt)	ARGS((void));
	void	(*endpage)	ARGS((void));
	void	(*drawbegin)	ARGS((int, int, _Xconst char *));
	void	(*drawraw)	ARGS((_Xconst char *));
	void	(*drawfile)	ARGS((_Xconst char *, FILE *));
	void	(*drawend)	ARGS((_Xconst char *));
	void	(*beginheader)	ARGS((void));
	void	(*endheader)	ARGS((void));
	void	(*newdoc)	ARGS((void));
}	psp, no_ps_procs;

#endif	/* PS */

/********************************
 *	   Procedures		*
 *******************************/

_XFUNCPROTOBEGIN

extern	int	atopix ARGS((_Xconst char *, wide_bool));
#if TOOLKIT
extern	Bool	compile_action ARGS((_Xconst char *, struct xdvi_action **));
#endif
#if BUTTONS
extern	void	create_buttons ARGS((void));
#if XAW
extern	void	set_button_panel_height ARGS((XtArgVal));
#endif
#endif /* BUTTONS */
#if GREY
extern	void	init_plane_masks ARGS((void));
#endif
#if COLOR
extern	Pixel	alloc_color ARGS((_Xconst struct rgb *, Pixel));
extern	void	do_color_change ARGS((void));
#elif GREY
extern	void	init_pix ARGS((void));
#endif
extern	void	expose ARGS((struct WindowRec *, int, int,
		  unsigned int, unsigned int));
extern	void	home ARGS((wide_bool));
extern	void	reconfig ARGS((void));
#if TOOLKIT
extern	void	handle_resize ARGS((Widget, XtPointer, XEvent *, Boolean *));
extern	void	handle_expose ARGS((Widget, XtPointer, XEvent *, Boolean *));
extern	void	handle_property_change ARGS((Widget, XtPointer, XEvent *,
		  Boolean *));
#endif
#if XAW
extern	void	handle_messages ARGS((Widget, XtPointer, XEvent *, Boolean *));
#elif MOTIF
extern	void	handle_wm_delete ARGS((Widget, XtPointer, XtPointer));
#endif
extern	void	goto_page ARGS((int, home_proc));
#if MOTIF
extern	void	file_pulldown_callback ARGS((Widget, XtPointer, XtPointer));
extern	void	navigate_pulldown_callback ARGS((Widget, XtPointer, XtPointer));
extern	void	scale_pulldown_callback ARGS((Widget, XtPointer, XtPointer));
extern	void	set_shrink_factor ARGS((int));
extern	void	popdown_callback ARGS((Widget, XtPointer, XtPointer));
#endif
#if !TOOLKIT
extern	void	showmessage ARGS((_Xconst char *));
#endif
extern	void	set_chld ARGS((struct xchild *));
extern	void	clear_chld ARGS((struct xchild *));
extern	void	set_io ARGS((struct xio *));
extern	void	clear_io ARGS((struct xio *));
extern	void	set_timer ARGS((struct xtimer *, int));
extern	void	cancel_timer ARGS((struct xtimer *));
extern	unsigned int read_events ARGS((unsigned int));
extern	void	enable_intr ARGS((void));
extern	void	do_pages ARGS((void)) NORETURN;
#if XAW
extern	void	simple_popup ARGS((struct status_popup *, _Xconst char *,
		  XtCallbackProc));
extern	void	simple_popdown ARGS((struct status_popup *));
extern	void	do_popup ARGS((Widget));
extern	Widget	warning_popup ARGS((_Xconst char *, _Xconst char *,
		  XtCallbackProc));
extern	Widget	warning_popup_long VARGS((_Xconst char *, _Xconst char *,
		  XtCallbackProc, ...));
extern	void	Act_print ARGS((Widget, XEvent *, String *, Cardinal *));
extern	void	Act_open_dvi_file ARGS((Widget, XEvent *, String *,
		  Cardinal *));
#elif MOTIF
extern	void	simple_popup ARGS((struct status_popup *, _Xconst char *,
		  XtCallbackProc));
extern	void	simple_popdown ARGS((struct status_popup *));
extern	void	do_popup ARGS((Widget));
extern	Widget	warning_popup ARGS((_Xconst char *, int, _Xconst char *,
		  XtCallbackProc));
extern	Widget	warning_popup_long ARGS((_Xconst char *, int, _Xconst char *,
		  XtCallbackProc, ...));
extern	void	Act_print ARGS((Widget, XEvent *, String *, Cardinal *));
extern	void	Act_open_dvi_file ARGS((Widget, XEvent *, String *,
		  Cardinal *));
#endif
extern	void	reset_fonts ARGS((void));
#if COLOR
extern	void	reset_colors ARGS((void));
extern	void	full_reset_colors ARGS((void));
#endif
extern	void	realloc_font ARGS((struct font *, wide_ubyte));
extern	void	realloc_virtual_font ARGS((struct font *, wide_ubyte));
extern	Boolean	load_font ARGS((struct font *));
extern	struct font	*define_font ARGS((FILE *, wide_ubyte,
			struct font *, struct font **, unsigned int,
			struct tn **));
extern	void	init_page ARGS((void));
extern	Boolean	open_dvi_file ARGS((_Xconst char *));
extern	void	form_dvi_property ARGS((ino_t));
extern	void	init_dvi_file ARGS((void));
extern	void	set_dvi_property ARGS((void));
extern	Boolean	check_dvi_file ARGS((void));
extern	void	reload_dvi_file ARGS((void));
#ifndef	TEXXET
extern	long	set_char ARGS((wide_ubyte));
extern	long	load_n_set_char ARGS((wide_ubyte));
extern	long	set_vf_char ARGS((wide_ubyte));
#else
extern	void	set_char ARGS((wide_ubyte, wide_ubyte));
extern	void	load_n_set_char ARGS((wide_ubyte, wide_ubyte));
extern	void	set_vf_char ARGS((wide_ubyte, wide_ubyte));
#endif
extern	void	prescan ARGS((void));
extern	void	draw_page ARGS((void));
extern	void	source_reverse_search ARGS((int, int));
extern	void	source_special_show ARGS((wide_bool));
extern	void	source_forward_search ARGS((_Xconst char *));
#if	CFGFILE
extern	void	readconfig ARGS((void));
#endif
extern	void	init_font_open ARGS((void));
extern	FILE	*font_open ARGS((_Xconst char *, char **, double, int *, int,
			char **));
#if	PS
extern	void	ps_clear_cache ARGS((void));
extern	void	ps_destroy ARGS((void));
#endif
extern	void	init_prescan ARGS((void));
#if COLOR
extern	void	scan_color_eop ARGS((void));
extern	void	set_fg_color ARGS((_Xconst struct rgb *));
#endif
extern	void	applicationDoSpecial ARGS((char *));
extern	void	scan_special ARGS((char *));
extern	void	geom_do_special ARGS((struct geom_info *, char *, double));
extern	void	xdvi_exit ARGS((int)) NORETURN;
extern	void	oops VARGS((_Xconst char *, ...)) NORETURN;
#ifndef KPATHSEA
extern	void	*xmalloc ARGS((unsigned));
extern	void	*xrealloc ARGS((void *, unsigned));
extern	char	*xstrdup ARGS((_Xconst char *));
extern	char	*xmemdup ARGS((_Xconst char *, size_t));
#endif
#if TOOLKIT && !HAVE_STRERROR && !defined strerror
extern	char	*strerror ARGS((int));
#endif
extern	void	expandline ARGS((size_t));
extern	void	alloc_bitmap ARGS((struct bitmap *));
#ifndef KPATHSEA
extern	void	xputenv ARGS((_Xconst char *, _Xconst char *));
#endif
extern	int	memicmp ARGS((_Xconst char *, _Xconst char *, size_t));
extern	FILE	*xfopen ARGS((_Xconst char *, OPEN_MODE_ARGS));
#if XAW
extern	int	xopen ARGS((_Xconst char *, int));
#endif
extern	int	xpipe ARGS((int *));
extern	DIR	*xopendir ARGS((_Xconst char *));
extern	_Xconst	struct passwd *ff_getpw ARGS((_Xconst char **, _Xconst char *));
extern	unsigned long	num ARGS((FILE *, int));
extern	long	snum ARGS((FILE *, int));
extern	size_t	property_get_data ARGS((Window, Atom, unsigned char **,
		  int (*x_get_property) (Display *, Window, Atom, long,
		  long, Bool, Atom, Atom *, int *, unsigned long *,
		  unsigned long *, unsigned char **)));
#if PS
extern	int	xdvi_temp_fd ARGS((char **));
#endif
extern	void	prep_fd ARGS((int, wide_bool));
extern	void	read_PK_index ARGS((struct font *, wide_bool));
extern	void	read_GF_index ARGS((struct font *, wide_bool));
extern	void	read_VF_index ARGS((struct font *, wide_bool));

#if	PS
extern	void	ps_init_paths ARGS((void));
extern	void	drawbegin_none ARGS((int, int, _Xconst char *));
extern	void	draw_bbox ARGS((void));
extern	void	NullProc ARGS((void));
#ifdef	PS_DPS
extern	Boolean	initDPS ARGS((void));
#endif
#ifdef	PS_NEWS
extern	Boolean	initNeWS ARGS((void));
#endif
#ifdef	PS_GS
extern	Boolean	initGS ARGS((void));
extern	void	gs_resume_prescan ARGS((void));
#endif
#endif	/* PS */

_XFUNCPROTOEND

#define one(fp)		((unsigned char) getc(fp))
#define sone(fp)	((long) one(fp))
#define two(fp)		num (fp, 2)
#define stwo(fp)	snum(fp, 2)
#define four(fp)	num (fp, 4)
#define sfour(fp)	snum(fp, 4)

#endif	/* XDVI_H */