X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Fwindres.c;h=ece32bad6bf6b2b93acf259c04be14f843833351;hb=b89667ebd42a3a59b8f17ec9153d07dd2fc7e5e1;hp=90918a6e90563686f6038203a068e98d4534ea9f;hpb=4a594fce16683232bbb2e239d3e3ebcfcde16d1a;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/windres.c b/binutils/windres.c index 90918a6e90..ece32bad6b 100644 --- a/binutils/windres.c +++ b/binutils/windres.c @@ -8,7 +8,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -157,7 +157,7 @@ res_init (void) void * res_alloc (rc_uint_type bytes) { - return (void *) obstack_alloc (&res_obstack, (size_t) bytes); + return obstack_alloc (&res_obstack, (size_t) bytes); } /* We also use an obstack to save memory used while writing out a set @@ -178,7 +178,7 @@ reswr_init (void) void * reswr_alloc (rc_uint_type bytes) { - return (void *) obstack_alloc (&reswr_obstack, (size_t) bytes); + return obstack_alloc (&reswr_obstack, (size_t) bytes); } /* Open a file using the include directory search list. */ @@ -673,6 +673,7 @@ usage (FILE *stream, int status) -D --define [=] Define SYM when preprocessing rc file\n\ -U --undefine Undefine SYM when preprocessing rc file\n\ -v --verbose Verbose - tells you what it's doing\n\ + -c --codepage= Specify default codepage\n\ -l --language= Set language when reading rc file\n\ --use-temp-file Use a temporary file instead of popen to read\n\ the preprocessor output\n\ @@ -749,6 +750,7 @@ static const struct option long_options[] = {"define", required_argument, 0, 'D'}, {"undefine", required_argument, 0, 'U'}, {"verbose", no_argument, 0, 'v'}, + {"codepage", required_argument, 0, 'c'}, {"language", required_argument, 0, 'l'}, {"use-temp-file", no_argument, 0, OPTION_USE_TEMP_FILE}, {"no-use-temp-file", no_argument, 0, OPTION_NO_USE_TEMP_FILE}, @@ -758,6 +760,26 @@ static const struct option long_options[] = {0, no_argument, 0, 0} }; +void +windres_add_include_dir (const char *p) +{ + struct include_dir *n, **pp; + + /* Computing paths is often complicated and error prone. + The easiest way to check for mistakes is at the time + we add them to include_dirs. */ + assert (p != NULL); + assert (*p != '\0'); + + n = xmalloc (sizeof *n); + n->next = NULL; + n->dir = (char * ) p; + + for (pp = &include_dirs; *pp != NULL; pp = &(*pp)->next) + ; + *pp = n; +} + /* This keeps gcc happy when using -Wmissing-prototypes -Wstrict-prototypes. */ int main (int, char **); @@ -809,11 +831,25 @@ main (int argc, char **argv) language = 0x409; /* LANG_ENGLISH, SUBLANG_ENGLISH_US. */ use_temp_file = 0; - while ((c = getopt_long (argc, argv, "f:i:l:o:I:J:O:F:D:U:rhHvV", long_options, + while ((c = getopt_long (argc, argv, "c:f:i:l:o:I:J:O:F:D:U:rhHvV", long_options, (int *) 0)) != EOF) { switch (c) { + case 'c': + { + rc_uint_type ncp; + + if (optarg[0] == '0' && (optarg[1] == 'x' || optarg[1] == 'X')) + ncp = (rc_uint_type) strtol (optarg + 2, NULL, 16); + else + ncp = (rc_uint_type) strtol (optarg, NULL, 10); + if (ncp == CP_UTF16 || ! unicode_is_valid_codepage (ncp)) + fatal (_("invalid codepage specified.\n")); + wind_default_codepage = wind_current_codepage = ncp; + } + break; + case 'i': input_filename = optarg; break; @@ -910,17 +946,7 @@ main (int argc, char **argv) preprocargs = n; } - { - struct include_dir *n, **pp; - - n = (struct include_dir *) xmalloc (sizeof *n); - n->next = NULL; - n->dir = optarg; - - for (pp = &include_dirs; *pp != NULL; pp = &(*pp)->next) - ; - *pp = n; - } + windres_add_include_dir (optarg); break; @@ -1036,7 +1062,27 @@ main (int argc, char **argv) return 0; } -static void set_endianess (bfd *abfd, const char *target) +static int +find_arch_match(const char *tname,const char **arch) +{ + while (*arch != NULL) + { + const char *in_a = strstr (*arch, tname); + char end_ch = (in_a ? in_a[strlen(tname)] : 0); + + if (in_a && (in_a == *arch || in_a[-1] == ':') + && end_ch == 0) + { + def_target_arch = *arch; + return 1; + } + arch++; + } + return 0; +} + +static void +set_endianess (bfd *abfd, const char *target) { const bfd_target *target_vec; @@ -1045,26 +1091,39 @@ static void set_endianess (bfd *abfd, const char *target) if (! target_vec) fatal ("Can't detect target endianess and architecture."); target_is_bigendian = ((target_vec->byteorder == BFD_ENDIAN_BIG) ? 1 : 0); + { - const char *tname = target_vec->name; - const char **arch = bfd_arch_list(); - if (arch && tname) + const char * tname = target_vec->name; + const char ** arches = bfd_arch_list(); + + if (arches && tname) { - if (strchr (tname, '-') != NULL) - tname = strchr (tname, '-') + 1; - while (*arch != NULL) + char *hyp = strchr (tname, '-'); + + if (hyp != NULL) { - const char *in_a = strstr (*arch, tname); - char end_ch = (in_a ? in_a[strlen(tname)] : 0); - if (in_a && (in_a == *arch || in_a[-1] == ':') - && end_ch == 0) + tname = hyp + 1; + + /* Make sure we dectect architecture names + for triplets like "pe-arm-wince-little". */ + if (!find_arch_match (tname, arches)) { - def_target_arch = *arch; - break; + char *new_tname = (char *) alloca (strlen (hyp) + 1); + strcpy (new_tname, hyp); + while ((hyp = strrchr (new_tname, '-')) != NULL) + { + *hyp = 0; + if (find_arch_match (new_tname, arches)) + break; + } } - arch++; } + else + find_arch_match (tname, arches); } + + free (arches); + if (! def_target_arch) fatal ("Can't detect architecture."); } @@ -1130,8 +1189,8 @@ set_windres_bfd (windres_bfd *wrbfd, bfd *abfd, asection *sec, rc_uint_type kind } void -set_windres_bfd_content(windres_bfd *wrbfd, const void *data, rc_uint_type off, - rc_uint_type length) +set_windres_bfd_content (windres_bfd *wrbfd, const void *data, rc_uint_type off, + rc_uint_type length) { if (WR_KIND(wrbfd) != WR_KIND_TARGET) { @@ -1143,8 +1202,8 @@ set_windres_bfd_content(windres_bfd *wrbfd, const void *data, rc_uint_type off, } void -get_windres_bfd_content(windres_bfd *wrbfd, void *data, rc_uint_type off, - rc_uint_type length) +get_windres_bfd_content (windres_bfd *wrbfd, void *data, rc_uint_type off, + rc_uint_type length) { if (WR_KIND(wrbfd) != WR_KIND_TARGET) {