home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / psroff3.0 / patch8 < prev    next >
Text File  |  1992-04-18  |  55KB  |  1,864 lines

  1. Newsgroups: comp.sources.unix
  2. From: clewis@ferret.ocunix.on.ca (Chris Lewis)
  3. Subject: v26i015: psroff 3.0, Patch08
  4. Sender: unix-sources-moderator@pa.dec.com
  5. Approved: vixie@pa.dec.com
  6.  
  7. Submitted-By: clewis@ferret.ocunix.on.ca (Chris Lewis)
  8. Posting-Number: Volume 26, Issue 15
  9. Archive-Name: psroff3.0/patch8
  10.  
  11.     This is official patch 08 for Psroff 3.0.
  12.     Please apply it by:
  13.     cd <psroff source directory>
  14.     touch ljdraw.c lj3draw.c    (not necessary for most versions of
  15.                     patch, but some need it)
  16.     patch -N -p < <this file>
  17.  
  18.     Please read the notes below before recompilation.  This
  19.     is a biggie - graphics support on LJ's, and I thought
  20.     I'd get it out before it got any worse ;-)
  21.     
  22.     The base release of psroff3.0 and previous patches were in
  23.     comp.sources.unix volume 24 and 25.
  24.  
  25.     Major changes:
  26.     1) Support for vertical and horizontal lines (\D) when driving
  27.        HP Laserjets and II's.  Now groff users can use tbl and
  28.        get boxes to work on II's and prior.
  29.     2) Full \D support on HP LJ III's - eg: full pic support on
  30.        III's from ditroff.  This is done by popping into HPGL
  31.        mode.  This has also necessitated adding a lj3 driver
  32.        type into troff2ps.  If you are driving a lj3, make sure
  33.        your psrofflib entry has -Tlj3 instead of -Tlj.
  34.        Thanks to David Wexelblat.
  35.     3) asc2ps/psxlate now compiles and works under VMS - define VMS
  36.        in defs.h first.
  37.     4) Improved documentation in defs.h and Makefile for configuration.
  38.        Read them before rebuilding - ESPECIALLY if Apollo.
  39.     5) Had SHELL assignment in submakes.  Apollos compile better.
  40.        (maybe Sonys too)  Lessening need for zap program.
  41.  
  42. Incidentally, psroff is reaching the limits of the functionality I
  43. think it should have.  I'm starting to contemplate doing a full rerelease
  44. as Psroff 4.0.  This would have a patch independent configuration,
  45. integrated hp2pbm and psnup.  Patch 9 will have a replacement for
  46. "make check" that does a FAR better job at figuring out your configuration
  47. than the current one can.  It will also have the rest of the drawing
  48. functionality for non-III LJ's.  Then we'll just shake the thing out
  49. a bit more and rerelease.
  50.  
  51. If you have trouble configuring psroff before patch 9 comes out, ask me
  52. for a copy of "checker".
  53.  
  54.     clewis@ferret.ocunix.on.ca (Chris Lewis)
  55.  
  56. ./lib/lj3.lib        HPGL mode initialization
  57. ./lib/psrofflib.S    switch lj3 emission over to -Tlj3 to troff2ps
  58.             (you may reject here.  All you need to do is
  59.             change -Tlj to -Tlj3)
  60. ./utils/psxlate.c    VMS support
  61. ./utils/asc2ps.c    VMS support
  62. ./lj.h            graphics stuff
  63. ./utils.c        Commoned "require" routine
  64. ./ps.c            Commoned "require" routine
  65. ./defs.h        PL8, lj3draw support
  66. ./INSTALL        Documentation improvements
  67. ./TROUBLE        Documentation improvements
  68. ./Makefile        Documentation improvements/lj*draw inclusions/SHELL
  69. ./t2conf.c        lj3 driver/draw.
  70. ./opt.c            SVR4 compiler complaints
  71. ./lj.c            graphics
  72. ./makeincl.S        SHELL
  73. ./ljdraw.c        LJ/LJII graphics driver (hor and vert lines only yet)
  74. ./debug.c        SVR4 compiler complaints
  75. ./lj3draw.c        LJIII graphics driver
  76.  
  77. Patchwrapped: 920123145338
  78.  
  79. Index: ./lib/lj3.lib
  80. *** /tmp/PATCHold/./lib/lj3.lib    Thu Jan 23 14:49:43 1992
  81. --- ./lib/lj3.lib    Thu Jan 23 14:49:44 1992
  82. ***************
  83. *** 29,36 ****
  84.   %            \xAABB \022 A %hello
  85.   %            Passes the following bytes: 0xAA, 0xBB, 022, and "A"
  86.   %            through to the laserjet.
  87. ! %ident  @(#)lj3.lib: 2.1 Copyright 90/07/18 16:52:26 Chris Lewis"
  88. ! \033E\033&k2G            %reset printer, set CR=CR,LF=CRLF,FF=CRFF */
  89. ! \033&l6d66p0o0e66f0L        %letter size, portrait, no perf skip */
  90. ! \0339                %reset side margins */
  91. ! \033&a0r0C            %move cursor to 0,0 */
  92. --- 29,43 ----
  93.   %            \xAABB \022 A %hello
  94.   %            Passes the following bytes: 0xAA, 0xBB, 022, and "A"
  95.   %            through to the laserjet.
  96. ! %ident  @(#)lj3.lib: 2.2 Copyright 92/01/23 14:27:59 Chris Lewis"
  97. ! \033E\033&k2G            %reset printer, set CR=CR,LF=CRLF,FF=CRFF 
  98. ! \033&l6d66p0o0e66f0L        %letter size, portrait, no perf skip
  99. ! \0339                %reset side margins
  100. ! \033&a0h0V            %move cursor to 0,0
  101. ! \033*c6120x7920y0T\033\045 1B    %set HP-GL/2 picture frame, go to HP-GL/2
  102. ! IN;WU0;LW0.5;SP1;        %initialize, pen widths in MM, 0.5MM for pen 1
  103. ! LA1,4,2,4;            %set round line caps & joins
  104. ! TR0;                %set transparency mode off
  105. ! IP0,11176,8636,0;        %set orientation to match PCL
  106. ! SC0,2550,0,3300;PU0,0;        %scale HP-GL/2 to 300dpi dots like PCL
  107. ! \033\045 1A            %return to PCL mode
  108. Index: ./lib/psrofflib.S
  109. *** /tmp/PATCHold/./lib/psrofflib.S    Thu Jan 23 14:49:53 1992
  110. --- ./lib/psrofflib.S    Thu Jan 23 14:49:55 1992
  111. ***************
  112. *** 1,4 ****
  113. ! #    2.22 91/12/07
  114.   #    This file controls psroff, you can insert additional printer
  115.   #    types here.  These are eval'd *late* in processing, so that
  116.   #    you can insert $copies etc.
  117. --- 1,4 ----
  118. ! #    2.23 92/01/23
  119.   #    This file controls psroff, you can insert additional printer
  120.   #    types here.  These are eval'd *late* in processing, so that
  121.   #    you can insert $copies etc.
  122. ***************
  123. *** 157,172 ****
  124.   
  125.   #    Laserjet III (built-in fonts, using supplied widths, Times base)
  126.   
  127. ! lj3    width=lj3 t2arg='-Tlj -plj3 -W%%FONTDIR%%/lj3'
  128.   lj3    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  129.   #    Laserjet III (built-in fonts, using supplied widths, Univers base)
  130. ! lj3u    width=lj3u t2arg='-Tlj -plj3u -W%%FONTDIR%%/lj3u'
  131.   lj3u    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  132.   #    Ditroff:
  133. ! dlj3    width=lj3 t2arg='-Tlj -plj3 -N -W%%FONTDIR%%/lj3'
  134.   dlj3    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  135.   #    Ditroff:
  136. ! dlj3u    width=lj3u t2arg='-Tlj -plj3u -N -W%%FONTDIR%%/lj3u'
  137.   dlj3u    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  138.   
  139.   
  140. --- 157,172 ----
  141.   
  142.   #    Laserjet III (built-in fonts, using supplied widths, Times base)
  143.   
  144. ! lj3    width=lj3 t2arg='-Tlj3 -plj3 -W%%FONTDIR%%/lj3'
  145.   lj3    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  146.   #    Laserjet III (built-in fonts, using supplied widths, Univers base)
  147. ! lj3u    width=lj3u t2arg='-Tlj3 -plj3u -W%%FONTDIR%%/lj3u'
  148.   lj3u    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  149.   #    Ditroff:
  150. ! dlj3    width=lj3 t2arg='-Tlj3 -plj3 -N -W%%FONTDIR%%/lj3'
  151.   dlj3    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  152.   #    Ditroff:
  153. ! dlj3u    width=lj3u t2arg='-Tlj3 -plj3u -N -W%%FONTDIR%%/lj3u'
  154.   dlj3u    lparg='| lp -d$ptr -og -n$copies' ptr=laser
  155.   
  156.   
  157. ***************
  158. *** 259,263 ****
  159.   #    width directories/devlj3 for this to work.
  160.   troff=gtroff
  161.   trofftype='-T$width'
  162. ! glj3    width=lj3 t2args='-Tlj -plj3 -N -Z -O0 -W%%FONTDIR%%/lj3 -G1'
  163.   glj3    lparg='lp -og -d$ptr -n$copies' ptr=laser
  164. --- 259,263 ----
  165.   #    width directories/devlj3 for this to work.
  166.   troff=gtroff
  167.   trofftype='-T$width'
  168. ! glj3    width=lj3 t2args='-Tlj3 -plj3 -N -Z -O0 -W%%FONTDIR%%/lj3 -G1'
  169.   glj3    lparg='lp -og -d$ptr -n$copies' ptr=laser
  170. Index: ./utils/psxlate.c
  171. *** /tmp/PATCHold/./utils/psxlate.c    Thu Jan 23 14:50:09 1992
  172. --- ./utils/psxlate.c    Thu Jan 23 14:50:11 1992
  173. ***************
  174. *** 23,29 ****
  175.    */
  176.   #ifndef    lint
  177.   static char SCCSid[] =
  178. !     "@(#)psxlate.c: 2.18 Copyright 91/12/21 13:13:44 Chris Lewis";
  179.   #endif
  180.   
  181.   #ifdef    ALONE
  182. --- 23,29 ----
  183.    */
  184.   #ifndef    lint
  185.   static char SCCSid[] =
  186. !     "@(#)psxlate.c: 2.19 Copyright 92/01/23 14:22:16 Chris Lewis";
  187.   #endif
  188.   
  189.   #ifdef    ALONE
  190. ***************
  191. *** 66,72 ****
  192. --- 66,76 ----
  193.   
  194.   char shuffle[100];
  195.   
  196. + #ifdef VMS
  197. + char tmp[] = {"SYS$SCRATCH:psxXXXXXX.tmp"};
  198. + #else
  199.   char tmp[] = {"/tmp/psxXXXXXX"};
  200. + #endif /* ifdef VMS */
  201.   
  202.   int pagecnt = 0;
  203.   char *progname;
  204. ***************
  205. *** 74,80 ****
  206. --- 78,88 ----
  207.   char *mygets();
  208.   
  209.   #ifndef    LIBDIR
  210. + #ifdef VMS
  211. + #define    LIBDIR    "PSROFF_POSTSCRIPT"
  212. + #else
  213.   #define    LIBDIR    "/usr/lib/troff2"
  214. + #endif /* ifdef VMS */
  215.   #endif
  216.   
  217.   char    cmdbuffer[BUFFERSIZE];    /* for psnup stuff */
  218. ***************
  219. *** 94,99 ****
  220. --- 102,113 ----
  221.       char *si = shuffle;
  222.       long offset, oldoffset;
  223.   
  224. + #ifdef VMS
  225. +     if(!shell$is_shell())
  226. +       shell_mung(&argc,&argv,0,"n-p-s-");
  227. + #endif /* ifdef VMS */
  228.       progname = argv[0];
  229.   
  230.   
  231. ***************
  232. *** 144,156 ****
  233. --- 158,178 ----
  234.           progname, startspot, pages - 1, pages);
  235.           psnupok = 0;
  236.       }
  237. + #ifdef VMS
  238. +     sprintf(cmdbuffer, "%s:nup.pro", LIBDIR);
  239. + #else
  240.       sprintf(cmdbuffer, "%s/nup.pro", LIBDIR);
  241. + #endif /* ifdef VMS */
  242.       if (access(cmdbuffer, 4) != 0) {
  243.           fprintf(stderr, "%s: can't do n-up (no nup.pro at %s)\n",
  244.           progname, cmdbuffer);
  245.           psnupok = 0;
  246.       }
  247. + #ifdef VMS
  248. +     sprintf(cmdbuffer, "%s:nup.epi", LIBDIR);
  249. + #else
  250.       sprintf(cmdbuffer, "%s/nup.epi", LIBDIR);
  251. + #endif /* ifdef VMS */
  252.       if (access(cmdbuffer, 4) != 0) {
  253.           fprintf(stderr, "%s: can't do n-up (no nup.epi at %s)\n",
  254.           progname, cmdbuffer);
  255. ***************
  256. *** 326,332 ****
  257. --- 348,358 ----
  258.   
  259.   cleanup() {
  260.       if (!debug)
  261. + #ifdef VMS
  262. +         delete(tmp);
  263. + #else
  264.       unlink(tmp);
  265. + #endif /* ifdef VMS */
  266.   }
  267.   
  268.   emit(fname)
  269. ***************
  270. *** 342,348 ****
  271. --- 368,378 ----
  272.       fputs(magicstr, stdout);
  273.   
  274.       if (psnupwanted) {
  275. + #ifdef VMS
  276. +     sprintf(cmdbuffer, "%s:nup.pro", LIBDIR);
  277. + #else
  278.       sprintf(cmdbuffer, "%s/nup.pro", LIBDIR);
  279. + #endif /* ifdef VMS */
  280.       emitnup(cmdbuffer, 1);
  281.       }
  282.   
  283. ***************
  284. *** 362,368 ****
  285. --- 392,402 ----
  286.       emitsect(file, &epilog);
  287.   
  288.       if (psnupwanted) {
  289. + #ifdef VMS
  290. +     sprintf(cmdbuffer, "%s:nup.epi", LIBDIR);
  291. + #else
  292.       sprintf(cmdbuffer, "%s/nup.epi", LIBDIR);
  293. + #endif /* ifdef VMS */
  294.       emitnup(cmdbuffer, 0);
  295.       }
  296.   
  297. Index: ./utils/asc2ps.c
  298. *** /tmp/PATCHold/./utils/asc2ps.c    Thu Jan 23 14:50:23 1992
  299. --- ./utils/asc2ps.c    Thu Jan 23 14:50:25 1992
  300. ***************
  301. *** 14,20 ****
  302.   
  303.   #ifndef    lint
  304.   static char SCCSid[] =
  305. !     "@(#)asc2ps.c: 2.5 Copyright 91/05/25 21:27:18 Chris Lewis";
  306.   #endif
  307.   
  308.   #ifndef    STANDALONE
  309. --- 14,20 ----
  310.   
  311.   #ifndef    lint
  312.   static char SCCSid[] =
  313. !     "@(#)asc2ps.c: 2.6 Copyright 92/01/23 14:22:06 Chris Lewis";
  314.   #endif
  315.   
  316.   #ifndef    STANDALONE
  317. ***************
  318. *** 118,123 ****
  319. --- 118,128 ----
  320.       extern char *optarg;
  321.       char buffer[BUFLEN];
  322.   
  323. + #ifdef VMS
  324. +     if(!shell$is_shell())
  325. +       shell_mung(&argc,&argv,0,"s-");
  326. + #endif /* ifdef VMS */
  327.       progname = argv[0];
  328.   
  329.       while((c = getopt(argc, argv, "plPLis:")) != EOF)
  330. ***************
  331. *** 203,208 ****
  332. --- 208,217 ----
  333.   char nodename[25];
  334.   
  335.   getnodename() {
  336. + #ifdef VMS
  337. +     strcpy(nodename, "<nodename>"); /* ignore getsyi("nodename") */
  338. + #else
  339.       FILE *uuname;
  340.       if ((uuname = popen(NODECMD, "r")) == NULL)
  341.       strcpy(nodename, "<noname>");
  342. ***************
  343. *** 210,220 ****
  344. --- 219,234 ----
  345.       fscanf(uuname, "%s", nodename);
  346.       pclose(uuname);
  347.       }
  348. + #endif /* ifdef VMS */
  349.   }
  350.   
  351.   doprolog() {
  352.       extern char *ctime();
  353. + #ifdef VMS   /* dont worry about getjpi("","username") */ 
  354. + #define getlogin() "<username>"
  355. + #else
  356.       extern char *getlogin();
  357. + #endif /* ifdef VMS */
  358.       extern char *strchr();
  359.       long curtime;
  360.       register char *tp;
  361. Index: ./lj.h
  362. *** /tmp/PATCHold/./lj.h    Thu Jan 23 14:50:35 1992
  363. --- ./lj.h    Thu Jan 23 14:50:36 1992
  364. ***************
  365. *** 8,17 ****
  366.       Function:        Laserjet Driver definitions
  367.    */
  368.   
  369. ! /* 2.2 91/02/20 */
  370.   
  371. ! /*    We're using decipoints */
  372. ! #define    LJRESOLUTION    720
  373.   
  374.   /*    Troff assumes 7.5" paper width, most macro packages print in
  375.       6.5" area within that.  Sooo, we'll center the paperwidth on the
  376. --- 8,17 ----
  377.       Function:        Laserjet Driver definitions
  378.    */
  379.   
  380. ! /* 2.3 92/01/12 */
  381.   
  382. ! /*    We're using dots now */
  383. ! #define    LJRESOLUTION    300
  384.   
  385.   /*    Troff assumes 7.5" paper width, most macro packages print in
  386.       6.5" area within that.  Sooo, we'll center the paperwidth on the
  387. ***************
  388. *** 21,27 ****
  389.   /*    11" paper length */
  390.   #define    TROFF2LJY(y) (((long) (y)+pageyoffset)*LJRESOLUTION/TROFFRESOLUTION)
  391.   
  392. ! extern int ljProlog(), ljEpilog(), ljChar(), ljPage();
  393.   
  394.   extern struct troff2befont ljSymFont[], ljStdFont[];
  395.   
  396. --- 21,27 ----
  397.   /*    11" paper length */
  398.   #define    TROFF2LJY(y) (((long) (y)+pageyoffset)*LJRESOLUTION/TROFFRESOLUTION)
  399.   
  400. ! extern int ljProlog(), ljEpilog(), ljChar(), ljPage(), ljDraw();
  401.   
  402.   extern struct troff2befont ljSymFont[], ljStdFont[];
  403.   
  404. Index: ./utils.c
  405. *** /tmp/PATCHold/./utils.c    Thu Jan 23 14:50:46 1992
  406. --- ./utils.c    Thu Jan 23 14:50:48 1992
  407. ***************
  408. *** 12,18 ****
  409.   
  410.   #ifndef    lint
  411.   static char SCCSid[] =
  412. !     "@(#)utils.c: 2.22 Copyright 91/12/26 17:58:48 Chris Lewis";
  413.   #endif
  414.   
  415.   #ifndef    HEADERSIZE
  416. --- 12,18 ----
  417.   
  418.   #ifndef    lint
  419.   static char SCCSid[] =
  420. !     "@(#)utils.c: 2.23 Copyright 92/01/12 03:55:40 Chris Lewis";
  421.   #endif
  422.   
  423.   #ifndef    HEADERSIZE
  424. ***************
  425. *** 589,591 ****
  426. --- 589,604 ----
  427.       }
  428.       return(opcode);
  429.   }
  430. + #ifdef    INSPECIAL
  431. + require(need, have, cmd, string)
  432. + int need, have;
  433. + char *cmd, *string; {
  434. +     if (need != have) {
  435. +     fprintf(stderr, "%s: need %d argument%s to draw a %s (%s)\n",
  436. +         progname, need, need == 1? "": "s", cmd, string);
  437. +     return(1);
  438. +     } else
  439. +     return(0);
  440. + }
  441. + #endif
  442. Index: ./ps.c
  443. *** /tmp/PATCHold/./ps.c    Thu Jan 23 14:51:01 1992
  444. --- ./ps.c    Thu Jan 23 14:51:06 1992
  445. ***************
  446. *** 15,21 ****
  447.   
  448.   #ifndef    lint
  449.   static char SCCSid[] =
  450. !     "@(#)ps.c: 2.17 Copyright 91/11/22 03:56:10 Chris Lewis";
  451.   #endif
  452.   
  453.   /*    ps.c will generate some additional "print" commands to cause
  454. --- 15,21 ----
  455.   
  456.   #ifndef    lint
  457.   static char SCCSid[] =
  458. !     "@(#)ps.c: 2.18 Copyright 92/01/12 03:55:46 Chris Lewis";
  459.   #endif
  460.   
  461.   /*    ps.c will generate some additional "print" commands to cause
  462. ***************
  463. *** 463,468 ****
  464. --- 463,469 ----
  465.       emitnum(val);
  466.       putchar(' ');
  467.   }
  468.   emitnum(val)
  469.   register int val; {
  470.       register int neg;
  471. ***************
  472. *** 480,485 ****
  473. --- 481,487 ----
  474.       if (val)
  475.       printf(".%d", val);
  476.   }
  477.   putnl(s)
  478.   char *s; {
  479.       fputs(s, stdout);
  480. ***************
  481. *** 595,612 ****
  482.   }
  483.   
  484.   #ifdef    INSPECIAL
  485. - static
  486. - require(need, have, cmd, string)
  487. - int need, have;
  488. - char *cmd, *string; {
  489. -     if (need != have) {
  490. -     fprintf(stderr, "%s: need %d argument%s to draw a %s (%s)\n",
  491. -         progname, need, need == 1? "": "s", cmd, string);
  492. -     return(1);
  493. -     } else
  494. -     return(0);
  495. - }
  496.   
  497.   /*    Do ditroff drawing command in s from origX,origY.
  498.       If opcode 0 just moveto
  499. --- 597,602 ----
  500. Index: ./defs.h
  501. *** /tmp/PATCHold/./defs.h    Thu Jan 23 14:51:26 1992
  502. --- ./defs.h    Thu Jan 23 14:51:28 1992
  503. ***************
  504. *** 9,15 ****
  505.    */
  506.   
  507.   /*    Official Release and Patch level:    */
  508. ! #define    T2VERSION    "@(#)PSROFF Copyright 91/12/26 Chris Lewis - R3 PL7"
  509.   
  510.   /*    Configuration parameters:
  511.    */
  512. --- 9,15 ----
  513.    */
  514.   
  515.   /*    Official Release and Patch level:    */
  516. ! #define    T2VERSION    "@(#)PSROFF Copyright 92/01/23 Chris Lewis - R3 PL8"
  517.   
  518.   /*    Configuration parameters:
  519.    */
  520. ***************
  521. *** 26,32 ****
  522.               /* a bcopy in your library */
  523.   
  524.   #undef    REGSPILL    /* Define if your compiler gives "infinite register
  525. !                spill in utils/psxlate.c (Xenix III) */
  526.       
  527.   
  528.   /*    The name of a routine that can be called thusly:
  529. --- 26,32 ----
  530.               /* a bcopy in your library */
  531.   
  532.   #undef    REGSPILL    /* Define if your compiler gives "infinite register
  533. !                spill" in utils/psxlate.c (Xenix III) */
  534.       
  535.   
  536.   /*    The name of a routine that can be called thusly:
  537. ***************
  538. *** 45,63 ****
  539.   /* If you have the stand-alone pk2sfp distribution, do not touch
  540.      anything from here on */
  541.   
  542. ! /*    Font width file configuration:
  543.   
  544. !     - If HEADERSIZE defined, use that many bytes as a prefix to the
  545. !       compiled font width table.  HEADERSIZE 0 is the correct definition
  546. !       for Xenix and most System V [o]troffs.  HEADERSIZE=32 works for Ultrix
  547. !       (except RISC, see below).  HEADERSIZE=32 works properly for most Suns.
  548. !     - If neither are defined, use a BSD/V7 style a.out.h header, this
  549. !       is appropriate for V7 and BSD troffs
  550. !     - If you are running RISC/Ultrix (Mips box? from DEC) define
  551. !       ASCIIWIDTHS, and the rest of this stuff will be ignored - Mips
  552. !       apparently changed their width table format to an ASCII form,
  553. !       and DEC picked it up.  In this case IGNORE any messages about
  554. !       HEADERSIZE from "make check".
  555.   
  556.       The headers I write will have something in them if HEADERSIZE > 0
  557.       and there's a font file from your original troff distribution in
  558. --- 45,76 ----
  559.   /* If you have the stand-alone pk2sfp distribution, do not touch
  560.      anything from here on */
  561.   
  562. ! /*    Font width file configuration (applicable to CAT troff):
  563.   
  564. !     1) if the /usr/lib/font/ftR file in your original troff
  565. !        installation is 224 bytes long, set HEADERSIZE to 0.
  566. !        Most Xenix.
  567. !     2) If the size of /usr/lib/font/ftR is > 224, and your system
  568. !        uses a.out.h headers on executable binaries, HEADERSIZE
  569. !        should be the size of the a.out header.  Usually 32.
  570. !        (Ie: SunOS, VAX/Ultrix)
  571. !     3) If the size of /usr/lib/font/ftR is large (around 1K), chances
  572. !        are that your system uses COFF headers on font files.
  573. !        HEADERSIZE should be set to the offset of the data section
  574. !        within /usr/lib/font/ftR.  Which is a bit tricky to find out.
  575. !        However, Apollo DomainOS is the only system I know that has
  576. !        COFF headers.  SR10.3 needs HEADERSIZE set to 304.  Prior
  577. !        DomainOS versions (eg: SR10.2) appear to need 336.
  578. !     4) If you are DEC Risc/Ultrix (not VAX/Ultrix) define
  579. !        ASCIIWIDTHS.  HEADERSIZE is irrelevant.
  580. !     See the description of HEADERSIZE, and the "HEADERSIZE Calculations"
  581. !     section in the TROUBLE document if you have difficulty.  There is
  582. !     extensive instructions on how to determine this parameter.  This
  583. !     parameter is the most common cause of problems.
  584.   
  585.       The headers I write will have something in them if HEADERSIZE > 0
  586.       and there's a font file from your original troff distribution in
  587. ***************
  588. *** 110,115 ****
  589. --- 123,129 ----
  590.   /*    Basic drivers: */
  591.   #define    PS    /* Postscript */
  592.   #define    LJ    /* Laserjet - utils programs will not build with this undef'd */
  593. + #define    LJ3    /* Laserjet 3 - does LJ + HP-GL/2 for PIC */
  594.   #define    DT    /* ditroff */
  595.   #define    DIT    /* ditroff *front-end* */
  596.   
  597. ***************
  598. *** 176,181 ****
  599. --- 190,201 ----
  600.                  you have to do this, please contact me with the
  601.                  particulars of the problem and your configuration */
  602.   
  603. + #undef LJ3_7BIT        /* define to make repeated vector encoding (HP-GL/2
  604. +                PE command) use 7-bit encoding.  Define this only
  605. +                if driver will be used on a 7-bit serial path.
  606. +                This is rarely helpful, because font downloading
  607. +                needs a 8 bit path */
  608.   /*    Edit no more .... */
  609.   
  610.   #define    MAXDLFONTS (MDLF - PRELOAD)    /* # fonts troff2ps can download */
  611. ***************
  612. *** 401,406 ****
  613. --- 421,427 ----
  614.   #define    D_PK    0x20    /* PK font handling */
  615.   #define    D_VERB    0x40    /* very verbose */
  616.   #define    D_FLSH    0x80    /* flush after each fprintf */
  617. + #define D_PIC    0x100    /* show pic commands */
  618.   
  619.   extern int debug;
  620.   
  621. Index: ./INSTALL
  622. *** /tmp/PATCHold/./INSTALL    Thu Jan 23 14:51:39 1992
  623. --- ./INSTALL    Thu Jan 23 14:51:41 1992
  624. ***************
  625. *** 1,5 ****
  626.           Psroff 3.0 Installation Instructions
  627. !             2.16 91/08/29
  628.   
  629.   Please see the TROUBLE file if you have difficulties.
  630.   The README file does provide a bit more background on some
  631. --- 1,5 ----
  632.           Psroff 3.0 Installation Instructions
  633. !             2.17 92/01/12
  634.   
  635.   Please see the TROUBLE file if you have difficulties.
  636.   The README file does provide a bit more background on some
  637. ***************
  638. *** 56,61 ****
  639. --- 56,63 ----
  640.         will abort with "Error n" without any other diagnostic information.
  641.         (Tested on RISC/Ultrix 4.2)
  642.   
  643. +       On Apollo, set SHELL to /bin/ksh.
  644.       - If you're building for ditroff input only, ignore the discussions
  645.         on HEADERSIZE and trofftype.
  646.   
  647. ***************
  648. *** 87,102 ****
  649.         see if we can get DEC to put it in as a update]
  650.   
  651.         Apollos need the -F trofftype variant.  Their HEADERSIZE
  652. !       calculation is strange.  You should set HEADERSIZE
  653. !       to 0, and proceed with these instructions, but do NOT
  654. !       install psroff.  Once you've built psroff, consult
  655. !       the TROUBLE file on how to run "dumpft -gv", which
  656. !       will tell you what your HEADERSIZE should be, then you
  657. !       should rebuild, test and install.
  658. !       The dumpft -gv trick will actually work on most systems
  659. !       (except RISC/Ultrix), but it requires you to rebuild psroff
  660. !       twice...
  661.   
  662.       - NOTE: during installs as root, the makefiles attempt to be
  663.         careful about the modes of the files it creates.  HOWEVER,
  664. --- 89,98 ----
  665.         see if we can get DEC to put it in as a update]
  666.   
  667.         Apollos need the -F trofftype variant.  Their HEADERSIZE
  668. !       calculation is strange.  If you are SR10.3, set HEADERSIZE
  669. !       to 304.  On SR10.2 and earlier, set HEADERSIZE to 336.
  670. !       If this doesn't work out, consult the TROUBLE file
  671. !       on "HEADERSIZE calculations".
  672.   
  673.       - NOTE: during installs as root, the makefiles attempt to be
  674.         careful about the modes of the files it creates.  HOWEVER,
  675. ***************
  676. *** 146,157 ****
  677.         is copiously documented there.
  678.   
  679.       - edit defs.h and define either BSD or ATT.  A few other options will
  680. !       pertain to you.  Take special note of HEADERSIZE.  Take a look
  681. !       at /usr/lib/font/ftR.  Is it 224 bytes long?  If so, HEADERSIZE
  682. !       should be 0.  Otherwise you will probably have to set it to the
  683. !       size of your a.out.h structure.  VAX Ultrix and Sun appear to always
  684. !       be HEADERSIZE = 32.  See remark about RISC Ultrix above.  If you're
  685. !       Apollo, see remark above, plus info in TROUBLE file about Apollos.
  686.   
  687.         With Laserjet driving:
  688.   
  689. --- 142,148 ----
  690.         is copiously documented there.
  691.   
  692.       - edit defs.h and define either BSD or ATT.  A few other options will
  693. !       pertain to you.  Take special note of HEADERSIZE.
  694.   
  695.         With Laserjet driving:
  696.   
  697. ***************
  698. *** 303,308 ****
  699. --- 294,302 ----
  700.   
  701.         Once you've printed the test sheet, if there seems to be any problems,
  702.         consult the "TEST SHEET ANALYSIS" section of the TROUBLE files.
  703. +       You can also consult the "Last Ditch Defense" section in the
  704. +       TROUBLE file as part of your analysis of what went wrong.
  705.   
  706.       - If you're running Postscript and you want to use n-up printing
  707.         (see psxlate(1)), you should obtain the psnup distribution
  708. Index: ./TROUBLE
  709. *** /tmp/PATCHold/./TROUBLE    Thu Jan 23 14:51:55 1992
  710. --- ./TROUBLE    Thu Jan 23 14:51:58 1992
  711. ***************
  712. *** 1,4 ****
  713. !         Psroff 3.0 Trouble Shooting.... 2.16 91/11/13
  714.   
  715.   (psroff 1.0 users can use this to a certain extent.  This is relatively
  716.   unchanged from Psroff 2.0 except for the ditroff input capability)
  717. --- 1,4 ----
  718. !         Psroff 3.0 Trouble Shooting.... 2.17 92/01/12
  719.   
  720.   (psroff 1.0 users can use this to a certain extent.  This is relatively
  721.   unchanged from Psroff 2.0 except for the ditroff input capability)
  722. ***************
  723. *** 16,21 ****
  724. --- 16,22 ----
  725.   odd to warrant mention here: if your makes blow up without much
  726.   in the way of diagnostics, refer to the INSTALL file regarding
  727.   the setting of SHELL, MAKE and use of "s5make" instead of "make".
  728. + Apollo seems to like SHELL set to /bin/ksh.
  729.   
  730.   Unless specified, the remarks in this file pertain to CAT troff input,
  731.   not ditroff input.
  732. ***************
  733. *** 70,136 ****
  734.           M<string>
  735.         These are back-end directives and they're supposed to be
  736.         there during psroff debug - ignore them.
  737. -     - HEADERSIZE: most troff's need an a.out.h header on the front
  738. -       of the width table files.  HEADERSIZE (defs.h) allows you to
  739. -       specify an arbitrary number of bytes on the front of the table
  740. -       in the width file.  Check /usr/lib/font/ftR (should be part
  741. -       of your original troff installation).  Is ftR 224 bytes long?
  742. -       If so, HEADERSIZE should be zero.  If not (eg: Ultrix,
  743. -       BSD's, some older Xenix, V7), you will have to specify
  744. -       HEADERSIZE.  SunOS, VAX/Ultrix wants 32.  (should be the size
  745. -       of an a.out header structure - od -c may give you some hints).
  746. -       Another way to tell is to run "file" on /usr/lib/font/ftR.
  747. -       Does it say "data"?  Then it probably needs HEADERSIZE 0.
  748. -       If it says "ascii" something, you're probably RISC/Ultrix, and you
  749. -       need ASCIIWIDTHS set.  If it says "executable" or "object" of some
  750. -       kind, you will have to set HEADERSIZE.
  751. -       RISC/Ultrix uses an ASCII format width table.  You can
  752. -       tell this if the following command:
  753. -         echo ".fp 1 R" | troff -t > /dev/null
  754. -       says something about non-ascii /usr/lib/font/ftR.  If
  755. -       it does, define ASCIIWIDTHS.
  756. -       If you're still having problems, use the "dumpft" trick
  757. -       shown below for Apollos.
  758. -       HEADERSIZE can be left as 0 for use with ditroff input.
  759. -       (Eg: it only matters for CAT troff)
  760. - NOTE for PSROFF 1.0 users:
  761. -     psroff 1.0 does not have a psroff.lib file, so changes (eg:
  762. -     width option specifications) have to be made directly to
  763. -     the psroff.sh shell script.  Further, in the library, many of
  764. -     the files names are reversed - eg: lj.lib in release 2.0 is lib.lj
  765. -     in 1.0.
  766.   
  767.   Most initial problems are due to width table installation/specification -
  768.   this varies from system to system and is *very* confusing.  I'm sorry about
  769. ! that, but there's no other way.  As a simple guide: if the /usr/lib/font/ftR
  770. ! file in your original troff installation is not 224 bytes long, you *will*
  771. ! have to set HEADERSIZE to something other than 0.
  772.   
  773.   After successful installation/testing, most problems are due to troff
  774.   errors that you don't get to see.
  775.   
  776. - Two notes on HEADERSIZE/ASCIIWID/etc.:
  777. -     1) Some versions of troff will accept the -T option, but ignore
  778. -        it.  Eg: Apollo and SunOS.  If the widths don't seem right, try the -F
  779. -        option.  make check will usually tell you -F in this case.
  780. -     2) If /usr/lib/font/ftR is substantially larger than 224 bytes,
  781. -        ie, over 500 or 600, you probably have special headers.
  782. -        Eg: Apollos.  What you should do is type the following:
  783. -         cd utils
  784. -         ./dumpft -gv < /usr/lib/font/ftR | grep Guess
  785. -        Which will output a series of lines which contains both
  786. -        a HEADERSIZE guess, plus an error count.  The errorcount
  787. -        will have a minimum value, ideally zero.  Set
  788. -        the HEADERSIZE to the guess with the minimum error
  789. -        count and rebuild and retry everything.  I won't attempt
  790. -        to supply these numbers for each of these systems because
  791. -        the number changes from release to release in some systems.
  792.   Build/Execute gross failures:
  793.   
  794.   Shell scripts die horrible deaths:
  795. --- 71,219 ----
  796.           M<string>
  797.         These are back-end directives and they're supposed to be
  798.         there during psroff debug - ignore them.
  799.   
  800. +     - HEADERSIZE: Most versions of troff use a initialized C
  801. +       array of characters 224 bytes long that is compiled using
  802. +       the C compiler.  Troff reads this file, and skips the
  803. +       various header structures to get at the data section of the
  804. +       compiled binary.  Psroff doesn't go this route of compiling
  805. +       C programs to determine the format of the width tables it
  806. +       needs to construct - you have to determine the size
  807. +       of the various structures, and set HEADERSIZE to this
  808. +       value.
  809. +       Many vendors have fiddled with this, and it's sometimes quite
  810. +       difficult to tell what the correct HEADERSIZE value is.
  811. +       Worse, some vendor supplied versions of troff (Risc Ultrix,
  812. +       Apollo DomainOS SR10.3) cannot even read the width tables
  813. +       that are supplied with them.  Thus, analysing your existing
  814. +       width tables isn't always going to result in the correct
  815. +       answer.
  816. +       See HEADERSIZE Calculations below:
  817. + HEADERSIZE Calculations:
  818.   Most initial problems are due to width table installation/specification -
  819.   this varies from system to system and is *very* confusing.  I'm sorry about
  820. ! that, but there's no other way.  Symptoms are "floating exceptions"
  821. ! from troff, often wild, but sometimes moderately subtle bad character
  822. ! spacing, and sometimes mysterious silent aborts.
  823.   
  824. + Detailed guide:
  825. +     1) if the /usr/lib/font/ftR file in your original troff installation
  826. +        224 bytes, set HEADERSIZE to 0.
  827. +     2) If the size of /usr/lib/font/ftR is > 224, and your system
  828. +        uses a.out.h headers on executable binaries, HEADERSIZE
  829. +        should be the size of the a.out header.  Usually 32.
  830. +     3) If the size of /usr/lib/font/ftR is large (around 1K), chances
  831. +        are that your system uses COFF headers on font files.
  832. +        HEADERSIZE should be set to the offset of the data section
  833. +        within /usr/lib/font/ftR.  Which is a bit tricky to find out.
  834. +        However, Apollo DomainOS is the only system I know that has
  835. +        COFF headers.  SR10.3 needs HEADERSIZE set to 304.  Prior
  836. +        DomainOS versions (eg: SR10.2) appears to need 336.
  837. +        (The dumpft trick below will report 336 for both).
  838. +     4) If you are DEC Risc/Ultrix (not VAX/Ultrix) define
  839. +        ASCIIWIDTHS.  HEADERSIZE is irrelevant.
  840. +     5) You can usually find out the proper HEADERSIZE value by
  841. +        using the "dumpft trick".
  842. + Dumpft Trick:
  843. +     You can try to test for the correct HEADERSIZE by using the
  844. +     "dumpft trick":
  845. +     After building psroff (with any HEADERSIZE), type the following:
  846. +     cd utils
  847. +     ./dumpft -gv < /usr/lib/font/ftR | grep Guess
  848. +     Which will output a series of lines which contains both
  849. +     a HEADERSIZE guess, plus an error count.  The errorcount
  850. +     will have a minimum value, ideally zero.  Set
  851. +     the HEADERSIZE to the guess with the minimum error
  852. +     count and rebuild and retry everything.
  853. +     Note however, some versions of troff can't even read their
  854. +     own width tables (Apollo DomainOS SR10.3), which will
  855. +     throw the dumpft trick's guess off.  And this won't work
  856. +     with RISC/Ultrix either.
  857. + Last ditch defence:
  858. +     If you still have problems that seem to have something to do
  859. +     with width tables, here is a procedure that will both demonstrate
  860. +     to you that psroff *does* work, and give some additional analysis
  861. +     for your problems with constructing width tables.
  862. +     Create a file called "A" containing:
  863. +     .in |1i
  864. +     .sp |1i
  865. +     This is a test of the computer.
  866. +     Create a second file called "B" which is a copy of "A",
  867. +     except that ".fp 1 R" has been prepended before the ".in".
  868. +     Each of the tests below should result in the line of text
  869. +     appearing one inch down, and approximately 1.5" to the right
  870. +     of the left edge of the page.
  871. +     Test 1: Basic troff and troff2ps sanity test:
  872. +     troff -t A | troff2ps -T<lj|ps> | <your print spooler>
  873. +     Pass: troff and troff2ps basic operation okay.
  874. +     Fail: troff or troff2ps broken.  Nothing to do with
  875. +         width tables.
  876. +     
  877. +     This, by the way, is a functioning CAT troff to postscript
  878. +     or laserjet pipeline.  Effectively a thack replacement.
  879. +     However, the widths aren't correct (especially lj), and the
  880. +     results will be suboptimal.
  881. +     Test 2: Vendor-supplied width table test:
  882. +     troff -t B | troff2ps -T<lj|ps> | <your print spooler>
  883. +     Pass: Vendor-supplied width tables are okay.  Dumpft valid.
  884. +     Fail: Vendor-supplied width tables are wrong.  DomainOS SR10.3
  885. +         and RISC/Ultrix fail this test.
  886. +     Note: the output quality won't be any better than test 1.
  887. +     Test 3: Psroff width table test:
  888. +     troff -t <widthoption> B | troff2ps -T<lj|ps> | <spooler>
  889. +     Where <widthoption> is either -T<lj|ps>, or
  890. +     -F/usr/lib/font/<lj|ps>/ftXX.  (trofftype)
  891. +     Output should be perfect.
  892. +     Pass: Psroff supplied width tables work.  Your problems lie
  893. +         elsewhere.  Likely psrofflib or your print spooler.
  894. +     Fail: Psroff supplied width tables don't work.  HEADERSIZE
  895. +         or ASCIIWIDTHS need changing.
  896. + Width table related details:
  897. +     Some versions of troff will accept the -T option, but ignore it.
  898. +     Eg: Apollo and SunOS.  If the widths don't seem right, try the -F
  899. +     option.  make check will usually tell you -F in this case.
  900.   After successful installation/testing, most problems are due to troff
  901.   errors that you don't get to see.
  902.   
  903.   Build/Execute gross failures:
  904.   
  905.   Shell scripts die horrible deaths:
  906. ***************
  907. *** 222,228 ****
  908.       This is because you've not installed or properly configured more fonts
  909.       than came with psroff, and psroff can't find a font close enough
  910.       in size, and is letting the printer guess - and has selected a font
  911. !     that it had previously incrementally downloaded.
  912.   
  913.       Get more fonts and make sure that lj.fonts is up-to-date with
  914.       the font set you have.   LJIII and LASERFONTS discusses font
  915. --- 305,312 ----
  916.       This is because you've not installed or properly configured more fonts
  917.       than came with psroff, and psroff can't find a font close enough
  918.       in size, and is letting the printer guess - and has selected a font
  919. !     that it had previously incrementally downloaded but hasn't had a
  920. !     "6" downloaded yet.
  921.   
  922.       Get more fonts and make sure that lj.fonts is up-to-date with
  923.       the font set you have.   LJIII and LASERFONTS discusses font
  924. Index: ./Makefile
  925. *** /tmp/PATCHold/./Makefile    Thu Jan 23 14:52:18 1992
  926. --- ./Makefile    Thu Jan 23 14:52:20 1992
  927. ***************
  928. *** 7,13 ****
  929.   #    Function: Upper level makefile; configuration options.
  930.   #
  931.   #
  932. ! #ident  "@(#)Makefile: 2.28 Copyright 91/12/07 02:20:15 Chris Lewis"
  933.   
  934.   #    If you're not sure whether you have a System V make, leave
  935.   #    this alone, and run the make anyways.  If it dies horribly
  936. --- 7,13 ----
  937.   #    Function: Upper level makefile; configuration options.
  938.   #
  939.   #
  940. ! #ident  "@(#)Makefile: 2.30 Copyright 92/01/23 14:23:19 Chris Lewis"
  941.   
  942.   #    If you're not sure whether you have a System V make, leave
  943.   #    this alone, and run the make anyways.  If it dies horribly
  944. ***************
  945. *** 21,26 ****
  946. --- 21,27 ----
  947.   #    Only uncomment the following braindamage if your MAKE doesn't
  948.   #    understand "include".  These are very rare and indicate you don't
  949.   #    have a System V make - see the "Broken Makes" section in MISC.
  950. + #    This is necessary for Sony's.
  951.   #MAKE    = sed -e '/^include/r ../makeincl' -e '/include/d' Makefile | make -f -
  952.   
  953.   #    Set to where you want the user-interfaces to go.  /usr/lbin
  954. ***************
  955. *** 65,77 ****
  956.   
  957.   #    Set this to -lc_s if you have 386/ix style shared libraries and you
  958.   #    wish to use them.  Don't know about any other system's shared libraries.
  959. ! LIBFLAGS =
  960.   
  961.   #    Bourne shell.  *All* Bourne shells with the exception of extremely
  962. ! #    braindamaged ones (such as Ultrix or vanilla BSD) will work fine.
  963. ! #    Ultrix/Dynix may need the ... s5bin/sh one.  ksh and bash
  964. ! #    *should* work just fine, but I've never tested 'em.  /usr/bin/sh5
  965. ! #    should be used on Ultrix.
  966.   #
  967.   #    This is also here for make, but if you have SHELL defined in your
  968.   #    *own* environment, you can't trust this to work anyways.
  969. --- 66,78 ----
  970.   
  971.   #    Set this to -lc_s if you have 386/ix style shared libraries and you
  972.   #    wish to use them.  Don't know about any other system's shared libraries.
  973. ! #    Math library (usually -lm) needed for lj3draw.
  974. ! LIBFLAGS = -lm
  975.   
  976.   #    Bourne shell.  *All* Bourne shells with the exception of extremely
  977. ! #    braindamaged ones (such as Ultrix, vanilla BSD, Sony, Apollo) will
  978. ! #    work fine.  Ultrix: use /usr/bin/sh5.  Korn shell does work here
  979. ! #    (Apollos and Ultrix)
  980.   #
  981.   #    This is also here for make, but if you have SHELL defined in your
  982.   #    *own* environment, you can't trust this to work anyways.
  983. ***************
  984. *** 178,184 ****
  985.   
  986.   #    Drivers:
  987.   
  988. ! BACKENDS = lj.o pk.o pkc.o ps.o dt.o dit.o
  989.   
  990.   DEFINES    = '-DLIBDIR="$(LIBDIR)/lib"' '-DFONTDIR="$(FONTDIR)"'\
  991.       '-DLJF="$(LJF)"' $(CCFLAGS)
  992. --- 179,185 ----
  993.   
  994.   #    Drivers:
  995.   
  996. ! BACKENDS = lj.o pk.o pkc.o ljdraw.o lj3draw.o ps.o dt.o dit.o
  997.   
  998.   DEFINES    = '-DLIBDIR="$(LIBDIR)/lib"' '-DFONTDIR="$(FONTDIR)"'\
  999.       '-DLJF="$(LJF)"' $(CCFLAGS)
  1000. ***************
  1001. *** 188,193 ****
  1002. --- 189,195 ----
  1003.   SEDSCRIPT =    "sed -e 's;%%LIBDIR%%;$(LIBDIR);g' \
  1004.                -e 's;%%LJF%%;$(LJF);g' \
  1005.                -e 's;%%STARTSHELL%%;'\"$(STARTSHELL)\"';g' \
  1006. +              -e 's;%%SHELL%%;'\"$(SHELL)\"';g' \
  1007.                -e 's;%%COMPILE%%;$(COMPILE);g' \
  1008.                -e 's;%%FONTDIR%%;$(FONTDIR);g' \
  1009.                -e 's;%%MANDIR%%;$(MANDIR);g' \
  1010. ***************
  1011. *** 344,349 ****
  1012. --- 346,353 ----
  1013.   ps.o:    defs.h ps.h
  1014.   dt.o:    defs.h dt.h
  1015.   lj.o:    defs.h lj.h pkc.h pk.h
  1016. + ljdraw.o:    defs.h lj.h
  1017. + lj3draw.o:    defs.h lj.h
  1018.   
  1019.   pk.o:    defs.h pk.h pkc.h
  1020.   pkc.o:    defs.h pk.h pkc.h
  1021. Index: ./t2conf.c
  1022. *** /tmp/PATCHold/./t2conf.c    Thu Jan 23 14:52:31 1992
  1023. --- ./t2conf.c    Thu Jan 23 14:52:32 1992
  1024. ***************
  1025. *** 12,18 ****
  1026.   
  1027.   #ifndef    lint
  1028.   static char SCCSid[] =
  1029. !     "@(#)t2conf.c: 2.3 Copyright 91/02/20 09:06:48 Chris Lewis";
  1030.   #endif
  1031.   
  1032.   #ifdef    PS
  1033. --- 12,18 ----
  1034.   
  1035.   #ifndef    lint
  1036.   static char SCCSid[] =
  1037. !     "@(#)t2conf.c: 2.5 Copyright 92/01/23 14:23:44 Chris Lewis";
  1038.   #endif
  1039.   
  1040.   #ifdef    PS
  1041. ***************
  1042. *** 19,25 ****
  1043.   #include "ps.h"
  1044.   #endif
  1045.   
  1046. ! #ifdef    LJ
  1047.   #include "lj.h"
  1048.   #endif
  1049.   
  1050. --- 19,25 ----
  1051.   #include "ps.h"
  1052.   #endif
  1053.   
  1054. ! #if defined(LJ) || defined(LJ3)
  1055.   #include "lj.h"
  1056.   #endif
  1057.   
  1058. ***************
  1059. *** 57,63 ****
  1060.   
  1061.   #ifdef    LJ
  1062.       { "lj",    ljProlog,    ljEpilog,    ljChar,    ljPage,    FontSel,
  1063. !         NULL,        NULL,        NULL, NULL,
  1064.           ljStdFont,    ljSymFont },
  1065.   #endif
  1066.       { NULL }
  1067. --- 57,69 ----
  1068.   
  1069.   #ifdef    LJ
  1070.       { "lj",    ljProlog,    ljEpilog,    ljChar,    ljPage,    FontSel,
  1071. !         NULL,        NULL,        NULL, ljDraw,
  1072. !         ljStdFont,    ljSymFont },
  1073. ! #endif
  1074. ! #ifdef    LJ3
  1075. !     { "lj3",    ljProlog,    ljEpilog,    ljChar,    ljPage,    FontSel,
  1076. !         NULL,        NULL,        NULL, lj3Draw,
  1077.           ljStdFont,    ljSymFont },
  1078.   #endif
  1079.       { NULL }
  1080. Index: ./opt.c
  1081. *** /tmp/PATCHold/./opt.c    Thu Jan 23 14:52:39 1992
  1082. --- ./opt.c    Thu Jan 23 14:52:41 1992
  1083. ***************
  1084. *** 16,22 ****
  1085.   #ifdef    OPT
  1086.   #ifndef    lint
  1087.   static char SCCSid[] =
  1088. !     "@(#)opt.c: 2.7 Copyright 92/01/03 11:33:47 Chris Lewis";
  1089.   #endif
  1090.   
  1091.   struct insbuf {
  1092. --- 16,22 ----
  1093.   #ifdef    OPT
  1094.   #ifndef    lint
  1095.   static char SCCSid[] =
  1096. !     "@(#)opt.c: 2.8 Copyright 92/01/23 14:23:52 Chris Lewis";
  1097.   #endif
  1098.   
  1099.   struct insbuf {
  1100. ***************
  1101. *** 157,163 ****
  1102.           p = tabS[nc].ch_name;
  1103.           else
  1104.           p = tabN[nc].ch_name;
  1105. !         if (strlen(p) >= 2) {
  1106.           if (strcmp(p, "hy") == 0 ||
  1107.               strcmp(p, "mi") == 0 ||
  1108.               strcmp(p, "\\-") == 0)
  1109. --- 157,163 ----
  1110.           p = tabS[nc].ch_name;
  1111.           else
  1112.           p = tabN[nc].ch_name;
  1113. !         if ((int)strlen(p) >= 2) {
  1114.           if (strcmp(p, "hy") == 0 ||
  1115.               strcmp(p, "mi") == 0 ||
  1116.               strcmp(p, "\\-") == 0)
  1117. Index: ./lj.c
  1118. *** /tmp/PATCHold/./lj.c    Thu Jan 23 14:52:50 1992
  1119. --- ./lj.c    Thu Jan 23 14:52:52 1992
  1120. ***************
  1121. *** 32,38 ****
  1122.   
  1123.   #ifndef    lint
  1124.   static char SCCSid[] =
  1125. !     "@(#)lj.c: 2.7 Copyright 91/03/10 03:12:47 Chris Lewis";
  1126.   #endif
  1127.   
  1128.   struct troff2befont ljStdFont[108] = {
  1129. --- 32,38 ----
  1130.   
  1131.   #ifndef    lint
  1132.   static char SCCSid[] =
  1133. !     "@(#)lj.c: 2.8 Copyright 92/01/23 14:24:06 Chris Lewis";
  1134.   #endif
  1135.   
  1136.   struct troff2befont ljStdFont[108] = {
  1137. ***************
  1138. *** 319,325 ****
  1139.   putoct(s)
  1140.   char *s; {
  1141.       int d;
  1142. !     if (strlen(s) < 3) {
  1143.       fprintf(stderr, "%s: octal sequence in fonts.l[kj] bad\n", progname);
  1144.       exit(1);
  1145.       }
  1146. --- 319,325 ----
  1147.   putoct(s)
  1148.   char *s; {
  1149.       int d;
  1150. !     if ((int)strlen(s) < 3) {
  1151.       fprintf(stderr, "%s: octal sequence in fonts.l[kj] bad\n", progname);
  1152.       exit(1);
  1153.       }
  1154. ***************
  1155. *** 709,725 ****
  1156.       DBP((D_BEND,"AFTER (sequence,x,y,font,points) = (%s,%d,%d,%d,%d)\n",
  1157.       sequence, nx, ny, font, points));
  1158.   
  1159. - /*    Egads, I discovered that 42% of the time in troff2ps was spent
  1160. -     doing these damn conversions! */
  1161. - #define    XYS    "\033&a%dh%dV%s"
  1162. - #define    XS    "\033&a%dH%s"
  1163.       if (lastYPos != ny) {
  1164. !     printf(XYS, nx, ny, sequence);
  1165.       lastYPos = ny;
  1166.       } else
  1167. !     printf(XS, nx, sequence);
  1168.   }
  1169.   
  1170.   ljProlog() {
  1171. --- 709,721 ----
  1172.       DBP((D_BEND,"AFTER (sequence,x,y,font,points) = (%s,%d,%d,%d,%d)\n",
  1173.       sequence, nx, ny, font, points));
  1174.   
  1175.       if (lastYPos != ny) {
  1176. !     printf(XY, nx, ny);
  1177.       lastYPos = ny;
  1178.       } else
  1179. !     printf(X, nx);
  1180. !     
  1181. !     fputs(sequence, stdout);
  1182.   }
  1183.   
  1184.   ljProlog() {
  1185. ***************
  1186. *** 902,905 ****
  1187.       c = getc(library);
  1188.       }
  1189.   }
  1190. ! #endif
  1191. --- 898,902 ----
  1192.       c = getc(library);
  1193.       }
  1194.   }
  1195. ! #endif /* LJ */
  1196. Index: ./makeincl.S
  1197. *** /tmp/PATCHold/./makeincl.S    Thu Jan 23 14:53:07 1992
  1198. --- ./makeincl.S    Thu Jan 23 14:53:08 1992
  1199. ***************
  1200. *** 4,10 ****
  1201.   #    See the LICENSE file for a full description of the restrictions
  1202.   #    under which this software is provided.
  1203.   #
  1204. ! #    Makefile overrides 2.6 91/11/22
  1205.   CC    = %%CC%%
  1206.   CFLAGS    = %%CCFLAGS%% -I../
  1207.   FONTDIR = %%FONTDIR%%
  1208. --- 4,10 ----
  1209.   #    See the LICENSE file for a full description of the restrictions
  1210.   #    under which this software is provided.
  1211.   #
  1212. ! #    Makefile overrides 2.7 92/01/12
  1213.   CC    = %%CC%%
  1214.   CFLAGS    = %%CCFLAGS%% -I../
  1215.   FONTDIR = %%FONTDIR%%
  1216. ***************
  1217. *** 21,26 ****
  1218. --- 21,27 ----
  1219.   T2DIR = %%T2DIR%%
  1220.   MAKEDEV = %%MAKEDEV%%
  1221.   PERL = %%PERL%%
  1222. + SHELL = %%SHELL%%
  1223.   
  1224.   #    This override is because apparently a .s suffix on a file will
  1225.   #    cause make to not select a ".S:" rule when the target is .s
  1226. Index: ./ljdraw.c
  1227. *** /tmp/PATCHold/./ljdraw.c    Thu Jan 23 14:53:14 1992
  1228. --- ./ljdraw.c    Thu Jan 23 14:53:16 1992
  1229. ***************
  1230. *** 0 ****
  1231. --- 1,249 ----
  1232. + /*
  1233. +     Copyright 1992 Chris Lewis
  1234. +         All Rights Reserved
  1235. +     See the LICENSE file for a full description of restrictions under which
  1236. +     this software is provided.
  1237. +     Function:        LaserJet driver, drawing code.
  1238. +             Needs LJII or later (rules)
  1239. + */
  1240. + #include "defs.h"
  1241. + #if    defined(LJ) && defined(INSPECIAL)
  1242. + #include "lj.h"
  1243. + #ifndef    lint
  1244. + static char SCCSid[] =
  1245. +     "@(#)ljdraw.c: 1.1 Copyright 92/01/23 14:26:18 Chris Lewis";
  1246. + #endif
  1247. + static int ljLine();
  1248. + /*    Do ditroff drawing command in s from origX,origY.
  1249. +     If opcode 0 just moveto
  1250. +     This is hardly complete.  Consider it a skeleton
  1251. +     for further work.  Before extending it beyond
  1252. +     horizontal and vertical lines, I'm going to switch
  1253. +     the whole driver over to 300ths from 720ths.
  1254. +     Which should eliminate a little jitter, and removes
  1255. +     a lot of excess work in line drawing.
  1256. +  */
  1257. + ljDraw(origX, origY, opcode, ctindex, numbers, saves)
  1258. + int origX, origY;
  1259. + int opcode;
  1260. + char *saves;
  1261. + int ctindex;
  1262. + short *numbers; {
  1263. +     int i, fill = 0;
  1264. +     static float curfill = 0;
  1265. +     static int curthick = 1;
  1266. +     static int warned = 0;
  1267. +     /* map absolute beginning position. */
  1268. +     origX = TROFF2LJX(origX);
  1269. +     origY = TROFF2LJY(origY);
  1270. +     if (!opcode) {
  1271. +     printf(XY, origX, origY);
  1272. +     lastYPos = origY;
  1273. +     return;
  1274. +     }
  1275. +     if (opcode != 'l')
  1276. +     if (!warned) {
  1277. +         fprintf(stderr, "%s: only lines are currently supported\n", progname);
  1278. +         warned = 1;
  1279. +         return;
  1280. +     }
  1281. +     switch (opcode) {
  1282. +     case 'f':
  1283. +         if (ctindex == 2)
  1284. +         ctindex = 1;
  1285. +         if (!require(1, ctindex, "set fill", saves))
  1286. +         curfill = (double) numbers[0] / 1000;
  1287. +         return;
  1288. +     case 't':
  1289. +         if (ctindex == 2)
  1290. +         ctindex = 1;
  1291. +         if (!require(1, ctindex, "set thick", saves))
  1292. +         curthick = numbers[0];
  1293. +         return;
  1294. +     }
  1295. +     DBP((D_CAT, "ljDraw: (%d,%d): %s\n", origX, origY, saves));
  1296. +     switch (opcode) {
  1297. +     case 'C':
  1298. +         if (ctindex == 2)
  1299. +         ctindex = 1;
  1300. +     case 'E':
  1301. +     case 'P':
  1302. +         fill = 1;
  1303. +         if (opcode != 'P')
  1304. +         break;
  1305. +     case 'l':
  1306. +     case 'a':
  1307. +     case 'p':
  1308. +     case '~':
  1309. +         for (i = 0; i < ctindex; i++)
  1310. +         numbers[i] = numbers[i] * LJRESOLUTION / TROFFRESOLUTION;
  1311. +     }
  1312. +     switch(opcode) {
  1313. +     case 'l':
  1314. +         if (require(2, ctindex, "line", saves))
  1315. +         return;
  1316. +         DBP((D_CAT, "drawline: %d, %d\n", numbers[0], numbers[1]));
  1317. +         ljLine(origX, origY, origX + numbers[0], origY + numbers[1]);
  1318. +         break;
  1319. + #if    0
  1320. +     case 'a':
  1321. +         if (require(4, ctindex, "arc", saves))
  1322. +         return;
  1323. +         for (i = 0; i < 4; i++) {
  1324. +         emitnums(numbers[i]);
  1325. +         }
  1326. +         putnl("Arc");
  1327. +         break;
  1328. +     case 'C':
  1329. +     case 'c':
  1330. +         if (require(1, ctindex, "circle", saves))
  1331. +         return;
  1332. +         numbers[1] = numbers[0];
  1333. +         ctindex++;
  1334. +     case 'E':
  1335. +     case 'e':
  1336. +         if (require(2, ctindex, "ellipse", saves))
  1337. +         return;
  1338. +         DBP((D_CAT, "drawellipse: %d, %d\n", numbers[0], numbers[1]));
  1339. +         emitnums((int) numbers[0]);
  1340. +         emitnums((int) numbers[1]);
  1341. +         putnl("Ellipse");
  1342. +         break;
  1343. +     case 'P':
  1344. +     case 'p':
  1345. +         if (ctindex&1) {
  1346. +         fprintf(stderr, "%s: even number of points for polygon: %s\n",
  1347. +             progname, saves);
  1348. +         break;
  1349. +         }
  1350. +         for (i = 0; i < ctindex; i += 2) {
  1351. +         emitnums((int) numbers[i]);
  1352. +         emitnums((int) numbers[i+1]);
  1353. +         putnl("rlineto");
  1354. +         }
  1355. +         putnl(" closepath");
  1356. +         break;
  1357. +     case '~':
  1358. +         if (ctindex < 4) {
  1359. +         fprintf(stderr, "%s: too few points to spline: %s\n",
  1360. +             progname, saves);
  1361. +         break;
  1362. +         }
  1363. +         emitnums(numbers[0]/2);
  1364. +         emitnums(numbers[1]/2);
  1365. +         putnl("rlineto");
  1366. +         /* NUM/DEN should be between 0 and 1; the closer it is to 1
  1367. +         the tighter the curve will be to the guiding lines; 2/3
  1368. +         is the standard value */
  1369. + #define    NUM    2
  1370. + #define    DEN    3
  1371. +         for (i = 0; i < ctindex - 2; i += 2) {
  1372. +         emitnums((numbers[i]*NUM)/(2*DEN));
  1373. +         emitnums((numbers[i + 1]*NUM)/(2*DEN));
  1374. +         emitnums(numbers[i]/2 + (numbers[i + 2]*(DEN - NUM))/(2*DEN));
  1375. +         emitnums(numbers[i + 1]/2 + (numbers[i + 3]*(DEN - NUM))/(2*DEN));
  1376. +         emitnums((numbers[i] - numbers[i]/2) + numbers[i + 2]/2);
  1377. +         emitnums((numbers[i + 1] - numbers[i + 1]/2) + numbers[i + 3]/2);
  1378. +         putnl("rcurveto");
  1379. +         }
  1380. +         emitnums(numbers[ctindex - 2] - numbers[ctindex - 2]/2);
  1381. +         emitnums(numbers[ctindex - 1] - numbers[ctindex - 1]/2);
  1382. +         putnl("rlineto");
  1383. +         break;
  1384. + #endif
  1385. +     default:
  1386. +         fprintf(stderr, "%s: invalid draw code %c (%s)\n", progname, opcode,
  1387. +         saves);
  1388. +         break;
  1389. +     }
  1390. + }
  1391. + static
  1392. + linwid() {
  1393. +     register int a;
  1394. +     a = lastPoints / 4;
  1395. +     if (!a)
  1396. +     a = 1;
  1397. +     else if (a > 10)
  1398. +     a = 10;
  1399. +     return(a);
  1400. + }
  1401. +     
  1402. + static ljPos(x, y)
  1403. + register int x, y; {
  1404. +     printf(XY, x, y);
  1405. +     lastYPos = y;
  1406. + }
  1407. + static
  1408. + ljHLine(x0, y0, x1, y1)
  1409. + int x0, y0, x1, y1; {
  1410. +     static int warning = 0;
  1411. +     if (!warning) {
  1412. +     fprintf(stderr, "%s: contains non-vertical or horizontal lines.  Ignored\n",
  1413. +         progname);
  1414. +     warning = 1;
  1415. +     }
  1416. + }
  1417. + static
  1418. + ljVerLine(x0, y0, y1)
  1419. + register int x0, y0, y1; {
  1420. +     register int t;
  1421. +     if (y0 > y1) {
  1422. +     t = y0;
  1423. +     y0 = y1;
  1424. +     y1 = t;
  1425. +     }
  1426. +     t = linwid();
  1427. +     ljPos(x0, y0-t+1);
  1428. +     printf("\033*c%da%db0P", t, y1-y0+t);
  1429. + }
  1430. + static
  1431. + ljHorLine(x0, y0, x1)
  1432. + register int x0, y0, x1; {
  1433. +     register int t = linwid();
  1434. +     if (x0 > x1) {
  1435. +     t = x0;
  1436. +     x0 = x1;
  1437. +     x1 = t;
  1438. +     }
  1439. +     t = linwid();
  1440. +     ljPos(x0, y0-t+1);
  1441. +     printf("\033*c%da%db0P", x1-x0+t, t);
  1442. + }
  1443. + static
  1444. + ljLine(x0, y0, x1, y1)
  1445. + register int x0, y0, x1, y1; {
  1446. +     if (y0 == y1)
  1447. +     ljHorLine(x0, y0, x1);
  1448. +     else if (x0 == x1)
  1449. +     ljVerLine(x0, y0, y1);
  1450. +     else
  1451. +     ljHLine(x0, y0, x1, y1);
  1452. + }
  1453. + #endif
  1454. Index: ./debug.c
  1455. *** /tmp/PATCHold/./debug.c    Thu Jan 23 14:53:24 1992
  1456. --- ./debug.c    Thu Jan 23 14:53:25 1992
  1457. ***************
  1458. *** 11,17 ****
  1459.   
  1460.   #ifndef    lint
  1461.   static char SCCSid[] =
  1462. !     "@(#)debug.c: 2.6 Copyright 91/02/20 09:00:22 Chris Lewis";
  1463.   #endif
  1464.   
  1465.   #ifdef    DEBUG
  1466. --- 11,17 ----
  1467.   
  1468.   #ifndef    lint
  1469.   static char SCCSid[] =
  1470. !     "@(#)debug.c: 2.7 Copyright 92/01/23 14:24:37 Chris Lewis";
  1471.   #endif
  1472.   
  1473.   #ifdef    DEBUG
  1474. ***************
  1475. *** 30,35 ****
  1476. --- 30,36 ----
  1477.       {'b', D_BEND},
  1478.       {'p', D_PK},
  1479.       {'v', D_VERB},
  1480. +     {'P', D_PIC},
  1481.       {'A', ~0},
  1482.       {0, 0}
  1483.   };
  1484. Index: ./lj3draw.c
  1485. *** /tmp/PATCHold/./lj3draw.c    Thu Jan 23 14:53:30 1992
  1486. --- ./lj3draw.c    Thu Jan 23 14:53:33 1992
  1487. ***************
  1488. *** 0 ****
  1489. --- 1,282 ----
  1490. + /*
  1491. +     Copyright 1992 David E. Wexelblat
  1492. +     Inspiration for the struction of these functions taken from ps.c
  1493. +     Copyright tranferred to Chris Lewis on the condition that the
  1494. +     original author's name remain with this code upon any 
  1495. +     subsequent distribution.
  1496. +     Copyright 1992 Chris Lewis
  1497. +         All Rights Reserved
  1498. +     See the LICENSE file for a full description of restrictions under which
  1499. +     this software is provided.
  1500. +     Function:        Provides translation of Ditroff \D commands to
  1501. +             HP-GL/2 for HP Laserjet III series (PCL5) printers.
  1502. + */
  1503. + #include "defs.h"
  1504. + #ifdef LJ3
  1505. + #include "lj.h"
  1506. + #include <math.h>
  1507. + #ifndef    lint
  1508. + static char SCCSid[] =
  1509. +     "@(#)lj3draw.c: 1.1 Copyright 92/01/23 14:26:29 Chris Lewis";
  1510. + #endif
  1511. + #define to_deg(a)    ((180.0/M_PI) * (a))
  1512. + #define XSCALE         (int)(8.5 * LJRESOLUTION)
  1513. + #define YSCALE        (int)(11 * LJRESOLUTION)
  1514. + #define SPLINE_STEPS     20
  1515. + #define ENTER_HPGL2    fputs("\033%1B", stdout)
  1516. + #define EXIT_HPGL2    fputs("\033%0A", stdout)
  1517. + #ifdef LJ3_7BIT
  1518. + # define BASE        32
  1519. + # define END        95
  1520. + #else
  1521. + # define BASE        64
  1522. + # define END        191
  1523. + #endif
  1524. + typedef struct {
  1525. +     int x, y;
  1526. + } Pt;
  1527. + encode_coord(x)
  1528. + int x;
  1529. + {
  1530. +     int x1;
  1531. +     x1 = (x >= 0) ? x << 1 : ((-x) << 1) + 1;
  1532. +     while (x1 >= BASE) {
  1533. +     putchar(63 + (x1 % BASE));
  1534. +     x1 /= BASE;
  1535. +     }
  1536. +     putchar(END + x1);
  1537. + }
  1538. + /*    Do ditroff drawing command in s from origX,origY.
  1539. +     If opcode 0 just moveto
  1540. +  */
  1541. + lj3Draw(origX, origY, opcode, ctindex, numbers, s)
  1542. + int origX, origY;        /* Origin for draw command */
  1543. + int opcode;            /* Draw function */
  1544. + int ctindex;            /* Number of parameters */
  1545. + short *numbers;         /* Parameters */
  1546. + char *s;            /* Draw command */
  1547. + {
  1548. +     register int i, j;
  1549. +     double a1, a2;
  1550. +     int sweep;
  1551. +     int n, x1, y1, x0, y0;
  1552. +     double w, t1, t2, t3;
  1553. +     char *command;
  1554. +     Pt *p;
  1555. +     /* map absolute beginning position */
  1556. +     origX = TROFF2LJX(origX);
  1557. +     origY = TROFF2LJY(origY);
  1558. +     switch (opcode) {
  1559. +     case 'f':
  1560. +         if (ctindex == 2)
  1561. +         ctindex = 1;
  1562. +         if (!require(1, ctindex, "set fill", s)) {
  1563. +             DBP((D_PIC, "lj3Draw: fill: %d\n", numbers[0]));
  1564. +         if ((numbers[0] < 0) || (numbers[0] > 1000))
  1565. +             fprintf(stderr, "%s: fill %d out of range [0,1000]\n",
  1566. +             numbers[0]);
  1567. +         else {
  1568. +             ENTER_HPGL2;
  1569. +                 printf("FT10,%d;",(100-(numbers[0]/10)));
  1570. +             EXIT_HPGL2;
  1571. +         }
  1572. +         }
  1573. +         return;
  1574. +     case 't':
  1575. +         if (ctindex == 2)
  1576. +         ctindex = 1;
  1577. +         if (!require(1, ctindex, "set thick", s)) {
  1578. +             DBP((D_PIC, "lj3Draw: thich: %d\n", numbers[0]));
  1579. +         /* width 1 = 1mm, troff resolution = 432 dpi */
  1580. +         ENTER_HPGL2;
  1581. +             printf("\033%%1BLW%.2f;\033%%0A\n", numbers[0]/17.0);
  1582. +         EXIT_HPGL2;
  1583. +         }
  1584. +         return;
  1585. +     }
  1586. +     printf(XY,origX,origY);
  1587. +     if (!opcode)
  1588. +     return;
  1589. +     DBP((D_PIC, "lj3Draw: (%d,%d): %s\n", origX, origY, s));
  1590. +     switch (opcode) {
  1591. +     case 'c':
  1592. +         if (ctindex == 2)
  1593. +         ctindex = 1;
  1594. +         /* FALLTHRU */
  1595. +     case 'e':
  1596. +         command = "CI";
  1597. +         break;
  1598. +     case 'C':
  1599. +         /* FALLTHRU */
  1600. +         if (ctindex == 2)
  1601. +         ctindex = 1;
  1602. +     case 'E':
  1603. +         command = "WG";
  1604. +         break;
  1605. +     case 'p':
  1606. +         command = "EP";
  1607. +         break;
  1608. +     case 'P':
  1609. +         command = "FP";
  1610. +         break;
  1611. +     }
  1612. +     for (i = 0; i < ctindex; i++)
  1613. +     numbers[i] = numbers[i] * LJRESOLUTION / TROFFRESOLUTION;
  1614. +     switch (opcode) {
  1615. +     case 'l':
  1616. +         if (require(2, ctindex, "line", s))
  1617. +         break;
  1618. +         DBP((D_PIC, "lj3Draw: line: %d, %d\n", numbers[0], numbers[1]));
  1619. +         ENTER_HPGL2;
  1620. +         printf("PD;PR%d,%d;", numbers[0], numbers[1]);
  1621. +         EXIT_HPGL2;
  1622. +         break;
  1623. +     case 'a':
  1624. +         if (require(4, ctindex, "arc", s))
  1625. +         break;
  1626. +         DBP((D_PIC, "lj3Draw: arc: %d, %d, %d, %d\n",
  1627. +         numbers[0], numbers[1], numbers[2], numbers[3]));
  1628. +         a1 = atan2((double)(-numbers[0]), (double)(-numbers[1]));
  1629. +         a2 = atan2((double)(numbers[2]), (double)(numbers[3]));
  1630. +         sweep = to_deg(a2-a1);
  1631. +         if (sweep < 0)
  1632. +         sweep += 360;
  1633. +         sweep = -sweep;    /* HP-GL/2 wants it in the other direction */
  1634. +         DBP((D_PIC, "lj3Draw: arc a1=%f a2=%f sweep=%d\n", a1, a2, sweep));
  1635. +         ENTER_HPGL2;
  1636. +         printf("PD;AR%d,%d,%d;", numbers[0], numbers[1], sweep);
  1637. +         EXIT_HPGL2;
  1638. +         break;
  1639. +     case 'C':
  1640. +     case 'c':
  1641. +         if (require(1, ctindex, (opcode=='C')?"filled circle":"circle", s))
  1642. +         break;
  1643. +         DBP((D_PIC, "lj3Draw: %scircle: %d\n", 
  1644. +         (opcode == 'C' ? "filled " : ""), numbers[0]));
  1645. +         /* Use 'CI r;' for circle, 'WG r,0,360;' for filled circle */
  1646. +         ENTER_HPGL2;
  1647. +         printf("PU;PR%d,0;%s%d%s;", numbers[0]/2, command, numbers[0]/2,
  1648. +         (opcode == 'C' ? ",0,360" : ""));
  1649. +         EXIT_HPGL2;
  1650. +         break;
  1651. +     case 'e':
  1652. +     case 'E':
  1653. +         if (require(2,ctindex,(opcode=='E')?"filled ellipse":"ellipse",s))
  1654. +         break;
  1655. +         DBP((D_PIC, "lj3Draw: %sellipse: %d, %d\n", 
  1656. +         (opcode == 'E' ? "filled " : ""), numbers[0], numbers[1]));
  1657. +         /* Use 'CI r;' for ellipse, 'WG r,0,360;' for filled ellipse */
  1658. +         ENTER_HPGL2;
  1659. +         printf("PU;PR%d,0;SC0,%d,0,%d;", numbers[0]/2, 
  1660. +         (int)(XSCALE * ((float)numbers[1]/numbers[0])), YSCALE);
  1661. +         printf("%s%d%s;SC0,%d,0,%d", command, numbers[1]/2,
  1662. +         (opcode == 'E' ? ",0,360" : ""), XSCALE, YSCALE);
  1663. +         EXIT_HPGL2;
  1664. +         break;
  1665. +     case 'p':
  1666. +     case 'P':
  1667. +         if (ctindex&1) {
  1668. +         fprintf(stderr, 
  1669. +             "%s: even number of points for %spolygon: %s\n",
  1670. +             progname, (opcode == 'P' ? "filled " : ""), s);
  1671. +         break;
  1672. +         }
  1673. +         DBP((D_PIC, "lj3Draw: %spolygon:",
  1674. +         (opcode == 'P' ? "filled " : "")));
  1675. + #        ifdef DEBUG
  1676. +         for (i=0; i < ctindex; i++)
  1677. +         DBP((D_PIC, " %d", numbers[i]));
  1678. +         DBP((D_PIC, "\n"));
  1679. + #        endif /* DEBUG */
  1680. +         ENTER_HPGL2;
  1681. +         printf("PM0;PD;PR%d,%d",numbers[0],numbers[1]);
  1682. +         for (i = 2; i < ctindex; i+=2)
  1683. +         printf(",%d,%d",numbers[i],numbers[i+1]);
  1684. +         printf(";PM2;%s;", command);
  1685. +         EXIT_HPGL2;
  1686. +         break;
  1687. +     case '~':
  1688. +         if (ctindex < 4) {
  1689. +         fprintf(stderr, "%s: too few points for spline: %s\n",
  1690. +             progname, s);
  1691. +         break;
  1692. +         }
  1693. +         DBP((D_PIC, "lj3Draw: spline:"));
  1694. + #        ifdef DEBUG
  1695. +         for (i=0; i < ctindex; i++)
  1696. +         DBP((D_PIC, " %d", numbers[i]));
  1697. +         DBP((D_PIC, "\n"));
  1698. + #        endif /* DEBUG */
  1699. +         n = ctindex/2 + 3;
  1700. +         p = (Pt *)malloc(sizeof(Pt) * n);
  1701. +         p[1].x = origX;
  1702. +         p[1].y = origY;
  1703. +         for (i = 2; i < n-1; i++) {
  1704. +         p[i].x = numbers[(i-2)*2]+p[i-1].x;
  1705. +         p[i].y = numbers[(i-2)*2+1]+p[i-1].y;
  1706. +         }
  1707. +         p[0] = p[1];
  1708. +         p[n-1] = p[n-2];
  1709. +         for (i = 0; i < n; i++)
  1710. +         DBP((D_PIC, "Pt %d: <%d,%d>\n", i, p[i].x, p[i].y));
  1711. +         ENTER_HPGL2;
  1712. + #ifdef LJ3_7BIT
  1713. +         fputs("PD;PE7", stdout);
  1714. + #else
  1715. +         fputs("PD;PE", stdout);
  1716. + #endif
  1717. +         x0 = origX;
  1718. +         y0 = origY;
  1719. +         for (i = 0; i < n-2; i++) {
  1720. +         for (j = 0; j < SPLINE_STEPS; j++) {
  1721. +             w = (double)j / SPLINE_STEPS;
  1722. +             t1 = w * w / 2 ;
  1723. +             w = w - 0.5;
  1724. +             t2 = 0.75 - w * w;
  1725. +             w = w - 0.5;
  1726. +             t3 = w * w / 2;
  1727. +             x1 = t1*p[i+2].x + t2*p[i+1].x + t3*p[i].x + 0.5;
  1728. +             y1 = t1*p[i+2].y + t2*p[i+1].y + t3*p[i].y + 0.5;
  1729. +             encode_coord(x1-x0);
  1730. +             encode_coord(y1-y0);
  1731. +             x0 = x1;
  1732. +             y0 = y1;
  1733. +         }
  1734. +         }
  1735. +         putchar(';');
  1736. +         EXIT_HPGL2;
  1737. +         free(p);
  1738. +             break;
  1739. +     default:
  1740. +         fprintf(stderr, "%s: invalid draw code %c (%s)\n",
  1741. +         progname, opcode, s);
  1742. +         break;
  1743. +     }
  1744. + }
  1745. + #endif /* LJ3 */
  1746.