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
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
|
<BEEBE.TEX.DVI>00REVHST.TXT.200, 17-Nov-87 20:02:40, Edit by BEEBE
This file contains a reverse chronological log of changes made to
the TeX DVI Driver family.
Version history:
2.10 [01-Nov-87]
2.09 [23-Sep-87]
2.08 [15-Aug-87]
2.07 [15-Apr-87]
2.06 [1986-1987]
The version number does not change with minor modifications that
affect only a few drivers, so the file write dates on the master
directories at Utah (and recorded on distribution tapes and
floppies) must be consulted to determine whether a particular
distribution contains these corrections. Where feasible, this
change log contains sufficient information to allow hand
installation of bug fixes. Changes will generally not be logged
at new versions, since they may be extensive.
[07-Jun-88] {Thanks to Hans Irtel
<irtel%vax1.rz.uni-regensburg.dbp.de@RELAY.CS.NET>}
In initglob.h about line 51, change
size_limit = 255; /* largest character size */
to
size_limit = 128; /* largest character size */
The HP LaserJet Plus has a character cell height
and width range limitation of 1..255, but further
restricts individual character dimensions to
0..128. This bug is exposed if you attempt to
print characters at size magstep 4 or larger,
such as the following test TeX file supplied by
William E. Anderson <anderson@cme-durer.arpa>:
\magnification=\magstep4
$$f(x)=\int{g(x)\over x}\,dx$$
\vfill\eject\bye
for which the integral sign will be lost without
the fix, and will appear once the fix is applied.
[31-May-88]
Issued newsletter #17.
[30-May-88] {Thanks to Jerry Leichter (LEICHTER@Venus.YCC.Yale.Edu)
for providing an example that exposed this bug.}
In dvijep.c, rules are output one dot too high.
According to the HP documentation, the position
of a rule is the upper-left corner. I took this
to mean that the rule would be output starting
just under the pixel at (x,y) in that corner.
What they must mean is that (x,y) is the position
of the pixel in the upper-left corner of the
filled area. Change the definitions of RULE()
and RULE2() about line 160 to reduce the height
value by 1 in the arguments to MOVETO():
diff -c dvijep.c,75 dvijep.c
*** dvijep.c,75 Wed May 18 09:42:01 1988
--- dvijep.c Mon May 30 19:03:07 1988
***************
*** 162,174 ****
lower-left corner, while the LaserJet Plus uses the upper-left corner.
*/
#define RULE(x,y,width,height) {\
! MOVETO(x,(y)+height);PUTESC;\
sprintf(plotfs,"*c%da%dbP",width,height); OUTST(plotfs);\
}
/* Set rule of same size as previous one at TeX position (x,y). The
device coordinates will be changed on completion. */
#define RULE2(x,y) {\
! MOVETO(x,(y)+rule_height);\
PUTESC;OUTST("*cP");\
}
/* Set the current font and character in preparation for a DOWNLOADCHAR */
--- 162,174 ----
lower-left corner, while the LaserJet Plus uses the upper-left corner.
*/
#define RULE(x,y,width,height) {\
! MOVETO(x,(y)+height-1);PUTESC;\
sprintf(plotfs,"*c%da%dbP",width,height); OUTST(plotfs);\
}
/* Set rule of same size as previous one at TeX position (x,y). The
device coordinates will be changed on completion. */
#define RULE2(x,y) {\
! MOVETO(x,(y)+rule_height-1);\
PUTESC;OUTST("*cP");\
}
/* Set the current font and character in preparation for a DOWNLOADCHAR */
The same correction must be made to dvilzr.c for
the DataProducts laser printer.
I had previously received reports of suspicions
of an error in dvijep's rule positions, but no
one ever was able to supply an example that I
could reproduce locally. Here is Jerry's
excellent little test file:
\documentstyle[12pt]{article}
\def\vec(#1,#2){\put(0,0){\vector(#1,#2){50}}}
\begin{document}
\setlength{\unitlength}{.01in}
\begin{picture}(0,0)(100,100)
\vec(-1,0)
\vec(1,0)
\vec(0,1)
\vec(0,-1)
%
\vec(-4,1)\vec(-3,1)\vec(-2,1)\vec(-1,1)
\vec(4,1)\vec(3,1)\vec(2,1)\vec(1,1)
%
\vec(-3,2)\vec(-1,2)
\vec(3,2)\vec(1,2)
%
\vec(-4,3)\vec(-2,3)\vec(-1,3)
\vec(4,3)\vec(2,3)\vec(1,3)
%
\vec(-3,4)\vec(-1,4)
\vec(3,4)\vec(1,4)
%
\vec(-4,-1)\vec(-3,-1)\vec(-2,-1)\vec(-1,-1)
\vec(4,-1)\vec(3,-1)\vec(2,-1)\vec(1,-1)
%
\vec(-3,-2)\vec(-1,-2)
\vec(3,-2)\vec(1,-2)
%
\vec(-4,-3)\vec(-2,-3)\vec(-1,-3)
\vec(4,-3)\vec(2,-3)\vec(1,-3)
%
\vec(-3,-4)\vec(-1,-4)
\vec(3,-4)\vec(1,-4)
%
\end{picture}
\end{document}
When printed with dvialw, the two horizontal
rules are printed correctly; before the above
correction to dvijep, they were one pixel too
high, (this gives a visible white streak). The
correction should also fix the misalignment with
the arrowheads.
[30-May-88]
The following bug in dvialw.c was fixed on
3-Feb-88, but unfortunately didn't make it into
this log.
diff -c dvialw.c,78 dvialw.c,79
*** dvialw.c,78 Sun Nov 1 11:21:38 1987
--- dvialw.c,79 Wed Feb 3 16:38:28 1988
***************
*** 1080,1085 ****
--- 1080,1086 ----
}
OUT_CHR('(');
OUT_XCHR(c);
+ OUT_CHR(')');
if (ycp != str_ycp)
{
OUT_NUM(xcp);
There was a missing ')' in the output.
[26-May-88]
Issued newsletter #16.
[18-May-88]
In dvijep.c about line 180, change
{PUTESC; sprintf(plotfs,"*c%dE",MAP_CHAR(ch)); OUTST(plotfs); }\
to
{PUTESC; sprintf(plotfs,"*cd%dE",MAP_CHAR(ch)); OUTST(plotfs); }\
This correction sets the font number to 0; the
old one works on the HP LaserJet, but might break
on clones.
[14-Apr-88]
Changed system() in vaxvms.c to allow warning and
information status returns to be treated as
success. The body of system() now reads:
t.dsc$w_length = strlen(s);
t.dsc$a_pointer = s;
t.dsc$b_class = DSC$K_CLASS_S;
t.dsc$b_dtype = DSC$K_DTYPE_T;
/* The 3 low-order bits of stat are
0 (warning),
1 (success),
2 (error),
3 (information), or
4 (severe or fatal error)
Consider values of 0, 1, or 3 to be success. LIB$SPAWN
will usually return SS$_NORMAL, independent of the value
of stat.
*/
if (LIB$SPAWN(&t,0,0,0,0,0,&stat) != SS$_NORMAL)
return (127);
switch (stat & 7)
{
case 0:
case 1:
case 3:
return (0);
default:
return (127);
}
[07-Mar-88]
Changed type of main() in keytst.c and lptops.c
from void to int, and inserted return(0) at end
to keep lint and VAX VMS C compiler happy. Draft
ANSI C (Oct-86 and Jan-88) does not specify what
the type of main() should be, and most compilers
don't care. VMS C 2.3 however produces an
annoying warning message if main() is not of type
int; I view this behavior as erroneous, because
main() is only a convention in C, and it is
possible to write C programs in many
implementations that do not have a main().
[02-Mar-88]
Added code to findpost.h to ignore trailing NULs
in a .DVI file, borrowing code from readpxl.h and
readgf.h that do the same thing for font files.
Users (including me) have been annoyed by the
inability of the drivers to handle a .DVI file
which has passed through a VAX VMS system where
gratuitous NULs are appended to pad the file
length to a multiple of 512 bytes.
This effort revealed another problem under VAX
VMS, and that is that the code in FSEEK() in
vaxvms.c on a request to position at end-of-file
actually positions before the last character,
instead of after it. An attempt at correcting
this was foiled by the VMS library ftell() which
returns 0 when the position set by FSEEK() is
outside the actual file limits, and while FTELL()
can correct the brain-damaged value returned by
ftell(), it cannot distinguish a nonsensical 0
result from ftell() at end-of-file from one at
the beginning of the file. Consequently, it has
been necessary in findpost.h to bump the
postambleptr value by one.
Since this modification can be installed
independently in even old versions of the DVI
driver family, and a context difference listing
is larger than findpost.h, here is the complete
new version:
/* -*-C-*- findpost.h */
/*-->findpost*/
/**********************************************************************/
/****************************** findpost ******************************/
/**********************************************************************/
void
findpost()
{
register long postambleptr;
register BYTE i;
register UNSIGN16 the_char; /* loop index */
(void) FSEEK (dvifp, 0L, 2); /* goto end of file */
/* VAX VMS binary files are stored with NUL padding to the next
512 byte multiple. We therefore search backwards to the last
non-NULL byte to find the real end-of-file, then move back from
that. Even if we are not on a VAX VMS system, the DVI file might
have passed through one on its way to the current host, so we
ignore trailing NULs on all machines. */
while (FSEEK(dvifp,-1L,1) == 0)
{
the_char = (UNSIGN16)fgetc(dvifp);
if (the_char)
break; /* exit leaving pointer PAST last non-NUL */
UNGETC((char)the_char,dvifp);
}
postambleptr = FTELL(dvifp) - 4;
#if OS_VAXVMS
/* There is a problem with FSEEK() that I cannot fix just now. A
request to position to end-of-file cannot be made to work correctly,
so FSEEK() positions in front of the last byte, instead of past it.
We therefore modify postambleptr accordingly to account for this. */
postambleptr++;
#endif
(void) FSEEK (dvifp, postambleptr, 0);
while (TRUE)
{
(void) FSEEK (dvifp, --(postambleptr), 0);
if (((i = (BYTE)nosignex(dvifp,(BYTE)1)) != 223) &&
(i != DVIFORMAT))
(void)fatal("findpost(): Bad end of DVI file");
if (i == DVIFORMAT)
break;
}
(void) FSEEK (dvifp, postambleptr - 4, 0);
(void) FSEEK (dvifp, (long)nosignex(dvifp,(BYTE)4), 0);
}
[06-Feb-88]
Revised lpt.ps to handle formfeed and tabs.
[17-Nov-87] Installation of the DVI driver family under
Microsoft C Version 5.0 resulted in a number of
changes more fully described in 01README.TXT (to
be included in the next DVI newsletter). This is
the first compiler that fully conforms to draft
ANSI C (October 1986) in both the language and
the run-time library.
Added missing typecast in dvieps.c and dvie72.c.
In dvihead.h, added #include's for io.h and
time.h for IBM_PC_MICROSOFT.
Added two missing typecasts in dvijep.c, and
inserted the missing condition "(t->istoobig) ||"
to BIGCHAR().
In gblprocs.h, replaced ANSI flag by ANSI_LIBRARY
and ANSI_PROTOTYPES to distinguish between
library conformance, and ANSI function prototype
use, and adjusted many function declarations
accordingly.
In keybrd.c, provided alternate name for
interrupt(); its use otherwise causes an compiler
error with MSC 5.0.
In keydef.h, replaced ANSI section by
ANSI_LIBRARY and ANSI_PROTOTYPE sections.
In keytst.c, added some comments, and changed the
test to loop a maximum of five times with no
input. Introduced an implementation of sleep()
for OS_PCDOS.
In lptops.c, replaced ANSI section by
ANSI_LIBRARY and ANSI_PROTOTYPE sections, and
reset a couple of constants to type long.
In machdefs.h, replaced ANSI section by
ANSI_LIBRARY and ANSI_PROTOTYPE sections, and for
IBM_PC_MICROSOFT, defined float to be double to
reduce data conversion warnings.
In main.h, removed #include's of stdlib.h and
string.h; they are already in machdefs.h.
In option.h, removed use of ABS() for a
floating-point argument to remove data conversion
warning.
In texidx.c, changed preprocessor symbol MSC to
IBM_PC_MICROSOFT.
In tosprx.c, replaced ANSI section by
ANSI_LIBRARY and ANSI_PROTOTYPE sections.
Revised IBM PC-specific version of Make to work
with Microsoft C Version 5.0, eliminating some
severe limitations imposed by Wizard C, and
permitting the MAKEFILE.MSC to be completely
self-contained, instead of having to reference
MAKEFILE.1 .. MAKEFILE.4. Several new features
were also implemented in Make; they are described
in a 00README.TXT file in the PCMAKE directory.
[01-Nov-87] Replaced references to (void)fprintf(..., plotfp)
with references to new macros OUTF(...),
OUTF2(...), and OUTF3(...), or existing ones
OUTC() and OUTS(). Replaced all instances of
putc(*c++,plotfp) by "OUTC(*c);c++". Since
putc() is usually a macro, there is a potential
incorrect side effect if its first argument is
evaluated more than once. Most C implementations
use it only in the two branches of a conditional
expression, which is safe.
[01-Nov-87] Completed major overhaul of dvijep.c. The font
deletion mechanism was not successful, partly
because the font number was not subsequently
reset in one place, but mostly because it causes
a page eject. This would make it impossible to
print some documents. dvijep now keeps track of
both the number of fonts in use on the current
page, and the total number in use in the
document. When either of these limits is
reached, the characters in those fonts are sent
as bitmaps, instead of as downloaded fonts. It
is still possible to have a document which is too
complex for the LaserJet to print (raising error
code 21 on the printer front panel status
display), but that is now a limit imposed by the
printer, rather than the DVI driver, and cannot
be gotten around.
There is room for further work here, however.
Most documents do not require an excessively
large number of fonts. For example,
dvidriver.ltx uses 23 fonts, and weave.tex uses
15, but the TeXbook uses 54.
When the DVI driver begins execution, through the
call chain main() -> dvifile() -> readpost() ->
getfntdf() -> readfont() -> reldfont() ->
read{pk|gf|pxl}() -> newfont(), it normally reads
in the font definitions from the DVI file
postamble and assigns font numbers in order of
occurrence, and builds its internal font and
character tables. Later, as pages are processed,
font changes occasioned by DVI fnt_num_0 ..
fnt_num_63 and fnt1 .. fnt4 commands result in
setting the global flag font_switched, which in
turn causes setchar() and setstr() to output font
switch commands to the device.
The implication of this for dvijep is that all
fonts beyond the first 32 are marked as
non-downloadable. In the case of the TeXbook, it
turns out that this includes the heavily-used
cmr, cmsy, and cmmi fonts at 5, 6, 7, 8, 9, and
10 pt sizes, which means that almost all of the
characters set on a page will be sent as bitmaps,
instead of as downloaded characters. On my HP
LaserJet Plus, every page raised printer error
code 21. This might not happen on an HP LaserJet
Series II, which can have substantially more
memory, but I haven't one locally to try the
experiment.
The solution to this problem is to delay font
number assignment until the font is actually
referenced. Since a considerably smaller number
of fonts are needed on each page, it is then
possible to download most of them, and a
font-rich document like the TeXbook can be
printed successfully in sections. The change
involves moving the body of newfont() to a new
function, makefont(), and having newfont() only
initialize the font_number with a special
"undefined" value. The macro SET_CURRENT_FONT
has become big enough that it has been
transformed into a function, setfont().
setfont() now checks font_number for the
undefined value, and in such a case, calls
makefont() to assign the font a number and create
it in the printer. With this change, the TeXbook
can be printed successfully.
[30-Oct-87] Changed vaxvms.c, gblprocs.h, openfont.h, and
machdefs.h to support dynamic determination of
the limit on the number of open files for VAX
VMS. This is a VMS quota parameter whose dynamic
value depends on the number of subprocesses.
Previously, a user with too small a limit would
find the dvi drivers could fail because the hard
limit on the number of open font files was too
large.
[29-Oct-87] In LW78.C, removed typeout of final CR LF in
Get_Msg(), and inserted system call to dismiss
the process until the output buffer is empty at
the start of Put_Packet().
LW78 had been experiencing I/O error returns from
the Apple LaserWriter Plus, and when I attempted
to copy a PostScript file directly to the
printer, the same thing happened, only much
earlier in the job. This raised the suspicion of
buffer overrun in the printer. Three experiments
using a 100-page document with (1) a 5-second
sleep before outputting each buffer, (2) process
dismissal until the buffer was empty, and (3) the
Kermit TRANSMIT command (which waits for a prompt
from the LaserWriter after each line) all
resulted in successful printing, and I have
confidence that this change in LW78 will provide
superior performance.
With the new LW78, I sent dvidriver.dvi-alw with
the modified BOP and EOP definitions given below,
and printed the 100 pages at an average rate of 5
pages per minute. Virtual memory usage was
initially 2Kb to 4Kb per page while fonts were
being downloaded, and in later pages, dropped to
a low of 1105 bytes/page. Pages with that low
figure had only text set on them, and no fonts
downloaded, with the text guarded by save/restore
sequences. That virtual memory was still
consumed leads one to wonder if there is not a
bug in the PostScript memory allocation code
which causes some "seepage" loss. If one of
dvialw's macros were leaving unclaimable garbage
behind, one would expect that the garbage amount
would vary, but many different pages had the same
1105 bytes/page consumption. Total virtual
memory consumed by the job was 112Kb, with 78Kb
remaining available at end-of-job.
[27-Oct-87] Simplified beginning-of-page and end-of-page code
in prtpage.h by creating bopact() and eopact()
routines in several drivers, and removed bopact.h
and eopact.h (which were previously used only by
dvibit), including references to them in
makefile.*.
[27-Oct-87] Numerous small editorial changes for code
consistency, and to reduce the number of warnings
from the lint utility.
[27-Oct-87] {Thanks to John Pavel (mcvax!nplpsg!jrp@uunet.uu.net)
for urging this change}
On Unix only, Version 2.10 now permits input to
come from stdin, and output to go to stdout,
allowing use of the drivers as filters. This
choice is automatically made when no file names
are specified on the command line.
Use of stdout for binary files is generally
impossible for other operating systems, which
either make a distinction between text and binary
file formats, or use line terminators other than
<LF>, necessitating translation of Unix
end-of-line '\n' on input and output. With the
exception of dvialw, all the drivers produce
binary output files.
[27-Oct-87] {Thanks to Bernhard Nebel (NEBEL@DB0TUI11.BITNET)
for useful suggestions}
Completed major overhaul of dvialw.c. A
fundamental problem with existing PostScript
interpreters is that they lack garbage
collection, and the PostScript programmer is
expected to manage storage with save/restore
command judiciously wrapped around throw-away
code. The problem this poses for a TeX
environment is that one does not wish to discard
downloaded fonts, since they will likely be
needed again.
In the previous version of dvialw, the -s and -v
options provided some user control of this, but
such user control is only of marginal utility.
It proved interesting to install the following
PostScript code segment immediately before the
BOJ (beginning of job) command in an output file
from dvialw produced from Appendix F of the
TeXBook. The TeXbook uses 54 fonts, and
therefore puts a sizeable burden on a printer
that has only limited font memory.
% These provide alternate definitions of BOP and EOP in dvialw.ps
% which cause CPU time and virtual memory statistics to be printed
% at the bottom of each output page
/BOP
{
clear
Mtrx setmatrix
25 0 translate
vmstatus pop /VMUSED exch def pop
usertime
} bdf
/EOP
{
/#copies exch def
/USERTIMEIN exch def
save
/pt {Resolution 72 div mul} def
/Helvetica-BoldOblique findfont 12 pt scalefont setfont
/SP {12 pt 0 pt rmoveto} def
/PN {SP 10 vmstr cvrs show} def
/vmstr 15 string def
36 pt 36 pt moveto
([VMstatus:) show
vmstatus PN PN PN (]) show
SP SP ([VMpage:) show
vmstatus pop exch pop VMUSED sub PN
(]) show
SP SP ([Page time:) show
usertime USERTIMEIN sub PN ( msec]) show
restore
showpage
} bdf
With this addition, each page now carries both
memory usage and (printer) CPU time statistics at
the bottom of each page. On the Apple
LaserWriter with paper type "note", there is
about 250Kb of virtual memory available at job
start. Here is a table of the memory
requirements for successive pages of Appendix F
of the TeXbook:
---- ----------- -----------
Page DVIALW 2.09 DVIALW 2.10
---- ----------- -----------
431 4953
432 26057
433 3713
434 9693
435 27948 21101
436 18971 13421
437 15644 10109
438 21764 15324
439 27064 19596
440 8172 6628
---- ----------- -----------
Version 2.09 reached a VM error condition
(virtual memory exhausted) on page 434, while
Version 2.10 was able to proceed 4 pages beyond
that before hitting the same limit. Each page in
Version 2.10 requires about 30% less virtual
memory.
Initially, I wrote a short filter program that
moved the text strings on each page to after the
font download sequences, wrapping the text in a
save/restore pair to recover the virtual memory
needed to store them. This proved to be quite
straightforward, requiring only about 60 lines of
C code.
To implement the same facility in dvialw proved
much more complex, because I was not willing to
suffer the performance penalty of reading each
page of the DVI file twice, once to collect
needed fonts, and a second time to set text and
rules. Instead, a completely new mechanism is
implemented whereby output is channelled through
several new routines, which ultimately reach the
low-level textchr() routine which gets a single
character to process. Based on a global flag,
textchr() either outputs this immediately (e.g.
for macros, rules, and font downloading), or
stores it in an internal buffer (text setting).
On the basis of examination of .dvi-alw files for
the DVI driver manual, and the TeXbook, the
internal buffer is chosen to be large enough so
that it will usually only need to be dumped once
per page.
PostScript loop tests on the Apple LaserWriter
Plus (Version 38.0 PostScript) give execution
times of about 0.25 msec for one iteration of an
empty loop, determined by executing
usertime 10000 {} repeat usertime exch sub
and 55 msec for one save/restore pair:
usertime 1000 {save restore} repeat usertime exch sub
Consequently, one does NOT want to do a
save/restore around every string, but only around
large groups of strings.
Because of the use of relative coordinates in
most output typeset text (the T macro instead of
the S macro), and the use of remembered rule
widths (w and h in the B and Q macros), it is not
trivial to correctly handle the case of more than
one bufferful per page (since intervening
non-buffered output might change the font or
current point), and it took a considerable number
of iterations to get it working satisfactorily,
with the buffer size temporarily set artificially
low.
Having the output being filtered through a
central location, textchr(), has made it possible
to further economize on the output volume (e.g by
collapsing <letter><newline><open-paren> to
<letter><open-paren>, and to more closely
approach a constant line width (except for
PostScript from a \special{} command, which is
output verbatim). Some operating systems have
trouble with long lines in files, and Version
2.10 should now largely remove this problem.
The line breaking algorithm implemented in
textchr() and textflush() is far from trivial,
because PostScript does not uniformly recognize
<backslash><newline> as a continuation sequence
that can be discarded; instead, it permits this
continuation mechanism only in parenthesized
strings. Otherwise, comments cannot be
continued, angle-bracketed strings can be
continued by simply inserting a bare newline, and
elsewhere, a newline can be used any place a
blank is used. Some of the comment lines
produced by dvialw are long; they are now split
automatically by placing a hyphen in the last
column of the line, and continuing with "%-" on
the next line. Any software that takes advantage
of the %%PageTable at the end will therefore need
adjusting (I doubt that any exists, so this
change does not concern me). It is regrettable
that the PostScript developers did not give line
continuation more thought.
Font change commands are now defined more
compactly as "F#" or "F##", where "#" is the
sequential number of the font in the document.
This further helps to reduce output volume. The
initial font definitions (the NF macro) still use
the full name, and carry a comment with the font
file name, so it is still possible to easily find
out what font file was used for any part of the
output. The problem of corrupted font files has
come to my attention on several occasions, so it
is worthwhile to maintain this connection in
dvialw, which is the only driver that produces
human-readable printer output.
On Appendix F of the TeXbook, these changes
reduced the output file size by about 8% compared
to Version 2.09, and about 9% when PS_SHORTLINES
was non-zero. On the DVI driver manual (99
pages), the file size from Version 2.10 with
PS_SHORTLINES defined was 15% shorter than that
from Version 2.09. Since a non-zero
PS_SHORTLINES produces marginally smaller output,
it is now the default for all implementations,
but it can be overridden by a compile-time
redefinition.
[22-Oct-87] {Thanks to Marcus Moehrmann (marcus%fkihh@unido.uucp)}
Added drivers dvieps and dvie72 for Epson 9-pin
printers and compatibles. dvieps is for 240H x
216V resolution, and dvie72 for 60H x 72V
resolution (same as dviprx for Printronix
printers).
It was necessary to make a number of changes to
the submitted code to bring it up-to-date with
the rest of the family, and to conform to my
coding practices. Since I do not have an Epson
printer on which to test this locally, the
version number carries the suffix
"[experimental]". The same suffix appears in
dvica2. These will be removed when the drivers
are considered ready for final release, based on
positive user feedback.
[22-Oct-87] Added debug option 128 (DBG_SET_TEXT) to display
each piece of text set by the driver, together
with its page coordinates in dots, and its font
name. This of course produces voluminous output,
but is quite handy when you are trying to step a
long way into execution to track down a bug.
[22-Oct-87] All debug options have been turned into symbolic
references, e.g.
if (DBGOPT(DBG_OFF_PAGE))
instead of
if (debug_code & 32)
It was clearly a mistake not to have done this in
the first place. I also wish that I had made
these options sequential numbers, instead of
powers of two, but it is probably too late to
change that now.
[12-Oct-87] Edited dviman.texinfo to bring it up-to-date with
dvi.1l and dviman.ltx.
[01-Oct-87] Created Unix-style man page file, dvi.1l.
[01-Oct-87] Added support for a "-z" option (typein of
"DVISPOOL dvifilename") for 4.xBSD Unix systems,
which have imitated TOPS-20's STI% (Simulate
Terminal Input) JSYS facility with ioctl(fildes,
TIOCSTI, *char).
[30-Sep-87] {Thanks to Stefan Kronberg (ZEFFI@FINABO.BITNET)}
Added support of font files with up to 256
characters. Normal TeX Computer Modern fonts use
only 128 characters per font, but extensions for
European alphabets, and Japanese fonts, will
require more than 128.
Unfortunately, this was not quite as trivial as I
had originally intended, where the values
LASTPXLCHAR and NPXLCHARS in gendefs.h need only
be increased from 127 and 128 to 255 and 256
respectively. The problem is that several loops
used code like
BYTE k;
...
for (k = FIRSTPXLCHAR; k <= LASTPXLCHAR; ++k)
With LASTPXLCHAR = 255, the last loop iteration
will increment k to 256, but since it is a byte
value, this wraps to 0, and the loop becomes
infinite on a byte-oriented machine. This made
it necessary to retype the offending loop indices
as UNSIGN16.
The context diff listing for these changes is
rather long (about 1200 lines), so I do not
include it here.
[30-Sep-87] Changed -d option processing in option.h to allow
multiple -d options to accumulate, instead of
requiring them to be set with one -d option. The
change is simple: replace
debug_code = (BYTE)atoi(optstr+2);
by
debug_code |= (BYTE)atoi(optstr+2);
[29-Sep-87] Because of problems on record-oriented file
systems (VAX VMS being the worst offender), the
code in dvialw.c does more when PS_SHORTLINES is
defined; it now keeps track of output widths, and
will not produce output lines more than a couple
of characters longer than a fixed value,
PS_MAXWIDTH. However, no such limit is placed on
comments, or macros retrieved from dvialw.ps;
both of these are already of limited length.
Changed machdefs.h to allow PS_SHORTLINES to be
set at compile time.
A single experiment on a 20-page DVI file showed
that the .dvi-alw output was about 3% longer when
a version of dvialw with PS_SHORTLINES set was
used.
[29-Sep-87] {Thanks to John Pavel (mcvax!nplpsg!jrp@seismo.css.gov)
and Brendan McKay (munnari!anucsd.oz!dbm@seismo.css.gov)}
The code in dvialw.c in functions setchar() and
setstr() emits a save/restore pair around a large
character font definition. On the Apple
LaserWriter Plus (which I only recently got as a
replacement for our stolen ALW), this results in
a "Fatal system error @ 0X2e6bec". The fix is
fortunately simple. Change those two instances
of
OUTS("save");
(but NOT the one in special()) to
OUTS("save /temporary_font NF 1 /temporary_font SF");
This will put the character in a temporary font
which is discarded when the restore command is
executed. Here is simple test file using cminch;
it produces a large (~400Kb) .dvi-alw file.
% test for dvialw downloading of large characters
\font\bigfont=cminch
This file tests a DVI driver's capability to support downloading
of large characters. The following uninteresting tables of the
Roman alphabet are printed in font {\it cminch\/}.
\bigfont
\obeylines
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
YZ
\vfill\eject\end
[29-Sep-87] {Thanks to John Pavel (mcvax!nplpsg!jrp@seismo.css.gov)}
Removed obsolete SHORTLINES references from
machdefs.h; PS_SHORTLINES remains, and can now be
set in machdefs.h, instead of only in dvialw.c.
The default setting in machdefs.h now is
#define PS_SHORTLINES 0
and dvialw.c now has
#ifndef PS_SHORTLINES
#define PS_SHORTLINES 0 /* run with long output lines */
#endif
[28-Sep-87] Updated all makefiles to include a generic target
dvi$(PGM) and an extra compilation flag value
XCFLAGS, so test versions can be constructed by a
command like "make PGM=foo XCFLAGS=-g dvifoo".
[28-Sep-87] {Thanks to Ian Young (ian@latlog.uucp)}
At the end of readgf.h, newfont() is called
before the loop which retrieves character metrics
via chargf(). This is incorrect for HPJETPLUS,
where the newfont() code in dvijep.c uses some of
the metrics. For the other devices, newfont()
only sets values in the font character tables.
Therefore, move the newfont() call to AFTER the
loop, so that the code reads in readgf.H:
for (the_char = FIRSTPXLCHAR; the_char <= LASTPXLCHAR; the_char++)
{ /* Get remaining character metrics, and ignore error returns for now. */
tcharptr = &(fontptr->ch[the_char]);
if (tcharptr->fontrp >= 0L)
(void)chargf(the_char,(void(*)())NULL);
}
#if (BBNBITGRAPH | HPJETPLUS | POSTSCRIPT | IMPRESS | CANON_A2)
(void)newfont();
#endif
[28-Sep-87] On Unix systems, getlogin() returns (char*)NULL
if the process is not attached to a terminal, in
particular, if the process is attached to a
pseudo-terminal (pty), such as a window or an
editor shell buffer. The way to get the real
login name in these circumstances is to use
cuserid((char*)NULL) in place of getlogin(), and
I have according made that change in dvialw.c and
lptops.c, and added appropriate function
declarations in gblprocs.h.
This change affects only text output in a
PostScript comment. Both cuserid() and
getlogin() are defined in 4.2BSD Unix, AT&T SYS V
Unix, HPUX, KCC (version 4), and IEEE Posix
(which draft ANSI C follows). PCC and V7 Unix
had only getlogin(). VAX VMS C has only
cuserid(). KCC (version 3), Microsoft C, Lattice
C, and Wizard C have neither.
[23-Sep-87] {Version 2.09 announcement}
Testing of the Free Software Foundation gcc
compiler has uncovered two bugs so far in the
compiler (they are being fixed rapidly). gcc
produces code for both VAX and Motorola
architectures, and is being used to develop the
GNU operating system. The testing also found a
serious bug in my code which unfortunately
impacts most of the DVI drivers, and can be the
cause of core dumps or other failures.
The value of XSIZE in dvi*.c is currently
computed as XDPI*XPSIZE, that is, the number of
dots across the page. Unfortunately, one or more
local arrays are later allocated and used with
the assumption that XSIZE is a multiple of the
machine word size, HOST_WORD_SIZE, and in dvijet,
it was assumed to be a multiple of
2*HOST_WORD_SIZE.
This bug was never caught on the DEC-20, because
there stacks grow upward, so beyond-bounds
references to stack arrays may just be writing
into unused memory. However, on the VAX, Intel
iAPX, and Motorola architectures, stacks grow
downward, and such references can wipe out the
call history, precipitating at best an address
exception or illegal instruction violation when
the return instruction is executed. This would
only happen if text was set against the
right-hand side of the page, and since TeX
documents usually produce wide margins, this may
be unlikely to happen.
To avoid complex dimension computations, and
preserve uniformity of definition among the
family, XSIZE is now increased to a multiple of
2*HOST_WORD_SIZE throughout. The fix is to
change
#define XSIZE (XDPI*XPSIZE) /* number of horizontal dots */
to
#define XSIZE (((XDPI*XPSIZE+2*HOST_WORD_SIZE-1)/\
(2*HOST_WORD_SIZE))*(2*HOST_WORD_SIZE))
/* number of horizontal dots; */
/* MUST BE multiple of */
/* 2*HOST_WORD_SIZE */
in all the dvi*.c files. I view this bug fix to
be important enough to warrant a version number
change, so the family is now at version 2.09.
The following Unix script can be used on Unix
systems to automate the patch:
#!/bin/csh
foreach f (dvi*.c)
echo $f
mv $f $f-old
sed -f bugfix.sed <$f-old >$f
end
Here is bugfix.sed:
s|"2.08|"2.09|
s|(XDPI\*XPSIZE)[ ]*/\* number of horizontal dots \*/|(((XDPI*XPSIZE+2*HOST_WORD_SIZE-1)/\\\
(2*HOST_WORD_SIZE))*(2*HOST_WORD_SIZE))\
/* number of horizontal dots; */\
/* MUST BE multiple of */\
/* 2*HOST_WORD_SIZE */|
[23-Sep-87] In openfont.h, nopen is incremented when the
requested font is not found in the list of
currently open files, but the code forgets to
decrement it if the request font never gets
successfully opened, which can happen if the font
file cannot be found, and no substitution font is
provided. Change the code about line 185 to
decrement nopen on open failure, so that it now
reads:
if (fontfp == (FILE*)NULL)
{
--nopen; /* don't count this failed open */
(void)sprintf(message,"Font file [%s [mag %d]] could not be \
[18-Sep-87] In LW78.C, Wait_For_Printer_Ready(), removed
output of Ctl-D; with the Apple LaserWriter Plus,
this causes the printer to respond to the
following Ctl-T with "printer busy", instead of
"idle", like the old Apple LaserWriter did.
[18-Sep-87] {Thanks to Mic Kaczmarczik (CC.KCACMARCZIK@A20.CC.UTEXAS.EDU)}
When dvialw.ps is modified to select LANDSCAPE
mode instead of NOTE (portrait), the output is
positioned incorrectly, and character bitmaps
look somewhat ragged. The former is due to a
missing translation command, and the latter to
tiny non-zero transformation matrix elements
which introduce computed coordinates which are in
error by one pixel. I have also taken the
liberty of installing a fix for the fact that
NOTE is not defined on non-Apple PostScript
printers. It should no longer be necessary to
edit dvialw.ps for Texas Instruments, QMS, et al
PostScript printers.
There is one problem with this change, and that
is that the SNAP call in the CharBuilder routine
must now be executed for each character set on
the page, so the output may prove to be somewhat
slower. To check this, I downloaded dvialw.ps to
our new Apple LaserWriter Plus, then executed
TeXdict begin
usertime 10000 {0 0 SNAP pop pop} repeat usertime
exch sub pstack
which results in a time of 70844 msec for 10000
calls, or an extra overhead of 7 msec per
character. Repeating the experiment using an
empty procedure body gives a loop overhead time
of 0.2 msec. With an average of 3000 characters
set per page, this amounts to 21 sec per page,
which is definitely not negligible. You may
therefore wish to leave the SNAP call out of a
version of dvialw.ps that is used only for
portrait orientation output.
Similar timing loops can be used to reveal an
average execution time of 1 msec for any
arithmetic operation (+-/*); PostScript
interpreters badly need hardware floating-point
support! There is a repeatable difference of
about 10% increase in speed when operands are
floating-point instead of integer values. dvialw
could be changed to write floating-point values
instead of integer ones, with a tradeoff of
slightly increased output file size to be
balanced against slightly faster arithmetic.
At the same time, I increased XPSIZE to 14 in
dvialw.c so that landscape mode output is not
clipped. Future work should introduce a general
flexible solution to the problem of paper size
specification for all of the drivers.
Here is a context difference which records the
changes. Additions are flagged with a "+" in the
first column, and changes with a "!", with the
old code first, and the new second.
*** dvialw.ps-old Wed Jul 29 14:35:41 1987
--- dvialw.ps Fri Sep 18 17:48:10 1987
***************
*** 1,3 ****
--- 1,10 ----
+ % <BEEBE.TEX.DVI>DVIALW.PS.17, 18-Sep-87 17:48:04, Edit by BEEBE
+ % Add test for note paper and if unknown, use letter paper instead.
+ % Non-Apple PostScript implementations do not know about note paper
+ % but its use on the Apple LaserWriter gains 92K of virtual memory
+ % <BEEBE.TEX.DVI>DVIALW.PS.16, 18-Sep-87 15:50:52, Edit by BEEBE
+ % Modify coordinate computations to remove round-off errors
+ % in landscape mode, and correct landscape page origin
% <BEEBE.TEX.DVI>DVIALW.PS.14, 22-Jun-87 09:55:05, Edit by BEEBE
% Add missing "0 900 translate Mtrx currentmatrix pop" to /LEGAL
% <BEEBE.TEX.DVI>DVIALW.PS.13, 7-Jan-87 17:38:51, Edit by BEEBE
***************
*** 110,116 ****
/BOJ
{
72 Resolution div 72 Resolution div scale
! NOTE % default page format
} bdf
% BOP -- beginning of page
--- 117,126 ----
/BOJ
{
72 Resolution div 72 Resolution div scale
! userdict /note known
! {NOTE} % default page format for ALW
! {LETTER} % default page format for others
! ifelse
} bdf
% BOP -- beginning of page
***************
*** 146,151 ****
--- 156,162 ----
ch-xoff neg ch-yoff ch-height sub
ch-width ch-xoff sub ch-yoff
setcachedevice
+ 0 0 SNAP translate
ch-width ch-height true [ 1 0 0 -1 ch-xoff ch-yoff ]
{ch-image} imagemask
} if
***************
*** 185,190 ****
--- 196,202 ----
72 Resolution div dup scale
0 3300 translate
-90 rotate
+ 0 -750 translate
Mtrx currentmatrix pop
} bdf
***************
*** 271,276 ****
--- 283,292 ----
% SF -- set new font at scale nnn (nnn = 1 normally; 2 gives double size chars)
% Usage -- nnn /fontname SF
/SF {findfont exch scalefont setfont} bdf() pop
+
+ % SNAP -- convert coordinates to integer device coordinates and back again
+ % Usage -- xxx yyy SNAP (leave xxx' yyy' on stack)
+ /SNAP {transform 2 {floor 0.5 add exch} repeat itransform} bdf
% T -- move absolute horizontally and show string, updating horizontal position
% to new endpt
[08-Sep-87]
In lptops.c, change
OUTSTR(getlogin());
to
if (getlogin() != (char*)NULL)
OUTSTR(getlogin());
because getlogin() can sometimes return a null
pointer, instead of a null string.
[31-Aug-87] {Thanks to HUXTABLE@UKANVAX.BITNET}
In gblprocs.h in the ANSI type declarations for
dvifile and main, change "char *[0]" to "char
*[]". The "[0]" is an odd production of
Microsoft C which was used to prepare the type
declarations at compile time. It sneaked through
the editing (it is not needed for Microsoft C to
compile these). VAX VMS C version 2.3-024 now
supports ANSI function declaration prototypes; I
don't have it up yet.
[14-Aug-87] Released Version 2.08 in time for TUG meeting.
[14-Aug-87] {Thanks to Matthias Moritz (U608017@NHYKUN11.EARN)
for Atari support additions}
Merged in support for the Atari 520ST+ using the
Mark Williams C Compiler. makefile.ast should
build it. Since this involves changes in many
routines, I took the opportunity to introduce a
few other changes as well, and incremented the
version number of dvi*.c from 2.07 to 2.08. The
new versions should be functionally identical to
the previous ones for virtually everyone.
The Mark Williams compiler has some limitations,
and could not handle long macro definitions, in
particular DEBUG_OPEN and FONTLIST. I have
therefore made DEBUG_OPEN() expand to dbgopen(),
where the latter is defined at the end of
dviinit.h; this does not follow my standard
practice of one function per file. FONTLIST was
simply removed, and the two instances of its use
were replaced by its definition. There are about
40 instances in the driver source code of macros
continued over multiple lines. They are written
that way to prevent long lines in the source code
(80 is the absolute limit), which is an even more
serious barrier to portability.
The default stacksize on the Atari is often too
small; for the time being, main programs have
been set to declare a larger stack. On PC DOS
(which Atari GEMDOS resembles), the Microsoft
EXEMOD utility can be used to change the
stacksize of an executable program without
requiring code modification. I don't know
whether there is something similar on the Atari.
I removed the OS_xxxx-dependent conditional code
in dvi*.c for output file extension selection, by
introduction of a new variable, DVIPREFIX, in
machdefs.h. This is prepended to the default
file extension, which is now always identical to
the letters following dvi in the dvi*.c files.
On systems which do not support long file
extensions, it will be a null string; otherwise,
it will be "dvi-".
In dvialw.c, a genuine BUG surfaced; PSDEF_PATH
should be #define'd to be subpath instead of
SUBPATH. Otherwise, it cannot be overridden by
an environment variable. Thanks to Matthias
Moritz for catching this one.
An experimental version of a Canon A2 driver has
been added as dvica2.c, based on work by Pekka
Pietilainen (TFYS-PP@FINOU.BITNET), starting from
dvican.c. I have merged in his changes and
removed Unix-isms. This driver is intentionally
not included in the Makefiles. Only a few sites
have the Canon A2 printer, and once more
experience is obtained, it may replace dvican.c.
If you have such a printer, you can easily modify
the appropriate Makefile to support it, or you
can just compile and load dvica2 manually. For
debugging purposes, three additional option
switches are accepted in option.h; they will
disappear as the code settles.
More experience with the drivers at many VAX VMS
sites has indicated that variable-length record
files for the output are probably undesirable
until DEC gets its act in gear and makes all VMS
utilities handle such files properly. I have
therefore modified the code in dviinit.h to use
the fixed-block binary format for all but
POSTSCRIPT devices (for which the output is truly
an ordinary text file); previously, this format
was only selected for IMPRESS (dviimp).
For non-Unix operating systems, it is generally
necessary to open binary files differently than
text files, since the C-runtime libraries use
that distinction to decide how to translate Unix
line terminators. Every system so far has used
the letter "b" in the fopen() mode string to
select this mode, and every Unix system ignores
the "b", except Ultrix, which raises a run-time
error, sigh... I have therefore replaced the
mode string by RB_OPEN and WB_OPEN, and they are
set in machdefs.h. For all Unix systems they
will be "r" and "w", and for most non-Unix
systems, "rb" and "wb".
Lines longer than 80 characters in *.c and *.h
files have been wrapped.
The header "%!PS-Adobe-1.0" in dvialw.c has been
shortened to "%!"; the Adobe TranScript spooler
software thinks it is allowed to do page reversal
when it sees this, but dvialw output pages cannot
be reordered because fonts are defined only on
demand. The similar header in lptops.c is all
right; the pages there ARE independent.
The sources have been run through 4.2BSD lint and
System V lint. A number of missing typecasts
have been supplied, and several unreferenced
local variables have been eliminated. lint still
produces many warnings, but the remaining ones
seem to be benign, or simply red herrings.
lint revealed numerous problems with texidx.c
(which came from the GNU Project). I have
eliminated unused variables and functions, but
there remain some serious errors of incorrect
argument lists to sort_in_core() and
sort_offline(). I am not proposing to fix these
now, because at least 3 comprehensive indexing
packages for TeX have appeared recently, and
texidx.c may rapidly become obsolete.
I have changed the handling of some preprocessor
symbols in several routines so as to eliminate
redefinition warnings, and any assumptions that
undefined symbols evaluate to 0. The draft ANSI
C standard REQUIRES that all undefined symbols
evaluate to 0 in preprocessor expressions, but
many compilers to do yet follow this rule (VAX
VMS C in particular).
[15-Aug-87] {Thanks to Julian Perry (seismo!mcvax!zen.co.uk!jules)}
The code in option.h in the -o switch section
that forced page_begin[npage] <= page_end[npage]
conflicts with negative page numbers for counting
from the end. I have removed the code there, and
then in dvifile.h, before the main page loop,
inserted code to reset the page_begin[] and
page_end[] arrays to positive values (this can
only be done after page_count is known), and to
order them properly.
[10-Aug-87] {Thanks to Gary Beihl (beihl%bell.cad.mcc.com@mcc.com)}
In lw78.c and dvialw.c, change instances of
time(0) to time((long*)NULL).
[27-Jul-87] {Thanks to Charles Karney (Karney%ppc.mfenet@nmfecc.arpa)}
Here are two small changes to vaxvms.c:
In vmsexit(), we turn on a high bit on a non-zero
status code to suppress a useless VMS message:
150,151c150,151
< exit((1 << 28) + 2); /* error */
< break; /* (suppresses %NONAME-E-NOMSG) */
---
> exit(2); /* error */
> break;
457d456
In system(), add a test for the status code
returned by LIB$SPAWN; for the MAKE utility, this
allows recognition of errors returned from a
compilation.
< int stat;
463,464c462
< return ((LIB$SPAWN(&t,0,0,0,0,0,&stat) == SS$_NORMAL)
< && ((stat & 1) > 0)) ? 0 : 127;
---
> return (LIB$SPAWN(&t) == SS$_NORMAL) ? 0 : 127;
[20-Jul-87]
Updated cross-referencing awk scripts for use on
Sun OS 3.3 using standard cxref utility, replaced
old x*.awk by xref, xref1.awk, xref2.awk, and
xref3.awk, and replaced dvi.lrf and dvi.rby by
dvi.xrf.
[20-Jul-87] {Thanks to Eric M. Carroll (Eric.M.Carroll@uunet.uu.net)}
In dvialw.c, getlogin() can return a NULL
pointer, so we need to guard against that.
Change
(void)fprintf(plotfp,"%%%%Creator: %s and ",getlogin());
to
(void)fprintf(plotfp,"%%%%Creator: %s and ",
(getlogin() == (char*)NULL) ? "" : getlogin());
[08-Jul-87]
Update makefile.* to reflect new dvil3p, and
remove obsolete makefile.eun (for Eunice).
[08-Jul-87]
Add symbol DECLN03PLUS and change SUBPATH for
Unix from /usr/lib/tex/inputs/ to
/usr/lib/tex/macros to match Washington TeX
distribution.
[08-Jul-87]
In gblprocs.h, add OS_VAXVMS to the list of hosts
where sprintf() is not declared (because it is in
system include files).
[08-Jul-87]
Change type of main() from void to int in
gblprocs.h and main.h to bring them into
conformance with the draft ANSI C Standard.
[08-Jul-87]
In fontfile.h, changed VMS section to allow for
the possibility that TEXFONTS is a logical name
list (thanks for John Sauter for this).
[08-Jul-87] {Thanks to John Sauter (Sauter@dssdev.dec.com)}
Add dvil3p.c for DEC LN03+ printer.
[08-Jul-87]
In dvil75.c in prtbmap(), change OUTC('-') to
OUTS("-\n") so as to avoid long output lines.
[10-Jun-87]
Fix several spelling errors:
machdefs.h: "you machine" -> "your machine"
dvi.hlp: "cmr10.300pxl" -> "cmr10.1500pxl"
"setenv VAR=value" -> "setenv VAR value"
dviman.ltx: "cmr10.300pxl" -> "cmr10.1500pxl"
"setenv VAR=value" -> "setenv VAR value"
dviman.texinfo: "cmr10.300pxl" -> "cmr10.1500pxl"
"setenv VAR=value" -> "setenv VAR value"
[20-May-87] from Brendan Mackay (munnari!anucsd.oz!bdm@seismo.CSS.GOV)
In openfont.h, the virtual font section can erroneously
reference a null fontfp; change
if (virt_font)
to
if (virt_font && (fontfp != (FILE*)NULL))
and
if (virt_font && virt_save[fileno(fp)].base != (char *)NULL)
to
if (virt_font && (fp != (FILE*)NULL) &&
(virt_save[fileno(fp)].base != (char *)NULL))
[15-May-87]
On line 127 of execute.c in the IBM PC-specific MAKE
utility, change
*str >= 'A' && *str <= 'A' ||
to
*str >= 'A' && *str <= 'Z' ||
[29-Apr-87] from Brendan Mackay (munnari!anucsd.oz!bdm@seismo.CSS.GOV)
In machdefs.h, change
#define REWIND(fp) fseek(fp,0L,0)
to
#define REWIND(fp) FSEEK(fp,0L,0)
This is not necessary for the family as distributed, but
Brendan has implemented the virtual font changes
necessary for VAX VMS; they should be incorporated in a
future release.
[29-Apr-87] from Brendan Mackay (munnari!anucsd.oz!bdm@seismo.CSS.GOV)
The code for vms_read() [in vaxvms.c] has problems. One
is that you don't test for end of file. The other is
that there is a bug in the C library which prevents you
asking for more than 65535 bytes at a time. It is
documented that no more than 65535 bytes will be
returned, but not that you can't ask for more. If you
do, it reduces your request mod 65536! Here's a
replacement:
/**********************************************************************/
/*-->READ*/
int
READ(file_desc,buffer,nbytes)
register int file_desc;
register char *buffer;
register int nbytes;
{
register int ngot;
register int left;
for (left = nbytes; left > 0; /* NOOP */)
{
ngot = read(file_desc,buffer,(left > 65024 ? 65024 : left));
if (ngot < 0)
return (-1); /* error occurred */
if (ngot == 0) /* eof occurred */
return(nbytes-left);
buffer += ngot;
left -= ngot;
}
return(nbytes-left);
}
[15-Apr-87] Completed version 2.07 for general release.
[04-Apr-87] to
[15-Apr-87]
Changed texidx.c to check for special characters
in generated \initial{} commands and suitably
protect them.
Changed dviinit.h to try to open output file and
log file in current directory if open in the
directory of the .dvi file fails (presumably
because no write access to that directory).
Adapted loadbmap() code from dvican.c to
dvijep.c, and added function declaration in
gblprocs.h, finally removing the limitation
dvijep had for large font characters.
Rearranged some struct members in gblvars.h to
ease debugging.
Added check in openfont.h for null pfontptr.
Updated Makefile's and added ones for KCC, PCC,
and VMS.
Rewrote 00arit.c to test short, int, and long
integer arithmetic.
Changed version numbers in dvi*.c from 2.06 to
2.07.
Split bopact.h (beginning of page action) out of
eopact.h.
Rewrote eopact.h to reflect new instant keyboard
response and better control over page
positioning.
Increased value of BIGBGCHAR in dvibit.c to allow
large characters to be sent as fonts, rather than
bitmaps.
There seems to be a bug in BitGraph Version 3.10
which causes characters to be overwritten at the
right margin when the actual screen width is
used. Reduced value of XSIZE in dvibit.c to fix
the problem.
Decreased YSIZE in dvibit.c to make space for
larger command and status area at top of screen.
Added keybrd.c and keydef.h to handle keyboard
input. keybrd.c was a major effort (900 lines of
code and comments), but now nicely hides the
ugliness of instant keyboard input on all the
operating systems presently supported in the DVI
family.
Removed references to Berkeley Unix sgtty.h file
and tty structures in dvibit.c and gblvars.h; no
longer needed since keybrd.c hides those details.
Use JSok instead of JSerr in f20open.h to allow
jsys() calls to work for both KCC-20 and PCC-20.
Modified character screen clipping decision in
setchar() in dvibit.c.
Changed raster-op code from 3 to 9 in BBNDPD
command in setchar() in dvibit.c so that display
is correct with both inverse video and normal
video.
Split reldfont.h out of readfont.h to support
font unloading needed for dvibit zoom commands.
Added #include "reldfont.h" to dvi*.c.
Removed conditionals around #include statements
and put them in the #include'd file instead; this
reduces the number of changes needed in the
dvi*.c files as new implementations are made.
This affects f20open.h, strchr.h, and strrchr.h.
Added KCC support changes to dvihead.h, fatal.h,
f20open.h, gblprocs.h, machdefs.h, main.h,
strchr.h, strrchr.h, texid3.h.
Added terminal backslash to lines in multi-line
macro invocations in dvijep.c and getbmap.h (KCC
restriction).
Added new function declarations to gblprocs.h.
Changed dimension of message[] in gblvars.h from
MAXSTR to MAXMSG; it needs to be larger than
MAXSTR in order to hold error messages containing
strings of size MAXSTR. MAXMSG is defined in
gendefs.h.
Updated lptops.c and lw78.c for KCC.
Added conditionals to lptops.c to initialize all
unset symbols to 0 (KCC requires this), and
default to OS_UNIX if no host is defined.
Added KCC_20 and DECLA75 symbols to machdefs.h.
Changed major DVI command loop in prtpage.h to
call kbinput(), bopact(), and eopact() for BBN
BitGraph, and changed full screen erase to
partial erase to preserve command/status window.
In texid3.c, changed short name readln to rdline
to remove conflict with KCC library.
Added GETCHAR routine to vaxvms.c; this is not
needed by the DVI driver family, but the idea was
used in keybrd.c.
[01-Apr-87] Begin work on Version 2.07
General work: major changes to support new KCC-20
compiler, substantially enhance DVIBIT, and add
DVIL75.
========================================================================
[01-Apr-87]
End work on Version 2.06:
[04-Mar-87]
Added declaration of errno in dvihead.h for BSD41
and BSD42; they don't have it in errno.h.
[04-Mar-87]
Added test for null file pointer before calls to
fclose() in abortrun.h and dviterm.h; failure to
do so causes core dumps when exit() is entered in
4.1 and 4.2BSD Unix.
[27-Feb-87]
option.h did not support negative magnifications,
like -m-0.5 and -m-1, which was advertised in the
documentation, dviman.ltx. Code has now been
added to handle that case. Without the fix, it
is of course still possible to get any
magnification value, since e.g. if -m1500 is the
default on a 300 dpi printer, then -m-0.5 is
equivalent to -m1369 (1369 = 1500/(1.2**(-0.5))).
[26-Feb-87]
In dispchar.h, change the line
rightones[HOST_WORD_SIZE - 1 - bits_to_next] &
to
rightones[bits_to_next] &
This code is not active for non 32-bit machines,
or the IBM PC, and the local 32-bit Unix machines
running the driver family have been using only
the laser printer members, so the bug was not
caught until we actually tried DVIPRX output
under VAX VMS. The effect it has is that large
vertical white streaks appear in the output
bitmap; dispchar() is used by all the
low-resolution dot matrix printers.
[25-Feb-87]
Added code to prtbmap() in dviprx.c to print
bitmap in hexadecimal when (debug_code & 1) is
non-zero.
[21-Feb-87]
In prtpage.h, corrected "\special" to
"\\special"; this error was caught by the KCC-20
compiler.
[10-Feb-87]
Yesterday I discovered that VAX VMS 4.4 printf()
wipes out the stack and kills the process if a
long string is printed. This turns out to be the
case in outline() in dvitos.c; the code has been
modified to use fputs() there instead.
[10-Feb-87]
Several debugging sessions on VAX VMS stepping
through the call chain fflush() -> _flsbuf() ->
_flsbuf_record() -> write_record() ->
write_buffer() -> write_imbed() -> write_output()
->signal() -> c$$translate() have made it clear
that the simple scheme in dvi*.c and lptops.c of
checking for a non-zero return value from
fflush() or ferror() is an unreliable way to
conclude a legitimate error (specifically, disk
storage exhausted) exists. Consequently, these
routines have been modified to call clearerr() at
the beginning of loadchar() and prtbmap(), then
to use a macro DISKFULL() to test for the error
condition. DISKFULL() is defined in machdefs.h,
and errno.h is now included by dvihead.h. This
regrettably introduces small changes in a number
of routines, but no other clean way of doing the
job appeared to be feasible.
[02-Feb-87]
Changed "pagecollation on" to "pagecollation off"
in dviimp.c. With version 3.3 of the Imagen
Image Processor software, there seems to be a bug
in that "pagecollation on" causes page reversal.
I have reported this to Imagen.
[20-Jan-87]
Replaced page_xxx[] arguments to sscanf() in
option.h with int temporaries p1,p2,p3; the
page_xxx[] values are of type INT16 which does
not match the %d format items. The use of
sscanf() in fontsub() is okay. The one in
special() in dvialw.c has the type COORDINATE for
the variables llx, lly, urx, ury; the type has
been changed to int.
This bug surfaced on an HP Unix system with the
FOCUS chip; it is disguised on the DEC-20 by
virtue of short, int, and long all being one word
long, and on the VAX and Intel architectures
which address these values by their low-order,
rather than high-order, byte (i.e. little Endian
order).
[16-Jan-87]
Corrected error in tosprx.c which resulted in
loss of first page, and added test to avoid
unnecessary OR'ing zero bits into bitmap.
[10-Jan-86]
In machdefs.h, reset MAXOPEN to NFILES-6 or less,
where NFILES is the limit on the number of open
files set in stdio.h. It was previously
NFILES-5, which can cause an abort with a message
"unable to open error log file" because all file
handles are in use.
[07-Jan-86]
Finished preliminary release of DVICAN for the
Canon LBP-8 A2 laser printer. At present, this
is forced to send bitmaps for every single
typeset character, since the downloaded font
mechanism does not work reliably. Canon's
documentation is abysmal, and after tearing my
hair out staring at hex dumps of the output of
many test files, I received a hex dump of a file
from a site in Holland using a driver obtained
from Japan; to my surprise, they did not use the
download mechanism, just bitmaps, so I expect
they hit the same problems I did. I intend to
try to find out more detailed information from
the local Canon dealer--perhaps there is
something magic missing. It is indeed suspicious
however, when TeX input "ABABABABAB" produces
"ABA A A A ", and "A SHORT STORY" produces "A SH
RT T Y"--characters apparently randomly (though
reproducibly) dropped from the printed page.
The penalty for sending bitmaps instead of fonts
is severe--on a 15-page test file, it took 10.8
times as many bytes/page as DVIJEP, averaging
nearly 95K characters/page, for a throughput of
one printed page every 2 to 4 minutes, instead of
the 4/minute available from the LaserJet Plus.
[20-Dec-86]
Updated DVIBIT, fixing several things that had
been broken by changes which could not be tested
earlier, and improving the interactive interface.
End-of-page action in prtpage.h has been expanded
and moved out to eopact.h. Warning messages are
suppressed for DVIBIT when quiet mode (-q) is
selected to avoid needlessly trashing the screen.
Default magnification for low-resolution devices
changed from 579 (magstep -3 in 200dpi family) to
603 (magstep -5 in 300dpi family).
Added run-time selectable virtual font support
for performance improvement, particular on
networked file systems where the overhead of
reading small packets becomes unacceptably large.
With .PK fonts, most font files for normal sized
text are 4K to 8K bytes, and for SliTeX text, 15K
to 20K bytes. With up to 15 fonts open, this
probably requires less than 200K bytes of memory,
which is available for the non-bitmapped drivers
even on my IBM PC.
[15-Dec-86]
Reorganized machdefs.h to group each set of
machine-specific changes inside one conditional
for that machine. Removed #undef's--if the
compiler warns of redefinitions, that is useful
feedback that the right set has been chosen.
Completed port to VAX VMS. VMS C has an
incomplete library and faulty implementations of
fseek(), ftell(), and ungetc(). To get around
these, macros FSEEK, FTELL, and UNGETC have been
used throughout the code, and machdefs.h will
define them to point to special versions found in
vaxvms.c in the OS_VAXVMS conditional section.
The VMS debugger, particular in screen mode where
the source code, output, and debug input are
displayed in three windows is excellent, though
unnecessarily verbose. VMS C makes memory page 0
inaccessible. This caught two instances of
dereferencing of NULL pointers in movedown.h and
moveover.h.
Logical names for VAX VMS are chosen to match the
Kellerman and Smith TeX implementation. DVI and
font file formats are assumed to be fixed binary;
stream files would be better (since fseek() and
ftell() work properly for them, and padding to
block boundaries is unnecessary), but their use
would require rewriting change files for all the
TeXware.
[05-Dec-86]
In dviinit.h (TOPS-20 and VMS only), fix bug
causing referencing of *(NULL + 1). Change
"if (isdigit(*(tcp1+1)))"
to
"if ((tcp1 != (char*)NULL) && isdigit(*(tcp1+1)))"
[15-Nov-86]
In fontfile.h (bug found Unix conditional code,
but could happen if other machines were added),
in the loop beginning
m = 0; /* index in filelist[] */
for (k = 0; k < MAXFORMATS; ++k) /* loop over possible file types */
{
*filelist[k] = '\0'; /* Initially, all filenames are empty */
the filelist[] entry is cleared on each loop
iteration, but in the Unix code section, it is
actually advancing over two entries at a time.
The initialization must be moved out into a
separate new loop preceding the old one:
for (k = 0; k < MAXFORMATS; ++k)
*filelist[k] = '\0'; /* Initially, all filenames are empty */
[13-Nov-86]
Update makefile.1, makefile.2, makefile.msc for
IBM PC.
[13-Nov-86]
Add extra library .h file #include's in dvihead.h
for IBM PC MICROSOFT C library function
declarations.
[12-Nov-86]
Change malloc to MALLOC in getbmap.h, loadchar.h,
machdefs.h, and readfont.h; for IBM PC Microsoft,
this is defined to use calloc() instead of
malloc() in machdefs.h. This seems to remove a
long-standing bug of the driver hanging the
machine after printing the last page, presumably
while in the free() calls in dviterm(). I made
extensive tests on the DEC-20 to try to reproduce
this bug, by using DDT to introduce code that
initializes the free stack area and malloc()'d
memory to values which would cause integer
overflow if used as integers, and would cause
illegal memory references if used as pointers.
No failure could be precipitated by this. On the
IBM PC, the symptom was that the driver would run
on a freshly-booted machine (booting sets memory
to a specific non-zero bit pattern), but if other
programs had been run, it would sometimes hang.
I found that by using the debugger to
preinitialize memory to a fixed bit pattern
before running DVIJEP, I could repeatedly run
DVIJEP all night long. The change from malloc()
to calloc(), which zeroes the returned memory,
permitted DVIJEP to run successfully 85 times in
a row; when I subsequently reran the old version,
it hung the PC. Recent netmail has carried
numerous discussions of irregularities of both
Lattice and Microsoft C malloc()'s; this may be
one more manifestation.
[31-Oct-86]
Fixed a dumb typo in dvialw.c and dvijep.c; in
setstr(), change
(void)fprintf(stderr,isprint(c) ? "%c" : "\\%03o",c);
to
(void)fprintf(stderr,isprint(str[k]) ? "%c" : "\\%03o",str[k]);
[24-Oct-86]
Whoops! Somehow, warning() lost its code to
write its message on stderr as well as the log
file. At the end, add the lines
NEWLINE(stderr);
#if (OS_TOPS20 | OS_VAXVMS)
(void)putc('%',stderr); /* percent at start of line */
#endif
(void)fputs(msg,stderr);
NEWLINE(stderr);
if (g_logname[0])
{
(void)fprintf(stderr,
"Current TeX page counters: [%s]",tctos());
NEWLINE(stderr);
}
The check of g_logname[0] suppresses an attempt
to supply page counters when no .DVI file has yet
been opened.
[24-Oct-86]
If an invalid option is detected in option(),
then warning() and/or fatal() will be called.
However, there is not yet a file name available
for a log file, and g_dolog is initially TRUE, so
both warning() and fatal() will abort because the
log file cannot be opened. Change the "if
(g_dolog ...) statements in fatal.h and warning.h
to include the condition "&& g_logname[0]".
Since C requires external variables to be
initialized to zero, g_logname[0] = '\0' when
option() is called, and no attempt will be made
to open the log file in warning() and fatal().
[21-Oct-86]
For TOPS-20 only, set output and log file
generation retention counts to zero, implying all
generations will be kept. That way, if the user
runs dvixxx for the same file, but with different
parameters (-x and -y are good examples), the
earlier versions will not be lost. This adds
some new flags to machdefs.h, and some additional
code to dviinit.h, fatal.h, and warning.h right
after their fopen() calls. fopen(,"w+") will
reuse an existing file, so we changed the logfile
generation to "-1", always giving a new file.
[21-Oct-86]
In prtpage.h, inserted
rule_height = -1; /* reset last rule parameters */
rule_width = -1;
before line
str_ycp = -1;
in POSTSCRIPT section (about line 115) of case
BOP. I caught this when I did `dvialw foo.dvi.*'
today-- after the first file, the PostScript
output contained a reference to the Q macro
before a B had been issued to define h and w, the
previous bar dimensions.
[13-Oct-86]
Added -d32 option to cause display of all
truncated off-page text strings. This was
prompted by my wasting time looking for what I
thought was a bug in setstr() with long strings.
Changes in functions setstr() and setchar() in
dvialw.c and dvijep.c, and setchar.h, as well as
documentation in dviman.ltx and dviman.texinfo.
[15-Sep-86]
Added -z option for PostScript and HP LaserJet
Plus on TOPS-20 only; this types in a command
"DVISPOOL: dvifilename\n", permitting the user to
define a spooler for the DVI file. This typein
is not automatic as in TOPS-20 TeX, because it
may interfere with batch and .mic files; however,
the final newline is supplied, because it is
assumed the user wanted it if the option switch
was given. Changes in dviterm.h, gblvars.h,
option.h, and usage.h, with new BOOLEAN global
variable "spool_output".
[15-Sep-86]
Added page_step[] to allow printing pages in
steps other 1, such as for duplex printing, and
option -obeginpage:endpage:steppage; this
required changes in dvifile.h, gblvars.h, main.h,
option.h, and usage.h.
[09-Sep-86]
Changed checksum error message in readgf.h,
readpk.h, and readpxl.h to output checksums in
octal and hexadecimal as well as decimal, and
explain why the mismatch is likely to have
occurred.
Changed debug_code to debug_code & 4 in dvijep.c,
and updated dviman.ltx to define settings of -d#
option for selective debug output.
Added DEBUG_OPEN() calls to dvialw.c, dviinit.h,
fatal.h, fontsub.h, openfont.h, and warning.h,
and definition of DEBUG_OPEN() to gendefs.h.
Delete doubled word in comment in charpk.h.
Insert typecast in fillrect.h:
*p = (UNSIGN32)ONES.
Insert typecast in dvibit.c:
tcharptr->istoobig = ((int)(tcharptr->hp*
((tcharptr->wp+15) >> 4)) >= BIGBGCHAR);
Change macro argument c to ch in dvijep.c
(Microsoft C version 4.0 otherwise thinks that
the c in the format specification is to be
expanded too):
#define SETCHARCODE(fontnumber,ch) {\
if (fontnumber)\
(void)fprintf(plotfp,"\033*c%dd%dE",fontnumber,MAPCHAR(ch));\
else\
(void)fprintf(plotfp,"\033*cd%dE",MAPCHAR(ch));\
}
[04-Sep-86]
Fixed handling of -o-# in option.h; I forgot to
check for signs in skipping the number.
[28-Aug-86]
Wrote errshow.c; it is a filter which merges the
error message file output by Microsoft C with a
copy of the source line causing the error
message.
[28-Aug-86]
Minor changes for type matching. Added typecasts
in chargf.h, charpk.h, dvialw.c, and dvijep.c.
Changed type declarations of m_begin, m_end,
m_step in dvitype.h, of k in fontfile.h, and of
fontfile() arguments in gblprocs.h. Added code
for IBM_PC_MICROSOFT to include stdlib.h and
string.h in main.h. Version 3.0 of Microsoft C
has a number of errors and inconsistencies in the
library file type declarations for stdio.h and
string.h. I fixed declarations and use of
putc(), putchar(), fileno(), _flsbuf(), thereby
eliminating "strong type mismatch" errors on
every instance of use of these functions.
Declarations of argument types for strxxx() have
int instead of char, and unsigned int instead of
int, for strchr(), strlen(), strrchr(),
strncpy(), strncat(), and strncmp(), which is at
variance with Kernighan & Ritchie, and with
Harbison & Steele, so use of these still gives
type mismatch errors. I am not fixing the
library file declarations pending seeing what
Version 4.0 has to offer, and what the ANSI C
Standard committee does with them.
[21-Aug-86]
Add -e option in option.h for run-time
command-line definition of ``environment''
variables, and move initialization of xx_index
out of initglob() into dvifile(). This was
prompted by the use of Unix server invocations of
the drivers through calls to ``system("dvixxx
filename")''. Such a call creates a new shell
which, although it inherits the caller's
environment, may in fact require different
environment variables, especially for things like
FONTLIST and TEXFONTS.
[21-Aug-86]
Change fontlist.h, gendefs.h, and openfont.h to
support a more general mechanism of font file
name generation. fontlist() now returns a list
of pointers to a series of possible font file
names; the first null string in the list
terminates it. The Unix and VAX VMS code
sections in fontlist.h now generate names with
the magnification both in the directory name as
well as in the extension. This was prompted by a
local need at Utah with some networked Unix
workstations which have both flavors of font file
storage.
[21-Aug-86]
Change handling of TeX \countn values to INT32,
instead of UNSIGN32; roman-numeral pages come out
with negative page numbers in PLAIN.TEX. This
affects the declaration and use of tex_counters[]
in dviinit.h, gblvars.h, prtpage.h, and tctos.h.
[18-Aug-86]
Allow negative page numbers on -o#:# switch to
mean pages from end (-1 = last, -2 = next to
last, etc.). sscanf() format change in option(),
and introduce PAGENUMBER() macro in dvifile().
[15-Aug-86]
Conversion of the font magnification factor for
*.*pxl files in fontfile.h to dots/inch for the
*.*gf and *.*pk files forgot to round up. Thus,
mag 1643 became 328 instead of 329. Because
fontfile() gets a truncated magnification value,
the rounding is non-trivial; comments in
fontfile() describe what is necessary.
; Local Modes:
; Mode:Text
; Comment Column:0
; Auto Fill Mode:1
; Fill Column:65
; Fill Prefix:" "
; Indent Tabs Mode:0
; End:
|