1 /************************************************
3 * Converting binary resources from/to *.rc files
5 * Copyright 1999 Juergen Schmied
12 #ifdef HAVE_SYS_PARAM_H
13 # include <sys/param.h>
15 #include <sys/types.h>
29 extern char* g_lpstrFileName;
33 char* g_lpstrFileName = NULL;
34 char* g_lpstrInputFile = NULL;
36 int b_force_overwrite = 0;
37 LPBYTE p_in_file = NULL;
39 static char* errorOpenFile = "Unable to open file.\n";
40 static char* errorRCFormat = "Unexpexted syntax in rc file line %i\n";
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");
50 void parse_options(int argc, char **argv)
57 g_lpstrInputFile = argv[1];
63 for( i = 1; i < argc - 1; i++ )
65 if( argv[i][0] != '-' ||
66 strlen(argv[i]) != 2 ) break;
68 if( argv[i][1] == 'd')
70 if (strcmp ("bin", argv[i+1])==0)
81 else if ( argv[i][1] == 'f')
83 b_force_overwrite = 1;
92 g_lpstrInputFile = argv[i];
99 int insert_hex (char * infile, FILE * outfile)
105 if( (fd = open( infile, O_RDONLY))==-1 )
107 fprintf(stderr, errorOpenFile );
110 if ((fstat(fd, &st) == -1) || (p_in_file = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
112 fprintf(stderr, errorOpenFile );
117 fprintf (outfile, "{\n '");
121 fprintf(outfile, "%02X", p_in_file[i]);
122 if (++i >= st.st_size) break;
123 fprintf(outfile, "%s", (i == (i & 0xfffffff0)) ? "'\n '" :" ");
125 fprintf (outfile, "'\n}\n");
126 munmap(p_in_file, st.st_size);
131 int convert_to_res ()
136 char tmpfile[L_tmpnam];
142 long startpos, endpos;
145 if( (ftemp = fopen( tmpfile, "w")) == NULL ) goto error_open_file;
147 if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
148 tinput = st.st_ctime;
150 while ( NULL != fgets(buffer, 255, fin))
152 fputs(buffer, ftemp);
154 if ( (pos = strstr(buffer, "BINRES")) != NULL)
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);
163 if ( (!stat(infile, &st) && st.st_ctime > tinput) || b_force_overwrite)
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;
172 insert_hex(infile, ftemp);
176 printf("[%s:s]", infile);
183 if (rename(tmpfile, g_lpstrInputFile) == -1)
192 fprintf(stderr, errorOpenFile );
196 fprintf(stderr, errorRCFormat, line);
206 int len, index, in_resource;
212 if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
213 tinput = st.st_ctime;
215 while ( NULL != fgets(buffer, 255, fin))
218 if ( (pos = strstr(buffer, "BINRES")) != NULL)
220 /* get the out-file name */
222 while ( *pos == ' ') pos++;
223 while ( pos[len] != ' ') len++;
224 strncpy(outfile, pos, len);
227 if ( stat(outfile, &st) || st.st_ctime < tinput || b_force_overwrite)
229 /* write a output file */
230 printf("[%s:c]", outfile);
231 if ( (fout = fopen( outfile, "w")) == NULL) goto error_open_file;
236 if ( NULL == fgets(buffer, 255, fin)) goto error_rc_format;
240 for ( index = 0; buffer[index] != 0; index++ )
244 if ( buffer[index] == '{' ) in_resource = 1;
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);
259 printf("[%s:s]", outfile);
269 fprintf(stderr, errorOpenFile );
273 fprintf(stderr, errorRCFormat, line);
277 int main(int argc, char **argv)
279 parse_options( argc, argv);
281 if (b_to_binary == 0)