|
|
1.1 root 1: #include <picfile.h>
2: #include <stdio.h>
3: #include <libc.h>
4: #define NLINE 1024 /* maximum length of header line */
5: PWR_error(f, buf)
6: PICFILE *f;
7: char *buf;
8: {
9: return 0;
10: }
11: PICFILE *picopen_r(file)
12: char *file;
13: {
14: char line[NLINE+1];
15: register char *lp;
16: char *nchan, *window, *command;
17: int x0, y0, x1, y1, i, n;
18: PICFILE *p=(PICFILE *)malloc(sizeof(PICFILE));
19: if(p==0){
20: PIC_error="Can't allocate PICFILE";
21: return 0;
22: }
23: p->flags=PIC_NOCLOSE|PIC_INPUT;
24: p->argc=-1;
25: p->cmap=0;
26: if(strcmp(file, "IN")==0)
27: p->fd=0;
28: else{
29: p->fd=open(file, 0);
30: if(p->fd<0){
31: Error:
32: if(!(p->flags&PIC_NOCLOSE)) close(p->fd);
33: if(p->argc>=0){
34: for(i=0;i!=p->argc;i++) free(p->argv[i]);
35: free((char *)p->argv);
36: }
37: if(p->cmap) free(p->cmap);
38: free((char *)p);
39: return 0;
40: }
41: p->flags=PIC_INPUT;
42: }
43: p->argc=0;
44: p->argv=(char **)malloc(sizeof(char *));
45: p->argv[0]=0;
46: for(;;){
47: lp=line;
48: do{
49: if(lp==&line[NLINE] || read(p->fd, lp, 1)!=1){
50: PIC_error="Can't read header";
51: goto Error;
52: }
53: }while(*lp++!='\n');
54: if(lp==line+1)
55: break;
56: lp[-1]='\0';
57: lp=strchr(line, '=');
58: if(lp==0){
59: PIC_error="Ill-formed header line";
60: goto Error;
61: }
62: *lp++='\0';
63: picputprop(p, line, lp);
64: }
65: if(strncmp(p->argv[0], "TYPE=", 5)!=0){
66: PIC_error="First header line not TYPE=";
67: goto Error;
68: }
69: p->type=p->argv[0]+5;
70: for(i=0;PIC_conf[i].type;i++)
71: if(strcmp(p->type, PIC_conf[i].type)==0) break;
72: if(!PIC_conf[i].type){
73: PIC_error="Illegal TYPE";
74: goto Error;
75: }
76: p->rd=PIC_conf[i].rd;
77: p->wr=PWR_error;
78: p->cl=PIC_conf[i].cl;
79: p->line=0;
80: p->buf=0;
81: p->chan=picgetprop(p, "CHAN");
82: nchan=picgetprop(p, "NCHAN");
83: if(PIC_conf[i].nchan){
84: p->nchan=PIC_conf[i].nchan;
85: if(nchan && p->nchan!=atoi(nchan)){
86: PIC_error="wrong NCHAN for this TYPE";
87: goto Error;
88: }
89: if(p->chan==0) switch(p->nchan){
90: case 1: p->chan="m"; break;
91: case 3: p->chan="rgb"; break;
92: }
93: }
94: else if(nchan)
95: p->nchan=atoi(nchan);
96: else if(p->chan)
97: p->nchan=strlen(p->chan);
98: else{
99: PIC_error="Neither CHAN nor NCHAN in header";
100: goto Error;
101: }
102: if(p->chan==0 && p->nchan<=16)
103: p->chan="????????????????"+16-p->nchan;
104: window=picgetprop(p, "WINDOW");
105: if(window==0){
106: PIC_error="No WINDOW in header";
107: goto Error;
108: }
109: if(sscanf(window, "%d%d%d%d", &x0, &y0, &x1, &y1)!=4) goto Error;
110: if(x0<x1){
111: p->x=x0;
112: p->width=x1-x0;
113: }
114: else{
115: p->x=x1;
116: p->width=x0-x1;
117: }
118: if(y0<y1){
119: p->y=y0;
120: p->height=y1-y0;
121: }
122: else{
123: p->y=y1;
124: p->height=y0-y1;
125: }
126: if(picgetprop(p, "CMAP")){
127: p->cmap=malloc(3*256);
128: if(p->cmap==0){
129: PIC_error="Can't allocate color map";
130: goto Error;
131: }
132: i=0;
133: lp=p->cmap;
134: while(i!=3*256){
135: n=read(p->fd, lp, 3*256-i);
136: if(n<=0){
137: PIC_error="Can't read color map";
138: goto Error;
139: }
140: i+=n;
141: lp+=n;
142: }
143: }
144: else
145: p->cmap=0;
146: command=picgetprop(p, "COMMAND");
147: if(command==0){
148: sprintf(line, "magically-create %s", file);
149: command=line;
150: }
151: if(PIC_command==0){
152: PIC_command=malloc(strlen(command)+1);
153: if(PIC_command)
154: strcpy(PIC_command, command);
155: }
156: else{
157: PIC_command=realloc(PIC_command, strlen(PIC_command)+strlen(command)+2);
158: if(PIC_command){
159: strcat(PIC_command, "\n");
160: strcat(PIC_command, command);
161: }
162: }
163: return p;
164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.