This is prepfix.c in view mode; [Download] [Up]
/*
* 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);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.