Fixed compile error.
[wine] / tools / bin2res.c
1 /************************************************
2  *
3  * Converting binary resources from/to *.rc files
4  *
5  * Copyright 1999 Juergen Schmied
6  *
7  * 11/99 first release
8  */
9
10 #include "config.h"
11
12 #ifdef HAVE_SYS_PARAM_H
13 # include <sys/param.h>
14 #endif
15 #include <sys/types.h>
16 #include <sys/stat.h>
17
18 #include <ctype.h>
19 #include <string.h>
20
21 #include <stdio.h>
22 #include <stdlib.h>
23
24 #include <fcntl.h>
25 #include <unistd.h>
26 #include <sys/mman.h>
27 #include "winuser.h"
28
29 extern char*   g_lpstrFileName;
30
31 /* global options */
32
33 char*   g_lpstrFileName = NULL;
34 char*   g_lpstrInputFile = NULL;
35 int     b_to_binary = 0;
36 int     b_force_overwrite = 0;
37 LPBYTE p_in_file = NULL;
38
39 static char*    errorOpenFile = "Unable to open file.\n";
40 static char*    errorRCFormat = "Unexpexted syntax in rc file line %i\n";
41
42 void usage(void)
43 {
44     printf("Usage: bin2res [-d bin] [input file]\n");
45     printf("  -d bin convert a *.res back to a binary\n");
46     printf("  -f force overwriting newer files\n");
47     exit(-1);
48 }
49
50 void parse_options(int argc, char **argv)
51 {
52   int i;
53
54   switch( argc )
55   {
56     case 2:
57          g_lpstrInputFile = argv[1];
58          break;
59
60     case 3:
61     case 4:
62     case 5:
63          for( i = 1; i < argc - 1; i++ )
64          {
65            if( argv[i][0] != '-' ||
66                strlen(argv[i]) != 2 ) break;
67
68            if( argv[i][1] == 'd')
69            {
70              if (strcmp ("bin", argv[i+1])==0)
71              {
72                b_to_binary =1;
73                i++;
74              }
75              else
76              {
77                usage();
78              }
79              
80            }
81            else if ( argv[i][1] == 'f')
82            {
83              b_force_overwrite = 1;
84            }
85            else
86            {
87              usage();
88            }
89          } 
90          if( i == argc - 1 )
91          {
92            g_lpstrInputFile = argv[i];
93            break;
94          }
95     default: usage();
96   }
97 }
98
99 int insert_hex (char * infile, FILE * outfile)
100 {
101         int i;
102         int             fd;
103         struct stat     st;
104
105         if( (fd = open( infile, O_RDONLY))==-1 ) 
106         {
107           fprintf(stderr, errorOpenFile );
108           exit(1);
109         }
110         if ((fstat(fd, &st) == -1) || (p_in_file = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)-1)
111         {
112           fprintf(stderr, errorOpenFile );
113           close(fd);
114           exit(1);
115         }
116
117         fprintf (outfile, "{\n '");
118         i = 0;
119         while (1)
120         {
121           fprintf(outfile, "%02X", p_in_file[i]);
122           if (++i >= st.st_size) break;
123           fprintf(outfile, "%s", (i == (i & 0xfffffff0)) ? "'\n '" :" ");
124         }
125         fprintf (outfile, "'\n}\n");
126         munmap(p_in_file, st.st_size);
127         close(fd);
128         return 1;       
129 }
130
131 int convert_to_res ()
132 {
133         FILE    *fin, *ftemp;
134         char    buffer[255];
135         char    infile[255];
136         char    tmpfile[L_tmpnam];
137         char    *pos;
138         int     c, len;
139         struct stat     st;
140         int line = 0;
141         time_t  tinput;
142         long startpos, endpos;
143                 
144         tmpnam(tmpfile);
145         if( (ftemp = fopen( tmpfile, "w")) == NULL ) goto error_open_file;
146         
147         if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
148         tinput = st.st_ctime;
149         
150         while ( NULL != fgets(buffer, 255, fin))
151         {
152           fputs(buffer, ftemp);
153           line++;
154           if ( (pos = strstr(buffer, "BINRES")) != NULL)
155           {
156             /* get the out-file name */
157             len = 0; pos += 6; startpos=0; endpos=0;
158             while ( *pos == ' ') pos++;
159             while ( pos[len] != ' ') len++;
160             strncpy(infile, pos, len);
161             infile[len]=0;
162             
163             if ( (!stat(infile, &st) && st.st_ctime > tinput) || b_force_overwrite)
164             {
165               /* write a output file */
166               printf("[%s:c]", infile);
167               while((c = fgetc(fin))!='{' && c != EOF) fputc(c, ftemp);
168               if (c == EOF ) goto error_rc_format;
169               while((c = fgetc(fin))!='}' && c != EOF);
170               if (c == EOF ) goto error_rc_format;
171
172               insert_hex(infile, ftemp);
173             }
174             else
175             {
176               printf("[%s:s]", infile);
177             }
178           }
179         }
180         
181         fclose(fin);
182         fclose(ftemp);
183         if (rename(tmpfile, g_lpstrInputFile) == -1)
184         {
185             perror("rename");
186             unlink(tmpfile);
187             return 0;
188         }
189         return 1;       
190
191 error_open_file:
192         fprintf(stderr, errorOpenFile );
193         return 0;
194
195 error_rc_format:        
196         fprintf(stderr, errorRCFormat, line);
197         return 0;
198 }
199
200 int convert_to_bin()
201 {
202         FILE    *fin, *fout;
203         char    buffer[255];
204         char    outfile[255];
205         char    *pos;
206         int     len, index, in_resource;
207         unsigned int    byte;
208         struct stat     st;
209         int line = 0;
210         time_t  tinput;
211                 
212         if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
213         tinput = st.st_ctime;
214         
215         while ( NULL != fgets(buffer, 255, fin))
216         {
217           line++;
218           if ( (pos = strstr(buffer, "BINRES")) != NULL)
219           {
220             /* get the out-file name */
221             len = 0; pos += 6;
222             while ( *pos == ' ') pos++;
223             while ( pos[len] != ' ') len++;
224             strncpy(outfile, pos, len);
225             outfile[len]=0;
226             
227             if ( stat(outfile, &st) || st.st_ctime < tinput || b_force_overwrite)
228             {
229               /* write a output file */
230               printf("[%s:c]", outfile);
231               if ( (fout = fopen( outfile, "w")) == NULL) goto error_open_file;
232
233               in_resource = 0;
234               while (1)
235               {
236                 if ( NULL == fgets(buffer, 255, fin)) goto error_rc_format;
237                 line++;
238
239                 /* parse a line */
240                 for ( index = 0; buffer[index] != 0; index++ )
241                 {
242                   if ( ! in_resource )
243                   {
244                     if ( buffer[index] == '{' ) in_resource = 1;
245                     continue;
246                   }
247
248                   if ( buffer[index] == ' ' || buffer[index] == '\''|| buffer[index] == '\n' ) continue;
249                   if ( buffer[index] == '}' ) goto end_of_resource;
250                   if ( ! isxdigit(buffer[index])) goto error_rc_format;
251                   index += sscanf(&buffer[index], "%02x", &byte);
252                   fputc(byte, fout);
253                 }  
254               }
255               fclose(fout);
256             }
257             else
258             {
259               printf("[%s:s]", outfile);
260             }
261 end_of_resource:            
262           }
263         }
264         
265         fclose(fin);
266         return 1;       
267
268 error_open_file:
269         fprintf(stderr, errorOpenFile );
270         return 0;
271
272 error_rc_format:        
273         fprintf(stderr, errorRCFormat, line);
274         return 0;
275 }
276
277 int main(int argc, char **argv)
278 {
279         parse_options( argc, argv);
280
281         if (b_to_binary == 0)
282         {
283           convert_to_res();
284         }
285         else
286         {
287           convert_to_bin();
288         }
289         printf("\n");
290         return 0;
291 }