|
|
researchv10 Norman
#include <picfile.h>
#include <stdio.h>
#include <libc.h>
#define NPROP 1024
PRD_error(f, buf)
PICFILE *f;
char *buf;
{
return 0;
}
extern char cmdline[513]; /* from getflags */
PICFILE *picopen_w(file, type, x, y, w, h, chan, argv, cmap)
char *file, *type, *chan, *argv[], *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=1;
else{
p->fd=creat(file, 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;PIC_conf[i].type;i++)
if(strcmp(type, PIC_conf[i].type)==0) break;
if(!PIC_conf[i].type){
PIC_error="Illegal TYPE";
goto Error;
}
p->rd=PRD_error;
p->wr=PIC_conf[i].wr;
p->cl=PIC_conf[i].cl;
p->line=0;
p->buf=0;
picputprop(p, "TYPE", type);
p->type=picgetprop(p, "TYPE");
sprintf(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(PIC_conf[i].nchan!=0 && PIC_conf[i].nchan!=p->nchan){
PIC_error="wrong NCHAN for this TYPE";
goto Error;
}
sprintf(prop, "%d", p->nchan);
picputprop(p, "NCHAN", prop);
picputprop(p, "CHAN", chan);
p->chan=picgetprop(p, "CHAN");
if(PIC_command) picputprop(p, "COMMAND", PIC_command);
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
sprintf(prop, "magically-create %s", file);
picputprop(p, "COMMAND", prop);
if(cmap){
p->cmap=malloc(3*256);
if(p->cmap==0){
PIC_error="No memory for colormap";
goto Error;
}
memcpy(p->cmap, cmap, 3*256);
picputprop(p, "CMAP", "");
}
else
p->cmap=0;
return p;
}
PWR_header(p)
PICFILE *p;
{
register char **ap, *vp, *ep;
int nlen;
for(ap=p->argv;*ap;ap++){
vp=strchr(*ap, '=')+1;
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{
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);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.