* rclex.l: Add casts and change types to avoid warnings.
authorIan Lance Taylor <ian@airs.com>
Wed, 1 Jul 1998 18:30:20 +0000 (18:30 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 1 Jul 1998 18:30:20 +0000 (18:30 +0000)
* rcparse.y: Likewise.
* resbin.c: Likewise.
* rescoff.c: Likewise.
* resrc.c: Likewise.

* Makefile.am: Rebuild dependencies.
  (HFILES): Remove readelf.h.
* Makefile.in: Rebuild.

Based on patches from Andrew Kozin
<Andrew.Kozin@p14.f960.n5020.z2.fidonet.org>:
* winduni.h: New file, from windres.h.
* winduni.c: New file, from windres.c.
* windres.c: Move Unicode functions into winduni.c.
* windres.h: Move Unicode declarations into winduni.h.  Include
winduni.h.
  (RT_ACCELERATOR): Rename from RT_ACCELERATORS to match Windows
macro.  Change all uses.
(RT_PLUGPLAY, RT_VXD): Correct values.
* Makefile.am (HFILES): Add windres.h.
(CFILES): Add winduni.c.
(windres_SOURCES): Add winduni.c.

binutils/.Sanitize
binutils/Makefile.am
binutils/Makefile.in
binutils/rclex.l
binutils/rcparse.y
binutils/resbin.c
binutils/rescoff.c
binutils/windres.h

index 3917b2ad7494e77929cc760545e7d2ac99d4b41b..44eda8785eafe6c7a7b43054c289afdf3ee04086 100644 (file)
@@ -111,6 +111,8 @@ testsuite
 version.c
 windres.c
 windres.h
+winduni.c
+winduni.h
 wrstabs.c
 
 Things-to-lose:
index 553cc7b0b499df8d8fd8f43ddf634a84f30f50fa..36a948ddc433e619dcbf1e1be67498baf6ee4985 100644 (file)
@@ -73,7 +73,7 @@ DEP = mkdep
 INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) @HDEFINES@ -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\""
 
 HFILES = arsup.h bucomm.h budbg.h coffgrok.h debug.h nlmconv.h dlltool.h \
-       windres.h readelf.h
+       windres.h winduni.h
 
 GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h
 
@@ -82,7 +82,7 @@ CFILES = addr2line.c ar.c arsup.c bucomm.c coffdump.c coffgrok.c debug.c \
        maybe-strip.c nlmconv.c nm.c not-ranlib.c not-strip.c \
        objcopy.c objdump.c prdbg.c rdcoff.c rddbg.c size.c srconv.c \
        stabs.c strings.c sysdump.c version.c wrstabs.c \
-       windres.c resrc.c rescoff.c resbin.c readelf.c
+       windres.c resrc.c rescoff.c resbin.c winduni.c readelf.c
 
 GENERATED_CFILES = \
        underscore.c arparse.c arlex.c sysroff.c sysinfo.c syslex.c \
@@ -252,7 +252,7 @@ nlmconv.o: nlmconv.c $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h
 nlmconv_SOURCES = nlmconv.c nlmheader.y $(BULIBS)
 
 windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \
-       $(BULIBS)
+       winduni.c $(BULIBS)
 windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS)
 
 DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \
@@ -430,21 +430,24 @@ wrstabs.o: wrstabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/aout/stab.def
 windres.o: windres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/getopt.h bucomm.h config.h $(INCDIR)/fopen-same.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/obstack.h windres.h
+  $(INCDIR)/libiberty.h $(INCDIR)/obstack.h windres.h \
+  winduni.h
 resrc.o: resrc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
+  windres.h winduni.h
 rescoff.o: rescoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \
+  windres.h winduni.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \
   $(INCDIR)/bfdlink.h
 resbin.o: resbin.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
-readelf.o: readelf.c readelf.h ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  windres.h winduni.h
+winduni.o: winduni.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  bucomm.h config.h $(INCDIR)/fopen-same.h winduni.h
+readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/m32r.h \
-  $(INCDIR)/elf/mips.h bucomm.h config.h $(INCDIR)/fopen-same.h \
-  $(INCDIR)/getopt.h
+  $(INCDIR)/elf/mips.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
+  bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/getopt.h
 underscore.o: underscore.c
 arparse.o: arparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h arsup.h
@@ -461,9 +464,9 @@ nlmheader.o: nlmheader.c ../bfd/bfd.h bucomm.h config.h \
   nlmconv.h
 rcparse.o: rcparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
+  windres.h winduni.h
 rclex.o: rclex.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h rcparse.h
+  windres.h winduni.h rcparse.h
 
 # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
index 69cec5b55a9167475aac1769c9a172e58bafb243..ff9ccc934b74bb3890cc50b6b6e2b3cff289902d 100644 (file)
@@ -145,7 +145,7 @@ DEP = mkdep
 INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) @HDEFINES@ -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\""
 
 HFILES = arsup.h bucomm.h budbg.h coffgrok.h debug.h nlmconv.h dlltool.h \
-       windres.h
+       windres.h winduni.h
 
 GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h
 
@@ -154,7 +154,7 @@ CFILES = addr2line.c ar.c arsup.c bucomm.c coffdump.c coffgrok.c debug.c \
        maybe-strip.c nlmconv.c nm.c not-ranlib.c not-strip.c \
        objcopy.c objdump.c prdbg.c rdcoff.c rddbg.c size.c srconv.c \
        stabs.c strings.c sysdump.c version.c wrstabs.c \
-       windres.c resrc.c rescoff.c resbin.c readelf.c
+       windres.c resrc.c rescoff.c resbin.c winduni.c readelf.c
 
 GENERATED_CFILES = \
        underscore.c arparse.c arlex.c sysroff.c sysinfo.c syslex.c \
@@ -239,7 +239,7 @@ sysdump_SOURCES = sysdump.c $(BULIBS)
 nlmconv_SOURCES = nlmconv.c nlmheader.y $(BULIBS)
 
 windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \
-       $(BULIBS)
+       winduni.c $(BULIBS)
 windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS)
 
 DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \
@@ -289,7 +289,7 @@ filemode.o
 dlltool_DEPENDENCIES =  ../bfd/libbfd.la ../libiberty/libiberty.a
 dlltool_LDFLAGS = 
 windres_OBJECTS =  windres.o resrc.o rescoff.o resbin.o rcparse.o \
-rclex.o bucomm.o version.o filemode.o
+rclex.o winduni.o bucomm.o version.o filemode.o
 windres_DEPENDENCIES =  ../bfd/libbfd.la ../libiberty/libiberty.a
 windres_LDFLAGS = 
 size_OBJECTS =  size.o bucomm.o version.o filemode.o
@@ -425,15 +425,15 @@ install-binPROGRAMS: $(bin_PROGRAMS)
        $(mkinstalldirs) $(DESTDIR)$(bindir)
        @list='$(bin_PROGRAMS)'; for p in $$list; do \
          if test -f $$p; then \
-           echo " $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
-           $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+           echo " $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+           $(LIBTOOL)  --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
          else :; fi; \
        done
 
 uninstall-binPROGRAMS:
        @$(NORMAL_UNINSTALL)
        list='$(bin_PROGRAMS)'; for p in $$list; do \
-         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
        done
 
 mostlyclean-noinstPROGRAMS:
@@ -1202,21 +1202,24 @@ wrstabs.o: wrstabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/aout/stab.def
 windres.o: windres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/getopt.h bucomm.h config.h $(INCDIR)/fopen-same.h \
-  $(INCDIR)/libiberty.h $(INCDIR)/obstack.h windres.h
+  $(INCDIR)/libiberty.h $(INCDIR)/obstack.h windres.h \
+  winduni.h
 resrc.o: resrc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
+  windres.h winduni.h
 rescoff.o: rescoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \
+  windres.h winduni.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \
   $(INCDIR)/bfdlink.h
 resbin.o: resbin.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
+  windres.h winduni.h
+winduni.o: winduni.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
+  bucomm.h config.h $(INCDIR)/fopen-same.h winduni.h
 readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/m32r.h \
-  $(INCDIR)/elf/mips.h bucomm.h config.h $(INCDIR)/fopen-same.h \
-  $(INCDIR)/getopt.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h
+  $(INCDIR)/elf/mips.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
+  bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/getopt.h
 underscore.o: underscore.c
 arparse.o: arparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h arsup.h
@@ -1233,10 +1236,10 @@ nlmheader.o: nlmheader.c ../bfd/bfd.h bucomm.h config.h \
   nlmconv.h
 rcparse.o: rcparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h
+  windres.h winduni.h
 rclex.o: rclex.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
-  windres.h rcparse.h
+  windres.h winduni.h rcparse.h
 
 # IF YOU PUT ANYTHING HERE IT WILL GO AWAY
 
index 50ef185d8ed8f32c2045e5085b8d6b13f5b29462..06a66077f287aba5c74ce3f43a7b803473cca438 100644 (file)
@@ -235,18 +235,18 @@ cpp_line (s)
   char *send, *fn;
 
   ++s;
-  while (isspace (*s))
+  while (isspace ((unsigned char) *s))
     ++s;
   
   line = strtol (s, &send, 0);
-  if (*send != '\0' && ! isspace (*send))
+  if (*send != '\0' && ! isspace ((unsigned char) *send))
     return;
 
   /* Subtract 1 because we are about to count the newline.  */
   rc_lineno = line - 1;
 
   s = send;
-  while (isspace (*s))
+  while (isspace ((unsigned char) *s))
     ++s;
 
   if (*s != '"')
@@ -392,8 +392,8 @@ handle_quotes (input, len)
       else
        {
          ++t;
-         assert (isspace (*t));
-         while (isspace (*t))
+         assert (isspace ((unsigned char) *t));
+         while (isspace ((unsigned char) *t))
            ++t;
          if (*t == '\0')
            break;
index 0ab87d2cf80103000836753aa70856833522c14a..c5de25f50259216b82bb22904b08f0ed7f0d7c4a 100644 (file)
@@ -107,7 +107,7 @@ static unsigned long class;
 %token BEDIT HEDIT IEDIT
 %token FONT
 %token ICON
-%token LANGUAGE CHARACTERISTICS VERSION
+%token LANGUAGE CHARACTERISTICS VERSIONK
 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE
 %token MENUBARBREAK MENUBREAK
 %token MESSAGETABLE
@@ -221,6 +221,9 @@ acc_entry:
            $$ = $1;
            $$.id = $2;
            $$.flags |= $4;
+           if (($$.flags & ACC_VIRTKEY) == 0
+               && ($$.flags & (ACC_SHIFT | ACC_CONTROL | ACC_ALT)) != 0)
+             rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
          }
        ;
 
@@ -228,21 +231,27 @@ acc_event:
          QUOTEDSTRING
          {
            const char *s = $1;
+           char ch;
 
+           $$.next = NULL;
            $$.id = 0;
-           if (*s != '^')
+           ch = *s;
+           if (ch != '^')
              $$.flags = 0;
            else
              {
-               $$.flags = ACC_CONTROL;
+               $$.flags = ACC_CONTROL | ACC_VIRTKEY;
                ++s;
+               ch = *s;
+               ch = toupper ((unsigned char) ch);
              }
-           $$.key = *s;
+           $$.key = ch;
            if (s[1] != '\0')
-             rcparse_warning ("accelerator should only be one character");
+             rcparse_warning (_("accelerator should only be one character"));
          }
        | posnumexpr
          {
+           $$.next = NULL;
            $$.flags = 0;
            $$.id = 0;
            $$.key = $1;
@@ -258,6 +267,11 @@ acc_options:
          {
            $$ = $1 | $3;
          }
+       /* I've had one report that the comma is optional.  */
+       | acc_options acc_option
+         {
+           $$ = $1 | $2;
+         }
        ;
 
 acc_option:
@@ -422,7 +436,7 @@ styles:
            dialog.pointsize = $3;
            unicode_from_ascii ((int *) NULL, &dialog.font, $5);
            if (dialog.ex == NULL)
-             rcparse_warning ("extended FONT requires DIALOGEX");
+             rcparse_warning (_("extended FONT requires DIALOGEX"));
            else
              {
                dialog.ex->weight = $6;
@@ -441,7 +455,7 @@ styles:
          {
            sub_res_info.language = $3 | ($4 << 8);
          }
-       | styles VERSION numexpr
+       | styles VERSIONK numexpr
          {
            sub_res_info.version = $3;
          }
@@ -500,7 +514,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "BEDIT");
          }
        | CHECKBOX
@@ -530,7 +544,7 @@ control:
            if ($11 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $11;
              }
          }
@@ -539,7 +553,7 @@ control:
          {
            $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $11;
            $$->data = $12;
          }
@@ -593,7 +607,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "HEDIT");
          }
        | ICON optstringc numexpr cnumexpr cnumexpr opt_control_data
@@ -603,7 +617,7 @@ control:
            if ($6 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $6;
              }
          }
@@ -615,7 +629,7 @@ control:
            if ($10 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $10;
              }
          }
@@ -625,7 +639,7 @@ control:
            $$ = define_control ($2, $3, $4, $5, $6, $7, CTL_STATIC,
                                 style, $9);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $10;
            $$->data = $11;
          }
@@ -639,7 +653,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "IEDIT");
          }
        | LISTBOX
@@ -748,7 +762,7 @@ control_params:
            if ($7 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $7;
              }
          }
@@ -759,7 +773,7 @@ control_params:
            if ($9 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $9;
              }
          }
@@ -768,7 +782,7 @@ control_params:
          {
            $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $9;
            $$->data = $10;
          }
@@ -1221,8 +1235,8 @@ id:
            /* It seems that resource ID's are forced to upper case.  */
            copy = xstrdup ($1);
            for (s = copy; *s != '\0'; s++)
-             if (islower (*s))
-               *s = toupper (*s);
+             if (islower ((unsigned char) *s))
+               *s = toupper ((unsigned char) *s);
            res_string_to_id (&$$, copy);
            free (copy);
          }
@@ -1255,7 +1269,7 @@ suboptions:
            $$ = $1;
            $$.language = $3 | ($4 << 8);
          }
-       | suboptions VERSION numexpr
+       | suboptions VERSIONK numexpr
          {
            $$ = $1;
            $$.version = $3;
index 7931dbf7a9ecc3f0645a60de4026d2f1e121d55f..b148ae48ca00ce8f5dbb27933b980f13c9db03ca 100644 (file)
@@ -105,7 +105,7 @@ bin_to_res (type, data, length, big_endian)
          return bin_to_res_fontdir (data, length, big_endian);
        case RT_FONT:
          return bin_to_res_generic (RES_TYPE_FONT, data, length);
-       case RT_ACCELERATORS:
+       case RT_ACCELERATOR:
          return bin_to_res_accelerators (data, length, big_endian);
        case RT_RCDATA:
          return bin_to_res_rcdata (data, length, big_endian);
@@ -127,7 +127,7 @@ static void
 toosmall (msg)
      const char *msg;
 {
-  fatal ("%s: not enough binary data", msg);
+  fatal (_("%s: not enough binary data"), msg);
 }
 
 /* Swap in a NULL terminated unicode string.  */
@@ -145,8 +145,8 @@ get_unicode (data, length, big_endian, retlen)
   c = 0;
   while (1)
     {
-      if (length < c * 2 + 2)
-       toosmall ("null terminated unicode string");
+      if (length < (unsigned long) c * 2 + 2)
+       toosmall (_("null terminated unicode string"));
       if (get_16 (big_endian, data + c * 2) == 0)
        break;
       ++c;
@@ -176,13 +176,13 @@ get_resid (id, data, length, big_endian)
   int first;
 
   if (length < 2)
-    toosmall ("resource ID");
+    toosmall (_("resource ID"));
 
   first = get_16 (big_endian, data);
   if (first == 0xffff)
     {
       if (length < 4)
-       toosmall ("resource ID");
+       toosmall (_("resource ID"));
       id->named = 0;
       id->u.id = get_16 (big_endian, data + 2);
       return 4;
@@ -226,7 +226,7 @@ bin_to_res_cursor (data, length, big_endian)
   struct res_resource *r;
 
   if (length < 4)
-    toosmall ("cursor");
+    toosmall (_("cursor"));
 
   c = (struct cursor *) res_alloc (sizeof *c);
   c->xhotspot = get_16 (big_endian, data);
@@ -260,35 +260,35 @@ bin_to_res_menu (data, length, big_endian)
   r->u.menu = m;
 
   if (length < 2)
-    toosmall ("menu header");
+    toosmall (_("menu header"));
 
   version = get_16 (big_endian, data);
 
   if (version == 0)
     {
       if (length < 4)
-       toosmall ("menu header");
+       toosmall (_("menu header"));
       m->help = 0;
       m->items = bin_to_res_menuitems (data + 4, length - 4, big_endian,
                                       &read);
     }
   else if (version == 1)
     {
-      int offset;
+      unsigned int offset;
 
       if (length < 8)
-       toosmall ("menuex header");
+       toosmall (_("menuex header"));
       m->help = get_32 (big_endian, data + 4);
       offset = get_16 (big_endian, data + 2);
       if (offset + 4 >= length)
-       toosmall ("menuex offset");
+       toosmall (_("menuex offset"));
       m->items = bin_to_res_menuexitems (data + 4 + offset,
                                         length - (4 + offset),
                                         big_endian,
                                         &read);
     }
   else
-    fatal ("unsupported menu version %d", version);
+    fatal (_("unsupported menu version %d"), version);
 
   return r;
 }
@@ -311,18 +311,19 @@ bin_to_res_menuitems (data, length, big_endian, read)
 
   while (length > 0)
     {
-      int flags, stroff, slen, itemlen;
+      int flags, slen, itemlen;
+      unsigned int stroff;
       struct menuitem *mi;
 
       if (length < 4)
-       toosmall ("menuitem header");
+       toosmall (_("menuitem header"));
 
       mi = (struct menuitem *) res_alloc (sizeof *mi);
       mi->state = 0;
       mi->help = 0;
 
       flags = get_16 (big_endian, data);
-      mi->type = flags;
+      mi->type = flags &~ (MENUITEM_POPUP | MENUITEM_ENDMENU);
 
       if ((flags & MENUITEM_POPUP) == 0)
        stroff = 4;
@@ -330,7 +331,7 @@ bin_to_res_menuitems (data, length, big_endian, read)
        stroff = 2;
 
       if (length < stroff + 2)
-       toosmall ("menuitem header");
+       toosmall (_("menuitem header"));
 
       if (get_16 (big_endian, data + stroff) == 0)
        {
@@ -391,11 +392,12 @@ bin_to_res_menuexitems (data, length, big_endian, read)
 
   while (length > 0)
     {
-      int flags, slen, itemlen;
+      int flags, slen;
+      unsigned int itemlen;
       struct menuitem *mi;
 
       if (length < 14)
-       toosmall ("menuitem header");
+       toosmall (_("menuitem header"));
 
       mi = (struct menuitem *) res_alloc (sizeof *mi);
       mi->type = get_32 (big_endian, data);
@@ -425,7 +427,7 @@ bin_to_res_menuexitems (data, length, big_endian, read)
          int subread;
 
          if (length < itemlen + 4)
-           toosmall ("menuitem");
+           toosmall (_("menuitem"));
          mi->help = get_32 (big_endian, data + itemlen);
          itemlen += 4;
 
@@ -460,12 +462,13 @@ bin_to_res_dialog (data, length, big_endian)
 {
   int version;
   struct dialog *d;
-  int c, sublen, off, i;
+  int c, sublen, i;
+  unsigned int off;
   struct dialog_control **pp;
   struct res_resource *r;
 
   if (length < 18)
-    toosmall ("dialog header");
+    toosmall (_("dialog header"));
 
   d = (struct dialog *) res_alloc (sizeof *d);
 
@@ -483,7 +486,7 @@ bin_to_res_dialog (data, length, big_endian)
 
       signature = get_16 (big_endian, data + 2);
       if (signature != 1)
-       fatal ("unexpected dialog signature %d", signature);
+       fatal (_("unexpected dialog signature %d"), signature);
 
       d->ex = (struct dialog_ex *) res_alloc (sizeof (struct dialog_ex));
       d->ex->help = get_32 (big_endian, data + 4);
@@ -493,7 +496,7 @@ bin_to_res_dialog (data, length, big_endian)
     }
 
   if (length < off + 10)
-    toosmall ("dialog header");
+    toosmall (_("dialog header"));
 
   c = get_16 (big_endian, data + off);
   d->x = get_16  (big_endian, data + off + 2);
@@ -525,7 +528,7 @@ bin_to_res_dialog (data, length, big_endian)
   else
     {
       if (length < off + 2)
-       toosmall ("dialog font point size");
+       toosmall (_("dialog font point size"));
 
       d->pointsize = get_16 (big_endian, data + off);
       off += 2;
@@ -533,7 +536,7 @@ bin_to_res_dialog (data, length, big_endian)
       if (d->ex != NULL)
        {
          if (length < off + 4)
-           toosmall ("dialogex font information");
+           toosmall (_("dialogex font information"));
          d->ex->weight = get_16 (big_endian, data + off);
          d->ex->italic = get_16 (big_endian, data + off + 2);
          off += 4;
@@ -558,7 +561,7 @@ bin_to_res_dialog (data, length, big_endian)
       if (d->ex == NULL)
        {
          if (length < off + 8)
-           toosmall ("dialog control");
+           toosmall (_("dialog control"));
 
          dc->style = get_32 (big_endian, data + off);
          dc->exstyle = get_32 (big_endian, data + off + 4);
@@ -568,7 +571,7 @@ bin_to_res_dialog (data, length, big_endian)
       else
        {
          if (length < off + 12)
-           toosmall ("dialogex control");
+           toosmall (_("dialogex control"));
          dc->help = get_32 (big_endian, data + off);
          dc->exstyle = get_32 (big_endian, data + off + 4);
          dc->style = get_32 (big_endian, data + off + 18);
@@ -576,7 +579,7 @@ bin_to_res_dialog (data, length, big_endian)
        }
 
       if (length < off + 10)
-       toosmall ("dialog control");
+       toosmall (_("dialog control"));
 
       dc->x = get_16 (big_endian, data + off);
       dc->y = get_16 (big_endian, data + off + 2);
@@ -593,7 +596,7 @@ bin_to_res_dialog (data, length, big_endian)
       off += sublen;
 
       if (length < off + 2)
-       toosmall ("dialog control end");
+       toosmall (_("dialog control end"));
 
       datalen = get_16 (big_endian, data + off);
       off += 2;
@@ -605,7 +608,7 @@ bin_to_res_dialog (data, length, big_endian)
          off = (off + 3) &~ 3;
 
          if (length < off + datalen)
-           toosmall ("dialog control data");
+           toosmall (_("dialog control data"));
 
          dc->data = ((struct rcdata_item *)
                      res_alloc (sizeof (struct rcdata_item)));
@@ -645,20 +648,20 @@ bin_to_res_string (data, length, big_endian)
 
   for (i = 0; i < 16; i++)
     {
-      int slen;
+      unsigned int slen;
 
       if (length < 2)
-       toosmall ("stringtable string length");
+       toosmall (_("stringtable string length"));
       slen = get_16 (big_endian, data);
       st->strings[i].length = slen;
 
       if (slen > 0)
        {
          unichar *s;
-         int j;
+         unsigned int j;
 
          if (length < 2 + 2 * slen)
-           toosmall ("stringtable string");
+           toosmall (_("stringtable string"));
 
          s = (unichar *) res_alloc (slen * sizeof (unichar));
          st->strings[i].string = s;
@@ -691,7 +694,7 @@ bin_to_res_fontdir (data, length, big_endian)
   struct res_resource *r;
 
   if (length < 2)
-    toosmall ("fontdir header");
+    toosmall (_("fontdir header"));
 
   c = get_16 (big_endian, data);
 
@@ -701,10 +704,10 @@ bin_to_res_fontdir (data, length, big_endian)
   for (i = 0; i < c; i++)
     {
       struct fontdir *fd;
-      int off;
+      unsigned int off;
 
       if (length < 56)
-       toosmall ("fontdir");
+       toosmall (_("fontdir"));
 
       fd = (struct fontdir *) res_alloc (sizeof *fd);
       fd->index = get_16 (big_endian, data);
@@ -720,13 +723,13 @@ bin_to_res_fontdir (data, length, big_endian)
       while (off < length && data[off] != '\0')
        ++off;
       if (off >= length)
-       toosmall ("fontdir device name");
+       toosmall (_("fontdir device name"));
       ++off;
 
       while (off < length && data[off] != '\0')
        ++off;
       if (off >= length)
-       toosmall ("fontdir face name");
+       toosmall (_("fontdir face name"));
       ++off;
 
       fd->length = off;
@@ -769,7 +772,9 @@ bin_to_res_accelerators (data, length, big_endian)
       struct accelerator *a;
 
       if (length < 8)
-       toosmall ("accelerator");
+       toosmall (_("accelerator"));
+
+      a = (struct accelerator *) res_alloc (sizeof *a);
 
       a->flags = get_16 (big_endian, data);
       a->key = get_16 (big_endian, data + 2);
@@ -831,11 +836,11 @@ bin_to_res_group_cursor (data, length, big_endian)
   struct res_resource *r;
 
   if (length < 6)
-    toosmall ("group cursor header");
+    toosmall (_("group cursor header"));
 
   type = get_16 (big_endian, data + 2);
   if (type != 2)
-    fatal ("unexpected group cursor type %d", type);
+    fatal (_("unexpected group cursor type %d"), type);
 
   c = get_16 (big_endian, data + 4);
 
@@ -850,7 +855,7 @@ bin_to_res_group_cursor (data, length, big_endian)
       struct group_cursor *gc;
 
       if (length < 14)
-       toosmall ("group cursor");
+       toosmall (_("group cursor"));
 
       gc = (struct group_cursor *) res_alloc (sizeof *gc);
 
@@ -889,11 +894,11 @@ bin_to_res_group_icon (data, length, big_endian)
   struct res_resource *r;
 
   if (length < 6)
-    toosmall ("group icon header");
+    toosmall (_("group icon header"));
 
   type = get_16 (big_endian, data + 2);
   if (type != 1)
-    fatal ("unexpected group icon type %d", type);
+    fatal (_("unexpected group icon type %d"), type);
 
   c = get_16 (big_endian, data + 4);
 
@@ -908,7 +913,7 @@ bin_to_res_group_icon (data, length, big_endian)
       struct group_icon *gi;
 
       if (length < 14)
-       toosmall ("group icon");
+       toosmall (_("group icon"));
 
       gi = (struct group_icon *) res_alloc (sizeof *gi);
 
@@ -978,8 +983,8 @@ get_version_header (data, length, big_endian, key, pkey, len, vallen, type,
        {
          if (length < 2)
            toosmall (key);
-         if (get_16 (big_endian, data) != *key)
-           fatal ("unexpected version string");
+         if (get_16 (big_endian, data) != (unsigned char) *key)
+           fatal (_("unexpected version string"));
 
          *off += 2;
          length -= 2;
@@ -1012,12 +1017,12 @@ bin_to_res_version (data, length, big_endian)
   get_version_header (data, length, big_endian, "VS_VERSION_INFO",
                      (unichar *) NULL, &verlen, &vallen, &type, &off);
 
-  if (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"),
           verlen, length);
 
   if (type != 0)
-    fatal ("unexpected version type %d", type);
+    fatal (_("unexpected version type %d"), type);
 
   data += off;
   length -= off;
@@ -1029,18 +1034,18 @@ bin_to_res_version (data, length, big_endian)
       unsigned long signature, fiv;
 
       if (vallen != 52)
-       fatal ("unexpected fixed version information length %d", vallen);
+       fatal (_("unexpected fixed version information length %d"), vallen);
 
       if (length < 52)
-       toosmall ("fixed version info");
+       toosmall (_("fixed version info"));
 
       signature = get_32 (big_endian, data);
       if (signature != 0xfeef04bd)
-       fatal ("unexpected fixed version signature %lu", signature);
+       fatal (_("unexpected fixed version signature %lu"), signature);
 
       fiv = get_32 (big_endian, data + 4);
       if (fiv != 0 && fiv != 0x10000)
-       fatal ("unexpected fixed version info version %lu", fiv);
+       fatal (_("unexpected fixed version info version %lu"), fiv);
 
       fi = (struct fixed_versioninfo *) res_alloc (sizeof *fi);
 
@@ -1069,7 +1074,7 @@ bin_to_res_version (data, length, big_endian)
       int ch;
 
       if (length < 8)
-       toosmall ("version var info");
+       toosmall (_("version var info"));
 
       vi = (struct ver_info *) res_alloc (sizeof *vi);
 
@@ -1086,7 +1091,7 @@ bin_to_res_version (data, length, big_endian)
                              &off);
 
          if (vallen != 0)
-           fatal ("unexpected stringfileinfo value length %d", vallen);
+           fatal (_("unexpected stringfileinfo value length %d"), vallen);
 
          data += off;
          length -= off;
@@ -1096,7 +1101,7 @@ bin_to_res_version (data, length, big_endian)
                              &type, &off);
 
          if (vallen != 0)
-           fatal ("unexpected version stringtable value length %d", vallen);
+           fatal (_("unexpected version stringtable value length %d"), vallen);
 
          data += off;
          length -= off;
@@ -1130,7 +1135,7 @@ bin_to_res_version (data, length, big_endian)
              valoff = (valoff + 3) &~ 3;
 
              if (off + valoff != subverlen)
-               fatal ("unexpected version string length %d != %d + %d",
+               fatal (_("unexpected version string length %d != %d + %d"),
                       subverlen, off, valoff);
 
              vs->next = NULL;
@@ -1141,7 +1146,7 @@ bin_to_res_version (data, length, big_endian)
              length -= valoff;
 
              if (verlen < subverlen)
-               fatal ("unexpected version string length %d < %d",
+               fatal (_("unexpected version string length %d < %d"),
                       verlen, subverlen);
 
              verlen -= subverlen;
@@ -1158,7 +1163,7 @@ bin_to_res_version (data, length, big_endian)
                              &off);
 
          if (vallen != 0)
-           fatal ("unexpected varfileinfo value length %d", vallen);
+           fatal (_("unexpected varfileinfo value length %d"), vallen);
 
          data += off;
          length -= off;
@@ -1177,7 +1182,7 @@ bin_to_res_version (data, length, big_endian)
              struct ver_varinfo *vv;
 
              if (length < 4)
-               toosmall ("version varfileinfo");
+               toosmall (_("version varfileinfo"));
 
              vv = (struct ver_varinfo *) res_alloc (sizeof *vv);
 
@@ -1192,13 +1197,13 @@ bin_to_res_version (data, length, big_endian)
              length -= 4;
 
              if (vallen < 4)
-               fatal ("unexpected version value length %d", vallen);
+               fatal (_("unexpected version value length %d"), vallen);
 
              vallen -= 4;
            }
        }
       else
-       fatal ("unexpected version string");
+       fatal (_("unexpected version string"));
 
       vi->next = NULL;
       *pp = vi;
@@ -1448,7 +1453,7 @@ res_to_bin_accelerator (accelerators, big_endian)
       d->data = (unsigned char *) reswr_alloc (8);
 
       put_16 (big_endian,
-             a->flags | (a->next == NULL ? 0 : ACC_LAST),
+             a->flags | (a->next != NULL ? 0 : ACC_LAST),
              d->data);
       put_16 (big_endian, a->key, d->data + 2);
       put_16 (big_endian, a->id, d->data + 4);
@@ -1559,7 +1564,7 @@ res_to_bin_dialog (dialog, big_endian)
   if (! dialogex)
     {
       put_32 (big_endian, dialog->style, first->data);
-      put_32 (big_endian, dialog->style, first->data + 4);
+      put_32 (big_endian, dialog->exstyle, first->data + 4);
       off = 8;
     }
   else
@@ -1599,7 +1604,7 @@ res_to_bin_dialog (dialog, big_endian)
       struct bindata *d;
 
       d = (struct bindata *) reswr_alloc (sizeof *d);
-      d->length = dialogex ? 2 : 6;
+      d->length = dialogex ? 6 : 2;
       d->data = (unsigned char *) reswr_alloc (d->length);
 
       length += d->length;
@@ -1631,7 +1636,6 @@ res_to_bin_dialog (dialog, big_endian)
   c = 0;
   for (dc = dialog->controls; dc != NULL; dc = dc->next)
     {
-      unsigned long length;
       struct bindata *d;
       int dcoff;
 
@@ -1690,14 +1694,21 @@ res_to_bin_dialog (dialog, big_endian)
        put_16 (big_endian, 0, d->data);
       else
        {
+         unsigned long sublen;
+
          dword_align_bin (&pp, &length);
 
          *pp = res_to_bin_rcdata (dc->data, big_endian);
+         sublen = 0;
          while (*pp != NULL)
            {
-             length += (*pp)->length;
+             sublen += (*pp)->length;
              pp = &(*pp)->next;
            }
+
+         put_16 (big_endian, sublen, d->data);
+
+         length += sublen;
        }
     }
 
index 6c7f21b15e3d4cd18a6b8d9169c4ef5c67e5bfdb..e620f2eb20617d974961989659654c64e1bb77a5 100644 (file)
@@ -124,6 +124,9 @@ read_coff_rsrc (filename, target)
   bfd_byte *data;
   struct coff_file_info finfo;
 
+  if (filename == NULL)
+    fatal (_("filename required for COFF input"));
+
   abfd = bfd_openr (filename, target);
   if (abfd == NULL)
     bfd_fatal (filename);
@@ -139,7 +142,7 @@ read_coff_rsrc (filename, target)
   sec = bfd_get_section_by_name (abfd, ".rsrc");
   if (sec == NULL)
     {
-      fprintf (stderr, "%s: %s: no resource section\n", program_name,
+      fprintf (stderr, _("%s: %s: no resource section\n"), program_name,
               filename);
       xexit (1);
     }
@@ -148,7 +151,7 @@ read_coff_rsrc (filename, target)
   data = (bfd_byte *) res_alloc (size);
 
   if (! bfd_get_section_contents (abfd, sec, data, 0, size))
-    bfd_fatal ("can't read resource section");
+    bfd_fatal (_("can't read resource section"));
 
   finfo.filename = filename;
   finfo.data = data;
@@ -174,7 +177,7 @@ overrun (finfo, msg)
      const struct coff_file_info *finfo;
      const char *msg;
 {
-  fatal ("%s: %s: address out of bounds", finfo->filename, msg);
+  fatal (_("%s: %s: address out of bounds"), finfo->filename, msg);
 }
 
 /* Read a resource directory.  */
@@ -192,8 +195,8 @@ read_coff_res_dir (data, finfo, type, level)
   struct res_entry **pp;
   const struct extern_res_entry *ere;
 
-  if (finfo->data_end - data < sizeof (struct extern_res_directory))
-    overrun (finfo, "directory");
+  if ((size_t) (finfo->data_end - data) < sizeof (struct extern_res_directory))
+    overrun (finfo, _("directory"));
 
   erd = (const struct extern_res_directory *) data;
 
@@ -221,7 +224,7 @@ read_coff_res_dir (data, finfo, type, level)
       int length, j;
 
       if ((const bfd_byte *) ere >= finfo->data_end)
-       overrun (finfo, "named directory entry");
+       overrun (finfo, _("named directory entry"));
 
       name = getfi_32 (finfo, ere->name);
       rva = getfi_32 (finfo, ere->rva);
@@ -229,8 +232,8 @@ read_coff_res_dir (data, finfo, type, level)
       /* For some reason the high bit in NAME is set.  */
       name &=~ 0x80000000;
 
-      if (name > finfo->data_end - finfo->data)
-       overrun (finfo, "directory entry name");
+      if (name > (size_t) (finfo->data_end - finfo->data))
+       overrun (finfo, _("directory entry name"));
 
       ers = finfo->data + name;
 
@@ -249,16 +252,16 @@ read_coff_res_dir (data, finfo, type, level)
       if ((rva & 0x80000000) != 0)
        {
          rva &=~ 0x80000000;
-         if (rva >= finfo->data_end - finfo->data)
-           overrun (finfo, "named subdirectory");
+         if (rva >= (size_t) (finfo->data_end - finfo->data))
+           overrun (finfo, _("named subdirectory"));
          re->subdir = 1;
          re->u.dir = read_coff_res_dir (finfo->data + rva, finfo, type,
                                         level + 1);
        }
       else
        {
-         if (rva >= finfo->data_end - finfo->data)
-           overrun (finfo, "named resource");
+         if (rva >= (size_t) (finfo->data_end - finfo->data))
+           overrun (finfo, _("named resource"));
          re->subdir = 0;
          re->u.res = read_coff_data_entry (finfo->data + rva, finfo, type);
        }
@@ -273,7 +276,7 @@ read_coff_res_dir (data, finfo, type, level)
       struct res_entry *re;
 
       if ((const bfd_byte *) ere >= finfo->data_end)
-       overrun (finfo, "ID directory entry");
+       overrun (finfo, _("ID directory entry"));
 
       name = getfi_32 (finfo, ere->name);
       rva = getfi_32 (finfo, ere->rva);
@@ -289,16 +292,16 @@ read_coff_res_dir (data, finfo, type, level)
       if ((rva & 0x80000000) != 0)
        {
          rva &=~ 0x80000000;
-         if (rva >= finfo->data_end - finfo->data)
-           overrun (finfo, "ID subdirectory");
+         if (rva >= (size_t) (finfo->data_end - finfo->data))
+           overrun (finfo, _("ID subdirectory"));
          re->subdir = 1;
          re->u.dir = read_coff_res_dir (finfo->data + rva, finfo, type,
                                         level + 1);
        }
       else
        {
-         if (rva >= finfo->data_end - finfo->data)
-           overrun (finfo, "ID resource");
+         if (rva >= (size_t) (finfo->data_end - finfo->data))
+           overrun (finfo, _("ID resource"));
          re->subdir = 0;
          re->u.res = read_coff_data_entry (finfo->data + rva, finfo, type);
        }
@@ -324,23 +327,23 @@ read_coff_data_entry (data, finfo, type)
   const bfd_byte *resdata;
 
   if (type == NULL)
-    fatal ("resource type unknown");
+    fatal (_("resource type unknown"));
 
-  if (finfo->data_end - data < sizeof (struct extern_res_data))
-    overrun (finfo, "data entry");
+  if ((size_t) (finfo->data_end - data) < sizeof (struct extern_res_data))
+    overrun (finfo, _("data entry"));
 
   erd = (const struct extern_res_data *) data;
 
   size = getfi_32 (finfo, erd->size);
   rva = getfi_32 (finfo, erd->rva);
   if (rva < finfo->secaddr
-      || rva - finfo->secaddr >= finfo->data_end - finfo->data)
-    overrun (finfo, "resource data");
+      || rva - finfo->secaddr >= (size_t) (finfo->data_end - finfo->data))
+    overrun (finfo, _("resource data"));
 
   resdata = finfo->data + (rva - finfo->secaddr);
 
-  if (size > finfo->data_end - resdata)
-    overrun (finfo, "resource data size");
+  if (size > (size_t) (finfo->data_end - resdata))
+    overrun (finfo, _("resource data size"));
 
   r = bin_to_res (*type, resdata, size, finfo->big_endian);
 
@@ -422,7 +425,6 @@ static void coff_res_to_bin
    would require doing the basic work of objcopy, just modifying or
    adding the .rsrc section.  */
 
-
 void
 write_coff_file (filename, target, resources)
      const char *filename;
@@ -435,6 +437,9 @@ write_coff_file (filename, target, resources)
   struct bindata *d;
   unsigned long length, offset;
 
+  if (filename == NULL)
+    fatal (_("filename required for COFF output"));
+
   abfd = bfd_openw (filename, target);
   if (abfd == NULL)
     bfd_fatal (filename);
@@ -721,7 +726,7 @@ coff_res_to_bin (res, cwi)
   r->addend = 0;
   r->howto = bfd_reloc_type_lookup (cwi->abfd, BFD_RELOC_RVA);
   if (r->howto == NULL)
-    bfd_fatal ("can't get BFD_RELOC_RVA relocation type");
+    bfd_fatal (_("can't get BFD_RELOC_RVA relocation type"));
 
   cwi->relocs = xrealloc (cwi->relocs,
                          (cwi->reloc_count + 2) * sizeof (arelent *));
index dbb9c5c2afaac467e477a7ba16fc3a8aec964ea0..a0a962dd51ce5f28d0cb8fdf43b95a3fb1e1500e 100644 (file)
@@ -24,6 +24,8 @@
 /* This is the header file for the windres program.  It defines
    structures and declares functions used within the program.  */
 
+#include "winduni.h"
+
 /* We represent resources internally as a tree, similar to the tree
    used in the .rsrc section of a COFF file.  The root is a
    res_directory structure.  */
@@ -55,9 +57,9 @@ struct res_id
     struct
     {
       /* Length of the name.  */
-      unsigned short length;
+      int length;
       /* Pointer to the name, which is a Unicode string.  */
-      unsigned short *name;
+      unichar *name;
     } n;
     /* If the named field is zero, this is the ID.  */
     unsigned long id;
@@ -162,7 +164,7 @@ struct res_resource
     struct
     {
       unsigned long length;
-      unsigned char *data;
+      const unsigned char *data;
     } data;
     struct accelerator *acc;
     struct cursor *cursor;
@@ -170,10 +172,10 @@ struct res_resource
     struct dialog *dialog;
     struct fontdir *fontdir;
     struct group_icon *group_icon;
-    struct menuitem *menu;
-    struct rcdata_data *rcdata;
+    struct menu *menu;
+    struct rcdata_item *rcdata;
     struct stringtable *stringtable;
-    struct rcdata_data *userdata;
+    struct rcdata_item *userdata;
     struct versioninfo *versioninfo;
   } u;
   /* Information from a res file.  */
@@ -200,15 +202,15 @@ struct res_resource
 #define RT_STRING               6
 #define RT_FONTDIR              7
 #define RT_FONT                         8
-#define RT_ACCELERATORS                 9
+#define RT_ACCELERATOR          9
 #define RT_RCDATA              10
 #define RT_MESSAGETABLE                11
 #define RT_GROUP_CURSOR                12
 #define RT_GROUP_ICON          14
 #define RT_VERSION             16
 #define RT_DLGINCLUDE          17
-#define RT_PLUGPLAY            18
-#define RT_VXD                 19
+#define RT_PLUGPLAY            19
+#define RT_VXD                 20
 #define RT_ANICURSOR           21
 #define RT_ANIICON             22
 
@@ -247,7 +249,7 @@ struct cursor
   /* Length of bitmap data.  */
   unsigned long length;
   /* Data.  */
-  unsigned char *data;
+  const unsigned char *data;
 };
 
 /* A group_cursor resource is a list of group_cursor structures.  */
@@ -291,11 +293,11 @@ struct dialog
   /* Class name.  */
   struct res_id class;
   /* Caption.  */
-  char *caption;
+  unichar *caption;
   /* Font point size.  */
   unsigned short pointsize;
   /* Font name.  */
-  char *font;
+  unichar *font;
   /* Extended information for a dialogex.  */
   struct dialog_ex *ex;
   /* Controls.  */
@@ -491,7 +493,7 @@ struct dialog_control
   /* Associated text.  */
   struct res_id text;
   /* Extra data for the window procedure.  */
-  struct rcdata_data *data;
+  struct rcdata_item *data;
   /* Help ID.  Only used in an extended dialog.  */
   unsigned long help;
 };
@@ -516,7 +518,7 @@ struct fontdir
   /* Length of font information.  */
   unsigned long length;
   /* Font information. */
-  unsigned char *data;
+  const unsigned char *data;
 };
 
 /* A group_icon resource is a list of group_icon structures.  */
@@ -541,6 +543,17 @@ struct group_icon
   unsigned short index;
 };
 
+/* A menu resource.  */
+
+struct menu
+{
+  /* List of menuitems.  */
+  struct menuitem *items;
+  /* Help ID.  I don't think there is any way to set this in an rc
+     file, but it can appear in the binary format.  */
+  unsigned long help;
+};
+
 /* A menu resource is a list of menuitem structures.  */
 
 struct menuitem
@@ -554,8 +567,8 @@ struct menuitem
   unsigned long state;
   /* Id.  */
   unsigned short id;
-  /* Text.  */
-  char *text;
+  /* Unicode text.  */
+  unichar *text;
   /* Popup menu items for a popup.  */
   struct menuitem *popup;
   /* Help ID.  This is only used in a menuex.  */
@@ -573,19 +586,11 @@ struct menuitem
 #define MENUITEM_POPUP         0x010
 #define MENUITEM_MENUBARBREAK  0x020
 #define MENUITEM_MENUBREAK     0x040
+#define MENUITEM_ENDMENU       0x080
 #define MENUITEM_HELP         0x4000
 
-/* An rcdata resource is a pointer to an rcdata_data structure.  */
-
-struct rcdata_data
-{
-  /* First data item.  */
-  struct rcdata_item *first;
-  /* Last data item.  */
-  struct rcdata_item *last;
-};
-
-/* For an rcdata resource we keep a list of rcdata_item structures.  */
+/* An rcdata resource is a pointer to a list of rcdata_item
+   structures.  */
 
 struct rcdata_item
 {
@@ -604,12 +609,20 @@ struct rcdata_item
   {
     unsigned int word;
     unsigned long dword;
-    char *string;
-    unsigned short *wstring;
     struct
     {
       unsigned long length;
-      unsigned char *data;
+      const char *s;
+    } string;
+    struct
+    {
+      unsigned long length;
+      const unichar *w;
+    } wstring;
+    struct
+    {
+      unsigned long length;
+      const unsigned char *data;
     } buffer;
   } u;
 };
@@ -622,9 +635,9 @@ struct stringtable
   struct
   {
     /* Length of string.  */
-    unsigned short length;
+    int length;
     /* String data if length > 0.  */
-    unsigned short *string;
+    unichar *string;
   } strings[16];
 };
 
@@ -677,7 +690,7 @@ struct ver_info
     struct
     {
       /* Language.  */
-      unsigned short *language;
+      unichar *language;
       /* Strings.  */
       struct ver_stringinfo *strings;
     } string;
@@ -685,7 +698,7 @@ struct ver_info
     struct
     {
       /* Key.  */
-      unsigned short *key;
+      unichar *key;
       /* Values.  */
       struct ver_varinfo *var;
     } var;
@@ -699,9 +712,9 @@ struct ver_stringinfo
   /* Next string.  */
   struct ver_stringinfo *next;
   /* Key.  */
-  unsigned short *key;
+  unichar *key;
   /* Value.  */
-  unsigned short *value;
+  unichar *value;
 };
 
 /* A list of variable version information.  */
@@ -716,6 +729,19 @@ struct ver_varinfo
   unsigned short charset;
 };
 
+/* This structure is used when converting resource information to
+   binary.  */
+
+struct bindata
+{
+  /* Next data.  */
+  struct bindata *next;
+  /* Length of data.  */
+  unsigned long length;
+  /* Data.  */
+  unsigned char *data;
+};
+
 /* Function declarations.  */
 
 extern struct res_directory *read_rc_file
@@ -730,9 +756,16 @@ extern void write_res_file
 extern void write_coff_file
   PARAMS ((const char *, const char *, const struct res_directory *));
 
+extern struct res_resource *bin_to_res
+  PARAMS ((struct res_id, const unsigned char *, unsigned long, int));
+extern struct bindata *res_to_bin PARAMS ((const struct res_resource *, int));
+
 extern FILE *open_file_search
   PARAMS ((const char *, const char *, const char *, char **));
 
+extern PTR res_alloc PARAMS ((size_t));
+extern PTR reswr_alloc PARAMS ((size_t));
+
 /* Resource ID handling.  */
 
 extern int res_id_cmp PARAMS ((struct res_id, struct res_id));
@@ -740,12 +773,6 @@ extern void res_id_print PARAMS ((FILE *, struct res_id, int));
 extern void res_ids_print PARAMS ((FILE *, int, const struct res_id *));
 extern void res_string_to_id PARAMS ((struct res_id *, const char *));
 
-/* Unicode support.  */
-
-extern void unicode_from_ascii
-  PARAMS ((unsigned short *, unsigned short **, const char *));
-extern void unicode_print PARAMS ((FILE *, const unsigned short *, int));
-
 /* Manipulation of the resource tree.  */
 
 extern struct res_resource *define_resource
@@ -754,7 +781,7 @@ extern struct res_resource *define_standard_resource
   PARAMS ((struct res_directory **, int, struct res_id, int, int));
 
 extern int extended_dialog PARAMS ((const struct dialog *));
-extern int extended_menu PARAMS ((const struct menuitem *));
+extern int extended_menu PARAMS ((const struct menu *));
 
 /* Communication between the rc file support and the parser and lexer.  */
 
@@ -767,6 +794,9 @@ extern int yylex PARAMS ((void));
 extern void yyerror PARAMS ((const char *));
 extern void rcparse_warning PARAMS ((const char *));
 extern void rcparse_set_language PARAMS ((int));
+extern void rcparse_discard_strings PARAMS ((void));
+extern void rcparse_rcdata PARAMS ((void));
+extern void rcparse_normal PARAMS ((void));
 
 extern void define_accelerator
   PARAMS ((struct res_id, const struct res_res_info *, struct accelerator *));
@@ -777,7 +807,7 @@ extern void define_cursor
 extern void define_dialog
   PARAMS ((struct res_id, const struct res_res_info *, const struct dialog *));
 extern struct dialog_control *define_control
-  PARAMS ((char *, unsigned long, unsigned long, unsigned long,
+  PARAMS ((const char *, unsigned long, unsigned long, unsigned long,
           unsigned long, unsigned long, unsigned long, unsigned long,
           unsigned long));
 extern void define_font
@@ -787,23 +817,20 @@ extern void define_icon
 extern void define_menu
   PARAMS ((struct res_id, const struct res_res_info *, struct menuitem *));
 extern struct menuitem *define_menuitem
-  PARAMS ((char *, int, unsigned long, unsigned long, unsigned long,
+  PARAMS ((const char *, int, unsigned long, unsigned long, unsigned long,
           struct menuitem *));
 extern void define_messagetable
   PARAMS ((struct res_id, const struct res_res_info *, const char *));
 extern void define_rcdata
-  PARAMS ((struct res_id, const struct res_res_info *, struct rcdata_data *));
-extern struct rcdata_data *append_rcdata_item
-  PARAMS ((struct rcdata_data *, struct rcdata_item *));
-extern struct rcdata_data *append_rcdata_string
-  PARAMS ((struct rcdata_data *, char *));
-extern struct rcdata_data *append_rcdata_number
-  PARAMS ((struct rcdata_data *, unsigned long, int));
+  PARAMS ((struct res_id, const struct res_res_info *, struct rcdata_item *));
+extern struct rcdata_item *define_rcdata_string
+  PARAMS ((const char *, unsigned long));
+extern struct rcdata_item *define_rcdata_number PARAMS ((unsigned long, int));
 extern void define_stringtable
-  PARAMS ((const struct res_res_info *, unsigned long, char *));
+  PARAMS ((const struct res_res_info *, unsigned long, const char *));
 extern void define_user_data
   PARAMS ((struct res_id, struct res_id, const struct res_res_info *,
-          struct rcdata_data *));
+          struct rcdata_item *));
 extern void define_user_file
   PARAMS ((struct res_id, struct res_id, const struct res_res_info *,
           const char *));
@@ -811,10 +838,10 @@ extern void define_versioninfo
   PARAMS ((struct res_id, int, struct fixed_versioninfo *,
           struct ver_info *));
 extern struct ver_info *append_ver_stringfileinfo
-  PARAMS ((struct ver_info *, char *, struct ver_stringinfo *));
+  PARAMS ((struct ver_info *, const char *, struct ver_stringinfo *));
 extern struct ver_info *append_ver_varfileinfo
-  PARAMS ((struct ver_info *, char *, struct ver_varinfo *));
+  PARAMS ((struct ver_info *, const char *, struct ver_varinfo *));
 extern struct ver_stringinfo *append_verval
-  PARAMS ((struct ver_stringinfo *, char *, char *));
+  PARAMS ((struct ver_stringinfo *, const char *, const char *));
 extern struct ver_varinfo *append_vertrans
   PARAMS ((struct ver_varinfo *, unsigned long, unsigned long));