Annotation of researchv10no/cmd/bcp/piclib.c, revision 1.1

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:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.