diff options
Diffstat (limited to 'binutils/resrc.c')
-rw-r--r-- | binutils/resrc.c | 121 |
1 files changed, 112 insertions, 9 deletions
diff --git a/binutils/resrc.c b/binutils/resrc.c index 9ba3c11..41c9cca 100644 --- a/binutils/resrc.c +++ b/binutils/resrc.c @@ -120,6 +120,52 @@ static void get_data PARAMS ((FILE *, unsigned char *, unsigned long, const char *)); static void define_fontdirs PARAMS ((void)); +/* look for the preprocessor program */ + +FILE * +look_for_default (cmd, prefix, end_prefix, preprocargs, filename) + char *cmd; + char *prefix; + int end_prefix; + char *preprocargs; + char *filename; +{ + char *path = getenv ("PATH"); + char *space; + int found; + struct stat s; + + strcpy (cmd, prefix); + + sprintf (cmd+end_prefix, "%s", DEFAULT_PREPROCESSOR); + space = strchr (cmd+end_prefix, ' '); + if (space) + *space = 0; + + if (strchr (cmd, '/')) + { + found = stat (cmd, &s); + + if (found < 0) + { + if (verbose) + fprintf (stderr, "Tried `%s'\n", cmd); + return 0; + } + } + + strcpy (cmd, prefix); + + sprintf (cmd+end_prefix, "%s %s %s", + DEFAULT_PREPROCESSOR, preprocargs, filename); + + if (verbose) + fprintf (stderr, "Using `%s'\n", cmd); + + cpp_pipe = popen (cmd, FOPEN_RT); + return cpp_pipe; +} + /* Read an rc file. */ struct res_directory * @@ -131,21 +177,78 @@ read_rc_file (filename, preprocessor, preprocargs, language) { char *cmd; - if (preprocessor == NULL) - preprocessor = DEFAULT_PREPROCESSOR; - if (preprocargs == NULL) preprocargs = ""; if (filename == NULL) filename = "-"; - cmd = xmalloc (strlen (preprocessor) - + strlen (preprocargs) - + strlen (filename) - + 10); - sprintf (cmd, "%s %s %s", preprocessor, preprocargs, filename); + if (preprocessor) + { + cmd = xmalloc (strlen (preprocessor) + + strlen (preprocargs) + + strlen (filename) + + 10); + sprintf (cmd, "%s %s %s", preprocessor, preprocargs, filename); - cpp_pipe = popen (cmd, FOPEN_RT); + cpp_pipe = popen (cmd, FOPEN_RT); + } + else + { + char *dash, *slash, *cp; + + preprocessor = DEFAULT_PREPROCESSOR; + + cmd = xmalloc (strlen (program_name) + + strlen (preprocessor) + + strlen (preprocargs) + + strlen (filename) + + 10); + + + dash = slash = 0; + for (cp=program_name; *cp; cp++) + { + if (*cp == '-') + dash = cp; + if ( +#if defined(__DJGPP__) || defined (__CYGWIN__) || defined(__WIN32__) + *cp == ':' || *cp == '\\' || +#endif + *cp == '/') + { + slash = cp; + dash = 0; + } + } + + cpp_pipe = 0; + + if (dash) + { + /* First, try looking for a prefixed gcc in the windres + directory, with the same prefix as windres */ + + cpp_pipe = look_for_default (cmd, program_name, dash-program_name+1, + preprocargs, filename); + } + + if (slash && !cpp_pipe) + { + /* Next, try looking for a gcc in the same directory as + that windres */ + + cpp_pipe = look_for_default (cmd, program_name, slash-program_name+1, + preprocargs, filename); + } + + if (!cpp_pipe) + { + /* Sigh, try the default */ + + cpp_pipe = look_for_default (cmd, "", 0, preprocargs, filename); + } + + } if (cpp_pipe == NULL) fatal (_("can't popen `%s': %s"), cmd, strerror (errno)); free (cmd); |