This is epsview.c in view mode; [Download] [Up]
/* EPS file previewer using the DPS library */
#include <ansi.h>
#include <libc.h>
#include <dpsclient/dpsclient.h>
int strisub(char *a,char *b) { /* Check for substring, case independent */
while (*a) {
if (!*b || tolower(*a)!=tolower(*b)) return(0);
++a;
++b;
}
return(1);
}
void printjunk(DPSContext ctxt, const char *buf, long unsigned int count)
{
unsigned char c;
while (count--) {
c = *buf++;
if (c < ' ' && c != '\n') {putchar('^'); c ^= 0x40;}
putchar(c);
}
}
void myerrorproc(
DPSContext ctxt,
DPSErrorCode errorCode,
long unsigned int arg1,
long unsigned int arg2 )
{
if (errorCode == 1000) {
printf("%%%%[ %.*s: %.*s; OffendingCommand: %.*s ]%%%%\n",
*(short *)(arg1+14),*(char **)(arg1+16)+arg1+4,
*(short *)(arg1+22),*(char **)(arg1+24)+arg1+4,
*(short *)(arg1+30),*(char **)(arg1+32)+arg1+4);
}
else {
printf("DPS Error %d:\n",errorCode);
printjunk(ctxt,(char *)arg1,arg2);
putchar('\n');
}
}
int main(int argc,char **argv) {
DPSContext d;
int fd,l,x,i,windows;
float llx,lly,urx,ury,scale,inches;
char *p, *e, *fname;
#define BUFLEN 1024
char buf[BUFLEN];
NXEvent event;
if (argv[1] && argv[1][0] == '-') {i=2; inches=atof(argv[1]+1);}
else {i=1; inches=0;}
d = DPSCreateContext(0,0,printjunk,myerrorproc);
DPSPrintf(d,"/showpage {initgraphics} bind def\n");
windows = 0;
if (i>=argc) {fd = 0; fname = "stdin"; goto PIPED;}
for (; i < argc; i++) {
fname = argv[i];
fd = open(fname,0);
if (fd<0) {printf("%s: %s\n",fname,strerror(errno)); continue;}
PIPED:
llx=lly=0; urx=612; ury=792; /* size of LaserWriter page */
e = buf+read(fd,buf,BUFLEN);
if (buf[0] != '%' || buf[1] != '!') {
printf("%s is not an EPS file.\n",fname);
goto DONE;
}
p = buf;
while(1) {
while (p<e && *p != '%') p++;
if (p > e-80) {
x = e-p;
memmove(buf,p,x);
e = buf+x+read(fd,buf+x,BUFLEN-x);
p = buf;
if (p >= e) {printf("%s has no %%%%BoundingBox.\n",fname); goto DONE;}
}
if (strisub("%%boundingbox:",p)) break;
p++;
}
while ((*p < '0' || *p > '9') && *p != '-') p++;
e = p; while (*p > ' ') p++; *p = 0;
llx = atof(e);
while ((*p < '0' || *p > '9') && *p != '-') p++;
e = p; while (*p > ' ') p++; *p = 0;
lly = atof(e);
while ((*p < '0' || *p > '9') && *p != '-') p++;
e = p; while (*p > ' ') p++; *p = 0;
urx = atof(e);
while ((*p < '0' || *p > '9') && *p != '-') p++;
e = p; while (*p > ' ') p++; *p = 0;
ury = atof(e);
/* printf("%%BoundingBox %g %g %g %g\n",llx,lly,urx,ury); */
if (urx<=llx) urx = llx+612;
if (ury<=lly) ury = lly+792;
DONE: urx-=llx; ury-=lly;
scale = inches ? 72*inches/(urx>ury?urx:ury) : 1.0;
lseek(fd,0L,0);
windows++;
DPSPrintf(d,"%d dup %g %g 0 window\n"
"windowdeviceround\n"
"1 0 currentwindow orderwindow\n",
windows*20,rint(urx*scale),rint(ury*scale));
DPSPrintf(d,"%d currentwindow seteventmask\n",
NX_LMOUSEDOWNMASK+NX_RMOUSEDOWNMASK);
DPSPrintf(d,"0 1 %g %g rectstroke\n",rint(urx*scale)-1,rint(ury*scale)-1);
DPSPrintf(d,"/_the_saved_vm_ save def\n");
if (inches) DPSPrintf(d,"%g dup scale\n",scale);
DPSPrintf(d,"%g %g translate\n",-llx,-lly);
while ((l=read(fd,buf,BUFLEN))>0) DPSWriteData(d,buf,l);
DPSPrintf(d,"\ngrestoreall _the_saved_vm_ restore\n");
close(fd);
}
while (windows) {
DPSFlushContext(d);
DPSGetEvent(d,&event,-1,NX_FOREVER,0);
if (event.type == NX_RMOUSEDOWN) {
DPSPrintf(d,"%d termwindow\n",event.window);
windows--;
}
else if (event.type == NX_LMOUSEDOWN) {
DPSPrintf(d,
"1 0 %d orderwindow\n"
"{%d stilldown not {exit} if\n"
"workspaceWindow currentmouse %g sub exch %g sub exch\n"
"%d movewindow} loop\n",
event.window,event.data.mouse.eventNum,
event.location.y,event.location.x,event.window);
}
}
/* DPSDestroyContext(d); */
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.