f7ca050bec901f10d2e16be5b7268ef37a5d50d2
[henge/webcc.git] / src / apc / fileparser_old.y
1 /* Asset Package Compiler */
2 %{
3 #include <stdio.h>
4 #include <string.h>
5 #include <dirent.h>
6 #include "sprite.h"
7 #include "symbol.h"
8 #include <png.h>
9
10
11 extern void yyerror();
12 extern int rinit();
13 extern int yylex();
14 #define DIR_SIZE 128/* size when all files have been concatenated together */
15
16 char dir_files[DIR_SIZE];
17 FILE* yyin;
18
19 int populate_yyin(FILE*);
20 int handle_vdat(char *);
21 int eval_png_file(char*);
22 int read_png_file(char*);
23
24 %}
25 %define parse.error verbose
26 %union{
27 char* str;
28 }
29
30 /* %token <str> EXT */
31 /* %token <str> FW */
32 /* %token <str> SPR */
33 /* %token CC */
34
35 /* /\* Rules *\/ */
36 /* %% */
37 /* SS: SPR '/' MD '.' EXT */
38 /* MD: CC '_' FW */
39 /* | FW */
40 /* | CC */
41
42
43 %token <str> VDAT
44 %token ODAT
45 %token ADAT
46
47 /* Rules */
48 %%
49 FLIST : FNAME /* Now output to VDAT.o */
50 FNAME : VDAT {printf("handle_vdat(%s)\n", $1);handle_vdat(yylval.str);printf("handled vdat\n");}
51 | ADAT
52 | ODAT
53
54 %%
55 int
56 main(int argc, char** argv)
57 {
58 /* Take arguments */
59
60 /* Concatenate all files into buf, they are null-terminated
61 by default */
62 FILE *fp;
63
64 fp = fopen("all_files", "w+");
65
66 if(!populate_yyin(fp))
67 printf("error processing the directory");
68
69 yyin = fp;
70 rinit();
71 yyparse(); /* runs handle_vdat after token is scanned */
72
73
74
75 return 0;
76 }
77 void
78 yyerror (char const *s)
79 {
80 fprintf(stderr, "%s\n", s);
81 }
82
83 /* TODO: READ INTO SINGLE BUFFER, NOT A FILE */
84 int
85 populate_yyin(FILE* fp)
86 {
87 int files_pos = 0;
88 int file_len = 0;
89 struct dirent* ep;
90
91 DIR* dp = opendir("pngfiles");
92 /* Concatenate all file names, seperated by '\0'
93 into files[] */
94 if(dp != NULL)
95 {
96 while(ep = readdir(dp))
97 { file_len = strlen(ep->d_name);
98 fwrite(ep->d_name, 1, file_len, fp);
99 printf("writing %s to file\n", ep->d_name);
100 }
101 fseek(fp, SEEK_SET, 0);
102 return 0;
103 }
104 else
105 {return 1;
106 }
107 closedir(dp);
108 }
109
110
111
112
113 /* Analyze file_name for information on sprite sheet,
114 store sprite sheet and label into sprite then
115 push sprite onto sprites[]*/
116 int
117 handle_vdat(char* file_name)
118 {
119 /* Parse the file_name for data */
120
121
122 /* Get the specs of the PNG file */
123 if(!eval_png_file(file_name))
124 {
125 printf("Failed in read_png_file\n");
126 return 1;
127 }
128
129 /* Insert sprite sheet from PNG into sprite_sheets */
130 push_sprite();
131
132
133
134
135 /* Store dir/filename in label as well as any other data that fits */
136 }
137 int eval_png_file(char* file_name)
138 {
139 /* Evaluate file_name for metadata */
140
141 /* Extracts header info from png_file */
142 read_png_file(file_name);
143
144
145 /* Create the symbol and put it in symbol_table[]*/
146
147 return 0;
148 }
149
150
151
152 /* variables for libPNG */
153 int png_width,png_height;
154 png_byte bit_depth;
155 png_byte color_type;
156 png_structp png_ptr;
157 png_infop info_ptr;
158
159 int
160 read_png_file( char* file_name)
161 {
162 /* Setup PNG file */
163 char header[8];
164 int is_png = 0;
165 char* dir = "pngfiles";
166
167 /* TODO: Change this fopen to a real var! */
168 FILE *fp = fopen("pngfiles/env_street_road03_0.png","rb");
169
170 if(!fp)
171 { printf("Could not read file %s in handle_vdat()", file_name);
172 return 1;
173 }
174
175 fread(header, 1, 8, fp);
176
177 is_png = !png_sig_cmp(header, 0, 8);
178 if(!is_png)
179 return 1;
180
181 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
182
183 if (!png_ptr)
184 { printf("Failed to allocate png_ptr\n");
185 return 1;
186 }
187 info_ptr = png_create_info_struct(png_ptr);
188
189 if (!info_ptr)
190 { printf("Failed to create info_ptr\n");
191 png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
192 return 1;
193 }
194
195 png_infop end_info = png_create_info_struct(png_ptr);
196 if (!end_info)
197 { printf("Failed to create end_info \n");
198 png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
199 return 1;
200 }
201
202 if(setjmp(png_jmpbuf(png_ptr)))
203 { printf("Failed in init_io\n");
204 png_destroy_read_struct(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
205 fclose(fp);
206 return 1;
207 }
208 png_init_io(png_ptr, fp);
209 png_set_sig_bytes(png_ptr, 8);
210
211 png_read_info(png_ptr, info_ptr);
212
213 png_width = png_get_image_width(png_ptr, info_ptr);
214 png_height = png_get_image_height(png_ptr, info_ptr);
215 color_type = png_get_color_type(png_ptr, info_ptr);
216 bit_depth = png_get_bit_depth(png_ptr, info_ptr);
217
218 png_read_update_info(png_ptr, info_ptr);
219
220
221 return 0;
222
223 }