#include <u.h>
#include <libc.h>
#include <libg.h>
#include <fb.h>
#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);
}