PR binutils/647
authorNick Clifton <nickc@redhat.com>
Mon, 17 Jan 2005 16:24:12 +0000 (16:24 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 17 Jan 2005 16:24:12 +0000 (16:24 +0000)
* rcparse.y (RCDATA): Allow a filename to be supplied as the parameter.
  Parse it with define_rcdata_file().
* resrc.c (define_rcdata_file): New function.
* windres.h: Provide a prototype for the new function.

* resrc.c (define_user_file): Fix typo by replacing "font file" with "file".

binutils/ChangeLog
binutils/rcparse.y
binutils/resrc.c
binutils/windres.h

index e83891f..9a16d82 100644 (file)
@@ -1,3 +1,14 @@
+2005-01-17   Eugene Kotlyarov  <ekot@narod.ru>
+
+       PR binutils/647
+       * rcparse.y (RCDATA): Allow a filename to be supplied as the
+       parameter.  Parse it with define_rcdata_file().
+       * resrc.c (define_rcdata_file): New function.
+       * windres.h: Provide a prototype for the new function.
+
+       * resrc.c (define_user_file): Fix typo by replacing "font file"
+       with "file".
+
 2005-01-16  Jason Thorpe  <thorpej@netbsd.org>
 
        * MAINTAINERS: Update my email address.
 2005-01-16  Jason Thorpe  <thorpej@netbsd.org>
 
        * MAINTAINERS: Update my email address.
index 7aacaaa..98ad3c8 100644 (file)
@@ -1,5 +1,6 @@
 %{ /* rcparse.y -- parser for Windows rc files
 %{ /* rcparse.y -- parser for Windows rc files
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
@@ -1152,6 +1153,13 @@ rcdata:
              YYERROR;
            rcparse_discard_strings ();
          }
              YYERROR;
            rcparse_discard_strings ();
          }
+       | id RCDATA suboptions file_name
+         {
+           define_rcdata_file ($1, &$3, $4);
+           if (yychar != YYEMPTY)
+             YYERROR;
+           rcparse_discard_strings ();
+         }
        ;
 
 /* We use a different lexing algorithm, because rcdata strings may
        ;
 
 /* We use a different lexing algorithm, because rcdata strings may
index c290a9d..296bd69 100644 (file)
@@ -1,5 +1,6 @@
 /* resrc.c -- read and write Windows rc files.
 /* resrc.c -- read and write Windows rc files.
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
@@ -857,7 +858,7 @@ define_font (struct res_id id, const struct res_res_info *resinfo,
   e = open_file_search (filename, FOPEN_RB, "font file", &real_filename);
 
   if (stat (real_filename, &s) < 0)
   e = open_file_search (filename, FOPEN_RB, "font file", &real_filename);
 
   if (stat (real_filename, &s) < 0)
-    fatal (_("stat failed on bitmap file `%s': %s"), real_filename,
+    fatal (_("stat failed on font file `%s': %s"), real_filename,
           strerror (errno));
 
   data = (unsigned char *) res_alloc (s.st_size);
           strerror (errno));
 
   data = (unsigned char *) res_alloc (s.st_size);
@@ -1249,12 +1250,45 @@ define_user_data (struct res_id id, struct res_id type,
   ids[2].named = 0;
   ids[2].u.id = resinfo->language;
 
   ids[2].named = 0;
   ids[2].u.id = resinfo->language;
 
-  r = define_resource (&resources, 3, ids, 0);
+  r = define_resource (& resources, 3, ids, 0);
   r->type = RES_TYPE_USERDATA;
   r->u.userdata = data;
   r->res_info = *resinfo;
 }
 
   r->type = RES_TYPE_USERDATA;
   r->u.userdata = data;
   r->res_info = *resinfo;
 }
 
+void
+define_rcdata_file (struct res_id id, const struct res_res_info *resinfo,
+                   const char *filename)
+{
+  struct rcdata_item *ri;
+  FILE *e;
+  char *real_filename;
+  struct stat s;
+  unsigned char *data;
+
+  e = open_file_search (filename, FOPEN_RB, "file", &real_filename);
+
+
+  if (stat (real_filename, &s) < 0)
+    fatal (_("stat failed on file `%s': %s"), real_filename,
+          strerror (errno));
+
+  data = (unsigned char *) res_alloc (s.st_size);
+
+  get_data (e, data, s.st_size, real_filename);
+
+  fclose (e);
+  free (real_filename);
+
+  ri = (struct rcdata_item *) res_alloc (sizeof *ri);
+  ri->next = NULL;
+  ri->type = RCDATA_BUFFER;
+  ri->u.buffer.length = s.st_size;
+  ri->u.buffer.data = data;
+
+  define_rcdata (id, resinfo, ri);
+}
+
 /* Define a user data resource where the data is in a file.  */
 
 void
 /* Define a user data resource where the data is in a file.  */
 
 void
@@ -1268,10 +1302,10 @@ define_user_file (struct res_id id, struct res_id type,
   struct res_id ids[3];
   struct res_resource *r;
 
   struct res_id ids[3];
   struct res_resource *r;
 
-  e = open_file_search (filename, FOPEN_RB, "font file", &real_filename);
+  e = open_file_search (filename, FOPEN_RB, "file", &real_filename);
 
   if (stat (real_filename, &s) < 0)
 
   if (stat (real_filename, &s) < 0)
-    fatal (_("stat failed on bitmap file `%s': %s"), real_filename,
+    fatal (_("stat failed on file `%s': %s"), real_filename,
           strerror (errno));
 
   data = (unsigned char *) res_alloc (s.st_size);
           strerror (errno));
 
   data = (unsigned char *) res_alloc (s.st_size);
index bd1c636..ef754ce 100644 (file)
@@ -1,5 +1,6 @@
 /* windres.h -- header file for windres program.
 /* windres.h -- header file for windres program.
-   Copyright 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+   Copyright 1997, 1998, 2000, 2002, 2003, 2005
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
@@ -829,6 +830,8 @@ extern void define_messagetable
   (struct res_id, const struct res_res_info *, const char *);
 extern void define_rcdata
   (struct res_id, const struct res_res_info *, struct rcdata_item *);
   (struct res_id, const struct res_res_info *, const char *);
 extern void define_rcdata
   (struct res_id, const struct res_res_info *, struct rcdata_item *);
+extern void define_rcdata_file 
+  (struct res_id, const struct res_res_info *, const char *);
 extern struct rcdata_item *define_rcdata_string
   (const char *, unsigned long);
 extern struct rcdata_item *define_rcdata_number (unsigned long, int);
 extern struct rcdata_item *define_rcdata_string
   (const char *, unsigned long);
 extern struct rcdata_item *define_rcdata_number (unsigned long, int);