xref: /original-bsd/old/vfilters/vdmp/vdmp.c (revision de38840f)
1 /*  VDMP: version 4.4				updated 07/12/81
2  *
3  *  reads raster file created by cifplot and dumps it onto the
4  *  Varian or Versatec plotter.
5  *  Must be called with vcontrol or by vpd/vad daemon since
6  *  it assumes plotter is already opened as device 3.
7  */
8 #include <stdio.h>
9 #include <signal.h>
10 #include <sys/vcmd.h>
11 
12 #define MAGIC_WORD	0xA5CF4DFA
13 
14 #define BUFSIZE		1024*128
15 #define BLOCK		1024
16 
17 extern char *ctime();
18 extern long time();
19 
20 char *Sid = "@(#)vdmp.c	4.4\t07/12/81";
21 int	plotmd[]	= { VPLOT, 0, 0};
22 int	prtmd[]		= { VPRINT, 0, 0};
23 char *name = "";
24 char *banner = "";
25 
26 int inbuf[BLOCK/sizeof(int)];
27 char vpbuf[BUFSIZE];
28 
29 int	in;
30 
31 #define VARIAN	1
32 #define VERSATEC 2
33 
34 int device = VARIAN;	/* Indicate which device */
35 int BytesPerLine = 264;	/* Number of bytes per raster line of the output device */
36 
37 main(argc, argv)
38 char **argv;
39 {
40 	extern int onintr();
41 	int b;
42 
43 	for(b=0; argv[1][0] == '-';b++) {
44 	    switch(argv[1][1]) {
45 		case 'W':
46 			device = VERSATEC;
47 			BytesPerLine = 880;
48 			break;
49 		case 'V':
50 			device = VARIAN;
51 			BytesPerLine = 264;
52 			break;
53 		case 'n':
54 			argc--; argv++;
55 			if(argv[1] != 0)
56 				name = argv[1];
57 			break;
58 		case 'b':
59 			argc--; argv++;
60 			if(argv[1] != 0)
61 				banner = argv[b];
62 			break;
63 		}
64 	    argc--; argv++;
65 	    }
66 	if(argc < 2) exit(-1);
67 	/* page feed */
68 	if(device == VARIAN) {
69 	    ioctl(3, VSETSTATE,prtmd);
70 	    write(3,"\f",2);
71 	    }
72 	if(device == VERSATEC) {
73 	    ioctl(3, VSETSTATE,prtmd);
74 	    write(3,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",16);
75 	    }
76 	/* open dump file */
77 	in = open(argv[1], 0);
78 	if(in == NULL) {
79 	    char str[128];
80 	    sprintf(str,"%s: No such file\n\n\n",argv[1]);
81 	    ioctl(3, VSETSTATE,prtmd);
82 	    write(3,str, strlen(str));
83 	    exit(-1);
84 	    }
85 	/* write header */
86 	{   char str[512];
87 	    long clock;
88 	    clock = time(0);
89 	    sprintf(str,"%s:%s%s",name,ctime(&clock),banner);
90 	    ioctl(3, VSETSTATE,prtmd);
91 	    write(3,str,(strlen(str)+1) & 0xfffffffe); /*makes strlen even*/
92 	    }
93 	/* open file for reading */
94 	b=read(in,inbuf,BLOCK);
95 	if(inbuf[0] == MAGIC_WORD && b == BLOCK) {
96 	    /* we have a formatted dump file */
97 	    inbuf[(BLOCK/sizeof(int))-1] = 0;  /* make sure string terminates */
98 	    write(3,&(inbuf[4]),(strlen(&(inbuf[4]))+1) & 0xfffe);
99 	    ioctl(3, VSETSTATE,prtmd);
100 	    write(3," \n",2);
101 	    putplot();
102 	    close(in);
103 	    }
104 	  else { 			/* dump file not formatted */
105 	    /* reset in's seek pointer and plot */
106 	    close(in);
107 	    in = open(argv[1], 0);
108 	    putplot();
109 	    close(in);
110 	    }
111 	if(device == VERSATEC) {
112 	    ioctl(3, VSETSTATE,prtmd);
113 	    write(3,"\n\n\n\n\n\n\n",8);
114 	    }
115 	exit(0);
116 	}
117 
118 
119 putplot()
120 {
121      register int i;
122      register char *buf;
123 
124      buf = &(vpbuf[0]);
125      /* vpd has already opened the Versatec as device 3 */
126      ioctl(3, VSETSTATE, plotmd);
127      while( (i=read(in,buf, BUFSIZE)) > 0)
128 		if(write(3,buf,i)!=i) exit(1);
129     }
130