#include #include #include #include #define NPROP 8192 /* bug!! this is unchecked!!! */ _PRDerror(PICFILE *f, char *buf){ USED(f, buf); return 0; } char cmdline[513]; /* from getflags */ PICFILE *picopen_w(char *file, char *type, int x, int y, int w, int h, char *chan, char *argv[], char *cmap){ int i; char prop[NPROP]; PICFILE *p=(PICFILE *)malloc(sizeof(PICFILE)); if(p==0) return 0; p->flags=PIC_NOCLOSE; p->argc=-1; p->cmap=0; if(strcmp(file, "OUT")==0) p->fd=dup(1, -1); else{ p->fd=create(file, OWRITE, 0666); if(p->fd<0){ Error: if(!(p->flags&PIC_NOCLOSE)) close(p->fd); if(p->argc>=0){ for(i=0;i!=p->argc;i++) free(p->argv[i]); free((char *)p->argv); } if(p->cmap) free(p->cmap); free((char *)p); return 0; } p->flags=0; } p->argc=0; p->argv=(char **)malloc(sizeof(char *)); p->argv[0]=0; for(i=0;_PICconf[i].type;i++) if(strcmp(type, _PICconf[i].type)==0) break; if(!_PICconf[i].type){ werrstr("Illegal TYPE"); goto Error; } p->rd=_PRDerror; p->wr=_PICconf[i].wr; p->cl=_PICconf[i].cl; p->line=0; p->buf=0; picputprop(p, "TYPE", type); p->type=picgetprop(p, "TYPE"); sprint(prop, "%d %d %d %d", x, y, x+w, y+h); picputprop(p, "WINDOW", prop); p->x=x; p->y=y; p->width=w; p->height=h; p->nchan=strlen(chan); if(_PICconf[i].nchan!=0 && _PICconf[i].nchan!=p->nchan){ werrstr("wrong NCHAN for this TYPE"); goto Error; } sprint(prop, "%d", p->nchan); picputprop(p, "NCHAN", prop); picputprop(p, "CHAN", chan); p->chan=picgetprop(p, "CHAN"); if(_PICcommand) picputprop(p, "COMMAND", _PICcommand); if(cmdline[0]) strcpy(prop, cmdline); else if(argv){ prop[0]='\0'; for(i=0;argv[i];i++){ if(i!=0) strcat(prop, " "); strcat(prop, argv[i]); } } else sprint(prop, "magically-create %s", file); picputprop(p, "COMMAND", prop); if(cmap){ p->cmap=malloc(3*256); if(p->cmap==0){ werrstr("No memory for colormap"); goto Error; } memcpy(p->cmap, cmap, 3*256); picputprop(p, "CMAP", ""); } else p->cmap=0; return p; } void _PWRheader(PICFILE *p){ register char **ap, *vp, *ep; int nlen; for(ap=p->argv;*ap;ap++){ vp=strchr(*ap, '='); if(vp==0) continue; /* error! */ vp++; nlen=vp-*ap; for(;;){ write(p->fd, *ap, nlen); ep=strchr(vp, '\n'); if(ep){ write(p->fd, vp, ep+1-vp); vp=ep+1; } else{ if(vp[0]) write(p->fd, vp, strlen(vp)); write(p->fd, "\n", 1); break; } } } write(p->fd, "\n", 1); if(p->cmap) write(p->fd, p->cmap, 3*256); }