New tool to convert the binary resources in *.rc files (hexdumps) from
and to a binary.
diff --git a/tools/bin2res.c b/tools/bin2res.c
new file mode 100644
index 0000000..5830739
--- /dev/null
+++ b/tools/bin2res.c
@@ -0,0 +1,291 @@
+/************************************************
+ *
+ * Converting binary resources from/to *.rc files
+ *
+ * Copyright 1999 Juergen Schmied
+ *
+ * 11/99 first release
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <string.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include "winuser.h"
+
+extern char* g_lpstrFileName;
+
+/* global options */
+
+char* g_lpstrFileName = NULL;
+char* g_lpstrInputFile = NULL;
+int b_to_binary = 0;
+int b_force_overwrite = 0;
+LPBYTE p_in_file = NULL;
+
+static char* errorOpenFile = "Unable to open file.\n";
+static char* errorRCFormat = "Unexpexted syntax in rc file line %i\n";
+
+void usage(void)
+{
+ printf("Usage: bin2res [-d bin] [input file]\n");
+ printf(" -d bin convert a *.res back to a binary\n");
+ printf(" -f force overwriting newer files\n");
+ exit(-1);
+}
+
+void parse_options(int argc, char **argv)
+{
+ int i;
+
+ switch( argc )
+ {
+ case 2:
+ g_lpstrInputFile = argv[1];
+ break;
+
+ case 3:
+ case 4:
+ case 5:
+ for( i = 1; i < argc - 1; i++ )
+ {
+ if( argv[i][0] != '-' ||
+ strlen(argv[i]) != 2 ) break;
+
+ if( argv[i][1] == 'd')
+ {
+ if (strcmp ("bin", argv[i+1])==0)
+ {
+ b_to_binary =1;
+ i++;
+ }
+ else
+ {
+ usage();
+ }
+
+ }
+ else if ( argv[i][1] == 'f')
+ {
+ b_force_overwrite = 1;
+ }
+ else
+ {
+ usage();
+ }
+ }
+ if( i == argc - 1 )
+ {
+ g_lpstrInputFile = argv[i];
+ break;
+ }
+ default: usage();
+ }
+}
+
+int insert_hex (char * infile, FILE * outfile)
+{
+ int i;
+ int fd;
+ struct stat st;
+
+ if( (fd = open( infile, O_RDONLY))==-1 )
+ {
+ fprintf(stderr, errorOpenFile );
+ exit(1);
+ }
+ if ((fstat(fd, &st) == -1) || (p_in_file = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
+ {
+ fprintf(stderr, errorOpenFile );
+ close(fd);
+ exit(1);
+ }
+
+ fprintf (outfile, "{\n '");
+ i = 0;
+ while (1)
+ {
+ fprintf(outfile, "%02X", p_in_file[i]);
+ if (++i >= st.st_size) break;
+ fprintf(outfile, "%s", (i == (i & 0xfffffff0)) ? "'\n '" :" ");
+ }
+ fprintf (outfile, "'\n}\n");
+ munmap(p_in_file, st.st_size);
+ close(fd);
+ return 1;
+}
+
+int convert_to_res ()
+{
+ FILE *fin, *ftemp;
+ char buffer[255];
+ char infile[255];
+ char tmpfile[L_tmpnam];
+ char *pos;
+ int c, len;
+ struct stat st;
+ int line = 0;
+ time_t tinput;
+ long startpos, endpos;
+
+ tmpnam(tmpfile);
+ if( (ftemp = fopen( tmpfile, "w")) == NULL ) goto error_open_file;
+
+ if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
+ tinput = st.st_ctime;
+
+ while ( NULL != fgets(buffer, 255, fin))
+ {
+ fputs(buffer, ftemp);
+ line++;
+ if ( (pos = strstr(buffer, "BINRES")) != NULL)
+ {
+ /* get the out-file name */
+ len = 0; pos += 6; startpos=0; endpos=0;
+ while ( *pos == ' ') pos++;
+ while ( pos[len] != ' ') len++;
+ strncpy(infile, pos, len);
+ infile[len]=0;
+
+ if ( (!stat(infile, &st) && st.st_ctime > tinput) || b_force_overwrite)
+ {
+ /* write a output file */
+ printf("[%s:c]", infile);
+ while((c = fgetc(fin))!='{' && c != EOF) fputc(c, ftemp);
+ if (c == EOF ) goto error_rc_format;
+ while((c = fgetc(fin))!='}' && c != EOF);
+ if (c == EOF ) goto error_rc_format;
+
+ insert_hex(infile, ftemp);
+ }
+ else
+ {
+ printf("[%s:s]", infile);
+ }
+ }
+ }
+
+ fclose(fin);
+ fclose(ftemp);
+ if (rename(tmpfile, g_lpstrInputFile) == -1)
+ {
+ perror("rename");
+ unlink(tmpfile);
+ return 0;
+ }
+ return 1;
+
+error_open_file:
+ fprintf(stderr, errorOpenFile );
+ return 0;
+
+error_rc_format:
+ fprintf(stderr, errorRCFormat, line);
+ return 0;
+}
+
+int convert_to_bin()
+{
+ FILE *fin, *fout;
+ char buffer[255];
+ char outfile[255];
+ char *pos;
+ int len, index, in_resource;
+ unsigned int byte;
+ struct stat st;
+ int line = 0;
+ time_t tinput;
+
+ if( (fin = fopen( g_lpstrInputFile, "r")) == NULL || stat(g_lpstrInputFile, &st)) goto error_open_file;
+ tinput = st.st_ctime;
+
+ while ( NULL != fgets(buffer, 255, fin))
+ {
+ line++;
+ if ( (pos = strstr(buffer, "BINRES")) != NULL)
+ {
+ /* get the out-file name */
+ len = 0; pos += 6;
+ while ( *pos == ' ') pos++;
+ while ( pos[len] != ' ') len++;
+ strncpy(outfile, pos, len);
+ outfile[len]=0;
+
+ if ( stat(outfile, &st) || st.st_ctime < tinput || b_force_overwrite)
+ {
+ /* write a output file */
+ printf("[%s:c]", outfile);
+ if ( (fout = fopen( outfile, "w")) == NULL) goto error_open_file;
+
+ in_resource = 0;
+ while (1)
+ {
+ if ( NULL == fgets(buffer, 255, fin)) goto error_rc_format;
+ line++;
+
+ /* parse a line */
+ for ( index = 0; buffer[index] != 0; index++ )
+ {
+ if ( ! in_resource )
+ {
+ if ( buffer[index] == '{' ) in_resource = 1;
+ continue;
+ }
+
+ if ( buffer[index] == ' ' || buffer[index] == '\''|| buffer[index] == '\n' ) continue;
+ if ( buffer[index] == '}' ) goto end_of_resource;
+ if ( ! isxdigit(buffer[index])) goto error_rc_format;
+ index += sscanf(&buffer[index], "%02x", &byte);
+ fputc(byte, fout);
+ }
+ }
+ fclose(fout);
+ }
+ else
+ {
+ printf("[%s:s]", outfile);
+ }
+end_of_resource:
+ }
+ }
+
+ fclose(fin);
+ return 1;
+
+error_open_file:
+ fprintf(stderr, errorOpenFile );
+ return 0;
+
+error_rc_format:
+ fprintf(stderr, errorRCFormat, line);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ parse_options( argc, argv);
+
+ if (b_to_binary == 0)
+ {
+ convert_to_res();
+ }
+ else
+ {
+ convert_to_bin();
+ }
+ printf("\n");
+ return 0;
+}