Imported Upstream version 2.3
[xfishtank.git] / gofish / gofish.c
1 #include <stdio.h>
2
3
4 #define BUFFSIZE 128
5
6
7 struct rgb_color {
8 unsigned int red, green, blue;
9 };
10
11 struct rgb_color Colors[16];
12
13 char Head[256];
14
15 int landing = 0;
16 int FishCount = 0;
17
18 int buff[BUFFSIZE];
19 int buffindx = BUFFSIZE;
20
21
22 int buffget();
23
24
25 void
26 readandwrite(w, h)
27 int w, h;
28 {
29 FILE *fp;
30 int i, j;
31 int val1, val2;
32 char name1[256];
33 char name2[256];
34
35 landing = 1;
36 sprintf(name1, "%s%03d.1", Head, FishCount);
37 sprintf(name2, "%s%03d.2", Head, FishCount);
38 fprintf(stderr, "Landing into files (%s) and (%s)\n", name1, name2);
39
40 fp = fopen(name1, "w");
41 if (fp == NULL) {
42 fprintf(stderr, "You should have seen the one that got away!\n");
43 fprintf(stderr, " (cannot open (%s) for write)\n", name1);
44 exit(1);
45 }
46 fprintf(fp, "xstitch_data %d %d 256\nred green blue\n", w, h);
47 for (i = 0; i < 16; i++) {
48 fprintf(fp, "%d %d %d\n", Colors[i].red, Colors[i].green, Colors[i].blue);
49 }
50 for (i = 16; i < 256; i++) {
51 fprintf(fp, "0 0 0\n");
52 }
53 for (j = 0; j < h; j++) {
54 for (i = 0; i < (w / 2); i++) {
55 val1 = buffget();
56 val2 = (val1 >> 4) & 0x0f;
57 fprintf(fp, "%d ", val2);
58 val2 = val1 & 0x0f;
59 fprintf(fp, "%d ", val2);
60 }
61 fprintf(fp, "\n");
62 }
63 fclose(fp);
64
65 for (i = 0; i < ((w / 2) * (h / 2)); i++) {
66 val1 = buffget();
67 }
68
69 fp = fopen(name2, "w");
70 if (fp == NULL) {
71 fprintf(stderr, "You should have seen the one that got away!\n");
72 fprintf(stderr, " (cannot open (%s) for write)\n", name2);
73 exit(1);
74 }
75 fprintf(fp, "xstitch_data %d %d 256\nred green blue\n", w, h);
76 for (i = 0; i < 16; i++) {
77 fprintf(fp, "%d %d %d\n", Colors[i].red, Colors[i].green, Colors[i].blue);
78 }
79 for (i = 16; i < 256; i++) {
80 fprintf(fp, "0 0 0\n");
81 }
82 for (j = 0; j < h; j++) {
83 for (i = 0; i < (w / 2); i++) {
84 val1 = buffget();
85 val2 = (val1 >> 4) & 0x0f;
86 fprintf(fp, "%d ", val2);
87 val2 = val1 & 0x0f;
88 fprintf(fp, "%d ", val2);
89 }
90 fprintf(fp, "\n");
91 }
92 fclose(fp);
93
94 landing = 0;
95 FishCount++;
96 }
97
98
99 void
100 fillbuff()
101 {
102 int i;
103
104 if (buffindx < BUFFSIZE) {
105 for (i = buffindx; i < BUFFSIZE; i++) {
106 buff[(i - buffindx)] = buff[i];
107 }
108 buffindx = BUFFSIZE - buffindx;
109 } else {
110 buffindx = 0;
111 }
112
113 for (i = buffindx; i < BUFFSIZE; i++) {
114 buff[i] = fgetc(stdin);
115 if (buff[i] == EOF) {
116 if (landing) {
117 fprintf(stderr, "You should have seen the one that got away!\n");
118 }
119 fprintf(stderr, " (EOF reached)\n");
120 exit(0);
121 }
122 }
123 buffindx = 0;
124 }
125
126
127 int
128 buffget()
129 {
130 int val;
131
132 if (buffindx == BUFFSIZE) {
133 fillbuff();
134 }
135
136 val = buff[buffindx];
137 buffindx++;
138 return (val);
139 }
140
141
142 int
143 lookstart()
144 {
145 int i, val;
146
147 if ((buff[14] == 0) && (buff[15] == 0) && (buff[16] == 0) && (buff[17] == 15)) {
148 for (i = 0; i < 18; i++) {
149 val = buffget();
150 }
151 return (1);
152 }
153 return (0);
154 }
155
156
157 int
158 lookhint(w, h)
159 int *w;
160 int *h;
161 {
162 int vals[4];
163 int i, indx, indx2, status;
164
165 vals[0] = buffget();
166 vals[1] = buffget();
167 vals[2] = buffget();
168 vals[3] = buffget();
169
170
171 indx = 0;
172 while (1) {
173 indx2 = indx;
174 if (vals[indx2] == 0) {
175 indx2++;
176 if (indx2 == 4) {
177 indx2 = 0;
178 }
179 if (vals[indx2] != 0) {
180 *w = vals[indx2];
181 indx2++;
182 if (indx2 == 4) {
183 indx2 = 0;
184 }
185 if (vals[indx2] == 0) {
186 indx2++;
187 if (indx2 == 4) {
188 indx2 = 0;
189 }
190 if (vals[indx2] != 0) {
191 *h = vals[indx2];
192 fillbuff();
193 fprintf(stderr, "?");
194 status = lookstart();
195 if (status) {
196 return;
197 }
198 }
199 }
200 }
201 }
202 vals[indx] = buffget();
203 indx++;
204 if (indx == 4) {
205 indx = 0;
206 }
207 }
208 }
209
210
211 int
212 lookfish()
213 {
214 int i, indx;
215
216 indx = buffindx;
217 for (i = 0; i < 16; i++) {
218 if ((buff[indx] != 0) || (buff[indx + 1] != i)) {
219 return (0);
220 }
221 indx += 2;
222 /* check red
223 if (buff[indx] != buff[indx + 1])
224 {
225 return(0);
226 }
227 */
228 indx += 2;
229 /* check green
230 if (buff[indx] != buff[indx + 1])
231 {
232 return(0);
233 }
234 */
235 indx += 2;
236 /* check blue
237 if (buff[indx] != buff[indx + 1])
238 {
239 return(0);
240 }
241 */
242 indx += 2;
243 }
244 return (1);
245 }
246
247
248 void
249 getcolors()
250 {
251 int i, val;
252
253 for (i = 0; i < 16; i++) {
254 val = buffget();
255 val = buffget();
256
257 val = buffget();
258 Colors[i].red = val;
259 val = buffget();
260
261 val = buffget();
262 Colors[i].green = val;
263 val = buffget();
264
265 val = buffget();
266 Colors[i].blue = val;
267 val = buffget();
268 }
269 }
270
271
272 main(argc, argv)
273 int argc;
274 char **argv;
275 {
276 int i, status;
277 int w, h;
278
279 if (argc > 1) {
280 strcpy(Head, argv[1]);
281 } else {
282 strcpy(Head, "fish");
283 }
284 fprintf(stderr, "Fishing .....\n");
285 while (1) {
286 lookhint(&w, &h);
287 fprintf(stderr, "I've got a nibble. ");
288 fillbuff();
289 fprintf(stderr, "Setting the hook. ");
290 status = lookfish();
291 if (status == 0) {
292 fprintf(stderr, "Missed it!\n");
293 continue;
294 }
295 getcolors();
296 fprintf(stderr, "Got it!\n");
297 readandwrite(w, h);
298 fprintf(stderr, "Trying for another .....\n");
299 }
300 }
This page took 0.030508 seconds and 4 git commands to generate.