1 |
< |
/* Copyright (c) 1987 Regents of the University of California */ |
1 |
> |
/* Copyright (c) 1991 Regents of the University of California */ |
2 |
|
|
3 |
|
#ifndef lint |
4 |
|
static char SCCSid[] = "$SunId$ LBL"; |
17 |
|
|
18 |
|
#define MAXFILE 32 |
19 |
|
|
20 |
+ |
#define SIGNHT 24 |
21 |
+ |
#define setpscom(b,n) sprintf(b, "psign -h %d '%.30s'|pfilt -1 -x /2 -y /2",\ |
22 |
+ |
2*SIGNHT, n) |
23 |
+ |
|
24 |
|
/* output picture size */ |
25 |
|
int xsiz = 0; |
26 |
|
int ysiz = 0; |
37 |
|
char *progname; |
38 |
|
|
39 |
|
struct { |
40 |
< |
char *name; /* file name */ |
40 |
> |
char *name; /* file or command name */ |
41 |
|
FILE *fp; /* stream pointer */ |
42 |
|
int xres, yres; /* picture size */ |
43 |
|
int xloc, yloc; /* anchor point */ |
49 |
|
|
50 |
|
int wrongformat = 0; |
51 |
|
|
52 |
+ |
char tmpbuf[128]; |
53 |
|
|
54 |
+ |
FILE *popen(); |
55 |
+ |
|
56 |
+ |
|
57 |
|
tabputs(s) /* print line preceded by a tab */ |
58 |
|
char *s; |
59 |
|
{ |
74 |
|
char *argv[]; |
75 |
|
{ |
76 |
|
double atof(); |
77 |
+ |
int ncolumns = 0; |
78 |
+ |
int dolabels = 0; |
79 |
+ |
int curcol = 0, curx = 0, cury = 0; |
80 |
|
int an; |
81 |
|
|
82 |
|
progname = argv[0]; |
95 |
|
atof(argv[an+3])); |
96 |
|
an += 3; |
97 |
|
break; |
98 |
+ |
case 'a': |
99 |
+ |
ncolumns = atoi(argv[++an]); |
100 |
+ |
break; |
101 |
+ |
case 'l': |
102 |
+ |
dolabels++; |
103 |
+ |
break; |
104 |
|
case '\0': |
105 |
|
case 't': |
106 |
|
goto dofiles; |
109 |
|
} |
110 |
|
dofiles: |
111 |
|
for (nfile = 0; an < argc; nfile++) { |
112 |
< |
if (nfile >= MAXFILE) { |
112 |
> |
if (dolabels) { |
113 |
> |
if (nfile >= MAXFILE-1) { |
114 |
> |
fprintf(stderr, |
115 |
> |
"%s: only %d files allowed with labels\n", |
116 |
> |
progname, MAXFILE/2); |
117 |
> |
} |
118 |
> |
} else { |
119 |
> |
if (nfile >= MAXFILE) { |
120 |
> |
fprintf(stderr, "%s: only %d files allowed\n", |
121 |
> |
progname, MAXFILE); |
122 |
> |
quit(1); |
123 |
> |
} |
124 |
> |
} |
125 |
> |
if (nfile >= (dolabels ? MAXFILE-1 : MAXFILE)) { |
126 |
|
fprintf(stderr, "%s: too many files\n", progname); |
127 |
|
quit(1); |
128 |
|
} |
154 |
|
goto userr; |
155 |
|
} |
156 |
|
getfile: |
157 |
< |
if (argc-an < 3) |
157 |
> |
if (argc-an < (ncolumns ? 1 : 3)) |
158 |
|
goto userr; |
159 |
|
if (!strcmp(argv[an], "-")) { |
160 |
|
input[nfile].name = "<stdin>"; |
161 |
|
input[nfile].fp = stdin; |
162 |
|
} else { |
163 |
|
input[nfile].name = argv[an]; |
164 |
< |
if ((input[nfile].fp = fopen(argv[an], "r")) == NULL) { |
164 |
> |
if ((input[nfile].fp = argv[an][0] == '!' ? |
165 |
> |
popen(argv[an]+1, "r") : |
166 |
> |
fopen(argv[an], "r")) == NULL) { |
167 |
|
perror(argv[an]); |
168 |
|
quit(1); |
169 |
|
} |
184 |
|
input[nfile].name); |
185 |
|
quit(1); |
186 |
|
} |
187 |
< |
input[nfile].xloc = atoi(argv[an++]); |
188 |
< |
input[nfile].yloc = atoi(argv[an++]); |
187 |
> |
if (ncolumns > 0) { |
188 |
> |
if (curcol >= ncolumns) { |
189 |
> |
cury = ymax; |
190 |
> |
curx = 0; |
191 |
> |
curcol = 0; |
192 |
> |
} |
193 |
> |
input[nfile].xloc = curx; |
194 |
> |
input[nfile].yloc = cury; |
195 |
> |
curx += input[nfile].xres; |
196 |
> |
curcol++; |
197 |
> |
} else { |
198 |
> |
input[nfile].xloc = atoi(argv[an++]); |
199 |
> |
input[nfile].yloc = atoi(argv[an++]); |
200 |
> |
} |
201 |
|
if (input[nfile].xloc < xmin) |
202 |
|
xmin = input[nfile].xloc; |
203 |
|
if (input[nfile].yloc < ymin) |
206 |
|
xmax = input[nfile].xloc+input[nfile].xres; |
207 |
|
if (input[nfile].yloc+input[nfile].yres > ymax) |
208 |
|
ymax = input[nfile].yloc+input[nfile].yres; |
209 |
+ |
if (dolabels) { |
210 |
+ |
input[++nfile].name = "<Label>"; |
211 |
+ |
setpscom(tmpbuf, input[nfile-1].name); |
212 |
+ |
if ((input[nfile].fp = popen(tmpbuf, "r")) == NULL) |
213 |
+ |
goto labelerr; |
214 |
+ |
if (checkheader(input[nfile].fp, COLRFMT, NULL) < 0) |
215 |
+ |
goto labelerr; |
216 |
+ |
if (fgetresolu(&input[nfile].xres, &input[nfile].yres, |
217 |
+ |
input[nfile].fp) != (YMAJOR|YDECR)) |
218 |
+ |
goto labelerr; |
219 |
+ |
input[nfile].xloc = input[nfile-1].xloc; |
220 |
+ |
input[nfile].yloc = input[nfile-1].yloc + |
221 |
+ |
input[nfile-1].yres - SIGNHT; |
222 |
+ |
input[nfile].hasmin = input[nfile].hasmax = 0; |
223 |
+ |
} |
224 |
|
} |
225 |
|
if (xsiz <= 0) |
226 |
|
xsiz = xmax; |
237 |
|
userr: |
238 |
|
fprintf(stderr, "Usage: %s [-x xres][-y yres][-b r g b] ", progname); |
239 |
|
fprintf(stderr, "[-t min1][+t max1] file1 x1 y1 ..\n"); |
240 |
+ |
quit(1); |
241 |
+ |
labelerr: |
242 |
+ |
fprintf(stderr, "%s: error opening label\n", progname); |
243 |
|
quit(1); |
244 |
|
} |
245 |
|
|