summaryrefslogtreecommitdiff
path: root/dviware/beebe/doc/00revhst.txt
blob: 3b2f0c3aabff6437f8bd040d81d02d2f97b299e3 (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
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: