|
|
1.1 root 1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved. */
2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. */
3: /* The copyright notice does not imply actual or intended publication. */
4: /* AUTHORS: */
5: /* H. S. Baird - ATT-BL MH - first versions */
6:
7: /* piclib.c - picture-file public functions.
8: alloc_PIC_hdr() - allocate initialized PIC_hdr, associate with FILE *
9: free_PIC_hdr() - free PIC_hdr & all malloc'ed fields
10: PIC_get_hdr() - get picture-file header
11: PIC_rline() - read one line of picture data
12: PIC_put_hdr() - get picture-file header
13: PIC_wline() - write one line of picture data
14: err_PIC_Line() - print line on stderr
15: PIC_hdr_toa() - PIC_hdr to ascii printable string
16: (PIC_* functions use system I/O, for speed)
17: */
18:
19: #include <stdio.h>
20: #include <math.h>
21: #include <string.h>
22: #include "boole.h"
23: #include "limits.h" /* numeric extreme values */
24: #include "Units.h"
25: #include "Coord.h"
26: #include "pic.h"
27:
28: #define PIC_debug (0)
29: double atof();
30:
31: PIC_hdr *alloc_PIC_hdr( fp )
32: FILE *fp; /* already-open file descr */
33: { PIC_hdr *h;
34: if((h=(PIC_hdr *)malloc(sizeof(PIC_hdr)))==NULL)
35: abort("piclib: alloc_PIC_hdr: can't alloc");
36: *h = empty_PIC_hdr;
37: h->fp = fp;
38: return(h);
39: }
40:
41: free_PIC_hdr( h )
42: PIC_hdr *h;
43: { if(h->parms!=NULL) free(h->parms);
44: if(h->line!=NULL) free(h->line);
45: if(h->pline!=NULL) free(h->pline);
46: if(h->misc!=NULL) free(h->misc);
47: free(h);
48: }
49:
50: /* system I/O variation on fgets(3), except it replaces \n with \0,
51: and returns the number of chars read (including \0) */
52: int PIC_fgets(bf,max,fd)
53: char *bf;
54: int max;
55: int fd;
56: { char *cp;
57: int stat,mny;
58: cp=bf; mny=0;
59: while(((stat=read(fd,cp,1))==1)&&(++mny<max)&&((*cp)!='\n')) cp++;
60: if(stat!=1) return(stat);
61: else if(mny>=max) return(-1);
62: *cp='\0';
63: return(mny);
64: }
65:
66: /* Read picture file header from file descr fileno(h->fp), set up the rest of the
67: header, and return status: 1 OK, 0 EOF, <0 error */
68: int PIC_get_hdr( h )
69: PIC_hdr *h;
70: #define HL_MAX 300
71: #define HTERM "=, \n" /* terminations for header words: "=,<sp><tab>" */
72: { char *cp,*parm,hline[HL_MAX],oline[HL_MAX],*hl;
73: int status,nrd,ch,mny;
74: /* synchronize FILE * ptr with file descr ptr */
75: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
76: hline[0]='\0';
77: if((mny=read(fileno(h->fp),hline,5))!=5)
78: return(0);
79: if(!(hline[0]=='T' && hline[1]=='Y' && hline[2]=='P'
80: && hline[3]=='E' && hline[4]=='=')) {
81: /* no "TYPE=" header; don't accept */
82: if(0) /* don't accept */ {
83: if(PIC_debug)
84: err("PIC_get_hdr: can't find TYPE=... header");
85: return(-1);
86: }
87: else /* accept as bitfile format (OBSOLESCENT) */ {
88: strcpy(h->type,"bitfile");
89: h->res_x = h->res_y = 0;
90: fseek(h->fp,h->seek+2L,0); /* back up to byte no. 2 */
91: /* read window */
92: if((ch=getc(h->fp))!=EOF) { h->bx.a.x = ch;
93: if((ch=getc(h->fp))!=EOF) { h->bx.a.x += (ch<<8);
94: if((ch=getc(h->fp))!=EOF) { h->bx.a.y = ch;
95: if((ch=getc(h->fp))!=EOF) { h->bx.a.y += (ch<<8);
96: if((ch=getc(h->fp))!=EOF) { h->bx.b.x = ch;
97: if((ch=getc(h->fp))!=EOF) { h->bx.b.x += (ch<<8);
98: if((ch=getc(h->fp))!=EOF) { h->bx.b.y = ch;
99: if((ch=getc(h->fp))!=EOF) { h->bx.b.y += (ch<<8); }}}}}}}}
100: else return(0/*EOF*/);
101: h->bx.b.x--; h->bx.b.y--;
102: /* synchronize file descr ptr with FILE * ptr */
103: lseek(fileno(h->fp),h->seek = ftell(h->fp),0);
104: };
105: }
106: else {
107: if((status=PIC_fgets(hline+5,HL_MAX-5,fileno(h->fp)))<=0)
108: return(status);
109: strcpy(oline,hline);
110: hl=hline; while(*hl==' ') hl++; /* strip initial blanks */
111: while(strlen(hl)>1) {
112: if(PIC_debug) err("PIC_get_hdr: hl \"%s\"",hl);
113: parm=strtok(hl,HTERM);
114: if(parm!=NULL&&strcmp(parm,"TYPE")==0) {
115: if((parm=strtok(0,HTERM))!=NULL) {
116: strcpy(h->type,parm);
117: if( (strcmp(h->type,"dump")==0)
118: || (strcmp(h->type,"pico")==0)
119: || (strcmp(h->type,"rle")==0)
120: || (strcmp(h->type,"binary")==0)
121: || (strcmp(h->type,"bitmap")==0)
122: || (strcmp(h->type,"dim")==0)
123: || (strcmp(h->type,"document-image")==0)
124: || (strcmp(h->type,"ccitt-g31")==0)
125: || (strcmp(h->type,"ccitt-g32")==0)
126: || (strcmp(h->type,"ccitt-g4")==0)
127: || (strcmp(h->type,"cdf")==0)
128: || (strcmp(h->type,"tiff")==0)
129: ) /* these types are expected */ {
130: if(PIC_debug)
131: err("PIC_get_hdr: good TYPE=\"%s\"",h->type);
132: }
133: else { if(PIC_debug)
134: err("PIC_get_hdr: unexpected TYPE=\"%s\"",h->type);
135: return(-1);
136: };
137: }
138: else { if(PIC_debug)
139: err("PIC_get_hdr: 1st line must be TYPE=...");
140:
141: return(-1);
142: };
143: }
144: else if(parm!=NULL&&strcmp(parm,"WINDOW")==0) {
145: if((parm=strtok(0,HTERM))!=NULL) h->bx.a.x=atoi(parm);
146: else return(-1);
147: if((parm=strtok(0,HTERM))!=NULL) h->bx.a.y=atoi(parm);
148: else return(-1);
149: if((parm=strtok(0,HTERM))!=NULL) h->bx.b.x=atoi(parm)-1;
150: else return(-1);
151: if((parm=strtok(0,HTERM))!=NULL) h->bx.b.y=atoi(parm)-1;
152: else return(-1);
153: }
154: else if(parm!=NULL&&strcmp(parm,"RES")==0) {
155: if((parm=strtok(0,HTERM))!=NULL)
156: h->res_x=(int)(atof(parm)+0.5);
157: else return(-1);
158: if((parm=strtok(0,HTERM))!=NULL)
159: h->res_y=(int)(atof(parm)+0.5);
160: else return(-1);
161: }
162: else if(parm!=NULL&&strcmp(parm,"NCHAN")==0) {
163: int nchan;
164: if((parm=strtok(0,HTERM))!=NULL) nchan=atoi(parm);
165: else return(-1);
166: if(nchan!=1) {
167: err("PIC_get_hdr: NCHAN=%d illegal: must be 1",nchan);
168: return(-1);
169: };
170: }
171: else if(parm!=NULL&&strcmp(parm,"PARMS")==0) {
172: int nchan;
173: if((parm=strtok(0,"\n"))!=NULL) {
174: h->parms = strdup(parm);
175: }
176: else return(-1);
177: }
178: else if(parm!=NULL) {
179: char *cat;
180: /* save all header lines with unexpected keywords */
181: if(h->misc==NULL) h->misc=(char *)malloc(strlen(oline)+2);
182: else { cat=(char *)malloc(strlen(h->misc)+strlen(oline)+2);
183: strcpy(cat,h->misc);
184: free(h->misc);
185: h->misc=cat;
186: };
187: strcat(h->misc,oline);
188: strcat(h->misc,"\n");
189: }
190: else return(-1);
191: if((status=PIC_fgets(hline,HL_MAX,fileno(h->fp)))<=0)
192: return(status);
193: strcpy(oline,hline);
194: hl=hline; while(*hl==' ') hl++; /* strip initial blanks */
195: };
196: };
197:
198: if(strcmp(h->type,"cdf")==0) {
199: int stat;
200: /* Compund Document Format has binary header */
201: /* synchronize FILE * ptr with file descr ptr */
202: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
203: if((stat=CDF_get_hdr(h)) != 1) return(stat);
204: };
205:
206: if(strcmp(h->type,"tiff")==0) {
207: int stat;
208: /* Tagged Image File Format has abinary header */
209: /* synchronize FILE * ptr with file descr ptr */
210: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
211: if((stat=TIFF_get_hdr(h)) != 1) return(stat);
212: };
213:
214: /* may want to allocate a line buffer here */
215: h->bpl = bbx_wid(&(h->bx));
216: if(strcmp(h->type,"binary")==0)
217: h->bpl = (h->bpl+7)/8; /* round up to byte boundary */
218: else if(strcmp(h->type,"bitfile")==0)
219: h->bpl = 2*((h->bpl+15)/16); /* round up to 2-byte boundary */
220: else if(strcmp(h->type,"bitmap")==0)
221: h->bpl = 2*((h->bpl+15)/16); /* round up to 2-byte boundary */
222: else if( strcmp(h->type,"rle")==0
223: || strcmp(h->type,"dim")==0
224: || strcmp(h->type,"document-image")==0
225: || strcmp(h->type,"cdf")==0
226: || strcmp(h->type,"cdf-mrlc")==0
227: || strcmp(h->type,"cdf-g31")==0
228: || strcmp(h->type,"cdf-g32")==0
229: || strcmp(h->type,"cdf-g4")==0
230: || strcmp(h->type,"tiff")==0 )
231: h->bpl = 0;
232: if(h->bpl==0) h->line = NULL;
233: else { /* allocate one extra byte in line buffer as a favor to RLE */
234: if((h->line = (unsigned char *) malloc(h->bpl+1))==NULL) {
235: fprintf(stderr,
236: "piclib: PIC_get_hdr: can't alloc h->line (%d bytes) - abort\n",
237: h->bpl+1);
238: return(-1);
239: };
240: memset(h->line,'\0',h->bpl);
241: if(strcmp(h->type,"bitfile")==0) {
242: if((h->pline = (unsigned char *) malloc(h->bpl+1))==NULL) {
243: fprintf(stderr,
244: "piclib: PIC_get_hdr: can't alloc h->pline (%d bytes) - abort\n",
245: h->bpl+1);
246: return(-1);
247: };
248: };
249: };
250: h->cy = h->bx.a.y-1; /* just prior to 1st line */
251: /* synchronize FILE * ptr with file descr ptr */
252: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
253: return(1);
254: }
255:
256: /* Read next page from AT&T Image Director file header from file descr
257: fileno(h->fp), set up the rest of the header, and return status:
258: 1 OK, 0 EOF, <0 error */
259: int CDF_next_page( h )
260: PIC_hdr *h;
261: { return(-1); /* unimplemented */
262: }
263:
264: #define HASHEADER(h) ((strcmp((h)->type,"postscript")!=0&&strcmp((h)->type,"sunraster")!=0))
265:
266: /* Read AT&T Image Director file header from file descr fileno(h->fp),
267: set up the rest of the header, and return status: 1 OK, 0 EOF, <0 error */
268: int CDF_get_hdr( h )
269: PIC_hdr *h;
270: { char *cp,*parm,hline[HL_MAX];
271: int status,nrd,ch,mny;
272: #define dbg_cdf (0)
273: typedef struct CDF_file {
274: unsigned char raw[16];
275: unsigned char op,np,at;
276: unsigned int l1,l2,len;
277: } CDF_file;
278: typedef struct CDF_page {
279: unsigned char raw[16];
280: unsigned char op,pn,at;
281: unsigned char f1,f2,f3,f4;
282: unsigned int ptr;
283: } CDF_page;
284: typedef struct CDF_recd {
285: unsigned char raw[16];
286: unsigned char op,a1,a2,a3;
287: unsigned int len;
288: Bbx bx;
289: } CDF_recd;
290: CDF_file fh;
291: CDF_page ph;
292: CDF_recd rh;
293:
294: if(dbg_cdf) err("CDF_get_hdr: enter %s",PIC_hdr_toa(h));
295: /* synchronize FILE * ptr with file descr ptr */
296: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
297: strcpy(h->type,"cdf");
298:
299: /* Read CDF File header */
300: if(fread(fh.raw,1,16,h->fp)!=16) return(0);
301: fh.op = fh.raw[0];
302: fh.np = fh.raw[1];
303: fh.at = fh.raw[2];
304: fh.l1 = fh.raw[4]+256*fh.raw[5];
305: fh.l2 = fh.raw[6]+256*fh.raw[7];
306: fh.len = fh.raw[12]+256*(fh.raw[13]+256*(fh.raw[14]+256*fh.raw[15]));
307: if(dbg_cdf) err("CDF_get_hdr: file hdr: op0x%x p%d at0x%x lim1:%u lim2:%u len%u",
308: fh.op,fh.np,fh.at,fh.l1,fh.l2,fh.len);
309: if(fh.op!=0xA0&&fh.op!=0xAF) abort("CDF_get_hdr: file must be CDF type");
310: if(fh.np!=1) err("CDF_get_hdr: file has %d pages - ignore all but 1st",fh.np);
311: switch(fh.at>>4) {
312: case 0: h->res_x = h->res_y = 100; break;
313: case 1: h->res_x = h->res_y = 200; break;
314: case 2: h->res_x = h->res_y = 300; break;
315: default: err("CDF_get_hdr: file has unknown resolution nibble 0x%x -- assume 400 dpi",fh.at>>4);
316: h->res_x = h->res_y = 400;
317: break;
318: };
319: h->bx.a.x = h->bx.a.y = 0;
320: h->bx.b.x = fh.l1;
321: h->bx.b.y = fh.l2;
322: if(fh.op==0xAF) {
323: abort("CDF_get_hdr: file has continuation header");
324: };
325:
326: /* Read 1st page table entry */
327: if(fread(ph.raw,1,16,h->fp)!=16) return(0);
328: ph.op = ph.raw[0];
329: ph.pn = ph.raw[1];
330: ph.at = ph.raw[2];
331: ph.ptr = ph.raw[12]+256*(ph.raw[13]+256*(ph.raw[14]+256*ph.raw[15]));
332: if(dbg_cdf) err("CDF_get_hdr: page hdr: op0x%x p%d at0x%x ptr%u",
333: ph.op,ph.pn,ph.at,ph.ptr);
334: if(ph.op!=0x80&&ph.op!=0x8F)
335: abort("CDF_get_hdr: page opcode 0x%x is peculiar",ph.op);
336: if(ph.pn!=1) err("CDF_get_hdr: page %d out of order - read anyway",ph.pn);
337: switch(ph.at&0x0F) { /* low nibble */
338: case 0: /* portrait */ break;
339: case 1: /* landscape */
340: default: err("CDF_get_hdr: page has peculiar format nibble 0x%x -- assume 40portrait",ph.at&0x0F);
341: break;
342: };
343: switch(ph.at>>4) { /* high nibble */
344: case 0xF: /* background is white */ break;
345: default: err("CDF_get_hdr: page has peculiar color nibble 0x%x -- assume white",ph.at>>4);
346: break;
347: };
348: /* seek top of Page */
349: fseek(h->fp,h->seek+=ph.ptr,0);
350:
351: /* Read CDF Record header */
352: if(fread(rh.raw,1,16,h->fp)!=16) return(0);
353: rh.op = rh.raw[0];
354: rh.a1 = rh.raw[1];
355: rh.a2 = rh.raw[2];
356: rh.a3 = rh.raw[3];
357: rh.len = rh.raw[4]+256*rh.raw[5];
358: rh.bx.a.x = rh.raw[8]+256*rh.raw[9];
359: rh.bx.a.y = rh.raw[10]+256*rh.raw[11];
360: rh.bx.b.x = rh.raw[12]+256*rh.raw[13];
361: rh.bx.b.y = rh.raw[14]+256*rh.raw[15];
362: if(dbg_cdf) err("CDF_get_hdr: record hdr: op0x%x a0x%x,0x%x,0x%x len%u bx%s",
363: rh.op,rh.a1,rh.a2,rh.a3,rh.len,bbx_toa(&rh.bx));
364: switch(rh.op) {
365: case 0x20: /* Image */ break;
366: case 0x01: /* End of Page */
367: case 0x10: /* Text */
368: case 0x1F: /* Text + cont. */
369: case 0x50: /* Text Document */
370: case 0x5F: /* Text Document + cont. */
371: case 0x40: case 0x41: case 0x42: case 0x43: case 0x44:
372: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4A:
373: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F:
374: /* Graphics */
375: default:
376: abort("CDF_get_hdr: record not Image");
377: };
378: if(rh.a2!=0x01) err("CDF_get_hdr: record not opaque - assume opaque");
379: switch(rh.a3&0x0F) { /* compression algorithm */
380: case 1: /* modified run-length code */
381: strcat(h->type,"-mrlc");
382: break;
383: case 0: /* raw */
384: abort("CDF_get_hdr: record compression 0x%x is legal but unsupported",rh.a3&0x0F);
385: break;
386: case 2: /* ccitt_g31 */
387: strcat(h->type,"-g31");
388: abort("CDF_get_hdr: record compression 0x%x is legal but unsupported",rh.a3&0x0F);
389: break;
390: case 3: /* ccitt_g32 or ccitt_g4 */
391: strcat(h->type,"-g32");
392: abort("CDF_get_hdr: record compression 0x%x is legal but unsupported",rh.a3&0x0F);
393: break;
394: default:
395: abort("CDF_get_hdr: record compression 0x%x is peculiar",rh.a3&0x0F);
396: break;
397: };
398: switch(rh.a3>>4) { /* resolution */
399: case 0:
400: h->res_y = 100;
401: break;
402: case 1:
403: h->res_y = 200;
404: break;
405: case 2:
406: h->res_y = 300;
407: break;
408: default:
409: err("CDF_get_hdr: record vert resolution peculiar 0x%x - assume 200 dpi",
410: rh.a3>>4);
411: h->res_y = 200;
412: break;
413: };
414: /* synchronize file descr ptr with FILE * ptr */
415: lseek(fileno(h->fp),h->seek = ftell(h->fp),0);
416: if(dbg_cdf) err("CDF_get_hdr: normal exit %s",PIC_hdr_toa(h));
417: return(1);
418: }
419:
420: /* Read Tagged Image Format File (TIFF) header, from file descr fileno(h->fp),
421: set up the rest of the PIC header, and return status: 1 OK, 0 EOF, <0 error */
422: int TIFF_get_hdr( h )
423: PIC_hdr *h;
424: { err("TIFF not yet supported");
425: return(-1);
426: }
427:
428: /* Write header to picture file, to file descriptor fileno(h->fp), and initialize
429: line buffer and cy. */
430: PIC_put_hdr( h )
431: PIC_hdr *h;
432: { char *cp,*parm,hline[HL_MAX];
433: int status,nrd;
434: unsigned short s;
435: #define put_ushort(S) { s=(S); putc(s&0377,h->fp); putc(s>>8,h->fp); }
436:
437: /* write type header */
438: if( strcmp(h->type,"bitfile")==0 ) { /* bitfile header */
439: put_ushort(0);
440: }
441: else if(HASHEADER(h)) {
442: sprintf(hline,"TYPE=%s\n",h->type);
443: write(fileno(h->fp),hline,strlen(hline));
444: };
445: if(strcmp(h->type,"pico")==0
446: || strcmp(h->type,"dump")==0) {
447: sprintf(hline,"NCHAN=1\n");
448: write(fileno(h->fp),hline,strlen(hline));
449: };
450:
451: /* write window */
452: h->bpl = bbx_wid(&(h->bx));
453: if(strcmp(h->type,"binary")!=0
454: && strcmp(h->type,"bitfile")!=0
455: && strcmp(h->type,"bitmap")!=0
456: && HASHEADER(h)) {
457: sprintf(hline,"WINDOW=%d %d %d %d\n",
458: h->bx.a.x,h->bx.a.y,h->bx.b.x+1,h->bx.b.y+1);
459: write(fileno(h->fp),hline,strlen(hline));
460: }
461: else if(strcmp(h->type,"binary")==0) {
462: h->bpl = (h->bpl+7)/8; /* round up to byte boundary */
463: sprintf(hline,"WINDOW=%d %d %d %d\n",
464: h->bx.a.x,h->bx.a.y,h->bx.b.x+1,h->bx.b.y+1);
465: write(fileno(h->fp),hline,strlen(hline));
466: }
467: else if(strcmp(h->type,"bitmap")==0) {
468: h->bpl = 2*((h->bpl+15)/16); /* round up to 2-byte boundary */
469: sprintf(hline,"WINDOW=%d %d %d %d\n",
470: h->bx.a.x,h->bx.a.y,h->bx.b.x+1,h->bx.b.y+1);
471: write(fileno(h->fp),hline,strlen(hline));
472: }
473: else if(strcmp(h->type,"sunraster")!=0 ) { /* bitfile window */
474: h->bpl = 2*((h->bpl+15)/16); /* round up to 2-byte boundary */
475: put_ushort(h->bx.a.x); put_ushort(h->bx.a.y);
476: put_ushort(h->bx.b.x+1); put_ushort(h->bx.b.y+1);
477: fflush(h->fp);
478: };
479: if( ((h->res_x!=0||h->res_y!=0)) && (HASHEADER(h))
480: && strcmp(h->type,"bitfile")!=0 ) {
481: sprintf(hline,"RES=%d %d\n",h->res_x,h->res_y);
482: write(fileno(h->fp),hline,strlen(hline));
483: };
484: if(h->parms!=NULL && strlen(h->parms)>0 && strcmp(h->type,"bitfile")!=0 ) {
485: sprintf(hline,"PARMS=%s\n",h->parms);
486: write(fileno(h->fp),hline,strlen(hline));
487: };
488: if(h->misc!=NULL && strlen(h->misc)>0 && strcmp(h->type,"bitfile")!=0 ) {
489: write(fileno(h->fp),h->misc,strlen(h->misc));
490: };
491: /* terminating blank line */
492: if( HASHEADER(h) && strcmp(h->type,"bitfile")!=0 ) {
493: hline[0] = '\n';
494: write(fileno(h->fp),hline,1);
495: };
496:
497: if(strcmp(h->type,"rle")==0) { h->bpl = 0; h->line = NULL; }
498: else { /* allocate one extra byte in line buffer as a favor to RLE */
499: if((h->line = (unsigned char *) malloc(h->bpl+1))==NULL) {
500: fprintf(stderr,
501: "piclib: PIC_put_hdr: can't alloc h->line (%d bytes) - abort\n",
502: h->bpl+1);
503: return(-1);
504: };
505: if(strcmp(h->type,"bitfile")==0) {
506: memset(h->line,'\0',h->bpl);
507: if((h->pline = (unsigned char *) malloc(h->bpl+1))==NULL) {
508: fprintf(stderr,
509: "piclib: PIC_put_hdr: can't alloc h->pline (%d bytes) - abort\n",
510: h->bpl+1);
511: return(-1);
512: };
513: };
514: };
515: h->cy = h->bx.a.y-1; /* just prior to 1st line */
516: /* synchronize FILE * ptr with file descr ptr */
517: fseek(h->fp,h->seek = lseek(fileno(h->fp),0L,1),0);
518: }
519:
520: err_PIC_line(h,sl)
521: PIC_hdr *h;
522: char *sl;
523: #define BPL 20 /* bytes to display per line */
524: { char *cp,*ep;
525: int bpl; /* bytes per display line */
526: bpl=0;
527: for(cp=sl,ep=sl+h->bpl; cp!=ep; cp++) {
528: fprintf(stderr,"%o ",0377&(*cp));
529: if((++bpl)%BPL==0) fprintf(stderr,"\n ");
530: };
531: if((bpl)%BPL!=0)fprintf(stderr,"\n");
532: }
533:
534: /* Skip `y' lines of PIC file */
535: PIC_skip(h,y)
536: PIC_hdr *h;
537: int y;
538: { lseek(fileno(h->fp),(long)(y*h->bpl),1);
539: h->seek += y*h->bpl;
540: h->cy += y;
541: }
542:
543: /* Read next full line of picture data, and if OK update line & cy;
544: return status: 1 OK, 0 EOF, -1 ERR.
545: Free buffer in header on EOF. */
546: int PIC_rline(h,lbpp)
547: PIC_hdr *h;
548: unsigned char **lbpp;
549: { int stat;
550: if( (stat=read(fileno(h->fp),h->line,h->bpl)) == h->bpl) {
551: *lbpp=h->line;
552: h->seek += h->bpl;
553: h->cy++;
554: if(PIC_debug) err("read %d bytes from fileno(h->fp) - OK",stat);
555: return(1);
556: }
557: else { /* EOF or ERR */
558: *lbpp=NULL;
559: free(h->line); h->line = NULL;
560: if(PIC_debug) err("read from fileno(h->fp) stat%d",stat);
561: if((stat>=0)&&(stat<h->bpl)) return(0 /*EOF*/);
562: else return(-1);
563: };
564: }
565:
566: /* write a full line of picture data, returning status: 1 OK, 0 EOF, -1 ERR */
567: int PIC_wline(h,line)
568: PIC_hdr *h;
569: unsigned char *line;
570: { int stat;
571: if( (stat=write(fileno(h->fp),line,h->bpl)) == h->bpl) {
572: h->seek += h->bpl;
573: h->cy++;
574: if(PIC_debug) err("wrote %d bytes to fd%d - OK",stat,fileno(h->fp));
575: return(1);
576: }
577: else { /* ERR */
578: err("write to fd%d stat%d",fileno(h->fp),stat);
579: if((stat>=0)&&(stat<h->bpl)) return(0 /*EOF*/);
580: else return(-1);
581: };
582: }
583:
584: char *PIC_hdr_toa(h)
585: PIC_hdr *h;
586: { static char s[120];
587: sprintf(s,"{type=%s bx%s res%d,%d bpl%d cy%d sk%d}",
588: h->type,
589: bbx_toa(&(h->bx)),
590: h->res_x,h->res_y,
591: h->bpl,
592: h->cy,
593: h->seek
594: );
595: return(s);
596: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.