/* windres.c -- a program to manipulate Windows resources
- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
- 2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-2020 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
Rewritten by Kai Tietz, Onevision.
#include "sysdep.h"
#include <assert.h>
-#include <time.h>
#include "bfd.h"
#include "getopt.h"
#include "bucomm.h"
#include "safe-ctype.h"
#include "obstack.h"
#include "windres.h"
-#include <sys/stat.h>
/* Used by resrc.c at least. */
int target_is_bigendian = 0;
const char *def_target_arch;
-static void set_endianess (bfd *, const char *);
+static void set_endianness (bfd *, const char *);
/* An enumeration of format types. */
*real_filename = n;
return e;
}
+ free (n);
if (errno != ENOENT)
break;
if (*resources == NULL)
{
- static unsigned int timeval;
-
- /* Use the same timestamp for every resource created in a
- single run. */
- if (timeval == 0)
- timeval = time (NULL);
-
*resources = ((rc_res_directory *)
res_alloc (sizeof (rc_res_directory)));
(*resources)->characteristics = 0;
- (*resources)->time = timeval;
+ /* Using a real timestamp only serves to create non-deterministic
+ results. Use zero instead. */
+ (*resources)->time = 0;
(*resources)->major = 0;
(*resources)->minor = 0;
(*resources)->entries = NULL;
-O --output-format=<format> Specify output format\n\
-F --target=<target> Specify COFF target\n\
--preprocessor=<program> Program to use to preprocess rc file\n\
+ --preprocessor-arg=<arg> Additional preprocessor argument\n\
-I --include-dir=<dir> Include directory when preprocessing rc file\n\
-D --define <sym>[=<val>] Define SYM when preprocessing rc file\n\
-U --undefine <sym> Undefine SYM when preprocessing rc file\n\
OPTION_USE_TEMP_FILE,
OPTION_NO_USE_TEMP_FILE,
OPTION_YYDEBUG,
- OPTION_INCLUDE_DIR
+ OPTION_INCLUDE_DIR,
+ OPTION_PREPROCESSOR_ARG
};
static const struct option long_options[] =
{"output-format", required_argument, 0, 'O'},
{"target", required_argument, 0, 'F'},
{"preprocessor", required_argument, 0, OPTION_PREPROCESSOR},
+ {"preprocessor-arg", required_argument, 0, OPTION_PREPROCESSOR_ARG},
{"include-dir", required_argument, 0, OPTION_INCLUDE_DIR},
{"define", required_argument, 0, 'D'},
{"undefine", required_argument, 0, 'U'},
program_name = argv[0];
xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
expandargv (&argc, &argv);
- bfd_init ();
+ if (bfd_init () != BFD_INIT_MAGIC)
+ fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target ();
res_init ();
preprocessor = optarg;
break;
+ case OPTION_PREPROCESSOR_ARG:
+ if (preprocargs == NULL)
+ {
+ quotedarg = quot (optarg);
+ preprocargs = xstrdup (quotedarg);
+ }
+ else
+ {
+ char *n;
+
+ quotedarg = quot (optarg);
+ n = xmalloc (strlen (preprocargs) + strlen (quotedarg) + 2);
+ sprintf (n, "%s %s", preprocargs, quotedarg);
+ free (preprocargs);
+ preprocargs = n;
+ }
+ break;
+
case 'D':
case 'U':
if (preprocargs == NULL)
{
struct stat statbuf;
char modebuf[11];
-
+
if (stat (optarg, & statbuf) == 0
/* Coded this way to avoid importing knowledge of S_ISDIR into this file. */
&& (mode_string (statbuf.st_mode, modebuf), modebuf[0] == 'd'))
output_format = format_from_filename (output_filename, 0);
}
- set_endianess (NULL, target);
+ set_endianness (NULL, target);
/* Read the input file. */
switch (input_format)
}
static void
-set_endianess (bfd *abfd, const char *target)
+set_endianness (bfd *abfd, const char *target)
{
const bfd_target *target_vec;
target_vec = bfd_get_target_info (target, abfd, &target_is_bigendian, NULL,
&def_target_arch);
if (! target_vec)
- fatal ("Can't detect target endianess and architecture.");
+ fatal ("Can't detect target endianness and architecture.");
if (! def_target_arch)
fatal ("Can't detect architecture.");
}
if (rdmode && ! bfd_check_format (abfd, bfd_object))
fatal ("can't open `%s' for input.", filename);
-
+
return abfd;
}
void
-set_windres_bfd_endianess (windres_bfd *wrbfd, int is_bigendian)
+set_windres_bfd_endianness (windres_bfd *wrbfd, int is_bigendian)
{
assert (!! wrbfd);
switch (WR_KIND(wrbfd))
target_get_8 (const void *p, rc_uint_type length)
{
rc_uint_type ret;
-
+
if (length < 1)
fatal ("Resource too small for getting 8-bit value.");
{
if (length < 2)
fatal ("Resource too small for getting 16-bit value.");
-
+
if (target_is_bigendian)
return bfd_getb16 (p);
else
{
if (length < 4)
fatal ("Resource too small for getting 32-bit value.");
-
+
if (target_is_bigendian)
return bfd_getb32 (p);
else
target_put_16 (void *p, rc_uint_type value)
{
assert (!! p);
-
+
if (target_is_bigendian)
bfd_putb16 (value, p);
else
target_put_32 (void *p, rc_uint_type value)
{
assert (!! p);
-
+
if (target_is_bigendian)
bfd_putb32 (value, p);
else
va_start (arg, fmt);
r += vfprintf (e, fmt, arg);
va_end (arg);
- return r;
+ return r;
}