aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1997-06-10 22:23:32 +0000
committerJason Merrill <merrill@gnu.org>1997-06-10 22:23:32 +0000
commit41e168350983a7b24d31585d1ddbcdfeea0c3075 (patch)
treefcacdeb8814a195725668368769656967b75bf54
parentd7d775a019c3a310bf54759560c7392bb03ea669 (diff)
downloadgcc-41e168350983a7b24d31585d1ddbcdfeea0c3075.zip
gcc-41e168350983a7b24d31585d1ddbcdfeea0c3075.tar.gz
gcc-41e168350983a7b24d31585d1ddbcdfeea0c3075.tar.bz2
x
From-SVN: r14225
-rw-r--r--gcc/collect2.c72
1 files changed, 48 insertions, 24 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c
index e5f404f2..e0ee616 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -493,6 +493,38 @@ savestring (input, size)
output[size] = 0;
return output;
}
+
+/* Parse a reasonable subset of shell quoting syntax. */
+
+static char *
+extract_string (pp)
+ char **pp;
+{
+ char *p = *pp;
+ int backquote = 0;
+ int inside = 0;
+
+ for (;;)
+ {
+ char c = *p;
+ if (c == '\0')
+ break;
+ ++p;
+ if (backquote)
+ obstack_1grow (&temporary_obstack, c);
+ else if (! inside && c == ' ')
+ break;
+ else if (! inside && c == '\\')
+ backquote = 1;
+ else if (c == '\'')
+ inside = !inside;
+ else
+ obstack_1grow (&temporary_obstack, c);
+ }
+
+ *pp = p;
+ return obstack_finish (&temporary_obstack);
+}
void
dump_file (name)
@@ -957,17 +989,13 @@ main (argc, argv)
putenv (p);
p = (char *) getenv ("COLLECT_GCC_OPTIONS");
- if (p)
- while (*p)
- {
- char *q = p;
- while (*q && *q != ' ') q++;
- if (*p == '-' && p[1] == 'm')
- num_c_args++;
-
- if (*q) q++;
- p = q;
- }
+ while (p && *p)
+ {
+ char *q = extract_string (&p);
+ if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
+ num_c_args++;
+ }
+ obstack_free (&temporary_obstack, temporary_firstobj);
c_ptr = c_argv = (char **) xcalloc (sizeof (char *), num_c_args);
@@ -1254,19 +1282,15 @@ main (argc, argv)
/* Get any options that the upper GCC wants to pass to the sub-GCC. */
p = (char *) getenv ("COLLECT_GCC_OPTIONS");
- if (p)
- while (*p)
- {
- char *q = p;
- while (*q && *q != ' ') q++;
- if (*p == '-' && (p[1] == 'm' || p[1] == 'f'))
- *c_ptr++ = savestring (p, q - p);
- if (strncmp (p, "-shared", sizeof ("shared") - 1) == 0)
- shared_obj = 1;
-
- if (*q) q++;
- p = q;
- }
+ while (p && *p)
+ {
+ char *q = extract_string (&p);
+ if (*q == '-' && (q[1] == 'm' || q[1] == 'f'))
+ *c_ptr++ = obstack_copy0 (&permanent_obstack, q, strlen (q));
+ if (strncmp (q, "-shared", sizeof ("shared") - 1) == 0)
+ shared_obj = 1;
+ }
+ obstack_free (&temporary_obstack, temporary_firstobj);
#ifdef COLLECT_EXPORT_LIST
/* The AIX linker will discard static constructors in object files if