mirror of
https://github.com/mabam/CAP.git
synced 2026-01-23 04:16:01 +00:00
252 lines
5.9 KiB
C
252 lines
5.9 KiB
C
/*
|
|
* Copyright (c) 1988, The Regents of the University of California.
|
|
* Edward Moy, Workstation Software Support Group, Workstation Support Serices,
|
|
* Information Systems and Technology.
|
|
*
|
|
* Permission is granted to any individual or institution to use, copy,
|
|
* or redistribute this software so long as it is not sold for profit,
|
|
* provided that this notice and the original copyright notices are
|
|
* retained. The University of California makes no representations about the
|
|
* suitability of this software for any purpose. It is provided "as is"
|
|
* without express or implied warranty.
|
|
*/
|
|
|
|
#ifndef lint
|
|
static char *SCCSid = "@(#)prepfix.c 2.2 10/25/89";
|
|
#endif lint
|
|
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#ifdef SYSV
|
|
#include <string.h>
|
|
#else SYSV
|
|
#include <strings.h>
|
|
#endif SYSV
|
|
#include "str.h"
|
|
|
|
#define CLEARTOMARK 12
|
|
#define EEXECLEN 80
|
|
#define EXTRA (NZEROLINE * ZEROLINE + CLEARTOMARK)
|
|
#define LINELEN 256
|
|
#define NPRODUCTS 32
|
|
#define NZEROLINE 7
|
|
#define ZEROLINE 65
|
|
#ifdef SYSV
|
|
#define index strchr
|
|
#define rindex strrchr
|
|
#endif SYSV
|
|
|
|
char exstr[] = "\
|
|
%ck userdict/%s known not and{currentfile eexec}{%d{currentfile read\n\
|
|
pop pop}repeat}ifelse\n\
|
|
";
|
|
char *match();
|
|
char *myname;
|
|
int maxproducts = NPRODUCTS;
|
|
int nproducts = 0;
|
|
char Ok[] = "\
|
|
/Ok{ok{true}{save /Pd statusdict /product get def false 0 1 ProdArr length\n\
|
|
1 sub{Pd exch ProdArr exch get anchorsearch exch pop{pop pop true exit}if}for\n\
|
|
exch restore}ifelse}bind def\n\
|
|
";
|
|
char ProdArr0[] = "/ProdArr [\n";
|
|
char ProdArr1[] = "] def\n";
|
|
char **products;
|
|
char tempname[] = "/tmp/prepfixXXXXXX";
|
|
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
register STR *str;
|
|
register FILE *tp;
|
|
register int i;
|
|
register unsigned char *lp;
|
|
char buf[BUFSIZ];
|
|
char *malloc(), *realloc();
|
|
|
|
if(myname = rindex(*argv, '/'))
|
|
myname++;
|
|
else
|
|
myname = *argv;
|
|
for(argc--, argv++ ; argc > 0 && **argv == '-' ; argc--, argv++) {
|
|
switch((*argv)[1]) {
|
|
case 'h':
|
|
usage();
|
|
case 'l':
|
|
if(nproducts <= 0 && (products =
|
|
(char **)malloc(maxproducts*sizeof(char *))) == NULL) {
|
|
fprintf(stderr,
|
|
"%s: Out of memory creating products array\n",
|
|
myname);
|
|
exit(1);
|
|
} else if(nproducts >= maxproducts - 1 && (products =
|
|
(char **)realloc(products, (maxproducts += NPRODUCTS)
|
|
* sizeof(char *))) == NULL) {
|
|
fprintf(stderr,
|
|
"%s: Out of memory expanding products array\n",
|
|
myname);
|
|
exit(1);
|
|
}
|
|
if((*argv)[2])
|
|
products[nproducts++] = &(*argv)[2];
|
|
else {
|
|
if(argc < 2) {
|
|
fprintf(stderr,
|
|
"%s: No argument for -l\n", myname);
|
|
exit(1);
|
|
}
|
|
argc--;
|
|
argv++;
|
|
products[nproducts++] = *argv;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if(argc > 1)
|
|
usage();
|
|
if(argc > 0 && freopen(*argv, "r", stdin) == NULL) {
|
|
fprintf(stderr, "%s: Can't open %s\n", myname, *argv);
|
|
exit(1);
|
|
}
|
|
mktemp(tempname);
|
|
if((tp = fopen(tempname, "w+")) == NULL) {
|
|
fprintf(stderr, "%s: Can't create temp file %s\n",
|
|
myname, tempname);
|
|
exit(1);
|
|
}
|
|
unlink(tempname);
|
|
str = STRalloc();
|
|
if(!STRgets(str, stdin)) {
|
|
fprintf(stderr, "%s: Null input\n", myname);
|
|
exit(1);
|
|
}
|
|
for( ; ; ) {
|
|
if(STRheadcompare(str, "% \251") == 0) {
|
|
fputs("% ", tp);
|
|
str->bufptr[0] = '(';
|
|
str->bufptr[1] = 'C';
|
|
str->bufptr[2] = ')';
|
|
} else if(STRheadcompare(str, "%%BeginProcSet:") == 0) {
|
|
STRputs(str, stdout);
|
|
fseek(tp, 0L, 0);
|
|
while((i = fread(buf, 1, BUFSIZ, tp)) > 0)
|
|
fwrite(buf, 1, i, stdout);
|
|
fclose(tp);
|
|
break;
|
|
}
|
|
STRputs(str, tp);
|
|
if(!STRgets(str, stdin)) {
|
|
fprintf(stderr, "%s: No BeginProcSet\n", myname);
|
|
exit(1);
|
|
}
|
|
}
|
|
while(STRgets(str, stdin)) {
|
|
if(nproducts > 0 && STRheadcompare(str, "/ok{") == 0) {
|
|
STRputs(str, stdout);
|
|
fputs(ProdArr0, stdout);
|
|
for(i = 0 ; i < nproducts ; i++)
|
|
printf("(%s)\n", products[i]);
|
|
fputs(ProdArr1, stdout);
|
|
fputs(Ok, stdout);
|
|
continue;
|
|
} else if(STRmatch(str, "setdefaulttimeouts")
|
|
|| STRmatch(str, "setsccinteractive"))
|
|
continue;
|
|
else if(STRmatch(str, "/stretch") && STRmatch(str, "eexec")) {
|
|
eexec("stretch", str);
|
|
continue;
|
|
} else if(STRmatch(str, "/smooth4") && STRmatch(str, "eexec")) {
|
|
eexec("smooth4", str);
|
|
continue;
|
|
} else if(STRmatch(str, " checkload")) {
|
|
checkload(str);
|
|
continue;
|
|
} else if(STRmatch(str, "(LaserWriter II NT)")) {
|
|
while(STRgets(str, stdin) && STRheadcompare(str, "35de")
|
|
!= 0)
|
|
{ /* ignore line */ }
|
|
while(STRgets(str, stdin) && isxdigit(*str->bufptr))
|
|
{ /* ignore line */ }
|
|
} else if(lp = STRmatch(str, "scaleby96{ppr")) {
|
|
STRputsptr(str, lp, stdout);
|
|
continue;
|
|
} else if(STRmatch(str, "waittimeout"))
|
|
continue;
|
|
else if(STRheadcompare(str, "%%EndProcSet") == 0) {
|
|
STRputs(str, stdout);
|
|
break;
|
|
}
|
|
STRputs(str, stdout);
|
|
}
|
|
exit(0);
|
|
}
|
|
|
|
eexec(name, str)
|
|
char *name;
|
|
register STR *str;
|
|
{
|
|
register int len;
|
|
|
|
if(!STRgets(str, stdin)) {
|
|
fprintf(stderr, "%s: EOF during reading eexec\n", myname);
|
|
exit(1);
|
|
}
|
|
len = (str->curendptr - str->bufptr) - 1;
|
|
printf(exstr, nproducts > 0 ? 'O' : 'o', name, len + (len / EEXECLEN)
|
|
+ (len % EEXECLEN ? 1 : 0) + EXTRA);
|
|
spliteexec(str);
|
|
}
|
|
|
|
checkload(str)
|
|
register STR *str;
|
|
{
|
|
if(nproducts > 0)
|
|
*str->bufptr = 'O';
|
|
STRputs(str, stdout);
|
|
if(!STRgets(str, stdin)) {
|
|
fprintf(stderr, "%s: EOF during reading eexec\n", myname);
|
|
exit(1);
|
|
}
|
|
spliteexec(str);
|
|
}
|
|
|
|
spliteexec(str)
|
|
register STR *str;
|
|
{
|
|
register int len;
|
|
register unsigned char *bp;
|
|
|
|
bp = str->bufptr;
|
|
len = (str->curendptr - bp) - 1;
|
|
while(len >= 80) {
|
|
fwrite(bp, 80, 1, stdout);
|
|
putchar('\n');
|
|
bp += 80;
|
|
len -= 80;
|
|
}
|
|
if(len > 0) {
|
|
fwrite(bp, len, 1, stdout);
|
|
putchar('\n');
|
|
}
|
|
for( ; ; ) {
|
|
if(!STRgets(str, stdin)) {
|
|
fprintf(stderr, "%s: EOF reached before cleartomark\n",
|
|
myname);
|
|
exit(1);
|
|
}
|
|
STRputs(str, stdout);
|
|
if(STRheadcompare(str, "cleartomark") == 0)
|
|
return;
|
|
}
|
|
}
|
|
|
|
usage()
|
|
{
|
|
fprintf(stderr,
|
|
"Usage: %s [-l product_name1 [-l product_name2]...] [file]\n",
|
|
myname);
|
|
fprintf(stderr, " %s -help\n", myname);
|
|
exit(1);
|
|
}
|