/* * Convert Atari Ghostscript .hlp files to Postscript * * The /width and /height printed by this program depend * critically on the contents of the file procs.ps. I * don't suggest changing that file or this one unless * you know enough PostScript to fix things up. */ /* Usage: "hlptops file1.hlp [file2.hlp ...]" */ #define MAXLEN (81) #define MARGINS (20) #define CHARHEIGHT (20) #define HEADERHEIGHT (4 * CHARHEIGHT + 15) #define ERROR1 "hlptops usage: hlptops file1.hlp [file2.hlp ...]" #define ERROR2 "hlptops: %s does not appear to be a Ghostscript help file.\n" #define HEADER1 "%!PS-Adobe-\n\ \n\ currentdict /procsdef known not {(procs.ps) runlibfile} if\n" #define HEADER2 "/height 000 def \n\ setsize\n\n" #define TRAILER "\nfooter showpage restoresize\n" #include #include main(int argc, char **argv) { FILE *hlpfile, *psfile; char infile[MAXLEN], outfile[MAXLEN], line[MAXLEN], temp[MAXLEN], *ptr; int i, j, k, length, longest, linecount, width, height; fpos_t widthpos, heightpos; if (argc < 1) { /* check for no input */ puts(ERROR1); exit(-1); } /* Process each file in the argument list. */ for (i=1; i < argc; i++, linecount=0) { /* See if it looks like a Ghostscript hlp file. */ if ((ptr = strstr(argv[i], "hlp")) == NULL) { printf(ERROR2, argv[i]); break; } /* Copy the input file name and open it. */ strcpy(infile, argv[i]); if ((hlpfile = fopen(infile, "r")) == NULL) { printf("hlptops: Unable to open %s!\n", infile); continue; } /* Construct the output file name and open it. */ *ptr = '\0'; strcpy(outfile , argv[i]); strcat(outfile, "ps"); if ((psfile = fopen(outfile, "w")) == NULL) { printf("hlptops: Unable to open %s!\n", outfile); fclose(psfile); continue; } /* Write the PostScript header in the output file. */ fputs(HEADER1, psfile); fgetpos(psfile, &widthpos); /* get position of /width */ fputs("/width 000 def \n", psfile); fgetpos(psfile, &heightpos); /* get position of /height */ fputs(HEADER2, psfile); /* skip any blank lines at the beginning of the hlp file */ do { if ((ptr = fgets(line, MAXLEN, hlpfile)) == NULL) { printf("hlptops: Unexpected end of file in %s\n", infile); goto endloop; } line[strlen(line)-1] = '\0'; /* get rid of \n */ } while (strlen(line) == 0); /* Use the first non-empty line as the header. */ /* skip leading spaces */ ++linecount; /* Escape any parentheses or backslashes that occur. */ if (strchr(line, '(') || strchr(line, ')') || strchr(line, '\\')) { for(j=0, k=0; line[j] != NULL; j++, k++) { if (line[j] == '(' || line[j] == ')' || line[j] == '\\') { temp[k] = '\\'; ++k; } temp[k] = line[j]; } temp[k] = '\0'; strcpy(line, temp); } longest = strlen(line); fprintf(psfile, "(%s) header\n\n", line+strspn(line, " ")); /* Convert the remainder of the file. */ while ((ptr = fgets((char *)line, MAXLEN, hlpfile)) != NULL) { length = strlen(line) - 1; line[length] = '\0'; /* get rid of \n */ ++linecount; /* Escape any parentheses or backslashes that occur. */ if (strchr(line, '(') || strchr(line, ')') || strchr(line, '\\')) { for(j=0, k=0; line[j] != NULL; j++, k++) { if (line[j] == '(' || line[j] == ')' || line[j] == '\\') { temp[k] = '\\'; ++k; } temp[k] = line[j]; } temp[k] = '\0'; strcpy(line, temp); } if (strlen(line) == 0) { if (linecount != 2) { /* no return after title */ fputs("return\n\n", psfile); } } else { fprintf(psfile, "(%s) jnl\n", line); } if (length > longest) longest = length; } endloop: /* Write the trailer in the output file. */ fputs(TRAILER, psfile); /* Assume the average character width is .41 * height */ width = (int)(longest * CHARHEIGHT * .41 + 2 * MARGINS); fsetpos(psfile, &widthpos); /* move back to set /width */ fprintf(psfile, "/width %d def ", width); height = linecount * CHARHEIGHT + HEADERHEIGHT; fsetpos(psfile, &heightpos); /* move back to set /height */ fprintf(psfile, "/height %d def ", height); /* Close both files and move to next input file. */ fclose(hlpfile); fclose(psfile); } }