* readelf.c (get_dynamic_type): Handle DT_GNU_PRELINKED,
[deliverable/binutils-gdb.git] / binutils / resbin.c
index 8fc07fbb29253928b7aad22c7252dc7fdcb62b6c..079818c6fab911de89d2c5453d5e3e66e54e0b92 100644 (file)
@@ -1,5 +1,5 @@
 /* resbin.c -- manipulate the Windows binary resource format.
 /* resbin.c -- manipulate the Windows binary resource format.
-   Copyright 1997, 1998 Free Software Foundation, Inc.
+   Copyright 1997, 1998, 1999, 2002 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.
@@ -30,6 +30,7 @@
 
 /* Macros to swap in values.  */
 
 
 /* Macros to swap in values.  */
 
+#define get_8(s)      (*((unsigned char *)(s)))
 #define get_16(be, s) ((be) ? bfd_getb16 (s) : bfd_getl16 (s))
 #define get_32(be, s) ((be) ? bfd_getb32 (s) : bfd_getl32 (s))
 
 #define get_16(be, s) ((be) ? bfd_getb16 (s) : bfd_getl16 (s))
 #define get_32(be, s) ((be) ? bfd_getb32 (s) : bfd_getl32 (s))
 
@@ -68,6 +69,9 @@ static struct res_resource *bin_to_res_version
   PARAMS ((const unsigned char *, unsigned long, int));
 static struct res_resource *bin_to_res_userdata
   PARAMS ((const unsigned char *, unsigned long, int));
   PARAMS ((const unsigned char *, unsigned long, int));
 static struct res_resource *bin_to_res_userdata
   PARAMS ((const unsigned char *, unsigned long, int));
+static void get_version_header
+  PARAMS ((const unsigned char *, unsigned long, int, const char *,
+          unichar **, int *, int *, int *, int *));
 
 /* Given a resource type ID, a pointer to data, a length, return a
    res_resource structure which represents that resource.  The caller
 
 /* Given a resource type ID, a pointer to data, a length, return a
    res_resource structure which represents that resource.  The caller
@@ -460,7 +464,7 @@ bin_to_res_dialog (data, length, big_endian)
      unsigned long length;
      int big_endian;
 {
      unsigned long length;
      int big_endian;
 {
-  int version;
+  int signature;
   struct dialog *d;
   int c, sublen, i;
   unsigned int off;
   struct dialog *d;
   int c, sublen, i;
   unsigned int off;
@@ -472,8 +476,8 @@ bin_to_res_dialog (data, length, big_endian)
 
   d = (struct dialog *) res_alloc (sizeof *d);
 
 
   d = (struct dialog *) res_alloc (sizeof *d);
 
-  version = get_16 (big_endian, data);
-  if (version != 1)
+  signature = get_16 (big_endian, data + 2);
+  if (signature != 0xffff)
     {
       d->ex = NULL;
       d->style = get_32 (big_endian, data);
     {
       d->ex = NULL;
       d->style = get_32 (big_endian, data);
@@ -482,11 +486,11 @@ bin_to_res_dialog (data, length, big_endian)
     }
   else
     {
     }
   else
     {
-      int signature;
+      int version;
 
 
-      signature = get_16 (big_endian, data + 2);
-      if (signature != 0xffff)
-       fatal (_("unexpected dialog signature %d"), signature);
+      version = get_16 (big_endian, data);
+      if (version != 1)
+       fatal (_("unexpected DIALOGEX version %d"), version);
 
       d->ex = (struct dialog_ex *) res_alloc (sizeof (struct dialog_ex));
       d->ex->help = get_32 (big_endian, data + 4);
 
       d->ex = (struct dialog_ex *) res_alloc (sizeof (struct dialog_ex));
       d->ex->help = get_32 (big_endian, data + 4);
@@ -514,6 +518,8 @@ bin_to_res_dialog (data, length, big_endian)
 
   d->caption = get_unicode (data + off, length - off, big_endian, &sublen);
   off += sublen * 2 + 2;
 
   d->caption = get_unicode (data + off, length - off, big_endian, &sublen);
   off += sublen * 2 + 2;
+  if (sublen == 0)
+    d->caption = NULL;
 
   if ((d->style & DS_SETFONT) == 0)
     {
 
   if ((d->style & DS_SETFONT) == 0)
     {
@@ -523,6 +529,7 @@ bin_to_res_dialog (data, length, big_endian)
        {
          d->ex->weight = 0;
          d->ex->italic = 0;
        {
          d->ex->weight = 0;
          d->ex->italic = 0;
+         d->ex->charset = 1; /* Default charset.  */
        }
     }
   else
        }
     }
   else
@@ -538,7 +545,8 @@ bin_to_res_dialog (data, length, big_endian)
          if (length < off + 4)
            toosmall (_("dialogex font information"));
          d->ex->weight = get_16 (big_endian, data + off);
          if (length < off + 4)
            toosmall (_("dialogex font information"));
          d->ex->weight = get_16 (big_endian, data + off);
-         d->ex->italic = get_16 (big_endian, data + off + 2);
+         d->ex->italic = get_8 (data + off + 2);
+         d->ex->charset = get_8 (data + off + 3);
          off += 4;
        }
 
          off += 4;
        }
 
@@ -587,9 +595,9 @@ bin_to_res_dialog (data, length, big_endian)
       dc->height = get_16 (big_endian, data + off + 6);
 
       if (d->ex != NULL)
       dc->height = get_16 (big_endian, data + off + 6);
 
       if (d->ex != NULL)
-        dc->id = get_32 (big_endian, data + off + 8);
+       dc->id = get_32 (big_endian, data + off + 8);
       else
       else
-        dc->id = get_16 (big_endian, data + off + 8);
+       dc->id = get_16 (big_endian, data + off + 8);
 
       off += 10 + (d->ex != NULL ? 2 : 0);
 
 
       off += 10 + (d->ex != NULL ? 2 : 0);
 
@@ -621,7 +629,7 @@ bin_to_res_dialog (data, length, big_endian)
          dc->data->u.buffer.length = datalen;
          dc->data->u.buffer.data = data + off;
 
          dc->data->u.buffer.length = datalen;
          dc->data->u.buffer.data = data + off;
 
-         off += datalen;         
+         off += datalen;
        }
 
       dc->next = NULL;
        }
 
       dc->next = NULL;
@@ -808,7 +816,7 @@ static struct res_resource *
 bin_to_res_rcdata (data, length, big_endian)
      const unsigned char *data;
      unsigned long length;
 bin_to_res_rcdata (data, length, big_endian)
      const unsigned char *data;
      unsigned long length;
-     int big_endian;
+     int big_endian ATTRIBUTE_UNUSED;
 {
   struct rcdata_item *ri;
   struct res_resource *r;
 {
   struct rcdata_item *ri;
   struct res_resource *r;
@@ -1019,7 +1027,7 @@ bin_to_res_version (data, length, big_endian)
   struct res_resource *r;
 
   get_version_header (data, length, big_endian, "VS_VERSION_INFO",
   struct res_resource *r;
 
   get_version_header (data, length, big_endian, "VS_VERSION_INFO",
-                     (unichar *) NULL, &verlen, &vallen, &type, &off);
+                     (unichar **) NULL, &verlen, &vallen, &type, &off);
 
   if ((unsigned int) verlen != length)
     fatal (_("version length %d does not match resource length %lu"),
 
   if ((unsigned int) verlen != length)
     fatal (_("version length %d does not match resource length %lu"),
@@ -1091,7 +1099,7 @@ bin_to_res_version (data, length, big_endian)
          vi->type = VERINFO_STRING;
 
          get_version_header (data, length, big_endian, "StringFileInfo",
          vi->type = VERINFO_STRING;
 
          get_version_header (data, length, big_endian, "StringFileInfo",
-                             (unichar *) NULL, &verlen, &vallen, &type,
+                             (unichar **) NULL, &verlen, &vallen, &type,
                              &off);
 
          if (vallen != 0)
                              &off);
 
          if (vallen != 0)
@@ -1163,7 +1171,7 @@ bin_to_res_version (data, length, big_endian)
          vi->type = VERINFO_VAR;
 
          get_version_header (data, length, big_endian, "VarFileInfo",
          vi->type = VERINFO_VAR;
 
          get_version_header (data, length, big_endian, "VarFileInfo",
-                             (unichar *) NULL, &verlen, &vallen, &type,
+                             (unichar **) NULL, &verlen, &vallen, &type,
                              &off);
 
          if (vallen != 0)
                              &off);
 
          if (vallen != 0)
@@ -1211,7 +1219,7 @@ bin_to_res_version (data, length, big_endian)
 
       vi->next = NULL;
       *pp = vi;
 
       vi->next = NULL;
       *pp = vi;
-      pp = &vi->next;      
+      pp = &vi->next;
     }
 
   v = (struct versioninfo *) res_alloc (sizeof *v);
     }
 
   v = (struct versioninfo *) res_alloc (sizeof *v);
@@ -1222,7 +1230,7 @@ bin_to_res_version (data, length, big_endian)
   r->type = RES_TYPE_VERSIONINFO;
   r->u.versioninfo = v;
 
   r->type = RES_TYPE_VERSIONINFO;
   r->u.versioninfo = v;
 
-  return r;  
+  return r;
 }
 
 /* Convert an arbitrary user defined resource from binary.  */
 }
 
 /* Convert an arbitrary user defined resource from binary.  */
@@ -1231,7 +1239,7 @@ static struct res_resource *
 bin_to_res_userdata (data, length, big_endian)
      const unsigned char *data;
      unsigned long length;
 bin_to_res_userdata (data, length, big_endian)
      const unsigned char *data;
      unsigned long length;
-     int big_endian;
+     int big_endian ATTRIBUTE_UNUSED;
 {
   struct rcdata_item *ri;
   struct res_resource *r;
 {
   struct rcdata_item *ri;
   struct res_resource *r;
@@ -1252,6 +1260,7 @@ bin_to_res_userdata (data, length, big_endian)
 \f
 /* Macros to swap out values.  */
 
 \f
 /* Macros to swap out values.  */
 
+#define put_8(v, s)      (*((unsigned char *) (s)) = (unsigned char) (v))
 #define put_16(be, v, s) ((be) ? bfd_putb16 ((v), (s)) : bfd_putl16 ((v), (s)))
 #define put_32(be, v, s) ((be) ? bfd_putb32 ((v), (s)) : bfd_putl32 ((v), (s)))
 
 #define put_16(be, v, s) ((be) ? bfd_putb16 ((v), (s)) : bfd_putl16 ((v), (s)))
 #define put_32(be, v, s) ((be) ? bfd_putb32 ((v), (s)) : bfd_putl32 ((v), (s)))
 
@@ -1621,12 +1630,14 @@ res_to_bin_dialog (dialog, big_endian)
          if (dialog->ex == NULL)
            {
              put_16 (big_endian, 0, d->data + 2);
          if (dialog->ex == NULL)
            {
              put_16 (big_endian, 0, d->data + 2);
-             put_16 (big_endian, 0, d->data + 4);
+             put_8 (0, d->data + 4);
+             put_8 (1, d->data + 5);
            }
          else
            {
              put_16 (big_endian, dialog->ex->weight, d->data + 2);
            }
          else
            {
              put_16 (big_endian, dialog->ex->weight, d->data + 2);
-             put_16 (big_endian, dialog->ex->italic, d->data + 4);
+             put_8 (dialog->ex->italic, d->data + 4);
+             put_8 (dialog->ex->charset, d->data + 5);
            }
        }
 
            }
        }
 
@@ -1674,9 +1685,9 @@ res_to_bin_dialog (dialog, big_endian)
       put_16 (big_endian, dc->height, d->data + dcoff + 6);
 
       if (dialogex)
       put_16 (big_endian, dc->height, d->data + dcoff + 6);
 
       if (dialogex)
-        put_32 (big_endian, dc->id, d->data + dcoff + 8);
+       put_32 (big_endian, dc->id, d->data + dcoff + 8);
       else
       else
-        put_16 (big_endian, dc->id, d->data + dcoff + 8);
+       put_16 (big_endian, dc->id, d->data + dcoff + 8);
 
       *pp = d;
       pp = &d->next;
 
       *pp = d;
       pp = &d->next;
@@ -1765,12 +1776,12 @@ res_to_bin_fontdir (fontdirs, big_endian)
 
       d->next = NULL;
       *pp = d;
 
       d->next = NULL;
       *pp = d;
-      pp = &d->next;      
+      pp = &d->next;
     }
 
   put_16 (big_endian, c, first->data);
 
     }
 
   put_16 (big_endian, c, first->data);
 
-  return first;  
+  return first;
 }
 
 /* Convert a group icon resource to binary.  */
 }
 
 /* Convert a group icon resource to binary.  */
@@ -2082,7 +2093,7 @@ res_to_bin_stringtable (st, big_endian)
 
       d->next = NULL;
       *pp = d;
 
       d->next = NULL;
       *pp = d;
-      pp = &d->next;      
+      pp = &d->next;
     }
 
   return first;
     }
 
   return first;
@@ -2111,7 +2122,7 @@ string_to_unicode_bin (s, big_endian)
 
   d->next = NULL;
 
 
   d->next = NULL;
 
-  return d;  
+  return d;
 }
 
 /* Convert a versioninfo resource to binary.  */
 }
 
 /* Convert a versioninfo resource to binary.  */
@@ -2276,7 +2287,7 @@ res_to_bin_versioninfo (versioninfo, big_endian)
                vsslen += length - hold;
 
                *pp = unicode_to_bin (vs->value, big_endian);
                vsslen += length - hold;
 
                *pp = unicode_to_bin (vs->value, big_endian);
-               put_16 (big_endian, (*pp)->length / 2, vssd->data + 2);
+               put_16 (big_endian, (*pp)->length / 2, vssd->data + 2);
                length += (*pp)->length;
                vilen += (*pp)->length;
                vslen += (*pp)->length;
                length += (*pp)->length;
                vilen += (*pp)->length;
                vslen += (*pp)->length;
This page took 0.026643 seconds and 4 git commands to generate.