Imported Upstream version 2.5
[xfishtank.git] / gofish / gofish.c
CommitLineData
2ac45f02
MG
1#include <stdio.h>
2
3
4#define BUFFSIZE 128
5
6
7struct rgb_color {
8 unsigned int red, green, blue;
9};
10
11struct rgb_color Colors[16];
12
13char Head[256];
14
15int landing = 0;
16int FishCount = 0;
17
18int buff[BUFFSIZE];
19int buffindx = BUFFSIZE;
20
21
22int buffget();
23
24
25void
26readandwrite(w, h)
27int 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
99void
100fillbuff()
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
127int
128buffget()
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
142int
143lookstart()
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
157int
158lookhint(w, h)
159int *w;
160int *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
211int
212lookfish()
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
248void
249getcolors()
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
272main(argc, argv)
273int argc;
274char **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.026461 seconds and 4 git commands to generate.