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