+static int
+name_match (const char *pattern, const char *name)
+{
+ if (wildcardp (pattern))
+ return fnmatch (pattern, name, 0);
+ return strcmp (pattern, name);
+}
+
+/* If PATTERN is of the form archive:file, return a pointer to the
+ separator. If not, return NULL. */
+
+static char *
+archive_path (const char *pattern)
+{
+ char *p = NULL;
+
+ if (link_info.path_separator == 0)
+ return p;
+
+ p = strchr (pattern, link_info.path_separator);
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+ if (p == NULL || link_info.path_separator != ':')
+ return p;
+
+ /* Assume a match on the second char is part of drive specifier,
+ as in "c:\silly.dos". */
+ if (p == pattern + 1 && ISALPHA (*pattern))
+ p = strchr (p + 1, link_info.path_separator);
+#endif
+ return p;
+}
+
+/* Given that FILE_SPEC results in a non-NULL SEP result from archive_path,
+ return whether F matches FILE_SPEC. */
+
+static bfd_boolean
+input_statement_is_archive_path (const char *file_spec, char *sep,
+ lang_input_statement_type *f)
+{
+ bfd_boolean match = FALSE;
+
+ if ((*(sep + 1) == 0
+ || name_match (sep + 1, f->filename) == 0)
+ && ((sep != file_spec)
+ == (f->the_bfd != NULL && f->the_bfd->my_archive != NULL)))
+ {
+ match = TRUE;
+
+ if (sep != file_spec)
+ {
+ const char *aname = f->the_bfd->my_archive->filename;
+ *sep = 0;
+ match = name_match (file_spec, aname) == 0;
+ *sep = link_info.path_separator;
+ }
+ }
+ return match;
+}
+
+static bfd_boolean