home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume12 / crc.pch next >
Text File  |  1987-10-08  |  31KB  |  1,476 lines

  1. Subject:  v12i003:  CRC Graphics Package Patch#1
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: rsk@j.cc.purdue.edu (Whitewater Wombat)
  7. Posting-number: Volume 12, Issue 3
  8. Archive-name: crc.pch
  9.  
  10. #    This is a shell archive.
  11. #    Remove everything above and including the cut line.
  12. #    Then run the rest of the file through sh.
  13. #----cut here-----cut here-----cut here-----cut here----#
  14. #!/bin/sh
  15. # shar:    Shell Archiver
  16. #    Run the following text with /bin/sh to create:
  17. #    README
  18. #    gd.c
  19. #    gp.c
  20. #    gplp.c
  21. #    hpd.c
  22. #    font-mods
  23. cat << \SHAR_EOF > README
  24. This patch contains two different items: first, the four drivers omitted
  25. from the original release.  This was a botch on my part--we don't use these
  26. drivers, and so when I packed up the sources to ship them out, I didn't
  27. include them.  The drivers are supposed to handle Printronix, Versatec,
  28. Grinnel, Comtal, and HP devices.
  29.  
  30. The second item, "font-mods", is some recent work done by Malcolm
  31. Slaney which allows the font used by this package to be kept in memory.
  32. It's not in "patch" format--I'm enclosing exactly what I received.
  33.  
  34. Finally, I have received some correspondence from various folks about
  35. this package...which I'm in the process of answering.  However, please
  36. note that I do NOT officially support this package, and so I can only
  37. put a little bit of time into this.
  38. -- 
  39. Rich Kulawiec, rsk@s.cc.purdue.edu, s.cc.purdue.edu!rsk
  40. SHAR_EOF
  41. cat << \SHAR_EOF > gd.c
  42. /*
  43.     gd - graphics driver for the Comtal and the Grinnel
  44.  
  45.     The CRC graphics package
  46.  
  47.     Carl Crawford
  48.     Purdue University
  49.     W. Lafayette, IN 47907
  50.  
  51.     September 1981
  52.  
  53.  
  54.     Cleaned up to support the new improved Grinnell
  55.     Malcolm Slaney
  56.     October 1983
  57. */
  58.  
  59. #include <stdio.h>
  60. #include <signal.h>
  61. #include <sys/types.h>
  62. #include <netinet/in.h>
  63.  
  64. #define L       (512 / sizeof(short))
  65. #define M       (16384 / L)
  66.  
  67. #define    COMTAL        0
  68. #define    GRINNELL    1
  69.  
  70. #define    IMAGE        0
  71. #define    OVERLAY        1
  72.  
  73. #define    Grinnell    "/dev/Gr/"
  74. #define    Comtal        "/dev/ct"
  75. #define    Overlay        "gov"
  76.  
  77. char    OutputDevice[BUFSIZ];
  78. char    buf[512],bb[512],*bf,*cf;
  79. unsigned short ibuf[L*M],kbuf[L*M];
  80. unsigned short *pp,*qq;
  81.  
  82. int    Device = COMTAL;            /* Comtal or Grinnell */
  83. int    Mode = OVERLAY;                /* Overlay or Image Plane */
  84. int    Number = 0;                /* Device Number */
  85.  
  86. int     blank;          /* 1=don't blank device */
  87.  
  88. FILE    *fdi, *fdo, *fd;/* file descriptors */
  89. FILE    *ifd, *popen();
  90. char    *ifn;           /* input file name */
  91. char    *pname;         /* program name */
  92. char    fill[256*8];    /* speed buffer for comtal image and grinnel */
  93. char    *cp,*po;    /* character pointers */
  94. int    net = 1;    /* 1 send output across network */
  95. char    host[10] = "arpa"; /* last resort host */
  96. int    ks;
  97. int    nleft, nread;
  98.  
  99. char    *table[] = {
  100.         "if",
  101.         0
  102.     };
  103.  
  104. main(argc,argv)
  105.     int     argc;
  106.     char    **argv;
  107. {
  108.     register i,j;
  109.     int k;
  110.     char    c;
  111.  
  112.     /* parse command line */
  113.  
  114.     pname = *argv;
  115.     while(argv++ , --argc){
  116.         if(argv[0][0] == '-')while(c = *++*argv)switch(c){
  117.  
  118.             case 'b':       /* blank */
  119.                 blank = 1;
  120.                 break;
  121.             case 'G':       /* Grinnell */
  122.                 Device = GRINNELL;;
  123.                 break;
  124.             case 'c':
  125.             case 'C':    /* Comtal */
  126.                 Device = COMTAL;
  127.                 break;
  128.             case 'i':
  129.                 Mode = IMAGE;
  130.                 break;
  131.             case 'o':
  132.                 Mode = OVERLAY;
  133.                 break;
  134.             case '0':    /* device 0 */
  135.             case '1':
  136.             case '2':
  137.             case '3':
  138.             case '4':
  139.                 Number = c;
  140.                 break;
  141.             case 'm':    /* override machine */
  142.                 strcpy(host,*argv+1);
  143.                 net = 1;
  144.                 goto noption;
  145.             default:
  146.                 fprintf(stderr,"bad flag: -%c\n",c);
  147.                 exit(1);
  148.             }
  149.         else
  150.             switch(comm(*argv)){
  151.  
  152.             case 1:
  153.                 ifn = *argv + 3;
  154.                 break;
  155.         }
  156. noption:
  157.     ;
  158.     }
  159.  
  160.     /* find out where to send output to */
  161.  
  162.     if((ifd = fopen((Device == COMTAL ? "/usr/lib/graphics/gd.site.Ct" :
  163.                         "/usr/lib/graphics/gd.site.Gr"),
  164.                         "r")) != NULL) {
  165.         fgets(host,10,ifd);
  166.         fclose(ifd);
  167.         host[strlen(host)-1] = 0;
  168.         if(strcmp(host,"local") == 0){
  169.             net = 0;
  170.         }else{
  171.             net = 1;
  172.         }
  173.     }
  174.  
  175.     if(ifn){
  176.         if((fd = fopen(ifn,"r")) == NULL)
  177.             err("can't open: ",ifn);
  178.     }else{
  179.         fd = stdin;
  180.     }
  181.  
  182.     /* send to remote machine if necessary */
  183.  
  184.     if(net){
  185.         short s;
  186.         sprintf(buf,"exec %s %s %s /usr/lib/graphics/gd -%s%s%c%s",
  187.             Device == GRINNELL ? "/usr/ucb/rsh" : "/usr/ecn/ns",
  188.             host,
  189.             Device == GRINNELL ? "" : "-S",
  190.             Device == GRINNELL ? "G" : "C",
  191.             Mode == IMAGE ? "i" : "o",
  192.             Number ? Number : '0',
  193.             blank ? "b" : "");
  194.             
  195.         if((fdo = popen(buf,"w")) == NULL){
  196.             fprintf(stderr,"can't execute pipe to '%s'\n",
  197.                 Device == GRINNELL ? "rsh" : "ns");
  198.             exit(1);
  199.         }
  200.         gdread(fileno(fd), ibuf, sizeof(short)*L*M);
  201.         s = 1;
  202.         if (Mode == OVERLAY && htons(s) != s
  203.             && strcmp(host, "dipl") == 0) {
  204.             unsigned short *sp;
  205.             int i;
  206.             for (i = L*M, sp = ibuf ; i > 0 ; i--, sp++)
  207.                 *sp = htons(*sp);
  208.         }
  209.         write(fileno(fdo), ibuf, sizeof(short)*L*M);
  210.         if(pclose(fdo)){
  211.             fprintf(stderr,"%s:/usr/lib/graphics/ngd died\n",host);
  212.             exit(1);
  213.         }
  214.         exit(0);
  215.     }
  216.  
  217.     /*  use local devices */
  218.  
  219.     /* find name of machine */
  220.     bzero(host, sizeof(host));
  221.     gethostname(host, sizeof(host)-1);
  222.  
  223.     sprintf(OutputDevice,"%s%s%c",
  224.         Device == GRINNELL ? Grinnell : Comtal,
  225.         Mode == OVERLAY ? Overlay : "",
  226.         Number ? Number : '0');
  227.  
  228.     if (Mode == OVERLAY){
  229.         if(blank)if((fdi = fopen(OutputDevice,"r")) == NULL){
  230.             fprintf(stderr,"can't open: %s:%s\n",host,OutputDevice);
  231.             exit(1);
  232.         }
  233.         if((fdo = fopen(OutputDevice,"w")) == NULL){
  234.             fprintf(stderr,"can't open: %s:%s\n",host,OutputDevice);
  235.             exit(1);
  236.         }
  237.         gdread(fileno(fd), ibuf, sizeof(short)*M*L);
  238.         if (blank) {
  239.             gdread(fileno(fdi), kbuf, sizeof(short)*M*L);
  240.             for(j = 0, pp = ibuf, qq = kbuf ; j < M * L ; j++)
  241.                 *pp++ |= *qq++;
  242.         }
  243.         write(fileno(fdo), ibuf, sizeof(ibuf));
  244.     }
  245.     else {
  246.         if(Device == COMTAL && !Number){
  247.             if((fdi = fopen("/dev/ct/tc","r")) == NULL){
  248.                 fprintf(stderr,"can't open: %s!/dev/ct/tc\n",
  249.                     host);
  250.                 exit(1);
  251.             }
  252.             fread(buf,sizeof(char),512,fdi);
  253.             fclose(fdi);
  254.             Number = ((buf[4]>>1)&3)+'0';
  255.             sprintf(OutputDevice,"%s%s%c",
  256.                 Device == GRINNELL ? Grinnell : Comtal,
  257.                 Mode == OVERLAY ? Overlay : "",
  258.                 Number ? Number : '0');
  259.         }
  260.         if(blank)if((fdi = fopen(OutputDevice,"r")) == NULL){
  261.             fprintf(stderr,"can't open: %s!%s\n",host,OutputDevice);
  262.             exit(1);
  263.         }
  264.         if((fdo = fopen(OutputDevice,"w")) == NULL){
  265.             fprintf(stderr,"can't open: %s!%s\n",host,OutputDevice);
  266.             exit(1);
  267.         }
  268.         for(i=0,cp=fill;i<256;i++){
  269.             if(i & 0200) *cp++ = 255; else *cp++ = 0;
  270.             if(i & 0100) *cp++ = 255; else *cp++ = 0;
  271.             if(i & 0040) *cp++ = 255; else *cp++ = 0;
  272.             if(i & 0020) *cp++ = 255; else *cp++ = 0;
  273.             if(i & 0010) *cp++ = 255; else *cp++ = 0;
  274.             if(i & 0004) *cp++ = 255; else *cp++ = 0;
  275.             if(i & 0002) *cp++ = 255; else *cp++ = 0;
  276.             if(i & 0001) *cp++ = 255; else *cp++ = 0;
  277.         }
  278.         for(k = 0 ; k < 512 ; k++){
  279.             bf = buf;
  280.             if(fread(ibuf,sizeof(short),32,fd) != 32)
  281.                 err("unexpected EOF","");
  282.             for( j = 0,cp = (char *)ibuf ; j < 32 ; j++){
  283.                 po = fill + ((0377 &(int)*(cp+1)) << 3);
  284.                 *bf++ = *po++;
  285.                 *bf++ = *po++;
  286.                 *bf++ = *po++;
  287.                 *bf++ = *po++;
  288.                 *bf++ = *po++;
  289.                 *bf++ = *po++;
  290.                 *bf++ = *po++;
  291.                 *bf++ = *po++;
  292.                 po = fill + ((0377 &(int)*cp) << 3);
  293.                 *bf++ = *po++;
  294.                 *bf++ = *po++;
  295.                 *bf++ = *po++;
  296.                 *bf++ = *po++;
  297.                 *bf++ = *po++;
  298.                 *bf++ = *po++;
  299.                 *bf++ = *po++;
  300.                 *bf++ = *po++;
  301.                 cp += 2;
  302.             }
  303.             if(blank){
  304.                 fread(bb,sizeof(char),512,fdi);
  305.                 for(j=0,bf=buf,cf=bb;j<512;j++)*bf++ |= *cf++;
  306.             }
  307.             fwrite(buf,sizeof(char),512,fdo);
  308.         }
  309.         if(blank)
  310.             fclose(fdi);
  311.         fclose(fdo);
  312.     }
  313. }
  314.  
  315. comm(s)
  316.     char    *s;
  317. {
  318.     register    int    i,j,r;
  319.  
  320.     for(i=0;table[i];i++){
  321.         for(j=0;(r=table[i][j]) == s[j] && r;j++);
  322.         if(r == 0 && s[j] == '=' && s[j+1] )return(i+1);
  323.     }
  324.     fprintf(stderr,"bad option: %s\n",s);
  325.     exit(1);
  326. }
  327.  
  328. err(s1,s2)
  329.     char    *s1,*s2;
  330. {
  331.     fprintf(stderr,"%s: %s%s\n",pname,s1,s2);
  332.     exit(1);
  333. }
  334.  
  335. gdread(fd, buf, nleft)
  336. int fd;
  337. char *buf;
  338. int nleft;
  339. {
  340.     int nread;
  341.     for ( ; nleft > 0 ; ) {
  342.         nread = read(fd, buf, nleft);
  343.         if (nread <= 0) 
  344.             err("unexpected EOF","");
  345.         buf += nread;
  346.         nleft -= nread;
  347.     }
  348. }
  349. SHAR_EOF
  350. cat << \SHAR_EOF > gp.c
  351. /*
  352.     gp - print bit planes on the Versatec
  353.  
  354.     The CRC graphics package
  355.  
  356.     Carl Crawford 
  357.     Purdue University
  358.     West Lafayette, IN 47901
  359.  
  360.     October 1981
  361.  
  362. */
  363.  
  364. #include    <stdio.h>
  365.  
  366. #define L    32
  367. #define M    512
  368.  
  369. FILE    *ofd,*ifd[20],*popen();
  370. FILE    *fd;        /* for getting site name */
  371. short buf[L],ibuf[L],obuf[132];
  372. int nf;            /* number of inout files */
  373. int    form[3] = {3,0,020}; /* stty stuff for some Versatecs */
  374. int     silent;         /* 1=don't print output message */
  375. char    host[10] = "a";    /* last resort site */
  376. int    outlen;        /* size of versatec line */
  377. int    net = 1;    /* 1=go across network */
  378. int     full;           /* 1= 4:1 0= 2:1 */
  379. char gov[] = "/dev/ct/gov0";
  380. char    cbuf[100];    /* character buffer for site determination */
  381. int    dumb;        /* 1=dumb Versatec */
  382.  
  383. main(argc, argv)
  384.     int     argc;
  385.     char    **argv;
  386. {
  387.     char    c;
  388.     short   map(),map2();
  389.     int     i;
  390.     register        j;
  391.     register short  *p,*q;
  392.  
  393.     if(argc == 1)synerr();
  394.  
  395. /* the file /u/lib/graphics/gp.site contains information about which
  396. versatec to use. it two fields: "host # ". the host is the network
  397. machine where graphics will be sent to. the # is the length of the
  398. line. 100 for normal versatecs and 132 for the old one at APPA. if
  399. host is 'local' then the versatec connected directly to the machine
  400. will be used. care should be used so that loops do not occur by
  401. sending output back and forth between machines. */
  402.  
  403.     if((fd = fopen("/usr/lib/graphics/gp.site","r")) != NULL){
  404.         fgets(host,10,fd);
  405.         for(i=0;i<10;i++){
  406.             if(host[i] == ' ' || host[i] == '\n'){
  407.                 host[i] = 0;
  408.                 break;
  409.             }
  410.         }
  411.         outlen = atoi(host + i + 1);
  412.         if(outlen == 132 ) dumb = 1;
  413.         fclose(fd);
  414.         if(strcmp(host,"local") == 0){
  415.             net = 0;
  416.         }else{
  417.             net = 1;
  418.         }
  419.     }
  420.  
  421.     while(argv++ , --argc){
  422.         if(**argv == '-')while(c = *++*argv)switch(c){
  423.  
  424.         case 'h':       /* 2:1 scaling */
  425.             full = 0;
  426.             break;
  427.         case 'f':       /* 4:1 scaling */
  428.             full = 1;
  429.             break;
  430.         case 'i':       /* standard input */
  431.             ifd[nf++] = stdin;
  432.             break;
  433.         case 's':       /* silent mode */
  434.             silent = 1;
  435.             break;
  436.         case 'm':    /* set up machine */
  437.             strcpy(host,*argv+1);
  438.             net = 1;
  439.             goto nloop;
  440.         default:
  441.             fprintf(stderr,"bad flag: -%c\n",c);
  442.             exit(1);
  443.         }else{
  444.             if(dumb){
  445.                 if(**argv >= '0' && **argv <= '2' && !*(*argv + 1)){
  446.                     gov[11] = **argv;
  447.                     ifd[nf++] = fopen(gov,"r");
  448.                     *argv = gov;
  449.                 }else{
  450.                 ifd[nf++] = fopen(*argv,"r");
  451.                 }
  452.             }else{
  453.                 ifd[nf++] = fopen(*argv,"r");
  454.             }
  455.             if(ifd[nf-1] == NULL){
  456.                 fprintf(stderr,"can't open: %s\n",*argv);
  457.                 exit(1);
  458.             }
  459.         }
  460. nloop:
  461.     ;
  462.     }
  463.  
  464.     if(!nf)synerr();
  465.     if(!dumb)full = 0;
  466.  
  467.     if(net){
  468.         sprintf(cbuf,"exec ns  %s -S  gp -i",host);
  469.         if(silent)strcat(cbuf," -s");
  470.         if(full)strcat(cbuf,"-f");
  471.         silent = 1;
  472.         if((ofd = popen(cbuf,"w")) == NULL){
  473.             fprintf(stderr,"can't execute pipe to '%s'\n",host);
  474.             exit(1);
  475.         }
  476.  
  477.  
  478.     }else{
  479.         if((fd=fopen("/etc/cpu","r")) != NULL){
  480.             fgets(host,10,fd);
  481.             host[strlen(host)-1] = 0;
  482.             fclose(fd);
  483.         }
  484.         if( (ofd = fopen("/dev/vc","w")) == NULL){
  485.             fprintf(stderr,"Versatec in use on '%s'\n",host);
  486.             exit(1);
  487.         }
  488.     }
  489.     if(!net && !dumb)stty(fileno(ofd),form);
  490.  
  491.     for(i=0;i<M;i++){
  492.         input();
  493.         if(net){
  494.             fwrite(ibuf,sizeof(short),L,ofd);
  495.         }else{
  496.             p = ibuf;
  497.             q = obuf + 20;
  498.             if(full)q -= 18;
  499.             for(j=0;j<L;j++){
  500.                 if(full){
  501.                     *q++ = map(12, *p);
  502.                     *q++ = map(8, *p);
  503.                     *q++ = map(4, *p);
  504.                     *q++ = map(0, *p++);
  505.                 }else{
  506.                     *q = map2(8, *p) << 8;
  507.                     *q++ |= map2(12, *p);
  508.                     *q = map2(0, *p) << 8;
  509.                     *q++ |= map2(4, *p++);
  510.                 }
  511.             }
  512.             for(j=0;j<(2<<full);j++){
  513.                 fwrite(obuf,sizeof(short),outlen,ofd);
  514.             }
  515.         }
  516.     }
  517.  
  518.     if(!net){
  519.         if(!dumb){
  520.             stty(fileno(ofd),form);
  521.         }else{
  522.             for(i=0;i<outlen;obuf[i++] = 0);
  523.             for(i=0;i<1500;i++)fwrite(obuf,sizeof(short),outlen,ofd);
  524.         }
  525.     }else{
  526.         pclose(ofd);
  527.     }
  528.     if(!silent)fprintf(stderr,"output at '%s'\n",host);
  529. }
  530.  
  531. #define K0    0000000
  532. #define K4    0000017
  533. #define K8    0000360
  534. #define K1    0007400
  535. #define K2    0170000
  536.  
  537. short tab[] = {
  538.     (K0),
  539.     (K1),
  540.     (K2),
  541.     (K1|K2),
  542.     (K4),
  543.     (K4|K1),
  544.     (K4|K2),
  545.     (K4|K2|K1),
  546.     (K8|K0),
  547.     (K8|K1),
  548.     (K8|K2),
  549.     (K8|K1|K2),
  550.     (K8|K4),
  551.     (K8|K4|K1),
  552.     (K8|K4|K2),
  553.     (K8|K4|K2|K1)
  554. };
  555.  
  556. short   map(n,d)
  557.     int     n;
  558.     short   d;
  559. {
  560.     return( tab[ (d>>n)&017 ] );
  561. }
  562.  
  563. #undef K0
  564. #undef K1
  565. #undef K2
  566. #undef K4
  567. #undef K8
  568. #define K0    0000000
  569. #define K1    0000003
  570. #define K2    0000014
  571. #define K4    0000060
  572. #define K8    0000300
  573.  
  574. short tab2[] = {
  575.     (K0),
  576.     (K1),
  577.     (K2),
  578.     (K1|K2),
  579.     (K4),
  580.     (K4|K1),
  581.     (K4|K2),
  582.     (K4|K2|K1),
  583.     (K8|K0),
  584.     (K8|K1),
  585.     (K8|K2),
  586.     (K8|K1|K2),
  587.     (K8|K4),
  588.     (K8|K4|K1),
  589.     (K8|K4|K2),
  590.     (K8|K4|K2|K1)
  591. };
  592.  
  593. short   map2(n,d)
  594.     int     n;
  595.     short   d;
  596. {
  597.     return( tab2[ (d>>n)&017 ] );
  598. }
  599.  
  600.  
  601. input()
  602. {
  603.     register int i, j;
  604.  
  605.     fread(ibuf,sizeof(short),L,ifd[0]);
  606.     i = 1;
  607.     while(i < nf){
  608.         fread(buf,sizeof(short),L,ifd[i++]);
  609.         for(j=0; j<L; j++)
  610.             ibuf[j] |= buf[j];
  611.     }
  612. }
  613.  
  614. synerr()
  615. {
  616.     fprintf(stderr,"syntax: gp [-ifhsm] file1 file2 ... filen\n");
  617.     exit(1);
  618. }
  619. SHAR_EOF
  620. cat << \SHAR_EOF > gplp.c
  621. #include    <stdio.h>
  622.  
  623. /*
  624.     gplp - print bit planes on a Printronix line-printer
  625.  
  626.     syntax: gplp [-XX] [-i] file1 file2 ... filen
  627.  
  628.     The CRC graphics package
  629.  
  630.     carl crawford
  631.     purdue university
  632.     w. lafayette, in 47907
  633.  
  634.     july 1979
  635.  
  636.  
  637.     *****************************************************************
  638.  
  639.     Modified by Tony Andrews : July, 1982
  640.  
  641.     Added "-s" option to compensate for different vertical and 
  642.     horizontal pixed densities on the printronix. Define "NSQ" to
  643.     delete the changes making the code identical to the original.
  644.  
  645.     The compensation is a simple compression so characters will be
  646.     distorted somewhat.
  647.  
  648.     To avoid a major overhaul of the argument processing, the "-s"
  649.     must come after the "-i" (if present) and before any file names.
  650.  
  651. */
  652.  
  653. #define L       32
  654. #define M       512
  655.  
  656. FILE    *ofd;            /* output file descriptor */
  657. FILE    *fd;            /* input file descriptor */
  658. char    PLOT    =    005;
  659. char    ENDLINE =    012;
  660. int     nfile;
  661. char    swtab[64];
  662. char    site[10] = "-ep";    /* last resort line-printer */
  663.  
  664. #ifndef NSQ
  665. int     sflag   =   0;
  666. short   mask[16];
  667.  
  668. #define MASK(x)  (((short)0x0001) << (15-x))
  669. #endif
  670.  
  671. main(argc,argv)
  672.     int    argc;
  673.     char    **argv;
  674. {
  675.     FILE    *ifd[20];
  676.     short ibuf[33],buf[33];
  677.     char    obuf[100],*ob;
  678.     register int     i,j,k;
  679.     char    swap();
  680.     FILE    *popen();
  681.  
  682.     ibuf[32] = 0;    /* clear last byte in vector */
  683. #ifndef NSQ
  684.     for(i=0;i<16;i++)               /* used to speed up masking later */
  685.         mask[i] = MASK(i);
  686. #endif
  687.     if((fd = fopen("/usr/lib/graphics/gplp.site","r")) != NULL){
  688.         fgets(site,10,fd);
  689.         fclose(fd);
  690.         site[strlen(site) - 1] = 0;
  691.     }
  692.  
  693.     if(argv[1][0] == '-' && argv[1][1] && argv[1][2] && !argv[1][3]){
  694.         if(argv[1][1] != 'p' || argv[1][2] != 'l'){
  695.             site[1] = argv[1][1];
  696.             site[2] = argv[1][2];
  697.             site[3] = 0;
  698.         }
  699.         argc--;
  700.         argv++;
  701.     }
  702.     if(argv[1][0] == '-' && argv[1][1] && argv[1][2] && argv[1][3] && !argv[1][4]){
  703.         if(argv[1][1] != 'p' || argv[1][2] != 'l'){
  704.             site[1] = argv[1][1];
  705.             site[2] = argv[1][2];
  706.             site[3] = argv[1][3];
  707.             site[4] = 0;
  708.         }
  709.         argc--;
  710.         argv++;
  711.     }
  712.  
  713.     if(argv[1][0] == '-' && argv[1][1] == 'i' && argv[1][2] == '\0'){
  714.         ifd[nfile++] = stdin;
  715.         argv++;
  716.         argc--;
  717.     }
  718. #ifndef NSQ
  719.     if(argv[1][0] == '-' && argv[1][1] == 's' && argv[1][2] == '\0'){
  720.         sflag++;
  721.         argv++;
  722.         argc--;
  723.     }
  724. #endif
  725.     if(argc == 1 && !nfile)synerr();
  726.     while(--argc){
  727.         if((ifd[nfile++] = fopen(argv[1],"r")) == NULL){
  728.             fprintf(stderr,"gplp: can't open: %s\n",argv[1]);
  729.             exit(1);
  730.         }
  731.         ++argv;
  732.     }
  733.     if (site[0] == '-')
  734.         strcpy(&site[0],&site[1]);
  735.  
  736.     sprintf(obuf,"exec lpr -l -P%s", site);
  737.     if((ofd = popen(obuf,"w")) == NULL){
  738.         fprintf(stderr,"gplp: can't pipe to lpr\n");
  739.         exit(1);
  740.     }
  741.  
  742.     for(i=0;i<64;i++)swtab[i] = swap((char) i);
  743.     for(j=0;j<M;j++){
  744.         if(fread(ibuf,sizeof(short),L,ifd[0]) != L){
  745.             fprintf(stderr,"gplp: unexpected EOF\n");
  746.             exit(1);
  747.         }
  748.         i = 0;
  749.         while(++i < nfile){
  750.             if(fread(buf,sizeof(short),L,ifd[i]) != L){
  751.                 fprintf(stderr,"gplp: unexpected EOF\n");
  752.                 exit(1);
  753.             }
  754.             for(k=0;k<L;k++)ibuf[k] |= buf[k];
  755.         }
  756. #ifndef NSQ
  757.         if(sflag) adjust(ibuf);
  758. #endif
  759.         ob = obuf;
  760.         *ob++ = PLOT;
  761.         for(i=0;i<L;i += 3){
  762.             *ob++ = swtab[(ibuf[i] >> 10) & 077];
  763.             *ob++ = swtab[(ibuf[i] >>4) & 077];
  764.             *ob++ = swtab[((ibuf[i+1] >> 14) & 03) | ((ibuf[i] << 2) & 074)];
  765.             *ob++ = swtab[(ibuf[i+1] >> 8) & 077];
  766.             *ob++ = swtab[(ibuf[i+1] >> 2) & 077];
  767.             *ob++ = swtab[((ibuf[i+2] >> 12) & 017) | ((ibuf[i+1] << 4) & 060)];
  768.             *ob++ = swtab[(ibuf[i+2] >> 6) & 077];
  769.             *ob++ = swtab[ibuf[i+2] & 077];
  770.         }
  771.         while(*(--ob) == 0100);
  772.         *(++ob) = ENDLINE;
  773.         fwrite(obuf,1,ob - obuf + 1,ofd);
  774.     }
  775.     fputc('\f',ofd);         /* eject page */
  776.     pclose(ofd);
  777.     wait(0);
  778. }
  779. char    swap(cc)
  780.     char    cc;
  781. {
  782.     register        int     i;
  783.     register char tmp;
  784.  
  785.     tmp = 0;
  786.     for(i=0;i<6;i++){
  787.         cc <<= 1;
  788.         tmp |= (cc & 0100);
  789.         tmp >>= 1;
  790.     }
  791.     return(tmp | 0100);
  792. }
  793. synerr()
  794. {
  795.     fprintf(stderr,"syntax: gplp [-XX] [-i] file1 file2 ... filen\n");
  796.     exit(1);
  797. }
  798. #ifndef NSQ
  799. adjust(buf)
  800. short *buf;
  801. {
  802.     register int i;
  803.     short tbuf[33];
  804.  
  805.     for(i=0; i<L ;i++)              /* clear output buffer */
  806.         tbuf[i] = 0;
  807.  
  808.     for(i=0; i<M ;i++)
  809.         if(biton(buf,i))
  810.             setbit(tbuf,(int) ( (60.0/72.0) * (float) i));
  811.  
  812.     for(i=0; i<L ;i++)              /* move adjusted buffer back    */
  813.         buf[i] = tbuf[i];       /* into the original            */
  814. }
  815. biton(b,n)
  816. short *b;
  817. int n;
  818. {
  819.     register int index,offset;
  820.  
  821.     index = n >> 4;
  822.     offset= n & 0x000f;
  823.     return(b[index] & mask[offset]);
  824. }
  825. setbit(b,n)
  826. short *b;
  827. int n;
  828. {
  829.     register int index,offset;
  830.  
  831.     index = n >> 4;
  832.     offset= n & 0x000f;
  833.     b[index] |= mask[offset];
  834. }
  835. #endif
  836. SHAR_EOF
  837. cat << \SHAR_EOF > hpd.c
  838. #define OLDHP
  839. /*
  840.     hpd - HP daemon program
  841.  
  842.     The CRC graphics package
  843.  
  844.     Carl Crawford
  845.     Purdue University
  846.     W. Lafayette, IN 47907
  847.  
  848.     March 1980
  849. */
  850.  
  851. #include <stdio.h>
  852. #include <signal.h>
  853.  
  854.  
  855. #ifdef    vax
  856. #include    <sys/file.h>
  857. #endif    vax
  858.  
  859. #define    ETX    3    /* <etx> */
  860. #define    ESC    27    /* <esc> */
  861.  
  862. #ifndef OLDHP
  863. #include <sgtty.h>
  864. struct sgttyb Tty,tty;
  865. char pbuf[BUFSIZ];
  866. #endif
  867.  
  868. int     flag,tickle;
  869. char    ansbuff[32];    /* return from HP */
  870. int     fd,fdi;        /* HP file descriptors */
  871. char    buf[512];    /* input buffer */
  872. char    name[100];    /* path to device */
  873. int    c;        /* input character */
  874. FILE    *ifd;        /* input to program */
  875. int    net = 1;    /* 1=send output across network */
  876. char    host[10] = "a";    /* last resort plotter site */
  877.  
  878. main(argc,argv)
  879.     int     argc;
  880.     char    **argv;
  881. {
  882.     register i,j;
  883.     char *p;
  884.     int    clean(),timeout();
  885.  
  886. #ifdef OLDHP
  887.     /* find out default host for plotter */
  888.  
  889.     if((ifd = fopen("/usr/lib/graphics/hpd.site","r")) != NULL){
  890.         fgets(host,10,ifd);
  891.         fclose(ifd);
  892.         host[strlen(host)-1] = 0;
  893.         if(strcmp(host,"local") == 0){
  894.             net = 0;
  895.         }else{
  896.             net = 1;
  897.         }
  898.     }
  899.  
  900.     /* see if -mHOST is on the command line */
  901.  
  902.     if(argc >= 2){
  903.         if(argv[1][0] == '-' && argv[1][1] == 'm' && argv[1][2]){
  904.             strcpy(host,argv[1]+2);
  905.             net = 1;
  906.             argc--;
  907.             argv++;
  908.         }
  909.     }
  910.  
  911.     /* see if path to plotter is specified */
  912.  
  913.     if(argc == 2){
  914.         strcpy(name,argv[1]);
  915.     }else{
  916.         strcpy(name,"/dev/plt0");
  917.     }
  918.  
  919.     /* pipe to another machine if necessary */
  920.  
  921.     if(net){
  922.         execl("/bin/ns","ns",host,"-S","/usr/lib/graphics/hpd",name,0);
  923.         execl("/usr/bin/ns","ns",host,"-S","/usr/lib/graphics/hpd",name,0);
  924.         execl("/usr/ecn/ns","ns",host,"-S","/usr/lib/graphics/hpd",name,0);
  925.         fprintf(stderr,"hpd: can't exec ns\n");
  926.         exit(1);
  927.     }
  928.  
  929.     /* drive plotter local to this machine */
  930.  
  931.     /* find out name of machine */
  932.  
  933.     if((ifd=fopen("/etc/cpu","r")) != NULL){
  934.         fgets(host,10,ifd);
  935.         host[strlen(host)-1] = 0;
  936.         fclose(ifd);
  937.     }
  938.  
  939.     /* open plotter for input and output */
  940.  
  941.     fdi = open(name,0);
  942.     if(fdi == -1)noplot();
  943.     fd = open(name,1);
  944.     if(fd == -1)noplot();
  945.  
  946. #ifdef    vax
  947.     flock(fdi,LOCK_EX);
  948. #endif    vax
  949. #endif OLDHP
  950.  
  951. #ifndef OLDHP
  952.     setbuf(stdout,pbuf);
  953.     fdi = fd = 1;
  954.     gtty(fd,&Tty);
  955.     tty = Tty;
  956.     tty.sg_flags &= ~ECHO;
  957.     stty(fd,&tty);
  958. #endif
  959.     /* catch interrupts and reset plotter */
  960.  
  961.     if (signal(SIGHUP,SIG_IGN) != SIG_IGN)
  962.         signal(SIGHUP,clean);
  963.     if (signal(SIGINT,SIG_IGN) != SIG_IGN)
  964.         signal(SIGINT,clean);
  965.     if (signal(SIGQUIT,SIG_IGN) != SIG_IGN)
  966.         signal(SIGQUIT,clean);
  967.  
  968.     i = 0;
  969.     while(1){
  970.         if((c = getchar()) != EOF)buf[i++] = c;
  971.         if(i == 512 || c == EOF || c == '}'){
  972.  
  973.             if (write(fd,buf,i) < 0) {
  974.                 perror("hpd: write failed");
  975.                 exit(69);
  976.             }
  977.  
  978.             flag = 1;
  979.             alarm(180);    /* have driver time out */
  980.             signal(SIGALRM,timeout);
  981.             /* wait for buffer to empty out */
  982.  
  983.             while(flag){
  984.                 tickle = '\05';
  985.  
  986.                 if (write(fd,&tickle,1) < 0) {
  987.                     perror("hpd: write failed"); 
  988.                     exit(69);
  989.                 }
  990.  
  991.                 if ((i = read(fdi,ansbuff,30)) < 0) {
  992.                     perror("hpd: read failed");
  993.                     exit(69);
  994.                 }
  995.  
  996.                 p = ansbuff;
  997.                 for(j = 0;j < i;j++)if(*p++ == 'G')flag = 0;
  998. #ifdef OLDHP
  999.                 if(c == EOF && !flag)exit(1);
  1000. #else
  1001.                 if(c == EOF && !flag)clean();
  1002. #endif
  1003.             }
  1004.                 
  1005.             alarm(0);
  1006.             i = 0;
  1007.         }
  1008.     }
  1009. }
  1010.  
  1011. noplot()
  1012. {
  1013.     fprintf(stderr,"Can't open HP plotter on %s!%s\n",host,name);
  1014.     exit(1);
  1015. }
  1016.  
  1017. clean()
  1018. {
  1019.     int i = 0;
  1020.  
  1021.     /* reset plotter and put the pen back */
  1022.  
  1023. #ifdef OLDHP
  1024.     buf[i++] = ESC;
  1025.     buf[i++] = '.';
  1026.     buf[i++] = 'K';
  1027. #endif
  1028.     buf[i++] = ETX;
  1029.     buf[i++] = '}';
  1030.     buf[i++] = 'v';
  1031.     buf[i++] = 0100;
  1032. #ifndef OLDHP
  1033.     buf[i++] = ESC;
  1034.     buf[i++] = '.';
  1035.     buf[i++] = ')';
  1036. #endif
  1037.     write(fd,buf,i);
  1038.  
  1039. #ifndef OLDHP
  1040.     stty(fd,&Tty);
  1041. #endif
  1042.  
  1043.     exit(1);
  1044. }
  1045.  
  1046. timeout()
  1047. {
  1048.     fprintf(stderr,"Time out HP running on %s!%s\n",host,name);
  1049.     clean();
  1050. }
  1051. SHAR_EOF
  1052. cat << \SHAR_EOF > font-mods
  1053. The following changes, WHICH I HAVE NOT TESTED, are designed to all
  1054. the font that qplot/plot3d uses to be kept in memory, rather than on
  1055. disk.  The original package kept the font on disk, because it was
  1056. designed to run on a PDP-11...but most machines around today shouldn't
  1057. have a problem keeping the font in memory, and should enjoy a performance
  1058. increase as a result.  I will be installing and testing these changes
  1059. shortly (I hope) so I'll be able to judge for myself. :-)
  1060.  
  1061. These changes were done by Malcolm Slaney, who comments:
  1062.  
  1063. OK....I think only two files have changed.  They are charfont/genfont.c
  1064. and lib/symbol.c.  They are appended to this letter.  When these changes
  1065. are installed you can get rid of the font.5x7 that must be kept in a well
  1066. known place.   Oh, yes, there is a change to the charfont/Makefile.
  1067.  
  1068. ----------------------------  charfont/genfont.c ---------------------
  1069. /*
  1070.     genfont - generate character font files
  1071.  
  1072.     The CRC graphics package
  1073.  
  1074.     Carl Crawford 
  1075.     Purdue University
  1076.     W. Lafayette, IN 47907
  1077.  
  1078.     October 1981
  1079. */
  1080.  
  1081. /*
  1082.      The file generated by 'genfont' used to have the following format:
  1083.  
  1084. short  height     Default character height.
  1085. short  size       Bytes of core required to hold coordinates.
  1086. short  pnt[256]   Indexes to 1st coordinate of each symbol.
  1087. short  crd[size]  Coordinates of symbols
  1088.  
  1089. Where each crd[i] has the following format:
  1090.  
  1091.   EVSXXXXXXSYYYYYY   (a 'short' is assumed to be 16 bits)
  1092.   III     IIIIIIII
  1093.   III     I   I----- Y coordinate (sign magnitude format)
  1094.   IIIIIIIII
  1095.   II   I----- X coordinate (sign magnitude format)
  1096.   II----- Line segment visible flag (0=invisible, 1=visible)
  1097.   I----- 1=more coordinates; 0=last coordinate
  1098.  
  1099. The new output of this program is a file that can be included directly
  1100. into a C program.  Back in the days of PDP 11's it was important to
  1101. keep the program small.  Now it is better to reduce the amount of IO
  1102. needed and to make maintance easier by removing the character description
  1103. file.........................................Malcolm.... May 1987.
  1104.  
  1105.   The file used as input to 'genfont' as the following format:
  1106.  
  1107.   \n/x0,y0,v0/x1,y1,v2/.../xm,ym,vm<cr>
  1108.   .
  1109.   .
  1110.   .
  1111.  
  1112.   where:
  1113.       'n' is the character in octal.
  1114.       xi, i=1,2,..m is the x coordinate of the i'th segment
  1115.       yi, i=1,2,..m is the x coordinate of the i'th segment
  1116.       vi, i=1,2,..m is the visible indicator of the i'th segment
  1117.         v = 0 => invisible
  1118.           = 1 => visible
  1119.  
  1120. */
  1121.  
  1122. #include <stdio.h>
  1123.  
  1124. FILE    *ifd;            /* input file descriptor */
  1125. char    InputBuffer[512];    /* input character buffer */
  1126. short    OutputBuffer[512];    /* output buffer for packed coords. */
  1127. int    OutputBufferPointer;    /* Current position in output buffer */
  1128. int    FilePosition;        /* position within file */
  1129. int    XPosition;        /* x position */
  1130. int    YPosition;        /* y position */
  1131. int    VisibFlag;        /* visib flag */
  1132. short    PackedChar;        /* formed coordinate */
  1133. int    CharIndex;        /* character number */
  1134. struct{            /* header structure */
  1135.     short  height;
  1136.     short  coordsz;
  1137.     short  pntrlst[256];
  1138. }fontcom;
  1139.  
  1140. main(argc, argv)
  1141.     int  argc;
  1142.     char  **argv;
  1143. {
  1144.     int    i;
  1145.  
  1146.     if(argc != 2)
  1147.         synerr();
  1148.     if((ifd = fopen(argv[1],"r"))==NULL)
  1149.         err("can't open: ",argv[1]);
  1150.  
  1151.     for (i=0; i<256; i++)
  1152.         fontcom.pntrlst[i] = -1;
  1153.  
  1154.     /* get height of font */
  1155.  
  1156.     if(gread())
  1157.         err("can't read height","");
  1158.     fontcom.height = atoi(InputBuffer);
  1159.  
  1160.     printf("short pntcoord[] = {\n");
  1161.     /* loop through all the entries */
  1162.     OutputBufferPointer = 0;
  1163.     while(!gread()){
  1164.         if (*InputBuffer == '\\') {
  1165.             WriteCharacter(CharIndex);
  1166.  
  1167.             CharIndex = atoi(InputBuffer+1);
  1168.             CharIndex = (CharIndex/100*64) + 
  1169.                     (((CharIndex/10)%10)*8) + 
  1170.                     CharIndex%10;
  1171.             if (CharIndex<0 || CharIndex>255)
  1172.                 err("invalid character number ",InputBuffer+1);
  1173.             fontcom.pntrlst[CharIndex] = FilePosition;
  1174.         }else{
  1175.             XPosition = atoi(InputBuffer);
  1176.             if(gread())err("incomplete coordinate specified","");
  1177.             YPosition = atoi(InputBuffer);
  1178.             if(gread())err("incomplete coordinate specified","");
  1179.             VisibFlag = atoi(InputBuffer)&&01;
  1180.             PackedChar = (VisibFlag<<14) | 
  1181.                     ((abs(XPosition)%128)<<7) | 
  1182.                     (abs(YPosition)%128);
  1183.             if(XPosition < 0)
  1184.                 PackedChar |= 0020000;
  1185.             if(YPosition < 0)
  1186.                 PackedChar |= 0100;
  1187.             OutputBuffer[OutputBufferPointer++] = PackedChar;
  1188.             FilePosition++;
  1189.         }
  1190.     }
  1191.  
  1192.     /* clean up last character */
  1193.     WriteCharacter(CharIndex);
  1194.  
  1195.     /* write header */
  1196.  
  1197.     printf("};\n");
  1198.     printf("struct {\n");
  1199.     printf("    short    height;\n");
  1200.     printf("    short    pntrlst[257];\n");
  1201.     printf("} fontcom = { %d,", fontcom.height);
  1202.     for (i=0;i<256;i++){
  1203.         if (i%8 == 0)
  1204.             printf("\n    ");
  1205.         printf("%d, ",fontcom.pntrlst[i]);
  1206.     }
  1207.     printf("0};\n");
  1208.     exit(0);
  1209. }
  1210.  
  1211. WriteCharacter(Index)
  1212. int    Index;
  1213. {
  1214.     int    i;
  1215.     if (OutputBufferPointer){
  1216.         printf("/* %c(0%03o) */\n",CharIndex, CharIndex);
  1217.  
  1218.         OutputBuffer[OutputBufferPointer-1] |= 0100000;
  1219.         for (i=0;i<OutputBufferPointer;i++)
  1220.             printf("%d,",OutputBuffer[i]);
  1221.  
  1222.         printf("\n");
  1223.         OutputBufferPointer = 0;
  1224.     }
  1225. }
  1226.  
  1227. gread()
  1228. {
  1229.     char    *c;
  1230.  
  1231.     c = InputBuffer;
  1232.     while((*c = fgetc(ifd)) != EOF){
  1233.         if(*c == ',' || *c == '/' || *c == '\n')return(0);
  1234.         c++;
  1235.     }
  1236.     return(1);
  1237. }
  1238.  
  1239. err(s1,s2)
  1240.     char    *s1,*s2;
  1241. {
  1242.     fputs(s1,stderr);
  1243.     fputs(s2,stderr);
  1244.     fputc('\n',stderr);
  1245.     exit(1);
  1246. }
  1247.  
  1248. synerr(){
  1249.     err("syntax: genfont <output file> <input file>","");
  1250. }
  1251.  
  1252. ---------------------------  lib/symbol.c ---------------------
  1253. /*
  1254.     symbol - plot strings
  1255.  
  1256.     The CRC graphics package
  1257.  
  1258.     Carl Crawford
  1259.     Purdue University
  1260.     W. Lafayette, IN 47907
  1261.  
  1262. */
  1263.  
  1264. #include    "crc.h"
  1265.  
  1266. symbol(x,y,height,str,angle)
  1267.     float x,y,angle;
  1268.     float height;
  1269.     char *str;
  1270. {
  1271.     int f,vis;
  1272.     int charfont();
  1273.     float xx,yy,t1,t2,ca,sa,d2r;
  1274.     static    float    oangle,oheight;
  1275.     static    int    first    = 1;    /* ==1 if first call    */
  1276.     int    dollar;
  1277.     char    cc;
  1278.  
  1279.     if(DEV == TEK && DEVN == 2 && index(str,'$') == 0) {
  1280.         register    int    i;
  1281.         plot(x,y,3);
  1282.         if(oangle != angle || first) {
  1283.         plotp(ESC);    /* Graphic text rotation    */
  1284.         plotp('M');
  1285.         plotp('R');
  1286.         tint((int) angle); tint(0);
  1287.         oangle = angle;
  1288.         }
  1289.         if(oheight != height || first) {
  1290.         plotp(ESC);    /* Graphic test size        */
  1291.         plotp('M');
  1292.         plotp('C');
  1293.         tint((int)(190*height));
  1294.         tint((int)(265*height));
  1295.         tint((int)( 75*height));
  1296.         oheight = height;
  1297.         }
  1298.         first = 0;
  1299.         plotp(ESC);    /* Output graphic string    */
  1300.         plotp('L');
  1301.         plotp('T');
  1302.         tint(strlen(str));
  1303.         for(i=0; str[i]; i++)
  1304.         plotp(str[i]);
  1305.         return;
  1306.         }
  1307.  
  1308.     d2r = 4.0 * atan(1.0) / 180.0;
  1309.     dollar = 0;
  1310.     angle *= d2r;
  1311.     sa = sin(angle);
  1312.     ca = cos(angle);
  1313.     plot(x,y,3);
  1314.  
  1315.     while(cc = *str){
  1316.         if(cc == '$' && dollar == 0){
  1317.             dollar = 1;
  1318.             str++;
  1319.         }
  1320.         else{
  1321.             if(dollar == 1){
  1322.                 dollar = 0;
  1323.                 cc += 0200;
  1324.             }
  1325.  
  1326. /*                /* kludge bad font defintition for '.' */
  1327. /*            if(cc == '.' && DEV <= MBIT)
  1328. /*                cc = ',';
  1329.  */
  1330.             do{
  1331.                 f = charfont(cc,height,&xx,&yy,&vis);
  1332.                 t1 = ca * xx - sa * yy;
  1333.                 t2 = sa * xx + ca *yy;
  1334.                 plot(t1+x,t2+y,3-vis);
  1335.             }
  1336.             while(f);
  1337.             x += t1;
  1338.             y += t2;
  1339.             str++;
  1340.         }
  1341.     }
  1342. }
  1343.  
  1344. /*   Charfont is a program that looks up the end points  of  line
  1345. segments  for  plotting  characters.   Each  time  'charfont'  is
  1346. called, it returns the relative coordinates, which when added  to
  1347. the  current  location yields the final end point for a line seg-
  1348. ment.  The initial point of the line segment is the current loca-
  1349. tion.   Whether the line segment is to be visible or not is indi-
  1350. cated by the returned value in "visflg". */
  1351.  
  1352. #include    "font.5x7.h"
  1353.  
  1354. charfont(symbol,height,x,y,visflg)
  1355.     char  symbol;
  1356.     float  height, *x, *y;
  1357.     int  *visflg;
  1358. {
  1359.     int  i;
  1360.     static short *pntr;
  1361.     static float  scale;
  1362.     register int  temp;
  1363.  
  1364.     /* find coordinate of first point */
  1365.  
  1366.     if (pntr == 0) {
  1367.         if ( (i=fontcom.pntrlst[symbol&0377]) == -1) {
  1368.  
  1369.             /* assume space if can't find it */
  1370.  
  1371.             if ( (i=fontcom.pntrlst[' ']) == -1) {
  1372.  
  1373.                 /* set if no space */
  1374.  
  1375.                 *x = 0.0;
  1376.                 *y = 0.0;
  1377.                 *visflg = 0;
  1378.                 return(0);
  1379.             }
  1380.         }
  1381.         pntr = pntcoord+i;
  1382.         scale = height/fontcom.height;
  1383.     }
  1384.     temp = *pntr++;
  1385.     
  1386.     /* get X coordiante */
  1387.  
  1388.     *x = ((temp>>7)&077)*scale;
  1389.     if (temp&0020000)*x = (-(*x));
  1390.  
  1391.     /* get Y coordinate */
  1392.  
  1393.     *y = (temp&077)*scale;
  1394.     if (temp&0100)*y = (-(*y));
  1395.  
  1396.     /* get visib flag */
  1397.  
  1398.     *visflg = (temp&040000)>>14;
  1399.  
  1400.     /* check for last coordinate */
  1401.  
  1402.     if (temp < 0) {
  1403.         pntr = 0;
  1404.         return(0);
  1405.     }
  1406.     return(1);
  1407. }
  1408.  
  1409. /*  The font file used by 'fontinit' to read  in  the  data  for
  1410.     'charfont' has the following format:
  1411.  
  1412. short  height     Default character height.
  1413. short  pnt[256]   Indexes to 1st coordinate of each symbol.
  1414. short  crd[size]  Coordinates of symbols
  1415.  
  1416. Where each crd[i] has the following format:
  1417.  
  1418.   EVSXXXXXXSYYYYYY
  1419.   III     IIIIIIII
  1420.   III     I   I----- Y coordinate (sign magnitude format)
  1421.   IIIIIIIII
  1422.   II   I----- X coordinate (sign magnitude format)
  1423.   II----- Line segment visible flag (0=invisible, 1=visible)
  1424.   I----- 1=more coordinates; 0=last coordinate
  1425.  
  1426. */
  1427.  
  1428.  
  1429. tint(i)
  1430.     int i;
  1431. {
  1432.     int negative,lo,hi1,hi2;
  1433.     negative = 1;
  1434.     if(i < 0){
  1435.         i = -i;
  1436.         negative = 0;
  1437.         }
  1438.     lo = (i % 16) + 32;
  1439.     if(negative)lo += 16;
  1440.     i /= 16;
  1441.     hi1 = (i % 64) + 64;
  1442.     i /= 64;
  1443.     hi2 = (i % 64) + 64;
  1444.     if(hi2 == 64){
  1445.         if(hi1 == 64){
  1446.             plotp(lo);
  1447.             return;
  1448.             }
  1449.         plotp(hi1); plotp(lo);
  1450.         return;
  1451.         }
  1452.     plotp(hi2); plotp(hi1); plotp(lo);
  1453. }
  1454.  
  1455. --------------------------- charfont/Makefile --------------------
  1456. CFLAGS=-O
  1457. GLIBDIR=/usp0/malcolm/crc/lib/graphics
  1458.  
  1459. all:        genfont font.5x7
  1460.  
  1461. font.5x7:    ifont.5x7 genfont
  1462.         genfont ifont.5x7 > font.5x7
  1463.  
  1464. genfont:    genfont.c
  1465.         cc $(CFLAGS) genfont.c -o genfont
  1466.  
  1467. install:    font.5x7
  1468.         cp font.5x7 ../lib/font.5x7.h
  1469. clean:
  1470.         rm -f font.5x7 genfont
  1471.  
  1472. SHAR_EOF
  1473. #    End of shell archive
  1474. exit 0
  1475.  
  1476.