home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume12 / psf2 / part03 / selectdef.c < prev   
Encoding:
C/C++ Source or Header  |  1990-05-19  |  5.8 KB  |  284 lines

  1. /* ta=4 */
  2. /*    allow user to select printer from various *.def files
  3.     and also select defaule page size (letter, a4 etc)
  4.     
  5.     selected printer is in file        Ppsfprint.cfg
  6.     seleted page size is in file    Ppagesize.cfg
  7.  
  8.     This also generates a postscript programme (psizes.ps) that should be
  9.     sent to the printer to print out the actual imageable area.
  10. */
  11.  
  12. #include <stdio.h>
  13.  
  14. #define printerdef "Ppsfprint.cfg"
  15.  
  16. typedef struct                     /*    measurement in point                    */
  17. {    char    paper_name[60];        /*    name of paper size (for command line)    */
  18.     char    paper_tray[200];    /*    postscript operator to select this tray    */
  19.     int        width;                /*    portrait point width of paper            */
  20.     int        height;                /*    portrait point height of paper            */
  21. } measure;
  22.  
  23. char *psheader = "%!\n\
  24. /getsize {\n\
  25.     clippath\n\
  26.     pathbbox\n\
  27. } def\n\
  28. /sendsize {\n\
  29.     /ury exch def\n\
  30.     /urx exch def\n\
  31.     /lly exch def\n\
  32.     /llx exch def\n\
  33.     /str 64 string def\n\
  34.     show\n\
  35.     (  ) show\n\
  36.     llx    ceiling cvi str cvs show\n\
  37.     (  ) show\n\
  38.     lly    ceiling cvi str cvs show\n\
  39.     (  ) show\n\
  40.     urx    floor cvi str cvs show\n\
  41.     (  ) show\n\
  42.     ury    floor cvi str cvs show\n\
  43. } def\n\
  44. /pg save def\n\
  45. newpath\n";
  46.  
  47. char *psfont = "/Courier findfont 12 scalefont setfont\n";
  48.  
  49. char *pstail = "showpage \n\
  50. pg restore\n\004";
  51.  
  52. char    printername[100];
  53. int        defaultsize;
  54.  
  55. main (argc, argv)
  56. int        argc;
  57. char    *argv[];
  58. {    int        i,j;
  59.     int        many, n, pnumber;
  60.     char    printers[100];
  61.     FILE    *fp, *fpdef;
  62.  
  63.     if (argc < 2)
  64.     {    fprintf (stderr, "Cannot find printer definition files (*.def)...\n");
  65.         exit (1);
  66.     }
  67.     
  68. refresh:
  69.     puts ("\n\n                         SELECT PRINTER TYPE\n");
  70.     many = 0;
  71.     for (i = 1;  i < argc;  i++)
  72.     {    if ((fp = fopen (argv[i], "r")) == NULL)
  73.             exit (1);
  74.         fgets (printers, 99, fp);
  75.         trim (printers);
  76.         n = strlen (printers);
  77.         if (n < 35)
  78.             n = 35;
  79.         many += n;    
  80.         if (many > 70)
  81.         {    many = n;
  82.             printf ("\n");
  83.         }
  84.         printf ("%2d: %-35s", i, printers);
  85.         fclose (fp);
  86.     }
  87.     printf ("\n");
  88.     do
  89.     {    printf ("==> Select printer by number (q = quit, r = refresh display): ");
  90.         gets (printers);
  91.         if (toupper (*printers) == 'Q')
  92.             exit (44);
  93.         if (toupper (*printers) == 'R')
  94.             goto refresh;
  95.         pnumber = atoi (printers);
  96.         if (pnumber < 1  ||  pnumber > argc)
  97.             puts ("... Invalid printer number");
  98.         else
  99.             break;
  100.     } while (1);
  101.     if (access (argv[pnumber], 4) == 0)
  102.     {
  103.         if ((fpdef = fopen (printerdef, "w")) != NULL)
  104.         {    fprintf (fpdef, "%s", argv[pnumber]);
  105.             fclose (fpdef);
  106.             getsize (argv[pnumber]);
  107.             genpost (argv[pnumber]);
  108.         }
  109.         else
  110.         {    fprintf (stderr, "Cannot create printer definition file: %s\n", printerdef);
  111.             exit (1);
  112.         }
  113.         fclose (fp);
  114.     }
  115.     else
  116.     {    fprintf (stderr, "Cannot find printer definition file: %s\n", argv[pnumber]);
  117.         exit (1);
  118.     }
  119.     exit (0);
  120. }
  121. getsize (fn)
  122. char    *fn;
  123. {    char    ptypes[40][100];
  124.     char    line[100];
  125.     int        ntypes, i, ncol, pnumber;
  126.     FILE    *fpdef;
  127.         
  128.     if ((fpdef = fopen (fn, "r")) != NULL)
  129.     {    fgets (printername, 99, fpdef);
  130.         trim (printername);
  131.         ntypes = 1;
  132.         for ( ; ; )
  133.         {    fgets (line, 99, fpdef);
  134.             if (*line == '*')
  135.                 break;
  136.             trim (line);
  137.             strcpy (ptypes[ntypes], line);
  138.             fgets (line, 99, fpdef);
  139.             fgets (line, 99, fpdef);
  140.             ntypes++;
  141.         }
  142.         fclose (fpdef);
  143.  
  144. ref:
  145.         printf ("\nPrinter is: %s\n\nSelect default page size:\n", printername);
  146.         for (i = 1;  i < ntypes;  i++)
  147.         {    printf ("%2d: %s\n", i, ptypes[i]);
  148.         }
  149.         do
  150.         {    printf ("==> Select page size by number (q = quit, r = refresh display): ");
  151.             gets (line);
  152.             if (toupper (*line) == 'Q')
  153.                 exit (44);
  154.             if (toupper (*line) == 'R')
  155.                 goto ref;
  156.             pnumber = atoi (line);
  157.             if (pnumber < 1  ||  pnumber > ntypes)
  158.                 puts ("... Invalid page size number");
  159.             else
  160.                 break;
  161.         } while (1);
  162.         fclose (fpdef);
  163.         ptypes[ntypes][0] = '\0';
  164.         if ((pnumber > 0  &&  pnumber < ntypes)
  165.             && (fopen ("Ppagesize.cfg", "w")) != NULL)
  166.         {
  167.             fprintf (fpdef, "%s", ptypes[pnumber]);
  168.             fclose (fpdef);
  169.             defaultsize = pnumber - 1;
  170.         }
  171.     }
  172.     else
  173.     {    fprintf (stderr, "Cannot find printer definition file: %s\n", printerdef);
  174.         exit (1);
  175.     }
  176.     exit (0);
  177. }
  178.  
  179. genpost (f)
  180. char    *f;
  181. {
  182.     FILE *pdef, *psfile;
  183.     char    line[500];
  184.     measure    page_types[40];
  185.     int        i, j;
  186.     int        x, y;
  187.     
  188.     if ((pdef = fopen (f, "r")) != NULL)
  189.     {
  190.         fgets (line, 100, pdef);
  191.         for (i = 0;  i < 28;  i++)
  192.         {    if (fgets (page_types[i].paper_name, 59, pdef) == NULL)
  193.                 break;
  194.             trim (page_types[i].paper_name);
  195.             if (page_types[i].paper_name[0] ==  '*')
  196.                 break;
  197.             if (fgets (page_types[i].paper_tray, 199, pdef) == NULL)
  198.                 bad_file();
  199.             trim (page_types[i].paper_tray);
  200.             if (fgets (line, 100, pdef) == NULL)
  201.                 bad_file();
  202.             trim (line);
  203.             sscanf (line, "%d%d",
  204.                 &page_types[i].width,
  205.                 &page_types[i].height);
  206.  
  207.         }
  208.         page_types[i].paper_name[0] = '\0';
  209.         fclose (pdef);
  210.         if ((psfile = fopen ("psizes.ps", "w")) != NULL)
  211.         {    fprintf (psfile, "%s", psheader);
  212.             for (j = i-1;  j >= 0;  j--)
  213.             {    lcase (line, page_types[j].paper_name);
  214.                 fprintf (psfile, "%s\n(%s: %d %d) getsize\n",
  215.                             line,
  216.                             page_types[j].paper_name,
  217.                             page_types[j].width, 
  218.                             page_types[j].height);
  219.             }
  220.             fprintf (psfile, "%s\n", page_types[defaultsize].paper_tray);
  221.             fprintf (psfile, "%s", psfont);
  222.             x = 50;
  223.             y = 600;
  224.             fprintf (psfile, "%d %d moveto\n", x, y);
  225.             fprintf (psfile, "(Imageable area) show\n");
  226.             y -= 15;
  227.             fprintf (psfile, "%d %d moveto\n", x, y);
  228.             fprintf (psfile, "(");
  229.             send (printername, psfile);
  230.             fprintf (psfile, ") show\n");
  231.             y -= 20;
  232.             for (j = i-1;  j >= 0;  j--)
  233.             {
  234.                 fprintf (psfile, "%d %d moveto\nsendsize\n", x, y);
  235.                 y -= 15;
  236.             }
  237.             fprintf (psfile, "%s", pstail);
  238.         }
  239.     }
  240. }
  241.  
  242. trim (s)
  243. char    *s;
  244. {
  245.     while (*s)
  246.     {    if (*s < ' ')
  247.         {    *s = 0;
  248.             break;
  249.         }
  250.         s++;
  251.     }
  252. }
  253.  
  254. bad_file()
  255. {
  256.     fprintf (stderr, "Bad %s file\n", PDEF);
  257.     exit (1);
  258. }
  259.  
  260. lcase (a, b)
  261. char    *a, *b;
  262. {
  263.     while (*b)
  264.     {    *a++ = tolower (*b);
  265.         b++;
  266.     }
  267.     *a = '\0';
  268. }
  269.  
  270. send (s, fp)
  271. char    *s;
  272. FILE    *fp;
  273. {
  274.     char    *strchr();
  275.     
  276.     while (*s)
  277.     {
  278.         if (strchr ("\r\b\\()", *s) != NULL)
  279.             fputc ('\\', fp);
  280.         fputc (*s, fp);
  281.         s++;
  282.     }
  283. }
  284.