home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / apps / dtp / ghost / gs301bt1 / help / hlptops.c < prev    next >
C/C++ Source or Header  |  1994-09-05  |  4KB  |  179 lines

  1. /*
  2.  *    Convert Atari Ghostscript .hlp files to Postscript
  3.  *
  4.  *    The /width and /height printed by this program depend
  5.  *    critically on the contents of the file procs.ps. I
  6.  *    don't suggest changing that file or this one unless
  7.  *    you know enough PostScript to fix things up.
  8.  */
  9.  
  10. /*     Usage: "hlptops file1.hlp [file2.hlp ...]"        */
  11.  
  12. #define MAXLEN         (81)
  13. #define MARGINS        (20)
  14. #define CHARHEIGHT    (20)
  15. #define HEADERHEIGHT    (4 * CHARHEIGHT + 15)
  16.  
  17. #define ERROR1     "hlptops usage: hlptops file1.hlp [file2.hlp ...]"
  18. #define ERROR2    "hlptops: %s does not appear to be a Ghostscript help file.\n"
  19.  
  20. #define HEADER1 "%!PS-Adobe-\n\
  21. \n\
  22. currentdict /procsdef known not {(procs.ps) runlibfile} if\n"
  23.  
  24. #define HEADER2 "/height 000 def \n\
  25. setsize\n\n"
  26.  
  27. #define TRAILER    "\nfooter showpage restoresize\n"
  28.  
  29. #include <stdio.h>
  30. #include <string.h>
  31.  
  32. main(int argc, char **argv)
  33. {
  34.     FILE *hlpfile, *psfile;
  35.  
  36.     char infile[MAXLEN], outfile[MAXLEN], line[MAXLEN], temp[MAXLEN], *ptr;
  37.  
  38.     int i, j, k, length, longest, linecount, width, height;
  39.  
  40.     fpos_t widthpos, heightpos;
  41.  
  42.     if (argc < 1) {        /* check for no input */
  43.     puts(ERROR1);
  44.     exit(-1);
  45.     }
  46.  
  47.     /* Process each file in the argument list. */
  48.  
  49.     for (i=1; i < argc; i++, linecount=0) {
  50.  
  51.     /* See if it looks like a Ghostscript hlp file. */
  52.  
  53.     if ((ptr = strstr(argv[i], "hlp")) == NULL) {
  54.         printf(ERROR2, argv[i]);
  55.         break;
  56.     }
  57.     
  58.     /* Copy the input file name and open it. */
  59.  
  60.     strcpy(infile, argv[i]);
  61.     if ((hlpfile = fopen(infile, "r")) == NULL) {
  62.         printf("hlptops: Unable to open %s!\n", infile);
  63.         continue;
  64.     }
  65.  
  66.     /* Construct the output file name and open it. */
  67.  
  68.     *ptr = '\0';
  69.     strcpy(outfile , argv[i]);
  70.     strcat(outfile, "ps");
  71.     if ((psfile = fopen(outfile, "w")) == NULL) {
  72.         printf("hlptops: Unable to open %s!\n", outfile);
  73.         fclose(psfile);
  74.         continue;
  75.     }
  76.  
  77.     /* Write the PostScript header in the output file. */
  78.  
  79.     fputs(HEADER1, psfile);
  80.     fgetpos(psfile, &widthpos);    /* get position of /width */
  81.     fputs("/width 000 def \n", psfile);
  82.     fgetpos(psfile, &heightpos);    /* get position of /height */
  83.     fputs(HEADER2, psfile);
  84.  
  85.     /* skip any blank lines at the beginning of the hlp file */
  86.  
  87.     do {
  88.         if ((ptr = fgets(line, MAXLEN, hlpfile)) == NULL) {
  89.         printf("hlptops: Unexpected end of file in %s\n", infile);
  90.         goto endloop;
  91.         }
  92.  
  93.         line[strlen(line)-1] = '\0';    /* get rid of \n */
  94.     }
  95.     while (strlen(line) == 0);
  96.  
  97.     /* Use the first non-empty line as the header. */
  98.     /* skip leading spaces */
  99.  
  100.     ++linecount;
  101.  
  102.     /* Escape any parentheses or backslashes that occur. */
  103.  
  104.     if (strchr(line, '(') || strchr(line, ')') || strchr(line, '\\')) {
  105.         for(j=0, k=0; line[j] != NULL; j++, k++) {
  106.         if (line[j] == '(' || line[j] == ')' || line[j] == '\\') {
  107.             temp[k] = '\\';
  108.             ++k;
  109.         }
  110.         temp[k] = line[j];
  111.         }
  112.         temp[k] = '\0';
  113.         strcpy(line, temp);
  114.     }
  115.  
  116.     longest = strlen(line);
  117.  
  118.     fprintf(psfile, "(%s) header\n\n", line+strspn(line, " "));
  119.     
  120.     /* Convert the remainder of the file. */
  121.  
  122.     while ((ptr = fgets((char *)line, MAXLEN, hlpfile)) != NULL) {
  123.         length = strlen(line) - 1;
  124.         line[length] = '\0';    /* get rid of \n */
  125.         ++linecount;
  126.         /* Escape any parentheses or backslashes that occur. */
  127.  
  128.         if (strchr(line, '(') || strchr(line, ')') || strchr(line, '\\')) {
  129.         for(j=0, k=0; line[j] != NULL; j++, k++) {
  130.             if (line[j] == '(' || line[j] == ')' || line[j] == '\\') {
  131.             temp[k] = '\\';
  132.             ++k;
  133.             }
  134.             temp[k] = line[j];
  135.         }
  136.         temp[k] = '\0';
  137.         strcpy(line, temp);
  138.         }
  139.  
  140.         if (strlen(line) == 0) {
  141.         if (linecount != 2) {        /* no return after title */
  142.             fputs("return\n\n", psfile);
  143.         }
  144.         }
  145.         else {
  146.         fprintf(psfile, "(%s) jnl\n", line);
  147.         }
  148.  
  149.         if (length > longest) longest = length;
  150.  
  151.     }
  152.  
  153.     endloop:
  154.  
  155.     /* Write the trailer in the output file. */
  156.  
  157.     fputs(TRAILER, psfile); 
  158.  
  159.     /* Assume the average character width is .41 * height */
  160.  
  161.     width = (int)(longest * CHARHEIGHT * .41 + 2 * MARGINS);
  162.  
  163.     fsetpos(psfile, &widthpos);    /* move back to set /width */
  164.     fprintf(psfile, "/width %d def ", width); 
  165.  
  166.     height = linecount * CHARHEIGHT + HEADERHEIGHT;
  167.  
  168.     fsetpos(psfile, &heightpos);    /* move back to set /height */
  169.     fprintf(psfile, "/height %d def ", height); 
  170.  
  171.     /* Close both files and move to next input file. */
  172.  
  173.     fclose(hlpfile);
  174.     fclose(psfile);
  175.  
  176.     }
  177.  
  178. }
  179.