1 /* Builtin function expansion for GNU Make.
2 Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc.
3 This file is part of GNU Make.
5 GNU Make is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 GNU Make is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNU Make; see the file COPYING. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
32 struct function_table_entry
36 int required_arguments
;
37 int expand_all_arguments
;
38 char *(*func_ptr
) PARAMS((char *output
, char **argv
, const char*funcname
));
41 static struct function_table_entry function_table
[];
44 /* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
45 each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is
46 the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is
47 nonzero, substitutions are done only on matches which are complete
48 whitespace-delimited words. If SUFFIX_ONLY is nonzero, substitutions are
49 done only at the ends of whitespace-delimited words. */
52 subst_expand (o
, text
, subst
, replace
, slen
, rlen
, by_word
, suffix_only
)
55 char *subst
, *replace
;
56 unsigned int slen
, rlen
;
57 int by_word
, suffix_only
;
59 register char *t
= text
;
62 if (slen
== 0 && !by_word
&& !suffix_only
)
64 /* The first occurrence of "" in any string is its end. */
65 o
= variable_buffer_output (o
, t
, strlen (t
));
67 o
= variable_buffer_output (o
, replace
, rlen
);
73 if ((by_word
| suffix_only
) && slen
== 0)
74 /* When matching by words, the empty string should match
75 the end of each word, rather than the end of the whole text. */
76 p
= end_of_token (next_token (t
));
79 p
= sindex (t
, 0, subst
, slen
);
82 /* No more matches. Output everything left on the end. */
83 o
= variable_buffer_output (o
, t
, strlen (t
));
88 /* Output everything before this occurrence of the string to replace. */
90 o
= variable_buffer_output (o
, t
, p
- t
);
92 /* If we're substituting only by fully matched words,
93 or only at the ends of words, check that this case qualifies. */
95 && ((p
> t
&& !isblank (p
[-1]))
96 || (p
[slen
] != '\0' && !isblank (p
[slen
]))))
98 && (p
[slen
] != '\0' && !isblank (p
[slen
]))))
99 /* Struck out. Output the rest of the string that is
100 no longer to be replaced. */
101 o
= variable_buffer_output (o
, subst
, slen
);
103 /* Output the replacement string. */
104 o
= variable_buffer_output (o
, replace
, rlen
);
106 /* Advance T past the string to be replaced. */
108 } while (*t
!= '\0');
114 /* Store into VARIABLE_BUFFER at O the result of scanning TEXT
115 and replacing strings matching PATTERN with REPLACE.
116 If PATTERN_PERCENT is not nil, PATTERN has already been
117 run through find_percent, and PATTERN_PERCENT is the result.
118 If REPLACE_PERCENT is not nil, REPLACE has already been
119 run through find_percent, and REPLACE_PERCENT is the result. */
122 patsubst_expand (o
, text
, pattern
, replace
, pattern_percent
, replace_percent
)
125 register char *pattern
, *replace
;
126 register char *pattern_percent
, *replace_percent
;
128 unsigned int pattern_prepercent_len
, pattern_postpercent_len
;
129 unsigned int replace_prepercent_len
, replace_postpercent_len
= 0;
134 /* We call find_percent on REPLACE before checking PATTERN so that REPLACE
135 will be collapsed before we call subst_expand if PATTERN has no %. */
136 if (replace_percent
== 0)
137 replace_percent
= find_percent (replace
);
138 if (replace_percent
!= 0)
140 /* Record the length of REPLACE before and after the % so
141 we don't have to compute these lengths more than once. */
142 replace_prepercent_len
= replace_percent
- replace
;
143 replace_postpercent_len
= strlen (replace_percent
+ 1);
146 /* We store the length of the replacement
147 so we only need to compute it once. */
148 replace_prepercent_len
= strlen (replace
);
150 if (pattern_percent
== 0)
151 pattern_percent
= find_percent (pattern
);
152 if (pattern_percent
== 0)
153 /* With no % in the pattern, this is just a simple substitution. */
154 return subst_expand (o
, text
, pattern
, replace
,
155 strlen (pattern
), strlen (replace
), 1, 0);
157 /* Record the length of PATTERN before and after the %
158 so we don't have to compute it more than once. */
159 pattern_prepercent_len
= pattern_percent
- pattern
;
160 pattern_postpercent_len
= strlen (pattern_percent
+ 1);
162 while ((t
= find_next_token (&text
, &len
)) != 0)
166 /* Is it big enough to match? */
167 if (len
< pattern_prepercent_len
+ pattern_postpercent_len
)
170 /* Does the prefix match? */
171 if (!fail
&& pattern_prepercent_len
> 0
173 || t
[pattern_prepercent_len
- 1] != pattern_percent
[-1]
174 || !strneq (t
+ 1, pattern
+ 1, pattern_prepercent_len
- 1)))
177 /* Does the suffix match? */
178 if (!fail
&& pattern_postpercent_len
> 0
179 && (t
[len
- 1] != pattern_percent
[pattern_postpercent_len
]
180 || t
[len
- pattern_postpercent_len
] != pattern_percent
[1]
181 || !strneq (&t
[len
- pattern_postpercent_len
],
182 &pattern_percent
[1], pattern_postpercent_len
- 1)))
186 /* It didn't match. Output the string. */
187 o
= variable_buffer_output (o
, t
, len
);
190 /* It matched. Output the replacement. */
192 /* Output the part of the replacement before the %. */
193 o
= variable_buffer_output (o
, replace
, replace_prepercent_len
);
195 if (replace_percent
!= 0)
197 /* Output the part of the matched string that
198 matched the % in the pattern. */
199 o
= variable_buffer_output (o
, t
+ pattern_prepercent_len
,
200 len
- (pattern_prepercent_len
201 + pattern_postpercent_len
));
202 /* Output the part of the replacement after the %. */
203 o
= variable_buffer_output (o
, replace_percent
+ 1,
204 replace_postpercent_len
);
208 /* Output a space, but not if the replacement is "". */
209 if (fail
|| replace_prepercent_len
> 0
210 || (replace_percent
!= 0 && len
+ replace_postpercent_len
> 0))
212 o
= variable_buffer_output (o
, " ", 1);
217 /* Kill the last space. */
224 /* Look up a function by name.
225 The table is currently small enough that it's not really worthwhile to use
226 a fancier lookup algorithm. If it gets larger, maybe...
229 static const struct function_table_entry
*
230 lookup_function (table
, s
)
231 const struct function_table_entry
*table
;
236 for (; table
->name
!= NULL
; ++table
)
237 if (table
->len
<= len
238 && (isblank (s
[table
->len
]) || s
[table
->len
] == '\0')
239 && strneq (s
, table
->name
, table
->len
))
246 /* Return 1 if PATTERN matches STR, 0 if not. */
249 pattern_matches (pattern
, percent
, str
)
250 register char *pattern
, *percent
, *str
;
252 unsigned int sfxlen
, strlength
;
256 unsigned int len
= strlen (pattern
) + 1;
257 char *new_chars
= (char *) alloca (len
);
258 bcopy (pattern
, new_chars
, len
);
260 percent
= find_percent (pattern
);
262 return streq (pattern
, str
);
265 sfxlen
= strlen (percent
+ 1);
266 strlength
= strlen (str
);
268 if (strlength
< (percent
- pattern
) + sfxlen
269 || !strneq (pattern
, str
, percent
- pattern
))
272 return !strcmp (percent
+ 1, str
+ (strlength
- sfxlen
));
276 /* Find the next comma or ENDPAREN (counting nested STARTPAREN and
277 ENDPARENtheses), starting at PTR before END. Return a pointer to
280 If no next argument is found, return NULL.
284 find_next_argument (startparen
, endparen
, ptr
, end
)
292 for (; ptr
< end
; ++ptr
)
293 if (*ptr
== startparen
)
296 else if (*ptr
== endparen
)
303 else if (*ptr
== ',' && !count
)
306 /* We didn't find anything. */
312 expand_builtin_function (o
, argc
, argv
, entry_p
)
316 struct function_table_entry
*entry_p
;
318 if (argc
< entry_p
->required_arguments
&& entry_p
->required_arguments
>= 0)
320 "Insufficient number of arguments (%d) to function `%s'",
321 argc
, entry_p
->name
);
323 if (!entry_p
->func_ptr
)
324 fatal (reading_file
, "Unimplemented on this platform: function `%s'",
327 return entry_p
->func_ptr (o
, argv
, entry_p
->name
);
330 /* Check for a function invocation in *STRINGP. *STRINGP points at the
331 opening ( or { and is not null-terminated. If a function invocation
332 is found, expand it into the buffer at *OP, updating *OP, incrementing
333 *STRINGP past the reference and returning nonzero. If not, return zero. */
336 handle_function (op
, stringp
)
340 const struct function_table_entry
*entry_p
;
341 char openparen
= (*stringp
)[0];
342 char closeparen
= openparen
== '(' ? ')' : '}';
343 char *beg
= *stringp
+ 1;
348 char **argv
, **argvp
;
351 entry_p
= lookup_function (function_table
, beg
);
356 /* We have found a call to a builtin function. Find the end of the
357 arguments, and do the function. */
359 endref
= beg
+ entry_p
->len
;
361 /* Space after function name isn't part of the args. */
362 p
= next_token (endref
);
365 /* Find the end of the function invocation, counting nested use of
366 whichever kind of parens we use. Since we're looking, count commas
367 to get a rough estimate of how many arguments we might have. The
368 count might be high, but it'll never be low. */
370 for (nargs
=1; *p
!= '\0'; ++p
)
373 else if (*p
== openparen
)
375 else if (*p
== closeparen
&& --count
< 0)
380 "unterminated call to function `%s': missing `%c'",
381 entry_p
->name
, closeparen
);
383 /* Get some memory to store the arg pointers. */
384 argvp
= argv
= (char **) alloca (sizeof(char *) * (nargs
+ 2));
386 /* Chop the string into arguments, then store the end pointer and a nul. */
391 char *next
= find_next_argument (openparen
, closeparen
, *argvp
, p
);
403 /* If we should expand, do it. */
404 if (entry_p
->expand_all_arguments
)
406 for (argvp
=argv
; argvp
[1] != 0; ++argvp
)
407 *argvp
= expand_argument (*argvp
, argvp
[1]-1);
409 /* end pointer doesn't make sense for expanded stuff. */
413 /* Finally! Run the function... */
414 *op
= expand_builtin_function (*op
, nargs
, argv
, entry_p
);
416 /* If we allocated memory for the expanded args, free it again. */
417 if (entry_p
->expand_all_arguments
)
418 for (argvp
=argv
; *argvp
!= 0; ++argvp
)
427 /* Glob-expand LINE. The returned pointer is
428 only good until the next call to string_glob. */
434 static char *result
= 0;
435 static unsigned int length
;
436 register struct nameseq
*chain
;
437 register unsigned int idx
;
439 chain
= multi_glob (parse_file_seq
440 (&line
, '\0', sizeof (struct nameseq
),
441 /* We do not want parse_file_seq to strip `./'s.
442 That would break examples like:
443 $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */
445 sizeof (struct nameseq
));
450 result
= (char *) xmalloc (100);
456 register char *name
= chain
->name
;
457 unsigned int len
= strlen (name
);
459 struct nameseq
*next
= chain
->next
;
460 free ((char *) chain
);
463 /* multi_glob will pass names without globbing metacharacters
464 through as is, but we want only files that actually exist. */
465 if (file_exists_p (name
))
467 if (idx
+ len
+ 1 > length
)
469 length
+= (len
+ 1) * 2;
470 result
= (char *) xrealloc (result
, length
);
472 bcopy (name
, &result
[idx
], len
);
480 /* Kill the last space and terminate the string. */
484 result
[idx
- 1] = '\0';
494 func_patsubst (o
, argv
, funcname
)
497 const char *funcname
;
499 o
= patsubst_expand (o
, argv
[2], argv
[0], argv
[1], (char *) 0, (char *) 0);
505 func_join(o
, argv
, funcname
)
508 const char *funcname
;
512 /* Write each word of the first argument directly followed
513 by the corresponding word of the second argument.
514 If the two arguments have a different number of words,
515 the excess words are just output separated by blanks. */
518 char *list1_iterator
= argv
[0];
519 char *list2_iterator
= argv
[1];
522 unsigned int len1
, len2
;
524 tp
= find_next_token (&list1_iterator
, &len1
);
526 o
= variable_buffer_output (o
, tp
, len1
);
528 pp
= find_next_token (&list2_iterator
, &len2
);
530 o
= variable_buffer_output (o
, pp
, len2
);
532 if (tp
!= 0 || pp
!= 0)
534 o
= variable_buffer_output (o
, " ", 1);
538 while (tp
!= 0 || pp
!= 0);
540 /* Kill the last blank. */
548 func_origin(o
, argv
, funcname
)
551 const char *funcname
;
553 /* Expand the argument. */
554 register struct variable
*v
= lookup_variable (argv
[0], strlen (argv
[0]));
556 o
= variable_buffer_output (o
, "undefined", 9);
565 o
= variable_buffer_output (o
, "default", 7);
568 o
= variable_buffer_output (o
, "environment", 11);
571 o
= variable_buffer_output (o
, "file", 4);
574 o
= variable_buffer_output (o
, "environment override", 20);
577 o
= variable_buffer_output (o
, "command line", 12);
580 o
= variable_buffer_output (o
, "override", 8);
583 o
= variable_buffer_output (o
, "automatic", 9);
591 #define IS_PATHSEP(c) ((c) == ']')
594 #define IS_PATHSEP(c) ((c) == '/' || (c) == '\\')
596 #define IS_PATHSEP(c) ((c) == '/')
602 func_notdir_suffix(o
, argv
, funcname
)
605 const char *funcname
;
607 /* Expand the argument. */
608 char *list_iterator
= argv
[0];
613 int is_suffix
= streq(funcname
, "suffix");
614 int is_notdir
= !is_suffix
;
615 while ((p2
= find_next_token (&list_iterator
, &len
)) != 0)
620 while (p
>= p2
&& (!is_suffix
|| *p
!= '.'))
633 o
= variable_buffer_output (o
, p
, len
- (p
- p2
));
635 #if defined(WINDOWS32) || defined(__MSDOS__)
636 /* Handle the case of "d:foo/bar". */
637 else if (streq(funcname
, "notdir") && p2
[0] && p2
[1] == ':')
640 o
= variable_buffer_output (o
, p
, len
- (p
- p2
));
644 o
= variable_buffer_output (o
, p2
, len
);
646 if (is_notdir
|| p
>= p2
)
648 o
= variable_buffer_output (o
, " ", 1);
653 /* Kill last space. */
663 func_basename_dir(o
, argv
, funcname
)
666 const char *funcname
;
668 /* Expand the argument. */
674 int is_basename
= streq(funcname
, "basename");
675 int is_dir
= !is_basename
;
677 while ((p2
= find_next_token (&p3
, &len
)) != 0)
680 while (p
>= p2
&& (!is_basename
|| *p
!= '.'))
687 if (p
>= p2
&& (is_dir
))
688 o
= variable_buffer_output (o
, p2
, ++p
- p2
);
689 else if (p
>= p2
&& (*p
== '.'))
690 o
= variable_buffer_output (o
, p2
, p
- p2
);
691 #if defined(WINDOWS32) || defined(__MSDOS__)
692 /* Handle the "d:foobar" case */
693 else if (p2
[0] && p2
[1] == ':' && is_dir
)
694 o
= variable_buffer_output (o
, p2
, 2);
698 o
= variable_buffer_output (o
, "[]", 2);
701 o
= variable_buffer_output (o
, "./", 2);
703 ; /* Just a nop... */
707 /* The entire name is the basename. */
708 o
= variable_buffer_output (o
, p2
, len
);
710 o
= variable_buffer_output (o
, " ", 1);
714 /* Kill last space. */
722 func_addsuffix_addprefix(o
, argv
, funcname
)
725 const char *funcname
;
727 int fixlen
= strlen (argv
[0]);
728 char *list_iterator
= argv
[1];
729 int is_addprefix
= streq (funcname
, "addprefix");
730 int is_addsuffix
= !is_addprefix
;
736 while ((p
= find_next_token (&list_iterator
, &len
)) != 0)
739 o
= variable_buffer_output (o
, argv
[0], fixlen
);
740 o
= variable_buffer_output (o
, p
, len
);
742 o
= variable_buffer_output (o
, argv
[0], fixlen
);
743 o
= variable_buffer_output (o
, " ", 1);
748 /* Kill last space. */
755 func_subst(o
, argv
, funcname
)
758 const char *funcname
;
760 o
= subst_expand (o
, argv
[2], argv
[0], argv
[1], strlen (argv
[0]),
761 strlen (argv
[1]), 0, 0);
768 func_firstword(o
, argv
, funcname
)
771 const char *funcname
;
774 char *words
= argv
[0];
775 char *p
= find_next_token (&words
, &i
);
778 o
= variable_buffer_output (o
, p
, i
);
785 func_words(o
, argv
, funcname
)
788 const char *funcname
;
791 char *word_iterator
= argv
[0];
794 while (find_next_token (&word_iterator
, (unsigned int *) 0) != 0)
797 sprintf (buf
, "%d", i
);
798 o
= variable_buffer_output (o
, buf
, strlen (buf
));
805 strip_whitespace (begpp
, endpp
)
809 while (isspace (**begpp
) && *begpp
<= *endpp
)
811 while (isspace (**endpp
) && *endpp
>= *begpp
)
820 char *end
= p
+ strlen (p
) -1;
822 strip_whitespace (&p
, &end
);
831 return (end
- beg
>= 0);
835 check_numeric (s
, message
)
840 fatal (reading_file
, message
);
846 func_word(o
, argv
, funcname
)
849 const char *funcname
;
855 /* Check the first argument. */
856 check_numeric (argv
[0], "non-numeric first argument to `word' function");
860 fatal (reading_file
, "the `word' function takes a positive index argument");
864 while ((p
= find_next_token (&end_p
, 0)) != 0)
869 o
= variable_buffer_output (o
, p
, end_p
- p
);
875 func_wordlist (o
, argv
, funcname
)
878 const char *funcname
;
883 /* Check the first argument. */
884 check_numeric (argv
[0],
885 "non-numeric first argument to `wordlist' function");
887 check_numeric (argv
[1],
888 "non-numeric second argument to `wordlist' function");
895 char *end_p
= argv
[2];
897 int start
= (i
< j
) ? i
: j
;
905 while (((p
= find_next_token (&end_p
, 0)) != 0) && --start
)
909 while (--count
&& (find_next_token (&end_p
, 0) != 0))
911 o
= variable_buffer_output (o
, p
, end_p
- p
);
918 func_findstring(o
, argv
, funcname
)
921 const char *funcname
;
923 /* Find the first occurrence of the first string in the second. */
924 int i
= strlen (argv
[0]);
925 if (sindex (argv
[1], 0, argv
[0], i
) != 0)
926 o
= variable_buffer_output (o
, argv
[0], i
);
932 func_foreach (o
, argv
, funcname
)
935 const char *funcname
;
937 /* expand only the first two. */
938 char *varname
= expand_argument (argv
[0], argv
[1] -1);
939 char *list
= expand_argument (argv
[1], argv
[2] -1);
940 char *body
= savestring (argv
[2], argv
[3] - argv
[2] -1 );
943 char *list_iterator
= list
;
945 register struct variable
*var
=0;
948 push_new_variable_scope ();
949 var
= define_variable (varname
, strlen (varname
), "", o_automatic
, 0);
951 /* loop through LIST, put the value in VAR and expand BODY */
952 while ((p
= find_next_token (&list_iterator
, &len
)) != 0)
961 var
->value
= (char *) xstrdup ((char*) p
);
965 result
= allocated_variable_expand (body
);
967 o
= variable_buffer_output (o
, result
, strlen (result
));
968 o
= variable_buffer_output (o
, " ", 1);
974 /* Kill the last space. */
977 pop_variable_scope ();
993 func_filter_filterout (o
, argv
, funcname
)
996 const char *funcname
;
998 struct a_word
*wordhead
=0;
999 struct a_word
*wordtail
=0;
1001 int is_filter
= streq (funcname
, "filter");
1002 char *patterns
= argv
[0];
1007 char *word_iterator
= argv
[1];
1009 /* Chop ARGV[1] up into words and then run each pattern through. */
1010 while ((p
= find_next_token (&word_iterator
, &len
)) != 0)
1012 struct a_word
*w
= (struct a_word
*)alloca(sizeof(struct a_word
));
1019 if (*word_iterator
!= '\0')
1028 struct a_word
*wp
=0;
1029 char *pat_iterator
= patterns
;
1035 /* Run each pattern through the words, killing words. */
1036 while ((p
= find_next_token (&pat_iterator
, &len
)) != 0)
1042 percent
= find_percent (p
);
1043 for (wp
= wordhead
; wp
!= 0; wp
= wp
->next
)
1044 wp
->matched
|= (percent
== 0 ? streq (p
, wp
->str
)
1045 : pattern_matches (p
, percent
, wp
->str
));
1050 /* Output the words that matched (or didn't, for filter-out). */
1051 for (wp
= wordhead
; wp
!= 0; wp
= wp
->next
)
1052 if (is_filter
? wp
->matched
: !wp
->matched
)
1054 o
= variable_buffer_output (o
, wp
->str
, strlen (wp
->str
));
1055 o
= variable_buffer_output (o
, " ", 1);
1060 /* Kill the last space. */
1069 func_strip(o
, argv
, funcname
)
1072 const char *funcname
;
1085 for (i
=0; *p
!= '\0' && !isspace(*p
); ++p
, ++i
)
1089 o
= variable_buffer_output (o
, word_start
, i
);
1090 o
= variable_buffer_output (o
, " ", 1);
1095 /* Kill the last space. */
1101 Print a warning or fatal message.
1104 func_error (o
, argv
, funcname
)
1107 const char *funcname
;
1113 /* The arguments will be broken on commas. Rather than create yet
1114 another special case where function arguments aren't broken up,
1115 just create a format string that puts them back together. */
1116 for (len
=0, argvp
=argv
; *argvp
!= 0; ++argvp
)
1117 len
+= strlen(*argvp
) + 2;
1119 p
= msg
= alloca (len
+ 1);
1121 for (argvp
=argv
; argvp
[1] != 0; ++argvp
)
1124 p
+= strlen(*argvp
);
1130 if (*funcname
== 'e')
1131 fatal (reading_file
, "%s", msg
);
1133 /* The warning function expands to the empty string. */
1134 error (reading_file
, "%s", msg
);
1141 chop argv[0] into words, and sort them.
1144 func_sort (o
, argv
, funcname
)
1147 const char *funcname
;
1151 register int wordi
= 0;
1153 /* Chop ARGV[0] into words and put them in WORDS. */
1159 while ((p
= find_next_token (&t
, &len
)) != 0)
1161 if (wordi
>= nwords
- 1)
1163 nwords
= 2* nwords
+ 5;
1164 words
= (char **) xrealloc ((char *) words
,
1165 nwords
* sizeof (char *));
1167 words
[wordi
++] = savestring (p
, len
);
1173 /* Now sort the list of words. */
1174 qsort ((char *) words
, wordi
, sizeof (char *), alpha_compare
);
1176 /* Now write the sorted list. */
1177 for (i
= 0; i
< wordi
; ++i
)
1179 len
= strlen (words
[i
]);
1180 if (i
== wordi
- 1 || strlen (words
[i
+ 1]) != len
1181 || strcmp (words
[i
], words
[i
+ 1]))
1183 o
= variable_buffer_output (o
, words
[i
], len
);
1184 o
= variable_buffer_output (o
, " ", 1);
1188 /* Kill the last space. */
1197 func_wildcard(o
, argv
, funcname
)
1200 const char *funcname
;
1204 o
= wildcard_expansion (argv
[0], o
);
1206 char *p
= string_glob (argv
[0]);
1207 o
= variable_buffer_output (o
, p
, strlen (p
));
1213 \r is replaced on UNIX as well. Is this desirable?
1216 fold_newlines (buffer
, length
)
1222 char *last_nonnl
= buffer
-1;
1224 for (; *src
!= '\0'; ++src
)
1226 if (src
[0] == '\r' && src
[1] == '\n')
1238 *(++last_nonnl
) = '\0';
1239 *length
= last_nonnl
- buffer
;
1244 int shell_function_pid
= 0, shell_function_completed
;
1250 #include <windows.h>
1252 #include "sub_proc.h"
1256 windows32_openpipe (int *pipedes
, int *pid_p
, char **command_argv
, char **envp
)
1258 SECURITY_ATTRIBUTES saAttr
;
1266 saAttr
.nLength
= sizeof(SECURITY_ATTRIBUTES
);
1267 saAttr
.bInheritHandle
= TRUE
;
1268 saAttr
.lpSecurityDescriptor
= NULL
;
1270 if (DuplicateHandle(GetCurrentProcess(),
1271 GetStdHandle(STD_INPUT_HANDLE
),
1272 GetCurrentProcess(),
1276 DUPLICATE_SAME_ACCESS
) == FALSE
) {
1277 fatal (NILF
, "create_child_process: DuplicateHandle(In) failed (e=%d)\n",
1281 if (DuplicateHandle(GetCurrentProcess(),
1282 GetStdHandle(STD_ERROR_HANDLE
),
1283 GetCurrentProcess(),
1287 DUPLICATE_SAME_ACCESS
) == FALSE
) {
1288 fatal (NILF
, "create_child_process: DuplicateHandle(Err) failed (e=%d)\n",
1292 if (!CreatePipe(&hChildOutRd
, &hChildOutWr
, &saAttr
, 0))
1293 fatal (NILF
, "CreatePipe() failed (e=%d)\n", GetLastError());
1297 hProcess
= process_init_fd(hIn
, hChildOutWr
, hErr
);
1300 fatal (NILF
, "windows32_openpipe (): process_init_fd() failed\n");
1303 process_register(hProcess
);
1305 /* make sure that CreateProcess() has Path it needs */
1306 sync_Path_environment();
1308 if (!process_begin(hProcess
, command_argv
, envp
, command_argv
[0], NULL
))
1309 *pid_p
= (int) hProcess
;
1311 fatal (NILF
, "windows32_openpipe (): unable to launch process (e=%d)\n",
1312 process_last_err(hProcess
));
1314 /* set up to read data from child */
1315 pipedes
[0] = _open_osfhandle((long) hChildOutRd
, O_RDONLY
);
1317 /* this will be closed almost right away */
1318 pipedes
[1] = _open_osfhandle((long) hChildOutWr
, O_APPEND
);
1328 msdos_openpipe (int* pipedes
, int *pidp
, char *text
)
1331 /* MSDOS can't fork, but it has `popen'.
1332 (Bwt, why isn't `popen' used in all the versions?) */
1333 struct variable
*sh
= lookup_variable ("SHELL", 5);
1335 extern int dos_command_running
, dos_status
;
1337 /* Make sure not to bother processing an empty line. */
1338 while (isblank (*text
))
1345 char buf
[PATH_MAX
+ 7];
1346 /* This makes sure $SHELL value is used by $(shell), even
1347 though the target environment is not passed to it. */
1348 sprintf (buf
, "SHELL=%s", sh
->value
);
1354 dos_command_running
= 1;
1356 fpipe
= popen (text
, "rt");
1357 dos_command_running
= 0;
1358 if (!fpipe
|| dos_status
)
1364 else if (errno
== 0)
1366 shell_function_completed
= -1;
1370 pipedes
[0] = fileno (fpipe
);
1371 *pidp
= 42; /* uh? The meaning of Life?*/
1373 shell_function_completed
= 1;
1380 Do shell spawning, with the naughty bits for different OSes.
1385 /* VMS can't do $(shell ...) */
1386 #define func_shell 0
1391 func_shell (o
, argv
, funcname
)
1394 const char *funcname
;
1396 char* batch_filename
= NULL
;
1402 char **command_argv
;
1409 /* Construct the argument list. */
1410 command_argv
= construct_command_argv (argv
[0],
1411 (char **) NULL
, (struct file
*) 0,
1413 if (command_argv
== 0)
1417 /* Using a target environment for `shell' loses in cases like:
1418 export var = $(shell echo foobie)
1419 because target_environment hits a loop trying to expand $(var)
1420 to put it in the environment. This is even more confusing when
1421 var was not explicitly exported, but just appeared in the
1422 calling environment. */
1426 /* For error messages. */
1427 if (reading_file
!= 0)
1429 error_prefix
= (char *) alloca (strlen(reading_file
->filenm
)+100);
1431 sprintf (error_prefix
,
1432 "%s:%lu: ", reading_file
->filenm
, reading_file
->lineno
);
1439 windows32_openpipe (pipedes
, &pid
, command_argv
, envp
);
1440 #else /* WINDOWS32 */
1443 fpipe
= msdos_openpipe (pipedes
, argv
[0], command_argv
, envp
);
1444 if (!fpipe
|| pipedes
[0] < 0)
1446 perror_with_name (error_prefix
, "pipe");
1450 if (pipe (pipedes
) < 0)
1452 perror_with_name (error_prefix
, "pipe");
1458 perror_with_name (error_prefix
, "fork");
1460 child_execute_job (0, pipedes
[1], command_argv
, envp
);
1462 # endif /* ! __MSDOS__ */
1464 #endif /* WINDOWS32 */
1466 /* We are the parent. */
1469 unsigned int maxlen
;
1472 /* Record the PID for reap_children. */
1473 shell_function_pid
= pid
;
1475 shell_function_completed
= 0;
1477 /* Free the storage only the child needed. */
1478 free (command_argv
[0]);
1479 free ((char *) command_argv
);
1481 /* Close the write side of the pipe. */
1482 (void) close (pipedes
[1]);
1485 /* Set up and read from the pipe. */
1488 buffer
= (char *) xmalloc (maxlen
+ 1);
1490 /* Read from the pipe until it gets EOF. */
1497 buffer
= (char *) xrealloc (buffer
, maxlen
+ 1);
1501 cc
= read (pipedes
[0], &buffer
[i
], maxlen
- i
);
1506 while (cc
> 0 || errno
== EINTR
);
1511 /* Close the read side of the pipe. */
1514 (void) pclose (fpipe
);
1516 (void) close (pipedes
[0]);
1519 /* Loop until child_handler sets shell_function_completed
1520 to the status of our child shell. */
1521 while (shell_function_completed
== 0)
1522 reap_children (1, 0);
1524 if (batch_filename
) {
1526 printf("Cleaning up temporary batch file %s\n", batch_filename
);
1527 remove(batch_filename
);
1528 free(batch_filename
);
1530 shell_function_pid
= 0;
1532 /* The child_handler function will set shell_function_completed
1533 to 1 when the child dies normally, or to -1 if it
1534 dies with status 127, which is most likely an exec fail. */
1536 if (shell_function_completed
== -1)
1538 /* This most likely means that the execvp failed,
1539 so we should just write out the error message
1540 that came in over the pipe from the child. */
1541 fputs (buffer
, stderr
);
1546 /* The child finished normally. Replace all
1547 newlines in its output with spaces, and put
1548 that in the variable output buffer. */
1549 fold_newlines (buffer
, &i
);
1550 o
= variable_buffer_output (o
, buffer
, i
);
1561 /* Do the Amiga version of func_shell. */
1564 func_shell (char *o
, char **argv
, const char *funcname
)
1566 /* Amiga can't fork nor spawn, but I can start a program with
1567 redirection of my choice. However, this means that we
1568 don't have an opportunity to reopen stdout to trap it. Thus,
1569 we save our own stdout onto a new descriptor and dup a temp
1570 file's descriptor onto our stdout temporarily. After we
1571 spawn the shell program, we dup our own stdout back to the
1572 stdout descriptor. The buffer reading is the same as above,
1573 except that we're now reading from a file. */
1575 #include <dos/dos.h>
1576 #include <proto/dos.h>
1579 char tmp_output
[FILENAME_MAX
];
1580 unsigned int maxlen
= 200;
1582 char * buffer
, * ptr
;
1585 char* batch_filename
= NULL
;
1587 /* Construct the argument list. */
1588 command_argv
= construct_command_argv (argv
[0], (char **) NULL
,
1589 (struct file
*) 0, &batch_filename
);
1590 if (command_argv
== 0)
1594 strcpy (tmp_output
, "t:MakeshXXXXXXXX");
1595 mktemp (tmp_output
);
1596 child_stdout
= Open (tmp_output
, MODE_NEWFILE
);
1598 for (aptr
=command_argv
; *aptr
; aptr
++)
1599 len
+= strlen (*aptr
) + 1;
1601 buffer
= xmalloc (len
+ 1);
1604 for (aptr
=command_argv
; *aptr
; aptr
++)
1606 strcpy (ptr
, *aptr
);
1607 ptr
+= strlen (ptr
) + 1;
1614 Execute (buffer
, NULL
, child_stdout
);
1617 Close (child_stdout
);
1619 child_stdout
= Open (tmp_output
, MODE_OLDFILE
);
1621 buffer
= xmalloc (maxlen
);
1628 buffer
= (char *) xrealloc (buffer
, maxlen
+ 1);
1631 cc
= Read (child_stdout
, &buffer
[i
], maxlen
- i
);
1636 Close (child_stdout
);
1638 fold_newlines (buffer
, &i
);
1639 o
= variable_buffer_output (o
, buffer
, i
);
1649 equality. Return is string-boolean, ie, the empty string is false.
1652 func_eq (char* o
, char **argv
, char *funcname
)
1654 int result
= ! strcmp (argv
[0], argv
[1]);
1655 o
= variable_buffer_output (o
, result
? "1" : "", result
);
1661 string-boolean not operator.
1664 func_not (char* o
, char **argv
, char *funcname
)
1668 while (isspace (*s
))
1671 o
= variable_buffer_output (o
, result
? "1" : "", result
);
1678 This is an experimental conditional function.
1682 $(if condition, true-part, false-part)
1684 This is fully not consistent with make's syntax, but more in line
1685 with `normal' programming languages.
1689 - CONDITION is false iff it evaluates to an empty string. White
1690 space before and after condition are stripped before evaluation.
1692 - If CONDITION is true, then TRUE-PART is evaluated, otherwise
1693 FALSE-PART is evaluated. Because only one of the two PARTs is
1694 evaluated, you can use $(if ) to create side-effects with the
1699 func_if (char* o
, char **argv
, char *funcname
)
1701 char *begp
= argv
[0];
1702 char *endp
= argv
[1]-2;
1706 strip_whitespace (&begp
, &endp
);
1708 expansion
= expand_argument (begp
, endp
+ 1);
1711 ? strlen (expansion
)
1717 expansion
= expand_argument (argv
[1 + result
], argv
[2+result
] -1);
1718 o
= variable_buffer_output (o
, expansion
, strlen (expansion
));
1724 /* User-defined functions. Expand the first argument as either a builtin
1725 function or a make variable, in the context of the rest of the arguments
1726 assigned to $1, $2, ... $N. $0 is the name of the function. */
1729 func_call (o
, argv
, funcname
)
1732 const char *funcname
;
1738 const struct function_table_entry
*entry_p
;
1740 /* Calling nothing is a no-op. */
1741 if (*argv
[0] == '\0')
1744 /* There is no way to define a variable with a space in the name, so strip
1745 trailing whitespace as a favor to the user. */
1747 flen
= strlen (argv
[0]);
1748 fname
= argv
[0] + flen
- 1;
1749 while (isspace (*fname
))
1753 flen
= fname
- argv
[0] + 1;
1756 /* Are we invoking a builtin function? */
1758 entry_p
= lookup_function (function_table
, fname
);
1762 for (i
=0; argv
[i
+1]; ++i
)
1765 return expand_builtin_function (o
, i
, argv
+ 1, entry_p
);
1768 /* No, so the first argument is the name of a variable to be expanded and
1769 interpreted as a function. Create the variable reference. */
1770 body
= alloca (flen
+ 4);
1773 strcpy (body
+ 2, fname
);
1777 /* Set up arguments $(1) .. $(N). $(0) is the function name. */
1779 push_new_variable_scope ();
1781 for (i
=0; *argv
; ++i
, ++argv
)
1785 sprintf (num
, "%d", i
);
1786 define_variable (num
, strlen (num
), *argv
, o_automatic
, 0);
1789 /* Expand the body in the context of the arguments, adding the result to
1790 the variable buffer. */
1792 o
= variable_expand_string (o
, body
, flen
+3);
1794 pop_variable_scope ();
1796 return o
+ strlen(o
);
1800 #define STRING_SIZE_TUPLE(_s) (_s), (sizeof(_s)-1)
1802 /* Lookup table for builtin functions.
1804 This doesn't have to be sorted; we use a straight lookup. We might gain
1805 some efficiency by moving most often used functions to the start of the
1808 REQUIRED_ARGUMENTS is the minimum number of arguments. A function
1809 can have more, but if they have less an error will be generated.
1811 EXPAND_ALL_ARGUMENTS means that all arguments should be expanded
1812 before invocation. Functions that do namespace tricks (foreach)
1813 don't automatically expand. */
1815 static struct function_table_entry function_table
[] =
1817 /* Name/size */ /* ARG EXP? Function */
1818 { STRING_SIZE_TUPLE("addprefix"), 2, 1, func_addsuffix_addprefix
},
1819 { STRING_SIZE_TUPLE("addsuffix"), 2, 1, func_addsuffix_addprefix
},
1820 { STRING_SIZE_TUPLE("basename"), 1, 1, func_basename_dir
},
1821 { STRING_SIZE_TUPLE("dir"), 1, 1, func_basename_dir
},
1822 { STRING_SIZE_TUPLE("notdir"), 1, 1, func_notdir_suffix
},
1823 { STRING_SIZE_TUPLE("subst"), 3, 1, func_subst
},
1824 { STRING_SIZE_TUPLE("suffix"), 1, 1, func_notdir_suffix
},
1825 { STRING_SIZE_TUPLE("filter"), 2, 1, func_filter_filterout
},
1826 { STRING_SIZE_TUPLE("filter-out"), 2, 1, func_filter_filterout
},
1827 { STRING_SIZE_TUPLE("findstring"), 2, 1, func_findstring
},
1828 { STRING_SIZE_TUPLE("firstword"), 1, 1, func_firstword
},
1829 { STRING_SIZE_TUPLE("join"), 2, 1, func_join
},
1830 { STRING_SIZE_TUPLE("patsubst"), 3, 1, func_patsubst
},
1831 { STRING_SIZE_TUPLE("shell"), 1, 1, func_shell
},
1832 { STRING_SIZE_TUPLE("sort"), 1, 1, func_sort
},
1833 { STRING_SIZE_TUPLE("strip"), 1, 1, func_strip
},
1834 { STRING_SIZE_TUPLE("wildcard"), 1, 1, func_wildcard
},
1835 { STRING_SIZE_TUPLE("word"), 2, 1, func_word
},
1836 { STRING_SIZE_TUPLE("wordlist"), 3, 1, func_wordlist
},
1837 { STRING_SIZE_TUPLE("words"), 1, 1, func_words
},
1838 { STRING_SIZE_TUPLE("origin"), 1, 1, func_origin
},
1839 { STRING_SIZE_TUPLE("foreach"), 3, 0, func_foreach
},
1840 { STRING_SIZE_TUPLE("call"), 1, 1, func_call
},
1841 { STRING_SIZE_TUPLE("error"), 1, 1, func_error
},
1842 { STRING_SIZE_TUPLE("warning"), 1, 1, func_error
},
1844 { STRING_SIZE_TUPLE("eq"), 2, 1, func_eq
},
1845 { STRING_SIZE_TUPLE("if"), 3, 0, func_if
},
1846 { STRING_SIZE_TUPLE("not"), 1, 1, func_not
},