ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/mtext.c
Revision: 1.1
Committed: Sat Feb 22 02:07:26 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * Program to convert ascii file to metafile
6 *
7 * 6/4/85
8 *
9 * cc mtext.c mfio.o syscalls.o misc.o
10 */
11
12
13 #include "meta.h"
14
15 #define MAXLINE 1024
16
17 #define CWIDTH 250
18
19 #define CTHICK 0
20
21 #define CDIR 0
22
23 #define CCOLOR 0
24
25 #define BYASPECT(w) ((w)*3/2)
26
27 static int cwidth = CWIDTH,
28 cheight = BYASPECT(CWIDTH),
29 cthick = CTHICK,
30 cdir = CDIR,
31 ccolor = CCOLOR;
32
33 char *progname;
34
35
36
37 main(argc, argv)
38
39 int argc;
40 char **argv;
41
42 {
43 FILE *fp;
44
45 #ifdef CPM
46 fixargs("mtext", &argc, &argv);
47 #endif
48
49 progname = *argv++;
50 argc--;
51
52 while (argc && **argv == '-') {
53 switch (*(*argv+1)) {
54 case 'w':
55 case 'W':
56 cwidth = atoi(*argv+2);
57 cheight = BYASPECT(cwidth);
58 if (cheight < 0 || cheight > XYSIZE)
59 error(USER, "illegal character width");
60 break;
61 case 't':
62 case 'T':
63 cthick = atoi(*argv+2);
64 if (cthick < 0 || cthick > 3)
65 error(USER, "thickness values between 0 and 3 only");
66 break;
67 case 'r':
68 case 'R':
69 cdir = 0;
70 break;
71 case 'u':
72 case 'U':
73 cdir = 1;
74 break;
75 case 'l':
76 case 'L':
77 cdir = 2;
78 break;
79 case 'd':
80 case 'D':
81 cdir = 3;
82 break;
83 case 'c':
84 case 'C':
85 ccolor = atoi(*argv+2);
86 if (ccolor < 0 || ccolor > 3)
87 error(USER, "color values between 0 and 3 only");
88 break;
89 default:
90 sprintf(errmsg, "unknown option '%s'", *argv);
91 error(WARNING, errmsg);
92 break;
93 }
94 argv++;
95 argc--;
96 }
97
98 if (argc)
99 while (argc) {
100 fp = efopen(*argv, "r");
101 execute(fp);
102 fclose(fp);
103 argv++;
104 argc--;
105 }
106 else
107 execute(stdin);
108
109 pglob(PEOF, 0200, NULL);
110
111 return(0);
112 }
113
114
115
116
117 execute(fp) /* execute a file */
118
119 FILE *fp;
120
121 {
122 static char linbuf[MAXLINE];
123 int nlines;
124 char **section;
125 char *calloc(), *malloc(), *fgets(), *strcpy();
126 int maxlen;
127 int done;
128 int i, j, k;
129
130 nlines = XYSIZE/cheight;
131 done = FALSE;
132
133 if ((section = (char **)calloc(nlines, sizeof(char *))) == NULL)
134 error(SYSTEM, "out of memory in execute");
135
136 while (!done) {
137 maxlen = 0;
138 for (j = 0; j < nlines; j++) {
139 if (done = fgets(linbuf, MAXLINE, fp) == NULL)
140 break;
141 k = strlen(linbuf);
142 if (linbuf[k-1] == '\n')
143 linbuf[--k] = '\0'; /* get rid of newline */
144 if (k > maxlen)
145 maxlen = k;
146 if ((section[j] = malloc(k+1)) == NULL)
147 error(SYSTEM, "out of memory in execute");
148 strcpy(section[j], linbuf);
149 }
150 if (maxlen > 0)
151 sectout(section, j, maxlen);
152 for (k = 0; k < j; k++) {
153 free(section[k]);
154 section[k] = NULL;
155 }
156 }
157
158 free((char *)section);
159
160 }
161
162
163
164
165 sectout(sect, nlines, maxlen) /* write out a section */
166
167 char **sect;
168 int nlines;
169 int maxlen;
170
171 {
172 int linwidt;
173 char *strncpy();
174 char *slin;
175 int i, j;
176
177 linwidt = XYSIZE/cwidth;
178
179 if ((slin = malloc(linwidt + 1)) == NULL)
180 error(SYSTEM, "out of memory in sectout");
181
182 for (i = 0; i < maxlen; i += linwidt) {
183
184 if (i > 0)
185 pglob(PEOP, cdir, NULL);
186
187 for (j = 0; j < nlines; j++)
188 if (i < strlen(sect[j])) {
189 strncpy(slin, sect[j] + i, linwidt);
190 slin[linwidt] = '\0';
191 plotstr(j, slin);
192 }
193
194 }
195
196 pglob(PEOP, 0200, NULL);
197 free(slin);
198
199 }
200
201
202
203 plotstr(lino, s) /* plot string on line lino */
204
205 int lino;
206 char *s;
207
208 {
209 int a0;
210 register int bottom, right;
211
212 a0 = (cdir<<4) | (cthick<<2) | ccolor;
213 bottom = XYSIZE-(lino+1)*cheight;
214 right = strlen(s)*cwidth;
215
216 switch (cdir) {
217 case 0: /* right */
218 pprim(PVSTR, a0, 0, bottom, right, bottom+cheight-1, s);
219 break;
220 case 1: /* up */
221 pprim(PVSTR, a0, XYSIZE-bottom-cheight+1, 0,
222 XYSIZE-bottom, right, s);
223 break;
224 case 2: /* left */
225 pprim(PVSTR, a0, XYSIZE-right, XYSIZE-bottom-cheight+1,
226 XYSIZE-1, XYSIZE-bottom, s);
227 break;
228 case 3: /* down */
229 pprim(PVSTR, a0, bottom, XYSIZE-right,
230 bottom+cheight-1, XYSIZE-1, s);
231 break;
232 }
233
234 }