ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cal/lam.c
Revision: 1.10
Committed: Fri Jun 18 01:12:57 2010 UTC (13 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.9: +8 -2 lines
Log Message:
Modified rlam to use -iw option for 2-byte words and added -ii and -ib options

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 1.10 static const char RCSid[] = "$Id: lam.c,v 1.9 2006/05/07 15:44:28 greg Exp $";
3 greg 1.1 #endif
4     /*
5     * lam.c - simple program to laminate files.
6     *
7     * 7/14/88 Greg Ward
8     */
9    
10 schorsch 1.2 #include <stdlib.h>
11     #include <string.h>
12 greg 1.1 #include <stdio.h>
13 greg 1.7 #include <ctype.h>
14 schorsch 1.2
15     #include "platform.h"
16 schorsch 1.3 #include "rtprocess.h"
17 greg 1.1
18 greg 1.7 #define MAXFILE 512 /* maximum number of files */
19 greg 1.1
20 greg 1.7 #define MAXLINE 4096 /* maximum input line */
21 greg 1.1
22     FILE *input[MAXFILE];
23 greg 1.7 int bytsiz[MAXFILE];
24 greg 1.6 char *tabc[MAXFILE];
25 greg 1.1 int nfiles;
26    
27     char buf[MAXLINE];
28    
29 schorsch 1.4 int
30 greg 1.1 main(argc, argv)
31     int argc;
32     char *argv[];
33     {
34     register int i;
35 greg 1.6 char *curtab;
36 greg 1.7 int curbytes;
37     int running, puteol;
38 greg 1.1
39 greg 1.6 curtab = "\t";
40 greg 1.7 curbytes = 0;
41 greg 1.1 nfiles = 0;
42     for (i = 1; i < argc; i++) {
43     if (argv[i][0] == '-') {
44     switch (argv[i][1]) {
45     case 't':
46 greg 1.6 curtab = argv[i]+2;
47 greg 1.1 break;
48 greg 1.7 case 'i':
49     switch (argv[i][2]) {
50     case 'f':
51     curbytes = sizeof(float);
52     break;
53     case 'd':
54     curbytes = sizeof(double);
55     break;
56 greg 1.10 case 'i':
57     curbytes = sizeof(int);
58     break;
59 greg 1.7 case 'w':
60 greg 1.10 curbytes = 2;
61     break;
62     case 'b':
63     curbytes = 1;
64 greg 1.7 break;
65     case 'a':
66     curbytes = argv[i][3] ? 1 : 0;
67     break;
68     default:
69     goto badopt;
70     }
71     if (isdigit(argv[i][3]))
72     curbytes *= atoi(argv[i]+3);
73     if (curbytes < 0 || curbytes > MAXLINE) {
74     fputs(argv[0], stderr);
75     fputs(": illegal input size\n", stderr);
76     exit(1);
77     }
78 greg 1.8 if (curbytes)
79     curtab = "";
80 greg 1.7 break;
81 greg 1.1 case '\0':
82     tabc[nfiles] = curtab;
83 greg 1.7 bytsiz[nfiles] = curbytes;
84 greg 1.1 input[nfiles++] = stdin;
85     break;
86 greg 1.7 badopt:;
87 greg 1.1 default:
88     fputs(argv[0], stderr);
89     fputs(": bad option\n", stderr);
90     exit(1);
91     }
92     } else if (argv[i][0] == '!') {
93     tabc[nfiles] = curtab;
94 greg 1.7 bytsiz[nfiles] = curbytes;
95 greg 1.9 if ((input[nfiles] = popen(argv[i]+1, "r")) == NULL) {
96 greg 1.1 fputs(argv[i], stderr);
97     fputs(": cannot start command\n", stderr);
98     exit(1);
99     }
100 greg 1.9 if (bytsiz[nfiles])
101     SET_FILE_BINARY(input[nfiles]);
102     ++nfiles;
103 greg 1.1 } else {
104     tabc[nfiles] = curtab;
105 greg 1.7 bytsiz[nfiles] = curbytes;
106 greg 1.9 if ((input[nfiles] = fopen(argv[i], "r")) == NULL) {
107 greg 1.1 fputs(argv[i], stderr);
108     fputs(": cannot open file\n", stderr);
109     exit(1);
110     }
111 greg 1.9 if (bytsiz[nfiles])
112     SET_FILE_BINARY(input[nfiles]);
113     ++nfiles;
114 greg 1.1 }
115     if (nfiles >= MAXFILE) {
116     fputs(argv[0], stderr);
117     fputs(": too many input streams\n", stderr);
118     exit(1);
119     }
120     }
121 greg 1.7 puteol = 0; /* check for tab character */
122     for (i = nfiles; i--; )
123     if (isprint(tabc[i][0]) || tabc[i][0] == '\t') {
124     puteol++;
125     break;
126     }
127 greg 1.1 do {
128     running = 0;
129     for (i = 0; i < nfiles; i++) {
130 greg 1.7 if (bytsiz[i]) { /* binary file */
131     if (fread(buf, bytsiz[i], 1, input[i]) == 1) {
132     if (i)
133     fputs(tabc[i], stdout);
134     fwrite(buf, bytsiz[i], 1, stdout);
135     running++;
136     }
137     } else if (fgets(buf, MAXLINE, input[i]) != NULL) {
138 greg 1.1 if (i)
139 greg 1.6 fputs(tabc[i], stdout);
140 greg 1.1 buf[strlen(buf)-1] = '\0';
141     fputs(buf, stdout);
142 greg 1.7 puteol++;
143 greg 1.1 running++;
144     }
145     }
146 greg 1.7 if (running && puteol)
147 greg 1.1 putchar('\n');
148     } while (running);
149    
150     exit(0);
151     }