source: trunk/src/kmk/function.c@ 1442

Last change on this file since 1442 was 1442, checked in by bird, 17 years ago

fixes.

  • Property svn:eol-style set to native
File size: 110.3 KB
Line 
1/* Builtin function expansion for GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4Foundation, Inc.
5This file is part of GNU Make.
6
7GNU Make is free software; you can redistribute it and/or modify it under the
8terms of the GNU General Public License as published by the Free Software
9Foundation; either version 2, or (at your option) any later version.
10
11GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License along with
16GNU Make; see the file COPYING. If not, write to the Free Software
17Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */
18
19#include "make.h"
20#include "filedef.h"
21#include "variable.h"
22#include "dep.h"
23#include "job.h"
24#include "commands.h"
25#include "debug.h"
26
27#ifdef _AMIGA
28#include "amiga.h"
29#endif
30
31#ifdef WINDOWS32 /* bird */
32# include "pathstuff.h"
33#endif
34
35#ifdef KMK_HELPERS
36# include "kbuild.h"
37#endif
38#ifdef CONFIG_WITH_XARGS /* bird */
39# ifdef HAVE_LIMITS_H
40# include <limits.h>
41# endif
42#endif
43#include <assert.h> /* bird */
44
45#if defined (CONFIG_WITH_MATH) || defined (CONFIG_WITH_NANOTS) || defined (CONFIG_WITH_FILE_SIZE) /* bird */
46# include <ctype.h>
47# ifdef _MSC_VER
48typedef __int64 math_int;
49# else
50# include <stdint.h>
51typedef int64_t math_int;
52# endif
53static char *math_int_to_variable_buffer (char *, math_int);
54#endif
55
56#ifdef CONFIG_WITH_NANOTS /* bird */
57# ifdef WINDOWS32
58# include <Windows.h>
59# endif
60#endif
61
62#ifdef __OS2__
63# define CONFIG_WITH_OS2_LIBPATH 1
64#endif
65#ifdef CONFIG_WITH_OS2_LIBPATH
66# define INCL_BASE
67# define INCL_ERRROS
68# include <os2.h>
69
70# define QHINF_EXEINFO 1 /* NE exeinfo. */
71# define QHINF_READRSRCTBL 2 /* Reads from the resource table. */
72# define QHINF_READFILE 3 /* Reads from the executable file. */
73# define QHINF_LIBPATHLENGTH 4 /* Gets the libpath length. */
74# define QHINF_LIBPATH 5 /* Gets the entire libpath. */
75# define QHINF_FIXENTRY 6 /* NE only */
76# define QHINF_STE 7 /* NE only */
77# define QHINF_MAPSEL 8 /* NE only */
78 extern APIRET APIENTRY DosQueryHeaderInfo(HMODULE hmod, ULONG ulIndex, PVOID pvBuffer, ULONG cbBuffer, ULONG ulSubFunction);
79#endif /* CONFIG_WITH_OS2_LIBPATH */
80
81
82struct function_table_entry
83 {
84 const char *name;
85 unsigned char len;
86 unsigned char minimum_args;
87 unsigned char maximum_args;
88 char expand_args;
89 char *(*func_ptr) (char *output, char **argv, const char *fname);
90 };
91
92static unsigned long
93function_table_entry_hash_1 (const void *keyv)
94{
95 const struct function_table_entry *key = keyv;
96 return_STRING_N_HASH_1 (key->name, key->len);
97}
98
99static unsigned long
100function_table_entry_hash_2 (const void *keyv)
101{
102 const struct function_table_entry *key = keyv;
103 return_STRING_N_HASH_2 (key->name, key->len);
104}
105
106static int
107function_table_entry_hash_cmp (const void *xv, const void *yv)
108{
109 const struct function_table_entry *x = xv;
110 const struct function_table_entry *y = yv;
111 int result = x->len - y->len;
112 if (result)
113 return result;
114 return_STRING_N_COMPARE (x->name, y->name, x->len);
115}
116
117static struct hash_table function_table;
118
119#ifdef CONFIG_WITH_MAKE_STATS
120unsigned long make_stats_allocations = 0;
121unsigned long make_stats_allocated = 0;
122unsigned long make_stats_allocated_sum = 0;
123unsigned long make_stats_ht_lookups = 0;
124unsigned long make_stats_ht_collisions = 0;
125#endif
126
127
128
129/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
130 each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is
131 the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is
132 nonzero, substitutions are done only on matches which are complete
133 whitespace-delimited words. */
134
135char *
136subst_expand (char *o, const char *text, const char *subst, const char *replace,
137 unsigned int slen, unsigned int rlen, int by_word)
138{
139 const char *t = text;
140 const char *p;
141
142 if (slen == 0 && !by_word)
143 {
144 /* The first occurrence of "" in any string is its end. */
145 o = variable_buffer_output (o, t, strlen (t));
146 if (rlen > 0)
147 o = variable_buffer_output (o, replace, rlen);
148 return o;
149 }
150
151 do
152 {
153 if (by_word && slen == 0)
154 /* When matching by words, the empty string should match
155 the end of each word, rather than the end of the whole text. */
156 p = end_of_token (next_token (t));
157 else
158 {
159 p = strstr (t, subst);
160 if (p == 0)
161 {
162 /* No more matches. Output everything left on the end. */
163 o = variable_buffer_output (o, t, strlen (t));
164 return o;
165 }
166 }
167
168 /* Output everything before this occurrence of the string to replace. */
169 if (p > t)
170 o = variable_buffer_output (o, t, p - t);
171
172 /* If we're substituting only by fully matched words,
173 or only at the ends of words, check that this case qualifies. */
174 if (by_word
175 && ((p > text && !isblank ((unsigned char)p[-1]))
176 || (p[slen] != '\0' && !isblank ((unsigned char)p[slen]))))
177 /* Struck out. Output the rest of the string that is
178 no longer to be replaced. */
179 o = variable_buffer_output (o, subst, slen);
180 else if (rlen > 0)
181 /* Output the replacement string. */
182 o = variable_buffer_output (o, replace, rlen);
183
184 /* Advance T past the string to be replaced. */
185 t = p + slen;
186 } while (*t != '\0');
187
188 return o;
189}
190
191
192
193/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
194 and replacing strings matching PATTERN with REPLACE.
195 If PATTERN_PERCENT is not nil, PATTERN has already been
196 run through find_percent, and PATTERN_PERCENT is the result.
197 If REPLACE_PERCENT is not nil, REPLACE has already been
198 run through find_percent, and REPLACE_PERCENT is the result.
199 Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
200 character _AFTER_ the %, not to the % itself.
201*/
202
203char *
204patsubst_expand_pat (char *o, const char *text,
205 const char *pattern, const char *replace,
206 const char *pattern_percent, const char *replace_percent)
207{
208 unsigned int pattern_prepercent_len, pattern_postpercent_len;
209 unsigned int replace_prepercent_len, replace_postpercent_len;
210 const char *t;
211 unsigned int len;
212 int doneany = 0;
213
214 /* Record the length of REPLACE before and after the % so we don't have to
215 compute these lengths more than once. */
216 if (replace_percent)
217 {
218 replace_prepercent_len = replace_percent - replace - 1;
219 replace_postpercent_len = strlen (replace_percent);
220 }
221 else
222 {
223 replace_prepercent_len = strlen (replace);
224 replace_postpercent_len = 0;
225 }
226
227 if (!pattern_percent)
228 /* With no % in the pattern, this is just a simple substitution. */
229 return subst_expand (o, text, pattern, replace,
230 strlen (pattern), strlen (replace), 1);
231
232 /* Record the length of PATTERN before and after the %
233 so we don't have to compute it more than once. */
234 pattern_prepercent_len = pattern_percent - pattern - 1;
235 pattern_postpercent_len = strlen (pattern_percent);
236
237 while ((t = find_next_token (&text, &len)) != 0)
238 {
239 int fail = 0;
240
241 /* Is it big enough to match? */
242 if (len < pattern_prepercent_len + pattern_postpercent_len)
243 fail = 1;
244
245 /* Does the prefix match? */
246 if (!fail && pattern_prepercent_len > 0
247 && (*t != *pattern
248 || t[pattern_prepercent_len - 1] != pattern_percent[-2]
249 || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1)))
250 fail = 1;
251
252 /* Does the suffix match? */
253 if (!fail && pattern_postpercent_len > 0
254 && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1]
255 || t[len - pattern_postpercent_len] != *pattern_percent
256 || !strneq (&t[len - pattern_postpercent_len],
257 pattern_percent, pattern_postpercent_len - 1)))
258 fail = 1;
259
260 if (fail)
261 /* It didn't match. Output the string. */
262 o = variable_buffer_output (o, t, len);
263 else
264 {
265 /* It matched. Output the replacement. */
266
267 /* Output the part of the replacement before the %. */
268 o = variable_buffer_output (o, replace, replace_prepercent_len);
269
270 if (replace_percent != 0)
271 {
272 /* Output the part of the matched string that
273 matched the % in the pattern. */
274 o = variable_buffer_output (o, t + pattern_prepercent_len,
275 len - (pattern_prepercent_len
276 + pattern_postpercent_len));
277 /* Output the part of the replacement after the %. */
278 o = variable_buffer_output (o, replace_percent,
279 replace_postpercent_len);
280 }
281 }
282
283 /* Output a space, but not if the replacement is "". */
284 if (fail || replace_prepercent_len > 0
285 || (replace_percent != 0 && len + replace_postpercent_len > 0))
286 {
287 o = variable_buffer_output (o, " ", 1);
288 doneany = 1;
289 }
290 }
291 if (doneany)
292 /* Kill the last space. */
293 --o;
294
295 return o;
296}
297
298/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
299 and replacing strings matching PATTERN with REPLACE.
300 If PATTERN_PERCENT is not nil, PATTERN has already been
301 run through find_percent, and PATTERN_PERCENT is the result.
302 If REPLACE_PERCENT is not nil, REPLACE has already been
303 run through find_percent, and REPLACE_PERCENT is the result.
304 Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
305 character _AFTER_ the %, not to the % itself.
306*/
307
308char *
309patsubst_expand (char *o, const char *text, char *pattern, char *replace)
310{
311 const char *pattern_percent = find_percent (pattern);
312 const char *replace_percent = find_percent (replace);
313
314 /* If there's a percent in the pattern or replacement skip it. */
315 if (replace_percent)
316 ++replace_percent;
317 if (pattern_percent)
318 ++pattern_percent;
319
320 return patsubst_expand_pat (o, text, pattern, replace,
321 pattern_percent, replace_percent);
322}
323
324
325#ifdef CONFIG_WITH_OPTIMIZATION_HACKS
326/* The maximum length of a function, once reached there is
327 it can't be function and we can skip the hash lookup drop out. */
328
329# ifdef KMK
330# define MAX_FUNCTION_LENGTH 12
331# else
332# define MAX_FUNCTION_LENGTH 10
333# endif
334#endif /* CONFIG_WITH_OPTIMIZATION_HACKS */
335
336/* Look up a function by name. */
337
338#ifdef CONFIG_WITH_OPTIMIZATION_HACKS
339__inline
340#endif /* CONFIG_WITH_OPTIMIZATION_HACKS */
341static const struct function_table_entry *
342lookup_function (const char *s)
343{
344 const char *e = s;
345#ifdef CONFIG_WITH_OPTIMIZATION_HACKS
346 int left = MAX_FUNCTION_LENGTH;
347 int ch;
348 while (((ch = *e) >= 'a' && ch <='z') || ch == '-')
349 {
350 if (!left--)
351 return 0;
352 e++;
353 }
354#else
355 while (*e && ( (*e >= 'a' && *e <= 'z') || *e == '-'))
356 e++;
357#endif
358 if (*e == '\0' || isblank ((unsigned char) *e))
359 {
360 struct function_table_entry function_table_entry_key;
361 function_table_entry_key.name = s;
362 function_table_entry_key.len = e - s;
363
364 return hash_find_item (&function_table, &function_table_entry_key);
365 }
366 return 0;
367}
368
369
370
371/* Return 1 if PATTERN matches STR, 0 if not. */
372
373int
374pattern_matches (const char *pattern, const char *percent, const char *str)
375{
376 unsigned int sfxlen, strlength;
377
378 if (percent == 0)
379 {
380 unsigned int len = strlen (pattern) + 1;
381 char *new_chars = alloca (len);
382 memcpy (new_chars, pattern, len);
383 percent = find_percent (new_chars);
384 if (percent == 0)
385 return streq (new_chars, str);
386 pattern = new_chars;
387 }
388
389 sfxlen = strlen (percent + 1);
390 strlength = strlen (str);
391
392 if (strlength < (percent - pattern) + sfxlen
393 || !strneq (pattern, str, percent - pattern))
394 return 0;
395
396 return !strcmp (percent + 1, str + (strlength - sfxlen));
397}
398
399
400
401/* Find the next comma or ENDPAREN (counting nested STARTPAREN and
402 ENDPARENtheses), starting at PTR before END. Return a pointer to
403 next character.
404
405 If no next argument is found, return NULL.
406*/
407
408static char *
409find_next_argument (char startparen, char endparen,
410 const char *ptr, const char *end)
411{
412 int count = 0;
413
414 for (; ptr < end; ++ptr)
415 if (*ptr == startparen)
416 ++count;
417
418 else if (*ptr == endparen)
419 {
420 --count;
421 if (count < 0)
422 return NULL;
423 }
424
425 else if (*ptr == ',' && !count)
426 return (char *)ptr;
427
428 /* We didn't find anything. */
429 return NULL;
430}
431
432
433
434/* Glob-expand LINE. The returned pointer is
435 only good until the next call to string_glob. */
436
437static char *
438string_glob (char *line)
439{
440 static char *result = 0;
441 static unsigned int length;
442 struct nameseq *chain;
443 unsigned int idx;
444
445 chain = multi_glob (parse_file_seq
446 (&line, '\0', sizeof (struct nameseq),
447 /* We do not want parse_file_seq to strip `./'s.
448 That would break examples like:
449 $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */
450 0),
451 sizeof (struct nameseq));
452
453 if (result == 0)
454 {
455 length = 100;
456 result = xmalloc (100);
457 }
458
459 idx = 0;
460 while (chain != 0)
461 {
462 const char *name = chain->name;
463 unsigned int len = strlen (name);
464
465 struct nameseq *next = chain->next;
466 free (chain);
467 chain = next;
468
469 /* multi_glob will pass names without globbing metacharacters
470 through as is, but we want only files that actually exist. */
471 if (file_exists_p (name))
472 {
473 if (idx + len + 1 > length)
474 {
475 length += (len + 1) * 2;
476 result = xrealloc (result, length);
477 }
478 memcpy (&result[idx], name, len);
479 idx += len;
480 result[idx++] = ' ';
481 }
482 }
483
484 /* Kill the last space and terminate the string. */
485 if (idx == 0)
486 result[0] = '\0';
487 else
488 result[idx - 1] = '\0';
489
490 return result;
491}
492
493
494/*
495 Builtin functions
496 */
497
498static char *
499func_patsubst (char *o, char **argv, const char *funcname UNUSED)
500{
501 o = patsubst_expand (o, argv[2], argv[0], argv[1]);
502 return o;
503}
504
505
506static char *
507func_join (char *o, char **argv, const char *funcname UNUSED)
508{
509 int doneany = 0;
510
511 /* Write each word of the first argument directly followed
512 by the corresponding word of the second argument.
513 If the two arguments have a different number of words,
514 the excess words are just output separated by blanks. */
515 const char *tp;
516 const char *pp;
517 const char *list1_iterator = argv[0];
518 const char *list2_iterator = argv[1];
519 do
520 {
521 unsigned int len1, len2;
522
523 tp = find_next_token (&list1_iterator, &len1);
524 if (tp != 0)
525 o = variable_buffer_output (o, tp, len1);
526
527 pp = find_next_token (&list2_iterator, &len2);
528 if (pp != 0)
529 o = variable_buffer_output (o, pp, len2);
530
531 if (tp != 0 || pp != 0)
532 {
533 o = variable_buffer_output (o, " ", 1);
534 doneany = 1;
535 }
536 }
537 while (tp != 0 || pp != 0);
538 if (doneany)
539 /* Kill the last blank. */
540 --o;
541
542 return o;
543}
544
545
546static char *
547func_origin (char *o, char **argv, const char *funcname UNUSED)
548{
549 /* Expand the argument. */
550 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
551 if (v == 0)
552 o = variable_buffer_output (o, "undefined", 9);
553 else
554 switch (v->origin)
555 {
556 default:
557 case o_invalid:
558 abort ();
559 break;
560 case o_default:
561 o = variable_buffer_output (o, "default", 7);
562 break;
563 case o_env:
564 o = variable_buffer_output (o, "environment", 11);
565 break;
566 case o_file:
567 o = variable_buffer_output (o, "file", 4);
568 break;
569 case o_env_override:
570 o = variable_buffer_output (o, "environment override", 20);
571 break;
572 case o_command:
573 o = variable_buffer_output (o, "command line", 12);
574 break;
575 case o_override:
576 o = variable_buffer_output (o, "override", 8);
577 break;
578 case o_automatic:
579 o = variable_buffer_output (o, "automatic", 9);
580 break;
581#ifdef CONFIG_WITH_LOCAL_VARIABLES
582 case o_local:
583 o = variable_buffer_output (o, "local", 5);
584 break;
585#endif
586 }
587
588 return o;
589}
590
591static char *
592func_flavor (char *o, char **argv, const char *funcname UNUSED)
593{
594 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
595
596 if (v == 0)
597 o = variable_buffer_output (o, "undefined", 9);
598 else
599 if (v->recursive)
600 o = variable_buffer_output (o, "recursive", 9);
601 else
602 o = variable_buffer_output (o, "simple", 6);
603
604 return o;
605}
606
607#ifdef VMS
608# define IS_PATHSEP(c) ((c) == ']')
609#else
610# ifdef HAVE_DOS_PATHS
611# define IS_PATHSEP(c) ((c) == '/' || (c) == '\\')
612# else
613# define IS_PATHSEP(c) ((c) == '/')
614# endif
615#endif
616
617
618static char *
619func_notdir_suffix (char *o, char **argv, const char *funcname)
620{
621 /* Expand the argument. */
622 const char *list_iterator = argv[0];
623 const char *p2;
624 int doneany =0;
625 unsigned int len=0;
626
627 int is_suffix = streq (funcname, "suffix");
628 int is_notdir = !is_suffix;
629 while ((p2 = find_next_token (&list_iterator, &len)) != 0)
630 {
631 const char *p = p2 + len;
632
633
634 while (p >= p2 && (!is_suffix || *p != '.'))
635 {
636 if (IS_PATHSEP (*p))
637 break;
638 --p;
639 }
640
641 if (p >= p2)
642 {
643 if (is_notdir)
644 ++p;
645 else if (*p != '.')
646 continue;
647 o = variable_buffer_output (o, p, len - (p - p2));
648 }
649#ifdef HAVE_DOS_PATHS
650 /* Handle the case of "d:foo/bar". */
651 else if (streq (funcname, "notdir") && p2[0] && p2[1] == ':')
652 {
653 p = p2 + 2;
654 o = variable_buffer_output (o, p, len - (p - p2));
655 }
656#endif
657 else if (is_notdir)
658 o = variable_buffer_output (o, p2, len);
659
660 if (is_notdir || p >= p2)
661 {
662 o = variable_buffer_output (o, " ", 1);
663 doneany = 1;
664 }
665 }
666
667 if (doneany)
668 /* Kill last space. */
669 --o;
670
671 return o;
672}
673
674
675static char *
676func_basename_dir (char *o, char **argv, const char *funcname)
677{
678 /* Expand the argument. */
679 const char *p3 = argv[0];
680 const char *p2;
681 int doneany=0;
682 unsigned int len=0;
683
684 int is_basename= streq (funcname, "basename");
685 int is_dir= !is_basename;
686
687 while ((p2 = find_next_token (&p3, &len)) != 0)
688 {
689 const char *p = p2 + len;
690 while (p >= p2 && (!is_basename || *p != '.'))
691 {
692 if (IS_PATHSEP (*p))
693 break;
694 --p;
695 }
696
697 if (p >= p2 && (is_dir))
698 o = variable_buffer_output (o, p2, ++p - p2);
699 else if (p >= p2 && (*p == '.'))
700 o = variable_buffer_output (o, p2, p - p2);
701#ifdef HAVE_DOS_PATHS
702 /* Handle the "d:foobar" case */
703 else if (p2[0] && p2[1] == ':' && is_dir)
704 o = variable_buffer_output (o, p2, 2);
705#endif
706 else if (is_dir)
707#ifdef VMS
708 o = variable_buffer_output (o, "[]", 2);
709#else
710#ifndef _AMIGA
711 o = variable_buffer_output (o, "./", 2);
712#else
713 ; /* Just a nop... */
714#endif /* AMIGA */
715#endif /* !VMS */
716 else
717 /* The entire name is the basename. */
718 o = variable_buffer_output (o, p2, len);
719
720 o = variable_buffer_output (o, " ", 1);
721 doneany = 1;
722 }
723
724 if (doneany)
725 /* Kill last space. */
726 --o;
727
728 return o;
729}
730
731static char *
732func_addsuffix_addprefix (char *o, char **argv, const char *funcname)
733{
734 int fixlen = strlen (argv[0]);
735 const char *list_iterator = argv[1];
736 int is_addprefix = streq (funcname, "addprefix");
737 int is_addsuffix = !is_addprefix;
738
739 int doneany = 0;
740 const char *p;
741 unsigned int len;
742
743 while ((p = find_next_token (&list_iterator, &len)) != 0)
744 {
745 if (is_addprefix)
746 o = variable_buffer_output (o, argv[0], fixlen);
747 o = variable_buffer_output (o, p, len);
748 if (is_addsuffix)
749 o = variable_buffer_output (o, argv[0], fixlen);
750 o = variable_buffer_output (o, " ", 1);
751 doneany = 1;
752 }
753
754 if (doneany)
755 /* Kill last space. */
756 --o;
757
758 return o;
759}
760
761static char *
762func_subst (char *o, char **argv, const char *funcname UNUSED)
763{
764 o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]),
765 strlen (argv[1]), 0);
766
767 return o;
768}
769
770
771static char *
772func_firstword (char *o, char **argv, const char *funcname UNUSED)
773{
774 unsigned int i;
775 const char *words = argv[0]; /* Use a temp variable for find_next_token */
776 const char *p = find_next_token (&words, &i);
777
778 if (p != 0)
779 o = variable_buffer_output (o, p, i);
780
781 return o;
782}
783
784static char *
785func_lastword (char *o, char **argv, const char *funcname UNUSED)
786{
787 unsigned int i;
788 const char *words = argv[0]; /* Use a temp variable for find_next_token */
789 const char *p = NULL;
790 const char *t;
791
792 while ((t = find_next_token (&words, &i)))
793 p = t;
794
795 if (p != 0)
796 o = variable_buffer_output (o, p, i);
797
798 return o;
799}
800
801static char *
802func_words (char *o, char **argv, const char *funcname UNUSED)
803{
804 int i = 0;
805 const char *word_iterator = argv[0];
806 char buf[20];
807
808 while (find_next_token (&word_iterator, (unsigned int *) 0) != 0)
809 ++i;
810
811 sprintf (buf, "%d", i);
812 o = variable_buffer_output (o, buf, strlen (buf));
813
814 return o;
815}
816
817/* Set begpp to point to the first non-whitespace character of the string,
818 * and endpp to point to the last non-whitespace character of the string.
819 * If the string is empty or contains nothing but whitespace, endpp will be
820 * begpp-1.
821 */
822char *
823strip_whitespace (const char **begpp, const char **endpp)
824{
825 while (*begpp <= *endpp && isspace ((unsigned char)**begpp))
826 (*begpp) ++;
827 while (*endpp >= *begpp && isspace ((unsigned char)**endpp))
828 (*endpp) --;
829 return (char *)*begpp;
830}
831
832static void
833check_numeric (const char *s, const char *msg)
834{
835 const char *end = s + strlen (s) - 1;
836 const char *beg = s;
837 strip_whitespace (&s, &end);
838
839 for (; s <= end; ++s)
840 if (!ISDIGIT (*s)) /* ISDIGIT only evals its arg once: see make.h. */
841 break;
842
843 if (s <= end || end - beg < 0)
844 fatal (*expanding_var, "%s: '%s'", msg, beg);
845}
846
847
848
849static char *
850func_word (char *o, char **argv, const char *funcname UNUSED)
851{
852 const char *end_p;
853 const char *p;
854 int i;
855
856 /* Check the first argument. */
857 check_numeric (argv[0], _("non-numeric first argument to `word' function"));
858 i = atoi (argv[0]);
859
860 if (i == 0)
861 fatal (*expanding_var,
862 _("first argument to `word' function must be greater than 0"));
863
864 end_p = argv[1];
865 while ((p = find_next_token (&end_p, 0)) != 0)
866 if (--i == 0)
867 break;
868
869 if (i == 0)
870 o = variable_buffer_output (o, p, end_p - p);
871
872 return o;
873}
874
875static char *
876func_wordlist (char *o, char **argv, const char *funcname UNUSED)
877{
878 int start, count;
879
880 /* Check the arguments. */
881 check_numeric (argv[0],
882 _("non-numeric first argument to `wordlist' function"));
883 check_numeric (argv[1],
884 _("non-numeric second argument to `wordlist' function"));
885
886 start = atoi (argv[0]);
887 if (start < 1)
888 fatal (*expanding_var,
889 "invalid first argument to `wordlist' function: `%d'", start);
890
891 count = atoi (argv[1]) - start + 1;
892
893 if (count > 0)
894 {
895 const char *p;
896 const char *end_p = argv[2];
897
898 /* Find the beginning of the "start"th word. */
899 while (((p = find_next_token (&end_p, 0)) != 0) && --start)
900 ;
901
902 if (p)
903 {
904 /* Find the end of the "count"th word from start. */
905 while (--count && (find_next_token (&end_p, 0) != 0))
906 ;
907
908 /* Return the stuff in the middle. */
909 o = variable_buffer_output (o, p, end_p - p);
910 }
911 }
912
913 return o;
914}
915
916static char *
917func_findstring (char *o, char **argv, const char *funcname UNUSED)
918{
919 /* Find the first occurrence of the first string in the second. */
920 if (strstr (argv[1], argv[0]) != 0)
921 o = variable_buffer_output (o, argv[0], strlen (argv[0]));
922
923 return o;
924}
925
926static char *
927func_foreach (char *o, char **argv, const char *funcname UNUSED)
928{
929 /* expand only the first two. */
930 char *varname = expand_argument (argv[0], NULL);
931 char *list = expand_argument (argv[1], NULL);
932 const char *body = argv[2];
933
934 int doneany = 0;
935 const char *list_iterator = list;
936 const char *p;
937 unsigned int len;
938 struct variable *var;
939
940 push_new_variable_scope ();
941 var = define_variable (varname, strlen (varname), "", o_automatic, 0);
942
943 /* loop through LIST, put the value in VAR and expand BODY */
944 while ((p = find_next_token (&list_iterator, &len)) != 0)
945 {
946 char *result = 0;
947#ifdef CONFIG_WITH_VALUE_LENGTH
948 if (len >= (unsigned int)var->value_alloc_len)
949 {
950 free (var->value);
951 var->value_alloc_len = (len + 32) & ~31;
952 var->value = xmalloc (var->value_alloc_len);
953 }
954 memcpy (var->value, p, len);
955 var->value[len] = '\0';
956 var->value_length = len;
957#else
958 free (var->value);
959 var->value = savestring (p, len);
960#endif
961
962 result = allocated_variable_expand (body);
963
964 o = variable_buffer_output (o, result, strlen (result));
965 o = variable_buffer_output (o, " ", 1);
966 doneany = 1;
967 free (result);
968 }
969
970 if (doneany)
971 /* Kill the last space. */
972 --o;
973
974 pop_variable_scope ();
975 free (varname);
976 free (list);
977
978 return o;
979}
980
981struct a_word
982{
983 struct a_word *next;
984 struct a_word *chain;
985 char *str;
986 int length;
987 int matched;
988};
989
990static unsigned long
991a_word_hash_1 (const void *key)
992{
993 return_STRING_HASH_1 (((struct a_word const *) key)->str);
994}
995
996static unsigned long
997a_word_hash_2 (const void *key)
998{
999 return_STRING_HASH_2 (((struct a_word const *) key)->str);
1000}
1001
1002static int
1003a_word_hash_cmp (const void *x, const void *y)
1004{
1005 int result = ((struct a_word const *) x)->length - ((struct a_word const *) y)->length;
1006 if (result)
1007 return result;
1008 return_STRING_COMPARE (((struct a_word const *) x)->str,
1009 ((struct a_word const *) y)->str);
1010}
1011
1012struct a_pattern
1013{
1014 struct a_pattern *next;
1015 char *str;
1016 char *percent;
1017 int length;
1018 int save_c;
1019};
1020
1021static char *
1022func_filter_filterout (char *o, char **argv, const char *funcname)
1023{
1024 struct a_word *wordhead;
1025 struct a_word **wordtail;
1026 struct a_word *wp;
1027 struct a_pattern *pathead;
1028 struct a_pattern **pattail;
1029 struct a_pattern *pp;
1030
1031 struct hash_table a_word_table;
1032 int is_filter = streq (funcname, "filter");
1033 const char *pat_iterator = argv[0];
1034 const char *word_iterator = argv[1];
1035 int literals = 0;
1036 int words = 0;
1037 int hashing = 0;
1038 char *p;
1039 unsigned int len;
1040
1041 /* Chop ARGV[0] up into patterns to match against the words. */
1042
1043 pattail = &pathead;
1044 while ((p = find_next_token (&pat_iterator, &len)) != 0)
1045 {
1046 struct a_pattern *pat = alloca (sizeof (struct a_pattern));
1047
1048 *pattail = pat;
1049 pattail = &pat->next;
1050
1051 if (*pat_iterator != '\0')
1052 ++pat_iterator;
1053
1054 pat->str = p;
1055 pat->length = len;
1056 pat->save_c = p[len];
1057 p[len] = '\0';
1058 pat->percent = find_percent (p);
1059 if (pat->percent == 0)
1060 literals++;
1061 }
1062 *pattail = 0;
1063
1064 /* Chop ARGV[1] up into words to match against the patterns. */
1065
1066 wordtail = &wordhead;
1067 while ((p = find_next_token (&word_iterator, &len)) != 0)
1068 {
1069 struct a_word *word = alloca (sizeof (struct a_word));
1070
1071 *wordtail = word;
1072 wordtail = &word->next;
1073
1074 if (*word_iterator != '\0')
1075 ++word_iterator;
1076
1077 p[len] = '\0';
1078 word->str = p;
1079 word->length = len;
1080 word->matched = 0;
1081 word->chain = 0;
1082 words++;
1083 }
1084 *wordtail = 0;
1085
1086 /* Only use a hash table if arg list lengths justifies the cost. */
1087 hashing = (literals >= 2 && (literals * words) >= 10);
1088 if (hashing)
1089 {
1090 hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2,
1091 a_word_hash_cmp);
1092 for (wp = wordhead; wp != 0; wp = wp->next)
1093 {
1094 struct a_word *owp = hash_insert (&a_word_table, wp);
1095 if (owp)
1096 wp->chain = owp;
1097 }
1098 }
1099
1100 if (words)
1101 {
1102 int doneany = 0;
1103
1104 /* Run each pattern through the words, killing words. */
1105 for (pp = pathead; pp != 0; pp = pp->next)
1106 {
1107 if (pp->percent)
1108 for (wp = wordhead; wp != 0; wp = wp->next)
1109 wp->matched |= pattern_matches (pp->str, pp->percent, wp->str);
1110 else if (hashing)
1111 {
1112 struct a_word a_word_key;
1113 a_word_key.str = pp->str;
1114 a_word_key.length = pp->length;
1115 wp = hash_find_item (&a_word_table, &a_word_key);
1116 while (wp)
1117 {
1118 wp->matched |= 1;
1119 wp = wp->chain;
1120 }
1121 }
1122 else
1123 for (wp = wordhead; wp != 0; wp = wp->next)
1124 wp->matched |= (wp->length == pp->length
1125 && strneq (pp->str, wp->str, wp->length));
1126 }
1127
1128 /* Output the words that matched (or didn't, for filter-out). */
1129 for (wp = wordhead; wp != 0; wp = wp->next)
1130 if (is_filter ? wp->matched : !wp->matched)
1131 {
1132 o = variable_buffer_output (o, wp->str, strlen (wp->str));
1133 o = variable_buffer_output (o, " ", 1);
1134 doneany = 1;
1135 }
1136
1137 if (doneany)
1138 /* Kill the last space. */
1139 --o;
1140 }
1141
1142 for (pp = pathead; pp != 0; pp = pp->next)
1143 pp->str[pp->length] = pp->save_c;
1144
1145 if (hashing)
1146 hash_free (&a_word_table, 0);
1147
1148 return o;
1149}
1150
1151
1152static char *
1153func_strip (char *o, char **argv, const char *funcname UNUSED)
1154{
1155 const char *p = argv[0];
1156 int doneany = 0;
1157
1158 while (*p != '\0')
1159 {
1160 int i=0;
1161 const char *word_start;
1162
1163 while (isspace ((unsigned char)*p))
1164 ++p;
1165 word_start = p;
1166 for (i=0; *p != '\0' && !isspace ((unsigned char)*p); ++p, ++i)
1167 {}
1168 if (!i)
1169 break;
1170 o = variable_buffer_output (o, word_start, i);
1171 o = variable_buffer_output (o, " ", 1);
1172 doneany = 1;
1173 }
1174
1175 if (doneany)
1176 /* Kill the last space. */
1177 --o;
1178
1179 return o;
1180}
1181
1182/*
1183 Print a warning or fatal message.
1184*/
1185static char *
1186func_error (char *o, char **argv, const char *funcname)
1187{
1188 char **argvp;
1189 char *msg, *p;
1190 int len;
1191
1192 /* The arguments will be broken on commas. Rather than create yet
1193 another special case where function arguments aren't broken up,
1194 just create a format string that puts them back together. */
1195 for (len=0, argvp=argv; *argvp != 0; ++argvp)
1196 len += strlen (*argvp) + 2;
1197
1198 p = msg = alloca (len + 1);
1199
1200 for (argvp=argv; argvp[1] != 0; ++argvp)
1201 {
1202 strcpy (p, *argvp);
1203 p += strlen (*argvp);
1204 *(p++) = ',';
1205 *(p++) = ' ';
1206 }
1207 strcpy (p, *argvp);
1208
1209 switch (*funcname) {
1210 case 'e':
1211 fatal (reading_file, "%s", msg);
1212
1213 case 'w':
1214 error (reading_file, "%s", msg);
1215 break;
1216
1217 case 'i':
1218 printf ("%s\n", msg);
1219 fflush(stdout);
1220 break;
1221
1222 default:
1223 fatal (*expanding_var, "Internal error: func_error: '%s'", funcname);
1224 }
1225
1226 /* The warning function expands to the empty string. */
1227 return o;
1228}
1229
1230
1231/*
1232 chop argv[0] into words, and sort them.
1233 */
1234static char *
1235func_sort (char *o, char **argv, const char *funcname UNUSED)
1236{
1237 const char *t;
1238 char **words;
1239 int wordi;
1240 char *p;
1241 unsigned int len;
1242 int i;
1243
1244 /* Find the maximum number of words we'll have. */
1245 t = argv[0];
1246 wordi = 1;
1247 while (*t != '\0')
1248 {
1249 char c = *(t++);
1250
1251 if (! isspace ((unsigned char)c))
1252 continue;
1253
1254 ++wordi;
1255
1256 while (isspace ((unsigned char)*t))
1257 ++t;
1258 }
1259
1260 words = xmalloc (wordi * sizeof (char *));
1261
1262 /* Now assign pointers to each string in the array. */
1263 t = argv[0];
1264 wordi = 0;
1265 while ((p = find_next_token (&t, &len)) != 0)
1266 {
1267 ++t;
1268 p[len] = '\0';
1269 words[wordi++] = p;
1270 }
1271
1272 if (wordi)
1273 {
1274 /* Now sort the list of words. */
1275 qsort (words, wordi, sizeof (char *), alpha_compare);
1276
1277 /* Now write the sorted list, uniquified. */
1278#ifdef CONFIG_WITH_RSORT
1279 if (strcmp (funcname, "rsort"))
1280 {
1281 /* sort */
1282#endif
1283 for (i = 0; i < wordi; ++i)
1284 {
1285 len = strlen (words[i]);
1286 if (i == wordi - 1 || strlen (words[i + 1]) != len
1287 || strcmp (words[i], words[i + 1]))
1288 {
1289 o = variable_buffer_output (o, words[i], len);
1290 o = variable_buffer_output (o, " ", 1);
1291 }
1292 }
1293#ifdef CONFIG_WITH_RSORT
1294 }
1295 else
1296 {
1297 /* rsort - reverse the result */
1298 i = wordi;
1299 while (i-- > 0)
1300 {
1301 len = strlen (words[i]);
1302 if (i == 0 || strlen (words[i - 1]) != len
1303 || strcmp (words[i], words[i - 1]))
1304 {
1305 o = variable_buffer_output (o, words[i], len);
1306 o = variable_buffer_output (o, " ", 1);
1307 }
1308 }
1309 }
1310#endif
1311
1312 /* Kill the last space. */
1313 --o;
1314 }
1315
1316 free (words);
1317
1318 return o;
1319}
1320
1321/*
1322 $(if condition,true-part[,false-part])
1323
1324 CONDITION is false iff it evaluates to an empty string. White
1325 space before and after condition are stripped before evaluation.
1326
1327 If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is
1328 evaluated (if it exists). Because only one of the two PARTs is evaluated,
1329 you can use $(if ...) to create side-effects (with $(shell ...), for
1330 example).
1331*/
1332
1333static char *
1334func_if (char *o, char **argv, const char *funcname UNUSED)
1335{
1336 const char *begp = argv[0];
1337 const char *endp = begp + strlen (argv[0]) - 1;
1338 int result = 0;
1339
1340 /* Find the result of the condition: if we have a value, and it's not
1341 empty, the condition is true. If we don't have a value, or it's the
1342 empty string, then it's false. */
1343
1344 strip_whitespace (&begp, &endp);
1345
1346 if (begp <= endp)
1347 {
1348 char *expansion = expand_argument (begp, endp+1);
1349
1350 result = strlen (expansion);
1351 free (expansion);
1352 }
1353
1354 /* If the result is true (1) we want to eval the first argument, and if
1355 it's false (0) we want to eval the second. If the argument doesn't
1356 exist we do nothing, otherwise expand it and add to the buffer. */
1357
1358 argv += 1 + !result;
1359
1360 if (*argv)
1361 {
1362 char *expansion = expand_argument (*argv, NULL);
1363
1364 o = variable_buffer_output (o, expansion, strlen (expansion));
1365
1366 free (expansion);
1367 }
1368
1369 return o;
1370}
1371
1372/*
1373 $(or condition1[,condition2[,condition3[...]]])
1374
1375 A CONDITION is false iff it evaluates to an empty string. White
1376 space before and after CONDITION are stripped before evaluation.
1377
1378 CONDITION1 is evaluated. If it's true, then this is the result of
1379 expansion. If it's false, CONDITION2 is evaluated, and so on. If none of
1380 the conditions are true, the expansion is the empty string.
1381
1382 Once a CONDITION is true no further conditions are evaluated
1383 (short-circuiting).
1384*/
1385
1386static char *
1387func_or (char *o, char **argv, const char *funcname UNUSED)
1388{
1389 for ( ; *argv ; ++argv)
1390 {
1391 const char *begp = *argv;
1392 const char *endp = begp + strlen (*argv) - 1;
1393 char *expansion;
1394 int result = 0;
1395
1396 /* Find the result of the condition: if it's false keep going. */
1397
1398 strip_whitespace (&begp, &endp);
1399
1400 if (begp > endp)
1401 continue;
1402
1403 expansion = expand_argument (begp, endp+1);
1404 result = strlen (expansion);
1405
1406 /* If the result is false keep going. */
1407 if (!result)
1408 {
1409 free (expansion);
1410 continue;
1411 }
1412
1413 /* It's true! Keep this result and return. */
1414 o = variable_buffer_output (o, expansion, result);
1415 free (expansion);
1416 break;
1417 }
1418
1419 return o;
1420}
1421
1422/*
1423 $(and condition1[,condition2[,condition3[...]]])
1424
1425 A CONDITION is false iff it evaluates to an empty string. White
1426 space before and after CONDITION are stripped before evaluation.
1427
1428 CONDITION1 is evaluated. If it's false, then this is the result of
1429 expansion. If it's true, CONDITION2 is evaluated, and so on. If all of
1430 the conditions are true, the expansion is the result of the last condition.
1431
1432 Once a CONDITION is false no further conditions are evaluated
1433 (short-circuiting).
1434*/
1435
1436static char *
1437func_and (char *o, char **argv, const char *funcname UNUSED)
1438{
1439 char *expansion;
1440 int result;
1441
1442 while (1)
1443 {
1444 const char *begp = *argv;
1445 const char *endp = begp + strlen (*argv) - 1;
1446
1447 /* An empty condition is always false. */
1448 strip_whitespace (&begp, &endp);
1449 if (begp > endp)
1450 return o;
1451
1452 expansion = expand_argument (begp, endp+1);
1453 result = strlen (expansion);
1454
1455 /* If the result is false, stop here: we're done. */
1456 if (!result)
1457 break;
1458
1459 /* Otherwise the result is true. If this is the last one, keep this
1460 result and quit. Otherwise go on to the next one! */
1461
1462 if (*(++argv))
1463 free (expansion);
1464 else
1465 {
1466 o = variable_buffer_output (o, expansion, result);
1467 break;
1468 }
1469 }
1470
1471 free (expansion);
1472
1473 return o;
1474}
1475
1476static char *
1477func_wildcard (char *o, char **argv, const char *funcname UNUSED)
1478{
1479#ifdef _AMIGA
1480 o = wildcard_expansion (argv[0], o);
1481#else
1482 char *p = string_glob (argv[0]);
1483 o = variable_buffer_output (o, p, strlen (p));
1484#endif
1485 return o;
1486}
1487
1488/*
1489 $(eval <makefile string>)
1490
1491 Always resolves to the empty string.
1492
1493 Treat the arguments as a segment of makefile, and parse them.
1494*/
1495
1496static char *
1497func_eval (char *o, char **argv, const char *funcname UNUSED)
1498{
1499 char *buf;
1500 unsigned int len;
1501
1502 /* Eval the buffer. Pop the current variable buffer setting so that the
1503 eval'd code can use its own without conflicting. */
1504
1505 install_variable_buffer (&buf, &len);
1506
1507 eval_buffer (argv[0]);
1508
1509 restore_variable_buffer (buf, len);
1510
1511 return o;
1512}
1513
1514
1515#ifdef CONFIG_WITH_EVALPLUS
1516/* Same as func_eval except that we push and pop the local variable
1517 context before evaluating the buffer. */
1518static char *
1519func_evalctx (char *o, char **argv, const char *funcname UNUSED)
1520{
1521 char *buf;
1522 unsigned int len;
1523
1524 /* Eval the buffer. Pop the current variable buffer setting so that the
1525 eval'd code can use its own without conflicting. */
1526
1527 install_variable_buffer (&buf, &len);
1528
1529 push_new_variable_scope ();
1530
1531 eval_buffer (argv[0]);
1532
1533 pop_variable_scope ();
1534
1535 restore_variable_buffer (buf, len);
1536
1537 return o;
1538}
1539
1540/* A mix of func_eval and func_value, saves memory for the expansion.
1541 This implements both evalval and evalvalctx, the latter has its own
1542 variable context just like evalctx. */
1543static char *
1544func_evalval (char *o, char **argv, const char *funcname)
1545{
1546 /* Look up the variable. */
1547 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
1548 if (v)
1549 {
1550 char *buf;
1551 unsigned int len;
1552 int var_ctx;
1553
1554 /* Eval the value. Pop the current variable buffer setting so that the
1555 eval'd code can use its own without conflicting. (really necessary?) */
1556
1557 install_variable_buffer (&buf, &len);
1558 var_ctx = !strcmp(funcname, "evalvalctx");
1559 if (var_ctx)
1560 push_new_variable_scope ();
1561
1562 eval_buffer (v->value);
1563
1564 if (var_ctx)
1565 pop_variable_scope ();
1566 restore_variable_buffer (buf, len);
1567 }
1568
1569 return o;
1570}
1571#endif /* CONFIG_WITH_EVALPLUS */
1572
1573static char *
1574func_value (char *o, char **argv, const char *funcname UNUSED)
1575{
1576 /* Look up the variable. */
1577 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
1578
1579 /* Copy its value into the output buffer without expanding it. */
1580 if (v)
1581#ifdef CONFIG_WITH_VALUE_LENGTH
1582 o = variable_buffer_output (o, v->value,
1583 v->value_length >= 0 ? v->value_length : strlen(v->value));
1584#else
1585 o = variable_buffer_output (o, v->value, strlen(v->value));
1586#endif
1587
1588 return o;
1589}
1590
1591/*
1592 \r is replaced on UNIX as well. Is this desirable?
1593 */
1594static void
1595fold_newlines (char *buffer, unsigned int *length)
1596{
1597 char *dst = buffer;
1598 char *src = buffer;
1599 char *last_nonnl = buffer -1;
1600 src[*length] = 0;
1601 for (; *src != '\0'; ++src)
1602 {
1603 if (src[0] == '\r' && src[1] == '\n')
1604 continue;
1605 if (*src == '\n')
1606 {
1607 *dst++ = ' ';
1608 }
1609 else
1610 {
1611 last_nonnl = dst;
1612 *dst++ = *src;
1613 }
1614 }
1615 *(++last_nonnl) = '\0';
1616 *length = last_nonnl - buffer;
1617}
1618
1619
1620
1621int shell_function_pid = 0, shell_function_completed;
1622
1623
1624#ifdef WINDOWS32
1625/*untested*/
1626
1627#include <windows.h>
1628#include <io.h>
1629#include "sub_proc.h"
1630
1631
1632void
1633windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
1634{
1635 SECURITY_ATTRIBUTES saAttr;
1636 HANDLE hIn;
1637 HANDLE hErr;
1638 HANDLE hChildOutRd;
1639 HANDLE hChildOutWr;
1640 HANDLE hProcess;
1641
1642
1643 saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
1644 saAttr.bInheritHandle = TRUE;
1645 saAttr.lpSecurityDescriptor = NULL;
1646
1647 if (DuplicateHandle (GetCurrentProcess(),
1648 GetStdHandle(STD_INPUT_HANDLE),
1649 GetCurrentProcess(),
1650 &hIn,
1651 0,
1652 TRUE,
1653 DUPLICATE_SAME_ACCESS) == FALSE) {
1654 fatal (NILF, _("create_child_process: DuplicateHandle(In) failed (e=%ld)\n"),
1655 GetLastError());
1656
1657 }
1658 if (DuplicateHandle(GetCurrentProcess(),
1659 GetStdHandle(STD_ERROR_HANDLE),
1660 GetCurrentProcess(),
1661 &hErr,
1662 0,
1663 TRUE,
1664 DUPLICATE_SAME_ACCESS) == FALSE) {
1665 fatal (NILF, _("create_child_process: DuplicateHandle(Err) failed (e=%ld)\n"),
1666 GetLastError());
1667 }
1668
1669 if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
1670 fatal (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
1671
1672 hProcess = process_init_fd(hIn, hChildOutWr, hErr);
1673
1674 if (!hProcess)
1675 fatal (NILF, _("windows32_openpipe (): process_init_fd() failed\n"));
1676
1677 /* make sure that CreateProcess() has Path it needs */
1678 sync_Path_environment();
1679
1680 if (!process_begin(hProcess, command_argv, envp, command_argv[0], NULL)) {
1681 /* register process for wait */
1682 process_register(hProcess);
1683
1684 /* set the pid for returning to caller */
1685 *pid_p = (int) hProcess;
1686
1687 /* set up to read data from child */
1688 pipedes[0] = _open_osfhandle((long) hChildOutRd, O_RDONLY);
1689
1690 /* this will be closed almost right away */
1691 pipedes[1] = _open_osfhandle((long) hChildOutWr, O_APPEND);
1692 } else {
1693 /* reap/cleanup the failed process */
1694 process_cleanup(hProcess);
1695
1696 /* close handles which were duplicated, they weren't used */
1697 CloseHandle(hIn);
1698 CloseHandle(hErr);
1699
1700 /* close pipe handles, they won't be used */
1701 CloseHandle(hChildOutRd);
1702 CloseHandle(hChildOutWr);
1703
1704 /* set status for return */
1705 pipedes[0] = pipedes[1] = -1;
1706 *pid_p = -1;
1707 }
1708}
1709#endif
1710
1711
1712#ifdef __MSDOS__
1713FILE *
1714msdos_openpipe (int* pipedes, int *pidp, char *text)
1715{
1716 FILE *fpipe=0;
1717 /* MSDOS can't fork, but it has `popen'. */
1718 struct variable *sh = lookup_variable ("SHELL", 5);
1719 int e;
1720 extern int dos_command_running, dos_status;
1721
1722 /* Make sure not to bother processing an empty line. */
1723 while (isblank ((unsigned char)*text))
1724 ++text;
1725 if (*text == '\0')
1726 return 0;
1727
1728 if (sh)
1729 {
1730 char buf[PATH_MAX + 7];
1731 /* This makes sure $SHELL value is used by $(shell), even
1732 though the target environment is not passed to it. */
1733 sprintf (buf, "SHELL=%s", sh->value);
1734 putenv (buf);
1735 }
1736
1737 e = errno;
1738 errno = 0;
1739 dos_command_running = 1;
1740 dos_status = 0;
1741 /* If dos_status becomes non-zero, it means the child process
1742 was interrupted by a signal, like SIGINT or SIGQUIT. See
1743 fatal_error_signal in commands.c. */
1744 fpipe = popen (text, "rt");
1745 dos_command_running = 0;
1746 if (!fpipe || dos_status)
1747 {
1748 pipedes[0] = -1;
1749 *pidp = -1;
1750 if (dos_status)
1751 errno = EINTR;
1752 else if (errno == 0)
1753 errno = ENOMEM;
1754 shell_function_completed = -1;
1755 }
1756 else
1757 {
1758 pipedes[0] = fileno (fpipe);
1759 *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
1760 errno = e;
1761 shell_function_completed = 1;
1762 }
1763 return fpipe;
1764}
1765#endif
1766
1767/*
1768 Do shell spawning, with the naughty bits for different OSes.
1769 */
1770
1771#ifdef VMS
1772
1773/* VMS can't do $(shell ...) */
1774#define func_shell 0
1775
1776#else
1777#ifndef _AMIGA
1778static char *
1779func_shell (char *o, char **argv, const char *funcname UNUSED)
1780{
1781 char *batch_filename = NULL;
1782
1783#ifdef __MSDOS__
1784 FILE *fpipe;
1785#endif
1786 char **command_argv;
1787 const char *error_prefix;
1788 char **envp;
1789 int pipedes[2];
1790 int pid;
1791
1792#ifndef __MSDOS__
1793 /* Construct the argument list. */
1794 command_argv = construct_command_argv (argv[0], NULL, NULL, &batch_filename);
1795 if (command_argv == 0)
1796 return o;
1797#endif
1798
1799 /* Using a target environment for `shell' loses in cases like:
1800 export var = $(shell echo foobie)
1801 because target_environment hits a loop trying to expand $(var)
1802 to put it in the environment. This is even more confusing when
1803 var was not explicitly exported, but just appeared in the
1804 calling environment.
1805
1806 See Savannah bug #10593.
1807
1808 envp = target_environment (NILF);
1809 */
1810
1811 envp = environ;
1812
1813 /* For error messages. */
1814 if (reading_file && reading_file->filenm)
1815 {
1816 char *p = alloca (strlen (reading_file->filenm)+11+4);
1817 sprintf (p, "%s:%lu: ", reading_file->filenm, reading_file->lineno);
1818 error_prefix = p;
1819 }
1820 else
1821 error_prefix = "";
1822
1823#if defined(__MSDOS__)
1824 fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
1825 if (pipedes[0] < 0)
1826 {
1827 perror_with_name (error_prefix, "pipe");
1828 return o;
1829 }
1830#elif defined(WINDOWS32)
1831 windows32_openpipe (pipedes, &pid, command_argv, envp);
1832 if (pipedes[0] < 0)
1833 {
1834 /* open of the pipe failed, mark as failed execution */
1835 shell_function_completed = -1;
1836
1837 return o;
1838 }
1839 else
1840#else
1841 if (pipe (pipedes) < 0)
1842 {
1843 perror_with_name (error_prefix, "pipe");
1844 return o;
1845 }
1846
1847# ifdef __EMX__
1848 /* close some handles that are unnecessary for the child process */
1849 CLOSE_ON_EXEC(pipedes[1]);
1850 CLOSE_ON_EXEC(pipedes[0]);
1851 /* Never use fork()/exec() here! Use spawn() instead in exec_command() */
1852 pid = child_execute_job (0, pipedes[1], command_argv, envp);
1853 if (pid < 0)
1854 perror_with_name (error_prefix, "spawn");
1855# else /* ! __EMX__ */
1856 pid = vfork ();
1857 if (pid < 0)
1858 perror_with_name (error_prefix, "fork");
1859 else if (pid == 0)
1860 child_execute_job (0, pipedes[1], command_argv, envp);
1861 else
1862# endif
1863#endif
1864 {
1865 /* We are the parent. */
1866 char *buffer;
1867 unsigned int maxlen, i;
1868 int cc;
1869
1870 /* Record the PID for reap_children. */
1871 shell_function_pid = pid;
1872#ifndef __MSDOS__
1873 shell_function_completed = 0;
1874
1875 /* Free the storage only the child needed. */
1876 free (command_argv[0]);
1877 free (command_argv);
1878
1879 /* Close the write side of the pipe. */
1880# ifdef _MSC_VER /* Avoid annoying msvcrt when debugging. (bird) */
1881 if (pipedes[1] != -1)
1882# endif
1883 close (pipedes[1]);
1884#endif
1885
1886 /* Set up and read from the pipe. */
1887
1888 maxlen = 200;
1889 buffer = xmalloc (maxlen + 1);
1890
1891 /* Read from the pipe until it gets EOF. */
1892 for (i = 0; ; i += cc)
1893 {
1894 if (i == maxlen)
1895 {
1896 maxlen += 512;
1897 buffer = xrealloc (buffer, maxlen + 1);
1898 }
1899
1900 EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i));
1901 if (cc <= 0)
1902 break;
1903 }
1904 buffer[i] = '\0';
1905
1906 /* Close the read side of the pipe. */
1907#ifdef __MSDOS__
1908 if (fpipe)
1909 (void) pclose (fpipe);
1910#else
1911# ifdef _MSC_VER /* Avoid annoying msvcrt when debugging. (bird) */
1912 if (pipedes[0] != -1)
1913# endif
1914 (void) close (pipedes[0]);
1915#endif
1916
1917 /* Loop until child_handler or reap_children() sets
1918 shell_function_completed to the status of our child shell. */
1919 while (shell_function_completed == 0)
1920 reap_children (1, 0);
1921
1922 if (batch_filename) {
1923 DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"),
1924 batch_filename));
1925 remove (batch_filename);
1926 free (batch_filename);
1927 }
1928 shell_function_pid = 0;
1929
1930 /* The child_handler function will set shell_function_completed
1931 to 1 when the child dies normally, or to -1 if it
1932 dies with status 127, which is most likely an exec fail. */
1933
1934 if (shell_function_completed == -1)
1935 {
1936 /* This likely means that the execvp failed, so we should just
1937 write the error message in the pipe from the child. */
1938 fputs (buffer, stderr);
1939 fflush (stderr);
1940 }
1941 else
1942 {
1943 /* The child finished normally. Replace all newlines in its output
1944 with spaces, and put that in the variable output buffer. */
1945 fold_newlines (buffer, &i);
1946 o = variable_buffer_output (o, buffer, i);
1947 }
1948
1949 free (buffer);
1950 }
1951
1952 return o;
1953}
1954
1955#else /* _AMIGA */
1956
1957/* Do the Amiga version of func_shell. */
1958
1959static char *
1960func_shell (char *o, char **argv, const char *funcname)
1961{
1962 /* Amiga can't fork nor spawn, but I can start a program with
1963 redirection of my choice. However, this means that we
1964 don't have an opportunity to reopen stdout to trap it. Thus,
1965 we save our own stdout onto a new descriptor and dup a temp
1966 file's descriptor onto our stdout temporarily. After we
1967 spawn the shell program, we dup our own stdout back to the
1968 stdout descriptor. The buffer reading is the same as above,
1969 except that we're now reading from a file. */
1970
1971#include <dos/dos.h>
1972#include <proto/dos.h>
1973
1974 BPTR child_stdout;
1975 char tmp_output[FILENAME_MAX];
1976 unsigned int maxlen = 200, i;
1977 int cc;
1978 char * buffer, * ptr;
1979 char ** aptr;
1980 int len = 0;
1981 char* batch_filename = NULL;
1982
1983 /* Construct the argument list. */
1984 command_argv = construct_command_argv (argv[0], (char **) NULL,
1985 (struct file *) 0, &batch_filename);
1986 if (command_argv == 0)
1987 return o;
1988
1989 /* Note the mktemp() is a security hole, but this only runs on Amiga.
1990 Ideally we would use main.c:open_tmpfile(), but this uses a special
1991 Open(), not fopen(), and I'm not familiar enough with the code to mess
1992 with it. */
1993 strcpy (tmp_output, "t:MakeshXXXXXXXX");
1994 mktemp (tmp_output);
1995 child_stdout = Open (tmp_output, MODE_NEWFILE);
1996
1997 for (aptr=command_argv; *aptr; aptr++)
1998 len += strlen (*aptr) + 1;
1999
2000 buffer = xmalloc (len + 1);
2001 ptr = buffer;
2002
2003 for (aptr=command_argv; *aptr; aptr++)
2004 {
2005 strcpy (ptr, *aptr);
2006 ptr += strlen (ptr) + 1;
2007 *ptr ++ = ' ';
2008 *ptr = 0;
2009 }
2010
2011 ptr[-1] = '\n';
2012
2013 Execute (buffer, NULL, child_stdout);
2014 free (buffer);
2015
2016 Close (child_stdout);
2017
2018 child_stdout = Open (tmp_output, MODE_OLDFILE);
2019
2020 buffer = xmalloc (maxlen);
2021 i = 0;
2022 do
2023 {
2024 if (i == maxlen)
2025 {
2026 maxlen += 512;
2027 buffer = xrealloc (buffer, maxlen + 1);
2028 }
2029
2030 cc = Read (child_stdout, &buffer[i], maxlen - i);
2031 if (cc > 0)
2032 i += cc;
2033 } while (cc > 0);
2034
2035 Close (child_stdout);
2036
2037 fold_newlines (buffer, &i);
2038 o = variable_buffer_output (o, buffer, i);
2039 free (buffer);
2040 return o;
2041}
2042#endif /* _AMIGA */
2043#endif /* !VMS */
2044
2045#ifdef EXPERIMENTAL
2046
2047/*
2048 equality. Return is string-boolean, ie, the empty string is false.
2049 */
2050static char *
2051func_eq (char *o, char **argv, const char *funcname)
2052{
2053 int result = ! strcmp (argv[0], argv[1]);
2054 o = variable_buffer_output (o, result ? "1" : "", result);
2055 return o;
2056}
2057
2058
2059/*
2060 string-boolean not operator.
2061 */
2062static char *
2063func_not (char *o, char **argv, const char *funcname)
2064{
2065 const char *s = argv[0];
2066 int result = 0;
2067 while (isspace ((unsigned char)*s))
2068 s++;
2069 result = ! (*s);
2070 o = variable_buffer_output (o, result ? "1" : "", result);
2071 return o;
2072}
2073#endif
2074
2075
2076
2077/* Return the absolute name of file NAME which does not contain any `.',
2078 `..' components nor any repeated path separators ('/'). */
2079#ifdef KMK
2080char *
2081#else
2082static char *
2083#endif
2084abspath (const char *name, char *apath)
2085{
2086 char *dest;
2087 const char *start, *end, *apath_limit;
2088
2089 if (name[0] == '\0' || apath == NULL)
2090 return NULL;
2091
2092#ifdef WINDOWS32 /* bird */
2093 dest = w32ify((char *)name, 1);
2094 if (!dest)
2095 return NULL;
2096 {
2097 size_t len = strlen(dest);
2098 memcpy(apath, dest, len);
2099 dest = apath + len;
2100 }
2101
2102 (void)end; (void)start; (void)apath_limit;
2103
2104#elif defined __OS2__ /* bird */
2105 if (_abspath(apath, name, GET_PATH_MAX))
2106 return NULL;
2107 dest = strchr(apath, '\0');
2108
2109 (void)end; (void)start; (void)apath_limit; (void)dest;
2110
2111#else /* !WINDOWS32 && !__OS2__ */
2112 apath_limit = apath + GET_PATH_MAX;
2113
2114#ifdef HAVE_DOS_PATHS /* bird added this */
2115 if (isalpha(name[0]) && name[1] == ':')
2116 {
2117 /* drive spec */
2118 apath[0] = toupper(name[0]);
2119 apath[1] = ':';
2120 apath[2] = '/';
2121 name += 2;
2122 }
2123 else
2124#endif /* HAVE_DOS_PATHS */
2125 if (name[0] != '/')
2126 {
2127 /* It is unlikely we would make it until here but just to make sure. */
2128 if (!starting_directory)
2129 return NULL;
2130
2131 strcpy (apath, starting_directory);
2132
2133 dest = strchr (apath, '\0');
2134 }
2135 else
2136 {
2137 apath[0] = '/';
2138 dest = apath + 1;
2139 }
2140
2141 for (start = end = name; *start != '\0'; start = end)
2142 {
2143 unsigned long len;
2144
2145 /* Skip sequence of multiple path-separators. */
2146 while (*start == '/')
2147 ++start;
2148
2149 /* Find end of path component. */
2150 for (end = start; *end != '\0' && *end != '/'; ++end)
2151 ;
2152
2153 len = end - start;
2154
2155 if (len == 0)
2156 break;
2157 else if (len == 1 && start[0] == '.')
2158 /* nothing */;
2159 else if (len == 2 && start[0] == '.' && start[1] == '.')
2160 {
2161 /* Back up to previous component, ignore if at root already. */
2162 if (dest > apath + 1)
2163 while ((--dest)[-1] != '/');
2164 }
2165 else
2166 {
2167 if (dest[-1] != '/')
2168 *dest++ = '/';
2169
2170 if (dest + len >= apath_limit)
2171 return NULL;
2172
2173 dest = memcpy (dest, start, len);
2174 dest += len;
2175 *dest = '\0';
2176 }
2177 }
2178#endif /* !WINDOWS32 && !__OS2__ */
2179
2180 /* Unless it is root strip trailing separator. */
2181#ifdef HAVE_DOS_PATHS /* bird (is this correct? what about UNC?) */
2182 if (dest > apath + 1 + (apath[0] != '/') && dest[-1] == '/')
2183#else
2184 if (dest > apath + 1 && dest[-1] == '/')
2185#endif
2186 --dest;
2187
2188 *dest = '\0';
2189
2190 return apath;
2191}
2192
2193
2194static char *
2195func_realpath (char *o, char **argv, const char *funcname UNUSED)
2196{
2197 /* Expand the argument. */
2198 const char *p = argv[0];
2199 const char *path = 0;
2200 int doneany = 0;
2201 unsigned int len = 0;
2202 PATH_VAR (in);
2203 PATH_VAR (out);
2204
2205 while ((path = find_next_token (&p, &len)) != 0)
2206 {
2207 if (len < GET_PATH_MAX)
2208 {
2209 strncpy (in, path, len);
2210 in[len] = '\0';
2211
2212 if (
2213#ifdef HAVE_REALPATH
2214 realpath (in, out)
2215#else
2216 abspath (in, out)
2217#endif
2218 )
2219 {
2220 o = variable_buffer_output (o, out, strlen (out));
2221 o = variable_buffer_output (o, " ", 1);
2222 doneany = 1;
2223 }
2224 }
2225 }
2226
2227 /* Kill last space. */
2228 if (doneany)
2229 --o;
2230
2231 return o;
2232}
2233
2234static char *
2235func_abspath (char *o, char **argv, const char *funcname UNUSED)
2236{
2237 /* Expand the argument. */
2238 const char *p = argv[0];
2239 const char *path = 0;
2240 int doneany = 0;
2241 unsigned int len = 0;
2242 PATH_VAR (in);
2243 PATH_VAR (out);
2244
2245 while ((path = find_next_token (&p, &len)) != 0)
2246 {
2247 if (len < GET_PATH_MAX)
2248 {
2249 strncpy (in, path, len);
2250 in[len] = '\0';
2251
2252 if (abspath (in, out))
2253 {
2254 o = variable_buffer_output (o, out, strlen (out));
2255 o = variable_buffer_output (o, " ", 1);
2256 doneany = 1;
2257 }
2258 }
2259 }
2260
2261 /* Kill last space. */
2262 if (doneany)
2263 --o;
2264
2265 return o;
2266}
2267
2268#ifdef CONFIG_WITH_ABSPATHEX
2269/* same as abspath except that the current path is given as the 2nd argument. */
2270static char *
2271func_abspathex (char *o, char **argv, const char *funcname UNUSED)
2272{
2273 /* Expand the argument. */
2274 const char *p = argv[0];
2275 char *cwd = argv[1];
2276 unsigned int cwd_len = ~0U;
2277 char *path = 0;
2278 int doneany = 0;
2279 unsigned int len = 0;
2280 PATH_VAR (in);
2281 PATH_VAR (out);
2282
2283 while ((path = find_next_token (&p, &len)) != 0)
2284 {
2285 if (len < GET_PATH_MAX)
2286 {
2287#ifdef HAVE_DOS_PATHS
2288 if (path[0] != '/' && path[0] != '\\' && (len < 2 || path[1] != ':') && cwd)
2289#else
2290 if (path[0] != '/' && cwd)
2291#endif
2292 {
2293 /* relative path, prefix with cwd. */
2294 if (cwd_len == ~0U)
2295 cwd_len = strlen (cwd);
2296 if (cwd_len + len + 1 >= GET_PATH_MAX)
2297 continue;
2298 memcpy (in, cwd, cwd_len);
2299 in[cwd_len] = '/';
2300 memcpy (in + cwd_len + 1, path, len);
2301 in[cwd_len + len + 1] = '\0';
2302 }
2303 else
2304 {
2305 /* absolute path pass it as-is. */
2306 memcpy (in, path, len);
2307 in[len] = '\0';
2308 }
2309
2310 if (abspath (in, out))
2311 {
2312 o = variable_buffer_output (o, out, strlen (out));
2313 o = variable_buffer_output (o, " ", 1);
2314 doneany = 1;
2315 }
2316 }
2317 }
2318
2319 /* Kill last space. */
2320 if (doneany)
2321 --o;
2322
2323 return o;
2324}
2325#endif
2326
2327#ifdef CONFIG_WITH_XARGS
2328/* Create one or more command lines avoiding the max argument
2329 lenght restriction of the host OS.
2330
2331 The last argument is the list of arguments that the normal
2332 xargs command would be fed from stdin.
2333
2334 The first argument is initial command and it's arguments.
2335
2336 If there are three or more arguments, the 2nd argument is
2337 the command and arguments to be used on subsequent
2338 command lines. Defaults to the initial command.
2339
2340 If there are four or more arguments, the 3rd argument is
2341 the command to be used at the final command line. Defaults
2342 to the sub sequent or initial command .
2343
2344 A future version of this function may define more arguments
2345 and therefor anyone specifying six or more arguments will
2346 cause fatal errors.
2347
2348 Typical usage is:
2349 $(xargs ar cas mylib.a,$(objects))
2350 or
2351 $(xargs ar cas mylib.a,ar as mylib.a,$(objects))
2352
2353 It will then create one or more "ar mylib.a ..." command
2354 lines with proper \n\t separation so it can be used when
2355 writing rules. */
2356static char *
2357func_xargs (char *o, char **argv, const char *funcname UNUSED)
2358{
2359 int argc;
2360 const char *initial_cmd;
2361 size_t initial_cmd_len;
2362 const char *subsequent_cmd;
2363 size_t subsequent_cmd_len;
2364 const char *final_cmd;
2365 size_t final_cmd_len;
2366 const char *args;
2367 size_t max_args;
2368 int i;
2369
2370#ifdef ARG_MAX
2371 /* ARG_MAX is a bit unreliable (environment), so drop 25% of the max. */
2372# define XARGS_MAX (ARG_MAX - (ARG_MAX / 4))
2373#else /* FIXME: update configure with a command line length test. */
2374# define XARGS_MAX 10240
2375#endif
2376
2377 argc = 0;
2378 while (argv[argc])
2379 argc++;
2380 if (argc > 4)
2381 fatal (NILF, _("Too many arguments for $(xargs)!\n"));
2382
2383 /* first: the initial / default command.*/
2384 initial_cmd = argv[0];
2385 while (isspace ((unsigned char)*initial_cmd))
2386 initial_cmd++;
2387 max_args = initial_cmd_len = strlen (initial_cmd);
2388
2389 /* second: the command for the subsequent command lines. defaults to the initial cmd. */
2390 subsequent_cmd = argc > 2 && argv[1][0] != '\0' ? argv[1] : "";
2391 while (isspace ((unsigned char)*subsequent_cmd))
2392 subsequent_cmd++;
2393 if (*subsequent_cmd)
2394 {
2395 subsequent_cmd_len = strlen (subsequent_cmd);
2396 if (subsequent_cmd_len > max_args)
2397 max_args = subsequent_cmd_len;
2398 }
2399 else
2400 {
2401 subsequent_cmd = initial_cmd;
2402 subsequent_cmd_len = initial_cmd_len;
2403 }
2404
2405 /* third: the final command. defaults to the subseq cmd. */
2406 final_cmd = argc > 3 && argv[2][0] != '\0' ? argv[2] : "";
2407 while (isspace ((unsigned char)*final_cmd))
2408 final_cmd++;
2409 if (*final_cmd)
2410 {
2411 final_cmd_len = strlen (final_cmd);
2412 if (final_cmd_len > max_args)
2413 max_args = final_cmd_len;
2414 }
2415 else
2416 {
2417 final_cmd = subsequent_cmd;
2418 final_cmd_len = subsequent_cmd_len;
2419 }
2420
2421 /* last: the arguments to split up into sensible portions. */
2422 args = argv[argc - 1];
2423
2424 /* calc the max argument length. */
2425 if (XARGS_MAX <= max_args + 2)
2426 fatal (NILF, _("$(xargs): the commands are longer than the max exec argument length. (%lu <= %lu)\n"),
2427 (unsigned long)XARGS_MAX, (unsigned long)max_args + 2);
2428 max_args = XARGS_MAX - max_args - 1;
2429
2430 /* generate the commands. */
2431 i = 0;
2432 for (i = 0; ; i++)
2433 {
2434 unsigned int len;
2435 const char *iterator = args;
2436 const char *end = args;
2437 const char *cur;
2438 const char *tmp;
2439
2440 /* scan the arguments till we reach the end or the max length. */
2441 while ((cur = find_next_token(&iterator, &len))
2442 && (size_t)((cur + len) - args) < max_args)
2443 end = cur + len;
2444 if (cur && end == args)
2445 fatal (NILF, _("$(xargs): command + one single arg is too much. giving up.\n"));
2446
2447 /* emit the command. */
2448 if (i == 0)
2449 {
2450 o = variable_buffer_output (o, (char *)initial_cmd, initial_cmd_len);
2451 o = variable_buffer_output (o, " ", 1);
2452 }
2453 else if (cur)
2454 {
2455 o = variable_buffer_output (o, "\n\t", 2);
2456 o = variable_buffer_output (o, (char *)subsequent_cmd, subsequent_cmd_len);
2457 o = variable_buffer_output (o, " ", 1);
2458 }
2459 else
2460 {
2461 o = variable_buffer_output (o, "\n\t", 2);
2462 o = variable_buffer_output (o, (char *)final_cmd, final_cmd_len);
2463 o = variable_buffer_output (o, " ", 1);
2464 }
2465
2466 tmp = end;
2467 while (tmp > args && isspace ((unsigned char)tmp[-1])) /* drop trailing spaces. */
2468 tmp--;
2469 o = variable_buffer_output (o, (char *)args, tmp - args);
2470
2471
2472 /* next */
2473 if (!cur)
2474 break;
2475 args = end;
2476 while (isspace ((unsigned char)*args))
2477 args++;
2478 }
2479
2480 return o;
2481}
2482#endif
2483
2484#ifdef CONFIG_WITH_TOUPPER_TOLOWER
2485static char *
2486func_toupper_tolower (char *o, char **argv, const char *funcname)
2487{
2488 /* Expand the argument. */
2489 const char *p = argv[0];
2490 while (*p)
2491 {
2492 /* convert to temporary buffer */
2493 char tmp[256];
2494 unsigned int i;
2495 if (!strcmp(funcname, "toupper"))
2496 for (i = 0; i < sizeof(tmp) && *p; i++, p++)
2497 tmp[i] = toupper(*p);
2498 else
2499 for (i = 0; i < sizeof(tmp) && *p; i++, p++)
2500 tmp[i] = tolower(*p);
2501 o = variable_buffer_output (o, tmp, i);
2502 }
2503
2504 return o;
2505}
2506#endif /* CONFIG_WITH_TOUPPER_TOLOWER */
2507
2508#if defined(CONFIG_WITH_VALUE_LENGTH) && defined(CONFIG_WITH_COMPARE)
2509
2510/* Strip leading spaces and other things off a command. */
2511static const char *
2512comp_cmds_strip_leading (const char *s, const char *e)
2513{
2514 while (s < e)
2515 {
2516 const char ch = *s;
2517 if (!isblank (ch)
2518 && ch != '@'
2519#ifdef CONFIG_WITH_COMMANDS_FUNC
2520 && ch != '%'
2521#endif
2522 && ch != '+'
2523 && ch != '-')
2524 break;
2525 s++;
2526 }
2527 return s;
2528}
2529
2530/* Worker for func_comp_vars() which is called if the comparision failed.
2531 It will do the slow command by command comparision of the commands
2532 when there invoked as comp-cmds. */
2533static char *
2534comp_vars_ne (char *o, const char *s1, const char *e1, const char *s2, const char *e2,
2535 char *ne_retval, const char *funcname)
2536{
2537 /* give up at once if not comp-cmds or comp-cmds-ex. */
2538 if (strcmp (funcname, "comp-cmds") != 0
2539 && strcmp (funcname, "comp-cmds-ex") != 0)
2540 o = variable_buffer_output (o, ne_retval, strlen (ne_retval));
2541 else
2542 {
2543 const char * const s1_start = s1;
2544 int new_cmd = 1;
2545 int diff;
2546 for (;;)
2547 {
2548 /* if it's a new command, strip leading stuff. */
2549 if (new_cmd)
2550 {
2551 s1 = comp_cmds_strip_leading (s1, e1);
2552 s2 = comp_cmds_strip_leading (s2, e2);
2553 new_cmd = 0;
2554 }
2555 if (s1 >= e1 || s2 >= e2)
2556 break;
2557
2558 /*
2559 * Inner compare loop which compares one line.
2560 * FIXME: parse quoting!
2561 */
2562 for (;;)
2563 {
2564 const char ch1 = *s1;
2565 const char ch2 = *s2;
2566 diff = ch1 - ch2;
2567 if (diff)
2568 break;
2569 if (ch1 == '\n')
2570 break;
2571 assert (ch1 != '\r');
2572
2573 /* next */
2574 s1++;
2575 s2++;
2576 if (s1 >= e1 || s2 >= e2)
2577 break;
2578 }
2579
2580 /*
2581 * If we exited because of a difference try to end-of-command
2582 * comparision, e.g. ignore trailing spaces.
2583 */
2584 if (diff)
2585 {
2586 /* strip */
2587 while (s1 < e1 && isblank (*s1))
2588 s1++;
2589 while (s2 < e2 && isblank (*s2))
2590 s2++;
2591 if (s1 >= e1 || s2 >= e2)
2592 break;
2593
2594 /* compare again and check that it's a newline. */
2595 if (*s2 != '\n' || *s1 != '\n')
2596 break;
2597 }
2598 /* Break out if we exited because of EOS. */
2599 else if (s1 >= e1 || s2 >= e2)
2600 break;
2601
2602 /*
2603 * Detect the end of command lines.
2604 */
2605 if (*s1 == '\n')
2606 new_cmd = s1 == s1_start || s1[-1] != '\\';
2607 s1++;
2608 s2++;
2609 }
2610
2611 /*
2612 * Ignore trailing empty lines.
2613 */
2614 if (s1 < e1 || s2 < e2)
2615 {
2616 while (s1 < e1 && (isblank (*s1) || *s1 == '\n'))
2617 if (*s1++ == '\n')
2618 s1 = comp_cmds_strip_leading (s1, e1);
2619 while (s2 < e2 && (isblank (*s2) || *s2 == '\n'))
2620 if (*s2++ == '\n')
2621 s2 = comp_cmds_strip_leading (s2, e2);
2622 }
2623
2624 /* emit the result. */
2625 if (s1 == e1 && s2 == e2)
2626 o = variable_buffer_output (o, "", 1);
2627 else
2628 o = variable_buffer_output (o, ne_retval, strlen (ne_retval));
2629 }
2630 return o;
2631}
2632
2633/*
2634 $(comp-vars var1,var2,not-equal-return)
2635 or
2636 $(comp-cmds cmd-var1,cmd-var2,not-equal-return)
2637
2638 Compares the two variables (that's given by name to avoid unnecessary
2639 expanding) and return the string in the third argument if not equal.
2640 If equal, nothing is returned.
2641
2642 comp-vars will to an exact comparision only stripping leading and
2643 trailing spaces.
2644
2645 comp-cmds will compare command by command, ignoring not only leading
2646 and trailing spaces on each line but also leading one leading '@',
2647 '-', '+' and '%'
2648*/
2649static char *
2650func_comp_vars (char *o, char **argv, const char *funcname)
2651{
2652 const char *s1, *e1, *x1, *s2, *e2, *x2;
2653 char *a1 = NULL, *a2 = NULL;
2654 size_t l, l1, l2;
2655 struct variable *var1 = lookup_variable (argv[0], strlen (argv[0]));
2656 struct variable *var2 = lookup_variable (argv[1], strlen (argv[1]));
2657
2658 /* the simple cases */
2659 if (var1 == var2)
2660 return variable_buffer_output (o, "", 0); /* eq */
2661 if (!var1 || !var2)
2662 return variable_buffer_output (o, argv[2], strlen(argv[2]));
2663 if (var1->value == var2->value)
2664 return variable_buffer_output (o, "", 0); /* eq */
2665 if (!var1->recursive && !var2->recursive)
2666 {
2667 if ( var1->value_length == var2->value_length
2668 && !memcmp (var1->value, var2->value, var1->value_length))
2669 return variable_buffer_output (o, "", 0); /* eq */
2670
2671 /* ignore trailing and leading blanks */
2672 s1 = var1->value;
2673 e1 = s1 + var1->value_length;
2674 while (isblank ((unsigned char) *s1))
2675 s1++;
2676 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2677 e1--;
2678
2679 s2 = var2->value;
2680 e2 = s2 + var2->value_length;
2681 while (isblank ((unsigned char) *s2))
2682 s2++;
2683 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2684 e2--;
2685
2686 if (e1 - s1 != e2 - s2)
2687 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2688l_simple_compare:
2689 if (!memcmp (s1, s2, e1 - s1))
2690 return variable_buffer_output (o, "", 0); /* eq */
2691 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2692 }
2693
2694 /* ignore trailing and leading blanks */
2695 s1 = var1->value;
2696 e1 = s1 + var1->value_length;
2697 while (isblank ((unsigned char) *s1))
2698 s1++;
2699 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2700 e1--;
2701
2702 s2 = var2->value;
2703 e2 = s2 + var2->value_length;
2704 while (isblank((unsigned char)*s2))
2705 s2++;
2706 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2707 e2--;
2708
2709 /* both empty after stripping? */
2710 if (s1 == e1 && s2 == e2)
2711 return variable_buffer_output (o, "", 0); /* eq */
2712
2713 /* optimist. */
2714 if ( e1 - s1 == e2 - s2
2715 && !memcmp(s1, s2, e1 - s1))
2716 return variable_buffer_output (o, "", 0); /* eq */
2717
2718 /* compare up to the first '$' or the end. */
2719 x1 = var1->recursive ? memchr (s1, '$', e1 - s1) : NULL;
2720 x2 = var2->recursive ? memchr (s2, '$', e2 - s2) : NULL;
2721 if (!x1 && !x2)
2722 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2723
2724 l1 = x1 ? x1 - s1 : e1 - s1;
2725 l2 = x2 ? x2 - s2 : e2 - s2;
2726 l = l1 <= l2 ? l1 : l2;
2727 if (l && memcmp (s1, s2, l))
2728 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2729
2730 /* one or both buffers now require expanding. */
2731 if (!x1)
2732 s1 += l;
2733 else
2734 {
2735 s1 = a1 = allocated_variable_expand ((char *)s1 + l);
2736 if (!l)
2737 while (isblank ((unsigned char) *s1))
2738 s1++;
2739 e1 = strchr (s1, '\0');
2740 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2741 e1--;
2742 }
2743
2744 if (!x2)
2745 s2 += l;
2746 else
2747 {
2748 s2 = a2 = allocated_variable_expand ((char *)s2 + l);
2749 if (!l)
2750 while (isblank ((unsigned char) *s2))
2751 s2++;
2752 e2 = strchr (s2, '\0');
2753 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2754 e2--;
2755 }
2756
2757 /* the final compare */
2758 if ( e1 - s1 != e2 - s2
2759 || memcmp (s1, s2, e1 - s1))
2760 o = comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2761 else
2762 o = variable_buffer_output (o, "", 1); /* eq */
2763 if (a1)
2764 free (a1);
2765 if (a2)
2766 free (a2);
2767 return o;
2768}
2769
2770/*
2771 $(comp-cmds-ex cmds1,cmds2,not-equal-return)
2772
2773 Compares the two strings and return the string in the third argument
2774 if not equal. If equal, nothing is returned.
2775
2776 The comparision will be performed command by command, ignoring not
2777 only leading and trailing spaces on each line but also leading one
2778 leading '@', '-', '+' and '%'.
2779*/
2780static char *
2781func_comp_cmds_ex (char *o, char **argv, const char *funcname)
2782{
2783 const char *s1, *e1, *x1, *s2, *e2, *x2;
2784 char *a1 = NULL, *a2 = NULL;
2785 size_t l, l1, l2;
2786
2787 /* the simple cases */
2788 s1 = argv[0];
2789 s2 = argv[1];
2790 if (s1 == s2)
2791 return variable_buffer_output (o, "", 0); /* eq */
2792 l1 = strlen (argv[0]);
2793 l2 = strlen (argv[1]);
2794
2795 if ( l1 == l2
2796 && !memcmp (s1, s2, l1))
2797 return variable_buffer_output (o, "", 0); /* eq */
2798
2799 /* ignore trailing and leading blanks */
2800 e1 = s1 + l1;
2801 while (isblank ((unsigned char) *s1))
2802 s1++;
2803 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2804 e1--;
2805
2806 e2 = s2 + l1;
2807 while (isblank ((unsigned char) *s2))
2808 s2++;
2809 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2810 e2--;
2811
2812 if (e1 - s1 != e2 - s2)
2813 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2814 if (!memcmp (s1, s2, e1 - s1))
2815 return variable_buffer_output (o, "", 0); /* eq */
2816 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2817}
2818#endif
2819
2820#ifdef CONFIG_WITH_DATE
2821# if defined (_MSC_VER) /* FIXME: !defined (HAVE_STRPTIME) */
2822char *strptime(const char *s, const char *format, struct tm *tm)
2823{
2824 return (char *)"strptime is not implemented";
2825}
2826# endif
2827/* Check if the string is all blanks or not. */
2828static int
2829all_blanks (const char *s)
2830{
2831 if (!s)
2832 return 1;
2833 while (isspace ((unsigned char)*s))
2834 s++;
2835 return *s == '\0';
2836}
2837
2838/* The first argument is the strftime format string, a iso
2839 timestamp is the default if nothing is given.
2840
2841 The second argument is a time value if given. The format
2842 is either the format from the first argument or given as
2843 an additional third argument. */
2844static char *
2845func_date (char *o, char **argv, const char *funcname)
2846{
2847 char *p;
2848 char *buf;
2849 size_t buf_size;
2850 struct tm t;
2851 const char *format;
2852
2853 /* determin the format - use a single word as the default. */
2854 format = !strcmp (funcname, "date-utc")
2855 ? "%Y-%m-%dT%H:%M:%SZ"
2856 : "%Y-%m-%dT%H:%M:%S";
2857 if (!all_blanks (argv[0]))
2858 format = argv[0];
2859
2860 /* get the time. */
2861 memset (&t, 0, sizeof(t));
2862 if (argv[0] && !all_blanks (argv[1]))
2863 {
2864 const char *input_format = !all_blanks (argv[2]) ? argv[2] : format;
2865 p = strptime (argv[1], input_format, &t);
2866 if (!p || *p != '\0')
2867 {
2868 error (NILF, _("$(%s): strptime(%s,%s,) -> %s\n"), funcname,
2869 argv[1], input_format, p ? p : "<null>");
2870 return variable_buffer_output (o, "", 0);
2871 }
2872 }
2873 else
2874 {
2875 time_t tval;
2876 time (&tval);
2877 if (!strcmp (funcname, "date-utc"))
2878 t = *gmtime (&tval);
2879 else
2880 t = *localtime (&tval);
2881 }
2882
2883 /* format it. note that zero isn't necessarily an error, so we'll
2884 have to keep shut about failures. */
2885 buf_size = 64;
2886 buf = xmalloc (buf_size);
2887 while (strftime (buf, buf_size, format, &t) == 0)
2888 {
2889 if (buf_size >= 4096)
2890 {
2891 *buf = '\0';
2892 break;
2893 }
2894 buf = xrealloc (buf, buf_size <<= 1);
2895 }
2896 o = variable_buffer_output (o, buf, strlen (buf));
2897 free (buf);
2898 return o;
2899}
2900#endif
2901
2902#ifdef CONFIG_WITH_FILE_SIZE
2903/* Prints the size of the specified file. Only one file is
2904 permitted, notthing is stripped. -1 is returned if stat
2905 fails. */
2906static char *
2907func_file_size (char *o, char **argv, const char *funcname UNUSED)
2908{
2909 struct stat st;
2910 if (stat (argv[0], &st))
2911 return variable_buffer_output (o, "-1", 2);
2912 return math_int_to_variable_buffer (o, st.st_size);
2913}
2914#endif
2915
2916#ifdef CONFIG_WITH_WHICH
2917/* Checks if the specified file exists an is executable.
2918 On systems employing executable extensions, the name may
2919 be modified to include the extension. */
2920static int func_which_test_x (char *file)
2921{
2922 struct stat st;
2923# if defined(WINDOWS32) || defined(__OS2__)
2924 char *ext;
2925 char *slash;
2926
2927 /* fix slashes first. */
2928 slash = file;
2929 while ((slash = strchr (slash, '\\')) != NULL)
2930 *slash++ = '/';
2931
2932 /* straight */
2933 if (stat (file, &st) == 0
2934 && S_ISREG (st.st_mode))
2935 return 1;
2936
2937 /* don't try add an extension if there already is one */
2938 ext = strchr (file, '\0');
2939 if (ext - file >= 4
2940 && ( !stricmp (ext - 4, ".exe")
2941 || !stricmp (ext - 4, ".cmd")
2942 || !stricmp (ext - 4, ".bat")
2943 || !stricmp (ext - 4, ".com")))
2944 return 0;
2945
2946 /* try the extensions. */
2947 strcpy (ext, ".exe");
2948 if (stat (file, &st) == 0
2949 && S_ISREG (st.st_mode))
2950 return 1;
2951
2952 strcpy (ext, ".cmd");
2953 if (stat (file, &st) == 0
2954 && S_ISREG (st.st_mode))
2955 return 1;
2956
2957 strcpy (ext, ".bat");
2958 if (stat (file, &st) == 0
2959 && S_ISREG (st.st_mode))
2960 return 1;
2961
2962 strcpy (ext, ".com");
2963 if (stat (file, &st) == 0
2964 && S_ISREG (st.st_mode))
2965 return 1;
2966
2967 return 0;
2968
2969# else
2970
2971 return access (file, X_OK) == 0
2972 && stat (file, &st) == 0
2973 && S_ISREG (st.st_mode);
2974# endif
2975}
2976
2977/* Searches for the specified programs in the PATH and print
2978 their full location if found. Prints nothing if not found. */
2979static char *
2980func_which (char *o, char **argv, const char *funcname UNUSED)
2981{
2982 const char *path;
2983 struct variable *path_var;
2984 unsigned i;
2985 PATH_VAR (buf);
2986
2987 path_var = lookup_variable ("PATH", 4);
2988 if (path_var)
2989 path = path_var->value;
2990 else
2991 path = ".";
2992
2993 /* iterate input */
2994 for (i = 0; argv[i]; i++)
2995 {
2996 unsigned int len;
2997 const char *iterator = argv[i];
2998 char *cur;
2999
3000 while ((cur = find_next_token (&iterator, &len)))
3001 {
3002 /* if there is a separator, don't walk the path. */
3003 if (memchr (cur, '/', len)
3004#ifdef HAVE_DOS_PATHS
3005 || memchr (cur, '\\', len)
3006 || memchr (cur, ':', len)
3007#endif
3008 )
3009 {
3010 if (len + 1 + 4 < GET_PATH_MAX) /* +4 for .exe */
3011 {
3012 memcpy (buf, cur, len);
3013 buf[len] = '\0';
3014 if (func_which_test_x (buf))
3015 o = variable_buffer_output (o, buf, strlen (buf));
3016 }
3017 }
3018 else
3019 {
3020 const char *comp = path;
3021 for (;;)
3022 {
3023 const char *src = comp;
3024 const char *end = strchr (comp, PATH_SEPARATOR_CHAR);
3025 size_t comp_len = end ? end - comp : strlen (comp);
3026 if (!comp_len)
3027 {
3028 comp_len = 1;
3029 src = ".";
3030 }
3031 if (len + comp_len + 2 + 4 < GET_PATH_MAX) /* +4 for .exe */
3032 {
3033 memcpy (buf, comp, comp_len);
3034 buf [comp_len] = '/';
3035 memcpy (&buf[comp_len + 1], cur, len);
3036 buf[comp_len + 1 + len] = '\0';
3037
3038 if (func_which_test_x (buf))
3039 {
3040 o = variable_buffer_output (o, buf, strlen (buf));
3041 break;
3042 }
3043 }
3044
3045 /* next */
3046 if (!end)
3047 break;
3048 comp = end + 1;
3049 }
3050 }
3051 }
3052 }
3053
3054 return variable_buffer_output (o, "", 0);
3055}
3056#endif
3057
3058#ifdef CONFIG_WITH_STACK
3059
3060/* Push an item (string without spaces). */
3061static char *
3062func_stack_push (char *o, char **argv, const char *funcname UNUSED)
3063{
3064 do_variable_definition(NILF, argv[0], argv[1], o_file, f_append, 0 /* !target_var */);
3065 return o;
3066}
3067
3068/* Pops an item off the stack / get the top stack element.
3069 (This is what's tricky to do in pure GNU make syntax.) */
3070static char *
3071func_stack_pop_top (char *o, char **argv, const char *funcname)
3072{
3073 struct variable *stack_var;
3074 const char *stack = argv[0];
3075 const int return_item = argv[0][sizeof("stack-pop") - 1] == '\0';
3076
3077 stack_var = lookup_variable (stack, strlen (stack) );
3078 if (stack_var)
3079 {
3080 unsigned int len;
3081 const char *iterator = stack_var->value;
3082 char *lastitem = NULL;
3083 char *cur;
3084
3085 while ((cur = find_next_token (&iterator, &len)))
3086 lastitem = cur;
3087
3088 if (lastitem != NULL)
3089 {
3090 if (strcmp (funcname, "stack-popv") != 0)
3091 o = variable_buffer_output (o, lastitem, len);
3092 if (strcmp (funcname, "stack-top") != 0)
3093 {
3094 *lastitem = '\0';
3095 while (lastitem > stack_var->value && isspace (lastitem[-1]))
3096 *--lastitem = '\0';
3097#ifdef CONFIG_WITH_VALUE_LENGTH
3098 stack_var->value_length = lastitem - stack_var->value;
3099#endif
3100 }
3101 }
3102 }
3103 return o;
3104}
3105#endif /* CONFIG_WITH_STACK */
3106
3107#if defined (CONFIG_WITH_MATH) || defined (CONFIG_WITH_NANOTS) || defined (CONFIG_WITH_FILE_SIZE)
3108/* outputs the number (as a string) into the variable buffer. */
3109static char *
3110math_int_to_variable_buffer (char *o, math_int num)
3111{
3112 static const char xdigits[17] = "0123456789abcdef";
3113 int negative;
3114 char strbuf[24]; /* 16 hex + 2 prefix + sign + term => 20
3115 or 20 dec + sign + term => 22 */
3116 char *str = &strbuf[sizeof (strbuf) - 1];
3117
3118 negative = num < 0;
3119 if (negative)
3120 num = -num;
3121
3122 *str = '\0';
3123
3124 do
3125 {
3126#ifdef HEX_MATH_NUMBERS
3127 *--str = xdigits[num & 0xf];
3128 num >>= 4;
3129#else
3130 *--str = xdigits[num % 10];
3131 num /= 10;
3132#endif
3133 }
3134 while (num);
3135
3136#ifdef HEX_MATH_NUMBERS
3137 *--str = 'x';
3138 *--str = '0';
3139#endif
3140
3141 if (negative)
3142 *--str = '-';
3143
3144 return variable_buffer_output (o, str, &strbuf[sizeof (strbuf) - 1] - str);
3145}
3146#endif /* CONFIG_WITH_MATH || CONFIG_WITH_NANOTS */
3147
3148#ifdef CONFIG_WITH_MATH
3149
3150/* Converts a string to an integer, causes an error if the format is invalid. */
3151static math_int
3152math_int_from_string (const char *str)
3153{
3154 const char *start;
3155 unsigned base = 0;
3156 int negative = 0;
3157 math_int num = 0;
3158
3159 /* strip spaces */
3160 while (isspace (*str))
3161 str++;
3162 if (!*str)
3163 {
3164 error (NILF, _("bad number: empty\n"));
3165 return 0;
3166 }
3167 start = str;
3168
3169 /* check for +/- */
3170 while (*str == '+' || *str == '-' || isspace (*str))
3171 if (*str++ == '-')
3172 negative = !negative;
3173
3174 /* check for prefix - we do not accept octal numbers, sorry. */
3175 if (*str == '0' && (str[1] == 'x' || str[1] == 'X'))
3176 {
3177 base = 16;
3178 str += 2;
3179 }
3180 else
3181 {
3182 /* look for a hex digit, if not found treat it as decimal */
3183 const char *p2 = str;
3184 for ( ; *p2; p2++)
3185 if (isxdigit (*p2) && !isdigit (*p2) && isascii (*p2) )
3186 {
3187 base = 16;
3188 break;
3189 }
3190 if (base == 0)
3191 base = 10;
3192 }
3193
3194 /* must have at least one digit! */
3195 if ( !isascii (*str)
3196 || !(base == 16 ? isxdigit (*str) : isdigit (*str)) )
3197 {
3198 error (NILF, _("bad number: '%s'\n"), start);
3199 return 0;
3200 }
3201
3202 /* convert it! */
3203 while (*str && !isspace (*str))
3204 {
3205 int ch = *str++;
3206 if (ch >= '0' && ch <= '9')
3207 ch -= '0';
3208 else if (base == 16 && ch >= 'a' && ch <= 'f')
3209 ch -= 'a' - 10;
3210 else if (base == 16 && ch >= 'A' && ch <= 'F')
3211 ch -= 'A' - 10;
3212 else
3213 {
3214 error (NILF, _("bad number: '%s' (base=%d, pos=%d)\n"), start, base, str - start);
3215 return 0;
3216 }
3217 num *= base;
3218 num += ch;
3219 }
3220
3221 /* check trailing spaces. */
3222 while (isspace (*str))
3223 str++;
3224 if (*str)
3225 {
3226 error (NILF, _("bad number: '%s'\n"), start);
3227 return 0;
3228 }
3229
3230 return negative ? -num : num;
3231}
3232
3233/* Add two or more integer numbers. */
3234static char *
3235func_int_add (char *o, char **argv, const char *funcname UNUSED)
3236{
3237 math_int num;
3238 int i;
3239
3240 num = math_int_from_string (argv[0]);
3241 for (i = 1; argv[i]; i++)
3242 num += math_int_from_string (argv[i]);
3243
3244 return math_int_to_variable_buffer (o, num);
3245}
3246
3247/* Subtract two or more integer numbers. */
3248static char *
3249func_int_sub (char *o, char **argv, const char *funcname UNUSED)
3250{
3251 math_int num;
3252 int i;
3253
3254 num = math_int_from_string (argv[0]);
3255 for (i = 1; argv[i]; i++)
3256 num -= math_int_from_string (argv[i]);
3257
3258 return math_int_to_variable_buffer (o, num);
3259}
3260
3261/* Multiply two or more integer numbers. */
3262static char *
3263func_int_mul (char *o, char **argv, const char *funcname UNUSED)
3264{
3265 math_int num;
3266 int i;
3267
3268 num = math_int_from_string (argv[0]);
3269 for (i = 1; argv[i]; i++)
3270 num *= math_int_from_string (argv[i]);
3271
3272 return math_int_to_variable_buffer (o, num);
3273}
3274
3275/* Divide an integer number by one or more divisors. */
3276static char *
3277func_int_div (char *o, char **argv, const char *funcname UNUSED)
3278{
3279 math_int num;
3280 math_int divisor;
3281 int i;
3282
3283 num = math_int_from_string (argv[0]);
3284 for (i = 1; argv[i]; i++)
3285 {
3286 divisor = math_int_from_string (argv[i]);
3287 if (!divisor)
3288 {
3289 error (NILF, _("divide by zero ('%s')\n"), argv[i]);
3290 return math_int_to_variable_buffer (o, 0);
3291 }
3292 num /= divisor;
3293 }
3294
3295 return math_int_to_variable_buffer (o, num);
3296}
3297
3298
3299/* Divide and return the remainder. */
3300static char *
3301func_int_mod (char *o, char **argv, const char *funcname UNUSED)
3302{
3303 math_int num;
3304 math_int divisor;
3305
3306 num = math_int_from_string (argv[0]);
3307 divisor = math_int_from_string (argv[1]);
3308 if (!divisor)
3309 {
3310 error (NILF, _("divide by zero ('%s')\n"), argv[1]);
3311 return math_int_to_variable_buffer (o, 0);
3312 }
3313 num %= divisor;
3314
3315 return math_int_to_variable_buffer (o, num);
3316}
3317
3318/* 2-complement. */
3319static char *
3320func_int_not (char *o, char **argv, const char *funcname UNUSED)
3321{
3322 math_int num;
3323
3324 num = math_int_from_string (argv[0]);
3325 num = ~num;
3326
3327 return math_int_to_variable_buffer (o, num);
3328}
3329
3330/* Bitwise AND (two or more numbers). */
3331static char *
3332func_int_and (char *o, char **argv, const char *funcname UNUSED)
3333{
3334 math_int num;
3335 int i;
3336
3337 num = math_int_from_string (argv[0]);
3338 for (i = 1; argv[i]; i++)
3339 num &= math_int_from_string (argv[i]);
3340
3341 return math_int_to_variable_buffer (o, num);
3342}
3343
3344/* Bitwise OR (two or more numbers). */
3345static char *
3346func_int_or (char *o, char **argv, const char *funcname UNUSED)
3347{
3348 math_int num;
3349 int i;
3350
3351 num = math_int_from_string (argv[0]);
3352 for (i = 1; argv[i]; i++)
3353 num |= math_int_from_string (argv[i]);
3354
3355 return math_int_to_variable_buffer (o, num);
3356}
3357
3358/* Bitwise XOR (two or more numbers). */
3359static char *
3360func_int_xor (char *o, char **argv, const char *funcname UNUSED)
3361{
3362 math_int num;
3363 int i;
3364
3365 num = math_int_from_string (argv[0]);
3366 for (i = 1; argv[i]; i++)
3367 num ^= math_int_from_string (argv[i]);
3368
3369 return math_int_to_variable_buffer (o, num);
3370}
3371
3372/* Compare two integer numbers. Returns make boolean (true="1"; false=""). */
3373static char *
3374func_int_cmp (char *o, char **argv, const char *funcname)
3375{
3376 math_int num1;
3377 math_int num2;
3378 int rc;
3379
3380 num1 = math_int_from_string (argv[0]);
3381 num2 = math_int_from_string (argv[1]);
3382
3383 funcname += sizeof ("int-") - 1;
3384 if (!strcmp (funcname, "eq"))
3385 rc = num1 == num2;
3386 else if (!strcmp (funcname, "ne"))
3387 rc = num1 != num2;
3388 else if (!strcmp (funcname, "gt"))
3389 rc = num1 > num2;
3390 else if (!strcmp (funcname, "ge"))
3391 rc = num1 >= num2;
3392 else if (!strcmp (funcname, "lt"))
3393 rc = num1 < num2;
3394 else /*if (!strcmp (funcname, "le"))*/
3395 rc = num1 <= num2;
3396
3397 return variable_buffer_output (o, rc ? "1" : "", rc);
3398}
3399
3400#endif /* CONFIG_WITH_MATH */
3401
3402#ifdef CONFIG_WITH_NANOTS
3403/* Returns the current timestamp as nano seconds. The time
3404 source is a high res monotone one if the platform provides
3405 this (and we know about it).
3406
3407 Tip. Use this with int-sub to profile makefile reading
3408 and similar. */
3409static char *
3410func_nanots (char *o, char **argv, const char *funcname)
3411{
3412 math_int ts;
3413
3414#if defined (WINDOWS32)
3415 static int s_state = -1;
3416 static LARGE_INTEGER s_freq;
3417
3418 if (s_state == -1)
3419 s_state = QueryPerformanceFrequency (&s_freq);
3420 if (s_state)
3421 {
3422 LARGE_INTEGER pc;
3423 if (!QueryPerformanceCounter (&pc))
3424 {
3425 s_state = 0;
3426 return func_nanots (o, argv, funcname);
3427 }
3428 ts = (math_int)((long double)pc.QuadPart / (long double)s_freq.QuadPart * 1000000000);
3429 }
3430 else
3431 {
3432 /* fall back to low resolution system time. */
3433 LARGE_INTEGER bigint;
3434 FILETIME ft = {0,0};
3435 GetSystemTimeAsFileTime (&ft);
3436 bigint.u.LowPart = ft.dwLowDateTime;
3437 bigint.u.HighPart = ft.dwLowDateTime;
3438 ts = bigint.QuadPart * 100;
3439 }
3440
3441/* FIXME: Linux and others have the realtime clock_* api, detect and use it. */
3442
3443#elif HAVE_GETTIMEOFDAY
3444 struct timeval tv;
3445 if (!gettimeofday (&tv, NULL))
3446 ts = (math_int)tv.tv_sec * 1000000000
3447 + tv.tv_usec * 1000;
3448 else
3449 {
3450 error (NILF, _("$(nanots): gettimeofday failed"));
3451 ts = 0;
3452 }
3453
3454#else
3455# error "PORTME"
3456#endif
3457
3458 return math_int_to_variable_buffer (o, ts);
3459}
3460#endif
3461
3462#ifdef CONFIG_WITH_OS2_LIBPATH
3463/* Sets or gets the OS/2 libpath variables.
3464
3465 The first argument indicates which variable - BEGINLIBPATH,
3466 ENDLIBPATH, LIBPATHSTRICT or LIBPATH.
3467
3468 The second indicates whether this is a get (not present) or
3469 set (present) operation. When present it is the new value for
3470 the variable. */
3471static char *
3472func_os2_libpath (char *o, char **argv, const char *funcname UNUSED)
3473{
3474 char buf[4096];
3475 ULONG fVar;
3476 APIRET rc;
3477
3478 /* translate variable name (first arg) */
3479 if (!strcmp (argv[0], "BEGINLIBPATH"))
3480 fVar = BEGIN_LIBPATH;
3481 else if (!strcmp (argv[0], "ENDLIBPATH"))
3482 fVar = END_LIBPATH;
3483 else if (!strcmp (argv[0], "LIBPATHSTRICT"))
3484 fVar = LIBPATHSTRICT;
3485 else if (!strcmp (argv[0], "LIBPATH"))
3486 fVar = 0;
3487 else
3488 {
3489 error (NILF, _("$(libpath): unknown variable `%s'"), argv[0]);
3490 return variable_buffer_output (o, "", 0);
3491 }
3492
3493 if (!argv[1])
3494 {
3495 /* get the variable value. */
3496 if (fVar != 0)
3497 {
3498 buf[0] = buf[1] = buf[2] = buf[3] = '\0';
3499 rc = DosQueryExtLIBPATH (buf, fVar);
3500 }
3501 else
3502 rc = DosQueryHeaderInfo (NULLHANDLE, 0, buf, sizeof(buf), QHINF_LIBPATH);
3503 if (rc != NO_ERROR)
3504 {
3505 error (NILF, _("$(libpath): failed to query `%s', rc=%d"), argv[0], rc);
3506 return variable_buffer_output (o, "", 0);
3507 }
3508 o = variable_buffer_output (o, buf, strlen (buf));
3509 }
3510 else
3511 {
3512 /* set the variable value. */
3513 size_t len;
3514 size_t len_max = sizeof (buf) < 2048 ? sizeof (buf) : 2048;
3515 const char *val;
3516 const char *end;
3517
3518 if (fVar == 0)
3519 {
3520 error (NILF, _("$(libpath): LIBPATH is read-only"));
3521 return variable_buffer_output (o, "", 0);
3522 }
3523
3524 /* strip leading and trailing spaces and check for max length. */
3525 val = argv[1];
3526 while (isspace (*val))
3527 val++;
3528 end = strchr (val, '\0');
3529 while (end > val && isspace (end[-1]))
3530 end--;
3531
3532 len = end - val;
3533 if (len >= len_max)
3534 {
3535 error (NILF, _("$(libpath): The new `%s' value is too long (%d bytes, max %d)"),
3536 argv[0], len, len_max);
3537 return variable_buffer_output (o, "", 0);
3538 }
3539
3540 /* make a stripped copy in low memory and try set it. */
3541 memcpy (buf, val, len);
3542 buf[len] = '\0';
3543 rc = DosSetExtLIBPATH (buf, fVar);
3544 if (rc != NO_ERROR)
3545 {
3546 error (NILF, _("$(libpath): failed to set `%s' to `%s', rc=%d"), argv[0], buf, rc);
3547 return variable_buffer_output (o, "", 0);
3548 }
3549
3550 o = variable_buffer_output (o, "", 0);
3551 }
3552 return o;
3553}
3554#endif /* CONFIG_WITH_OS2_LIBPATH */
3555
3556#ifdef CONFIG_WITH_MAKE_STATS
3557/* Retrieve make statistics. */
3558static char *
3559func_make_stats (char *o, char **argv, const char *funcname UNUSED)
3560{
3561 char buf[512];
3562 int len;
3563
3564 if (!argv[0] || (!argv[0][0] && !argv[1]))
3565 {
3566 len = sprintf (buf, "alloc-cur: %5lu %6luKB (/%3luMB) hash: %5lu %2lu%%",
3567 make_stats_allocations,
3568 make_stats_allocated / 1024,
3569 make_stats_allocated_sum / (1024*1024),
3570 make_stats_ht_lookups,
3571 (make_stats_ht_collisions * 100) / make_stats_ht_lookups);
3572 o = variable_buffer_output (o, buf, len);
3573 }
3574 else
3575 {
3576 /* selective */
3577 int i;
3578 for (i = 0; argv[i]; i++)
3579 {
3580 unsigned long val;
3581 if (i != 0)
3582 o = variable_buffer_output (o, " ", 1);
3583 if (!strcmp(argv[i], "allocations"))
3584 val = make_stats_allocations;
3585 else if (!strcmp(argv[i], "allocated"))
3586 val = make_stats_allocated;
3587 else if (!strcmp(argv[i], "allocated_sum"))
3588 val = make_stats_allocated_sum;
3589 else if (!strcmp(argv[i], "ht_lookups"))
3590 val = make_stats_ht_lookups;
3591 else if (!strcmp(argv[i], "ht_collisions"))
3592 val = make_stats_ht_collisions;
3593 else if (!strcmp(argv[i], "ht_collisions_pct"))
3594 val = (make_stats_ht_collisions * 100) / make_stats_ht_lookups;
3595 else
3596 {
3597 o = variable_buffer_output (o, argv[i], strlen (argv[i]));
3598 continue;
3599 }
3600
3601 len = sprintf (buf, "%ld", val);
3602 o = variable_buffer_output (o, buf, len);
3603 }
3604 }
3605 return o;
3606}
3607#endif /* CONFIG_WITH_MAKE_STATS */
3608
3609#ifdef CONFIG_WITH_COMMANDS_FUNC
3610/* Gets all the commands for a target, separated by newlines.
3611
3612 This is useful when creating and checking target dependencies since
3613 it reduces the amount of work and the memory consuption. A new prefix
3614 character '%' has been introduced for skipping certain lines, like
3615 for instance the one calling this function and pushing to a dep file.
3616 Blank lines are also skipped.
3617
3618 The commands function takes exactly one argument, which is the name of
3619 the target which commands should be returned.
3620
3621 The commands-sc is identical to commands except that it uses a ';' to
3622 separate the commands.
3623
3624 The commands-usr is similar to commands except that it takes a 2nd
3625 argument that is used to separate the commands. */
3626char *
3627func_commands (char *o, char **argv, const char *funcname)
3628{
3629 struct file *file;
3630 static int recursive = 0;
3631
3632 if (recursive)
3633 return variable_buffer_output (o, "recursive", sizeof ("recursive") - 1);
3634 recursive = 1;
3635
3636 file = lookup_file (argv[0]);
3637 if (file)
3638 {
3639 int i, cmd_sep_len;
3640 struct commands *cmds = file->cmds;
3641 const char *cmd_sep;
3642
3643 if (!strcmp (funcname, "commands"))
3644 {
3645 cmd_sep = "\n";
3646 cmd_sep_len = 1;
3647 }
3648 else if (!strcmp (funcname, "commands-sc"))
3649 {
3650 cmd_sep = ";";
3651 cmd_sep_len = 1;
3652 }
3653 else /*if (!strcmp (funcname, "commands-usr"))*/
3654 {
3655 cmd_sep = argv[1];
3656 cmd_sep_len = strlen (cmd_sep);
3657 }
3658
3659 initialize_file_variables (file, 1 /* reading - FIXME: we don't know? */);
3660 set_file_variables (file);
3661 chop_commands (cmds);
3662
3663 for (i = 0; i < cmds->ncommand_lines; i++)
3664 {
3665 char *p;
3666 char *in, *out, *ref;
3667
3668 /* Skip it if it has a '%' prefix or is blank. */
3669 if (cmds->lines_flags[i] & COMMAND_GETTER_SKIP_IT)
3670 continue;
3671 p = cmds->command_lines[i];
3672 while (isblank ((unsigned char)*p))
3673 p++;
3674 if (*p == '\0')
3675 continue;
3676
3677 /* --- copied from new_job() in job.c --- */
3678
3679 /* Collapse backslash-newline combinations that are inside variable
3680 or function references. These are left alone by the parser so
3681 that they will appear in the echoing of commands (where they look
3682 nice); and collapsed by construct_command_argv when it tokenizes.
3683 But letting them survive inside function invocations loses because
3684 we don't want the functions to see them as part of the text. */
3685
3686 /* IN points to where in the line we are scanning.
3687 OUT points to where in the line we are writing.
3688 When we collapse a backslash-newline combination,
3689 IN gets ahead of OUT. */
3690
3691 in = out = p;
3692 while ((ref = strchr (in, '$')) != 0)
3693 {
3694 ++ref; /* Move past the $. */
3695
3696 if (out != in)
3697 /* Copy the text between the end of the last chunk
3698 we processed (where IN points) and the new chunk
3699 we are about to process (where REF points). */
3700 memmove (out, in, ref - in);
3701
3702 /* Move both pointers past the boring stuff. */
3703 out += ref - in;
3704 in = ref;
3705
3706 if (*ref == '(' || *ref == '{')
3707 {
3708 char openparen = *ref;
3709 char closeparen = openparen == '(' ? ')' : '}';
3710 int count;
3711 char *p;
3712
3713 *out++ = *in++; /* Copy OPENPAREN. */
3714 /* IN now points past the opening paren or brace.
3715 Count parens or braces until it is matched. */
3716 count = 0;
3717 while (*in != '\0')
3718 {
3719 if (*in == closeparen && --count < 0)
3720 break;
3721 else if (*in == '\\' && in[1] == '\n')
3722 {
3723 /* We have found a backslash-newline inside a
3724 variable or function reference. Eat it and
3725 any following whitespace. */
3726
3727 int quoted = 0;
3728 for (p = in - 1; p > ref && *p == '\\'; --p)
3729 quoted = !quoted;
3730
3731 if (quoted)
3732 /* There were two or more backslashes, so this is
3733 not really a continuation line. We don't collapse
3734 the quoting backslashes here as is done in
3735 collapse_continuations, because the line will
3736 be collapsed again after expansion. */
3737 *out++ = *in++;
3738 else
3739 {
3740 /* Skip the backslash, newline and
3741 any following whitespace. */
3742 in = next_token (in + 2);
3743
3744 /* Discard any preceding whitespace that has
3745 already been written to the output. */
3746 while (out > ref
3747 && isblank ((unsigned char)out[-1]))
3748 --out;
3749
3750 /* Replace it all with a single space. */
3751 *out++ = ' ';
3752 }
3753 }
3754 else
3755 {
3756 if (*in == openparen)
3757 ++count;
3758
3759 *out++ = *in++;
3760 }
3761 }
3762 }
3763 }
3764
3765 /* There are no more references in this line to worry about.
3766 Copy the remaining uninteresting text to the output. */
3767 if (out != in)
3768 strcpy (out, in);
3769
3770 /* --- copied from new_job() in job.c --- */
3771
3772 /* Finally, expand the line. */
3773 if (i)
3774 o = variable_buffer_output (o, cmd_sep, cmd_sep_len);
3775 o = variable_expand_for_file_2 (o, cmds->command_lines[i], file);
3776
3777 /* Skip it if it has a '%' prefix or is blank. */
3778 p = o;
3779 while (isblank ((unsigned char)*o)
3780 || strchr("@-+", *o))
3781 o++;
3782 if (*o != '\0' && *o != '%')
3783 o = strchr (o, '\0');
3784 else
3785 o = p - cmd_sep_len;
3786 }
3787 }
3788 /* else FIXME: bitch about it? */
3789
3790 recursive = 0;
3791 return o;
3792}
3793#endif /* CONFIG_WITH_COMMANDS_FUNC */
3794
3795/* Lookup table for builtin functions.
3796
3797 This doesn't have to be sorted; we use a straight lookup. We might gain
3798 some efficiency by moving most often used functions to the start of the
3799 table.
3800
3801 If MAXIMUM_ARGS is 0, that means there is no maximum and all
3802 comma-separated values are treated as arguments.
3803
3804 EXPAND_ARGS means that all arguments should be expanded before invocation.
3805 Functions that do namespace tricks (foreach) don't automatically expand. */
3806
3807static char *func_call (char *o, char **argv, const char *funcname);
3808
3809
3810static struct function_table_entry function_table_init[] =
3811{
3812 /* Name/size */ /* MIN MAX EXP? Function */
3813 { STRING_SIZE_TUPLE("abspath"), 0, 1, 1, func_abspath},
3814 { STRING_SIZE_TUPLE("addprefix"), 2, 2, 1, func_addsuffix_addprefix},
3815 { STRING_SIZE_TUPLE("addsuffix"), 2, 2, 1, func_addsuffix_addprefix},
3816 { STRING_SIZE_TUPLE("basename"), 0, 1, 1, func_basename_dir},
3817 { STRING_SIZE_TUPLE("dir"), 0, 1, 1, func_basename_dir},
3818 { STRING_SIZE_TUPLE("notdir"), 0, 1, 1, func_notdir_suffix},
3819 { STRING_SIZE_TUPLE("subst"), 3, 3, 1, func_subst},
3820 { STRING_SIZE_TUPLE("suffix"), 0, 1, 1, func_notdir_suffix},
3821 { STRING_SIZE_TUPLE("filter"), 2, 2, 1, func_filter_filterout},
3822 { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout},
3823 { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring},
3824 { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword},
3825 { STRING_SIZE_TUPLE("flavor"), 0, 1, 1, func_flavor},
3826 { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join},
3827 { STRING_SIZE_TUPLE("lastword"), 0, 1, 1, func_lastword},
3828 { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst},
3829 { STRING_SIZE_TUPLE("realpath"), 0, 1, 1, func_realpath},
3830#ifdef CONFIG_WITH_RSORT
3831 { STRING_SIZE_TUPLE("rsort"), 0, 1, 1, func_sort},
3832#endif
3833 { STRING_SIZE_TUPLE("shell"), 0, 1, 1, func_shell},
3834 { STRING_SIZE_TUPLE("sort"), 0, 1, 1, func_sort},
3835 { STRING_SIZE_TUPLE("strip"), 0, 1, 1, func_strip},
3836 { STRING_SIZE_TUPLE("wildcard"), 0, 1, 1, func_wildcard},
3837 { STRING_SIZE_TUPLE("word"), 2, 2, 1, func_word},
3838 { STRING_SIZE_TUPLE("wordlist"), 3, 3, 1, func_wordlist},
3839 { STRING_SIZE_TUPLE("words"), 0, 1, 1, func_words},
3840 { STRING_SIZE_TUPLE("origin"), 0, 1, 1, func_origin},
3841 { STRING_SIZE_TUPLE("foreach"), 3, 3, 0, func_foreach},
3842 { STRING_SIZE_TUPLE("call"), 1, 0, 1, func_call},
3843 { STRING_SIZE_TUPLE("info"), 0, 1, 1, func_error},
3844 { STRING_SIZE_TUPLE("error"), 0, 1, 1, func_error},
3845 { STRING_SIZE_TUPLE("warning"), 0, 1, 1, func_error},
3846 { STRING_SIZE_TUPLE("if"), 2, 3, 0, func_if},
3847 { STRING_SIZE_TUPLE("or"), 1, 0, 0, func_or},
3848 { STRING_SIZE_TUPLE("and"), 1, 0, 0, func_and},
3849 { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value},
3850 { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval},
3851#ifdef CONFIG_WITH_EVALPLUS
3852 { STRING_SIZE_TUPLE("evalctx"), 0, 1, 1, func_evalctx},
3853 { STRING_SIZE_TUPLE("evalval"), 0, 1, 0, func_evalval},
3854 { STRING_SIZE_TUPLE("evalvalctx"), 0, 1, 0, func_evalval},
3855 { STRING_SIZE_TUPLE("evalcall"), 1, 0, 1, func_call},
3856 { STRING_SIZE_TUPLE("evalcall2"), 1, 0, 1, func_call},
3857#endif
3858#ifdef EXPERIMENTAL
3859 { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq},
3860 { STRING_SIZE_TUPLE("not"), 0, 1, 1, func_not},
3861#endif
3862#ifdef CONFIG_WITH_TOUPPER_TOLOWER
3863 { STRING_SIZE_TUPLE("toupper"), 0, 1, 1, func_toupper_tolower},
3864 { STRING_SIZE_TUPLE("tolower"), 0, 1, 1, func_toupper_tolower},
3865#endif
3866#ifdef CONFIG_WITH_ABSPATHEX
3867 { STRING_SIZE_TUPLE("abspathex"), 0, 2, 1, func_abspathex},
3868#endif
3869#ifdef CONFIG_WITH_XARGS
3870 { STRING_SIZE_TUPLE("xargs"), 2, 0, 1, func_xargs},
3871#endif
3872#if defined(CONFIG_WITH_VALUE_LENGTH) && defined(CONFIG_WITH_COMPARE)
3873 { STRING_SIZE_TUPLE("comp-vars"), 3, 3, 1, func_comp_vars},
3874 { STRING_SIZE_TUPLE("comp-cmds"), 3, 3, 1, func_comp_vars},
3875 { STRING_SIZE_TUPLE("comp-cmds-ex"), 3, 3, 1, func_comp_cmds_ex},
3876#endif
3877#ifdef CONFIG_WITH_DATE
3878 { STRING_SIZE_TUPLE("date"), 0, 1, 1, func_date},
3879 { STRING_SIZE_TUPLE("date-utc"), 0, 3, 1, func_date},
3880#endif
3881#ifdef CONFIG_WITH_FILE_SIZE
3882 { STRING_SIZE_TUPLE("file-size"), 1, 1, 1, func_file_size},
3883#endif
3884#ifdef CONFIG_WITH_WHICH
3885 { STRING_SIZE_TUPLE("which"), 0, 0, 1, func_which},
3886#endif
3887#ifdef CONFIG_WITH_STACK
3888 { STRING_SIZE_TUPLE("stack-push"), 2, 2, 1, func_stack_push},
3889 { STRING_SIZE_TUPLE("stack-pop"), 1, 1, 1, func_stack_pop_top},
3890 { STRING_SIZE_TUPLE("stack-popv"), 1, 1, 1, func_stack_pop_top},
3891 { STRING_SIZE_TUPLE("stack-top"), 1, 1, 1, func_stack_pop_top},
3892#endif
3893#ifdef CONFIG_WITH_MATH
3894 { STRING_SIZE_TUPLE("int-add"), 2, 0, 1, func_int_add},
3895 { STRING_SIZE_TUPLE("int-sub"), 2, 0, 1, func_int_sub},
3896 { STRING_SIZE_TUPLE("int-mul"), 2, 0, 1, func_int_mul},
3897 { STRING_SIZE_TUPLE("int-div"), 2, 0, 1, func_int_div},
3898 { STRING_SIZE_TUPLE("int-mod"), 2, 2, 1, func_int_mod},
3899 { STRING_SIZE_TUPLE("int-not"), 1, 1, 1, func_int_not},
3900 { STRING_SIZE_TUPLE("int-and"), 2, 0, 1, func_int_and},
3901 { STRING_SIZE_TUPLE("int-or"), 2, 0, 1, func_int_or},
3902 { STRING_SIZE_TUPLE("int-xor"), 2, 0, 1, func_int_xor},
3903 { STRING_SIZE_TUPLE("int-eq"), 2, 2, 1, func_int_cmp},
3904 { STRING_SIZE_TUPLE("int-ne"), 2, 2, 1, func_int_cmp},
3905 { STRING_SIZE_TUPLE("int-gt"), 2, 2, 1, func_int_cmp},
3906 { STRING_SIZE_TUPLE("int-ge"), 2, 2, 1, func_int_cmp},
3907 { STRING_SIZE_TUPLE("int-lt"), 2, 2, 1, func_int_cmp},
3908 { STRING_SIZE_TUPLE("int-le"), 2, 2, 1, func_int_cmp},
3909#endif
3910#ifdef CONFIG_WITH_NANOTS
3911 { STRING_SIZE_TUPLE("nanots"), 0, 0, 0, func_nanots},
3912#endif
3913#ifdef CONFIG_WITH_OS2_LIBPATH
3914 { STRING_SIZE_TUPLE("libpath"), 1, 2, 1, func_os2_libpath},
3915#endif
3916#ifdef CONFIG_WITH_MAKE_STATS
3917 { STRING_SIZE_TUPLE("make-stats"), 0, ~0, 0, func_make_stats},
3918#endif
3919#ifdef CONFIG_WITH_COMMANDS_FUNC
3920 { STRING_SIZE_TUPLE("commands"), 1, 1, 1, func_commands},
3921 { STRING_SIZE_TUPLE("commands-sc"), 1, 1, 1, func_commands},
3922 { STRING_SIZE_TUPLE("commands-usr"), 2, 2, 1, func_commands},
3923#endif
3924#ifdef KMK_HELPERS
3925 { STRING_SIZE_TUPLE("kb-src-tool"), 1, 1, 0, func_kbuild_source_tool},
3926 { STRING_SIZE_TUPLE("kb-obj-base"), 1, 1, 0, func_kbuild_object_base},
3927 { STRING_SIZE_TUPLE("kb-obj-suff"), 1, 1, 0, func_kbuild_object_suffix},
3928 { STRING_SIZE_TUPLE("kb-src-prop"), 4, 4, 0, func_kbuild_source_prop},
3929 { STRING_SIZE_TUPLE("kb-src-one"), 0, 1, 0, func_kbuild_source_one},
3930#endif
3931};
3932
3933#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry))
3934
3935
3936
3937/* These must come after the definition of function_table. */
3938
3939static char *
3940expand_builtin_function (char *o, int argc, char **argv,
3941 const struct function_table_entry *entry_p)
3942{
3943 if (argc < (int)entry_p->minimum_args)
3944 fatal (*expanding_var,
3945 _("insufficient number of arguments (%d) to function `%s'"),
3946 argc, entry_p->name);
3947
3948 /* I suppose technically some function could do something with no
3949 arguments, but so far none do, so just test it for all functions here
3950 rather than in each one. We can change it later if necessary. */
3951
3952 if (!argc)
3953 return o;
3954
3955 if (!entry_p->func_ptr)
3956 fatal (*expanding_var,
3957 _("unimplemented on this platform: function `%s'"), entry_p->name);
3958
3959 return entry_p->func_ptr (o, argv, entry_p->name);
3960}
3961
3962/* Check for a function invocation in *STRINGP. *STRINGP points at the
3963 opening ( or { and is not null-terminated. If a function invocation
3964 is found, expand it into the buffer at *OP, updating *OP, incrementing
3965 *STRINGP past the reference and returning nonzero. If not, return zero. */
3966
3967static int
3968handle_function2 (const struct function_table_entry *entry_p, char **op, const char **stringp) /* bird split it up. */
3969{
3970 char openparen = (*stringp)[0];
3971 char closeparen = openparen == '(' ? ')' : '}';
3972 const char *beg;
3973 const char *end;
3974 int count = 0;
3975 char *abeg = NULL;
3976 char **argv, **argvp;
3977 int nargs;
3978
3979 beg = *stringp + 1;
3980
3981 /* We found a builtin function. Find the beginning of its arguments (skip
3982 whitespace after the name). */
3983
3984 beg = next_token (beg + entry_p->len);
3985
3986 /* Find the end of the function invocation, counting nested use of
3987 whichever kind of parens we use. Since we're looking, count commas
3988 to get a rough estimate of how many arguments we might have. The
3989 count might be high, but it'll never be low. */
3990
3991 for (nargs=1, end=beg; *end != '\0'; ++end)
3992 if (*end == ',')
3993 ++nargs;
3994 else if (*end == openparen)
3995 ++count;
3996 else if (*end == closeparen && --count < 0)
3997 break;
3998
3999 if (count >= 0)
4000 fatal (*expanding_var,
4001 _("unterminated call to function `%s': missing `%c'"),
4002 entry_p->name, closeparen);
4003
4004 *stringp = end;
4005
4006 /* Get some memory to store the arg pointers. */
4007 argvp = argv = alloca (sizeof (char *) * (nargs + 2));
4008
4009 /* Chop the string into arguments, then a nul. As soon as we hit
4010 MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the
4011 last argument.
4012
4013 If we're expanding, store pointers to the expansion of each one. If
4014 not, make a duplicate of the string and point into that, nul-terminating
4015 each argument. */
4016
4017 if (entry_p->expand_args)
4018 {
4019 const char *p;
4020 for (p=beg, nargs=0; p <= end; ++argvp)
4021 {
4022 const char *next;
4023
4024 ++nargs;
4025
4026 if (nargs == entry_p->maximum_args
4027 || (! (next = find_next_argument (openparen, closeparen, p, end))))
4028 next = end;
4029
4030 *argvp = expand_argument (p, next);
4031 p = next + 1;
4032 }
4033 }
4034 else
4035 {
4036 int len = end - beg;
4037 char *p, *aend;
4038
4039 abeg = xmalloc (len+1);
4040 memcpy (abeg, beg, len);
4041 abeg[len] = '\0';
4042 aend = abeg + len;
4043
4044 for (p=abeg, nargs=0; p <= aend; ++argvp)
4045 {
4046 char *next;
4047
4048 ++nargs;
4049
4050 if (nargs == entry_p->maximum_args
4051 || (! (next = find_next_argument (openparen, closeparen, p, aend))))
4052 next = aend;
4053
4054 *argvp = p;
4055 *next = '\0';
4056 p = next + 1;
4057 }
4058 }
4059 *argvp = NULL;
4060
4061 /* Finally! Run the function... */
4062 *op = expand_builtin_function (*op, nargs, argv, entry_p);
4063
4064 /* Free memory. */
4065 if (entry_p->expand_args)
4066 for (argvp=argv; *argvp != 0; ++argvp)
4067 free (*argvp);
4068 if (abeg)
4069 free (abeg);
4070
4071 return 1;
4072}
4073
4074int
4075handle_function (char **op, const char **stringp) /* bird split it up */
4076{
4077 const struct function_table_entry *entry_p = lookup_function (*stringp + 1);
4078 if (!entry_p)
4079 return 0;
4080 return handle_function2 (entry_p, op, stringp);
4081}
4082
4083
4084
4085/* User-defined functions. Expand the first argument as either a builtin
4086 function or a make variable, in the context of the rest of the arguments
4087 assigned to $1, $2, ... $N. $0 is the name of the function. */
4088
4089static char *
4090func_call (char *o, char **argv, const char *funcname UNUSED)
4091{
4092 static int max_args = 0;
4093 char *fname;
4094 char *cp;
4095 char *body;
4096 int flen;
4097 int i;
4098 int saved_args;
4099 const struct function_table_entry *entry_p;
4100 struct variable *v;
4101#ifdef CONFIG_WITH_EVALPLUS
4102 char *buf;
4103 unsigned int len;
4104#endif
4105
4106 /* There is no way to define a variable with a space in the name, so strip
4107 leading and trailing whitespace as a favor to the user. */
4108 fname = argv[0];
4109 while (*fname != '\0' && isspace ((unsigned char)*fname))
4110 ++fname;
4111
4112 cp = fname + strlen (fname) - 1;
4113 while (cp > fname && isspace ((unsigned char)*cp))
4114 --cp;
4115 cp[1] = '\0';
4116
4117 /* Calling nothing is a no-op */
4118 if (*fname == '\0')
4119 return o;
4120
4121 /* Are we invoking a builtin function? */
4122
4123 entry_p = lookup_function (fname);
4124 if (entry_p)
4125 {
4126 /* How many arguments do we have? */
4127 for (i=0; argv[i+1]; ++i)
4128 ;
4129 return expand_builtin_function (o, i, argv+1, entry_p);
4130 }
4131
4132 /* Not a builtin, so the first argument is the name of a variable to be
4133 expanded and interpreted as a function. Find it. */
4134 flen = strlen (fname);
4135
4136 v = lookup_variable (fname, flen);
4137
4138 if (v == 0)
4139 warn_undefined (fname, flen);
4140
4141 if (v == 0 || *v->value == '\0')
4142 return o;
4143
4144 body = alloca (flen + 4);
4145 body[0] = '$';
4146 body[1] = '(';
4147 memcpy (body + 2, fname, flen);
4148 body[flen+2] = ')';
4149 body[flen+3] = '\0';
4150
4151 /* Set up arguments $(1) .. $(N). $(0) is the function name. */
4152
4153 push_new_variable_scope ();
4154
4155 for (i=0; *argv; ++i, ++argv)
4156 {
4157 char num[11];
4158
4159 sprintf (num, "%d", i);
4160 define_variable (num, strlen (num), *argv, o_automatic, 0);
4161 }
4162
4163 /* If the number of arguments we have is < max_args, it means we're inside
4164 a recursive invocation of $(call ...). Fill in the remaining arguments
4165 in the new scope with the empty value, to hide them from this
4166 invocation. */
4167
4168 for (; i < max_args; ++i)
4169 {
4170 char num[11];
4171
4172 sprintf (num, "%d", i);
4173 define_variable (num, strlen (num), "", o_automatic, 0);
4174 }
4175
4176 saved_args = max_args;
4177 max_args = i;
4178
4179#ifdef CONFIG_WITH_EVALPLUS
4180 if (!strcmp (funcname, "call"))
4181 {
4182#endif
4183 /* Expand the body in the context of the arguments, adding the result to
4184 the variable buffer. */
4185
4186 v->exp_count = EXP_COUNT_MAX;
4187 o = variable_expand_string (o, body, flen+3);
4188 v->exp_count = 0;
4189
4190 o += strlen (o);
4191#ifdef CONFIG_WITH_EVALPLUS
4192 }
4193 else if (!strcmp (funcname, "evalcall"))
4194 {
4195 /* Evaluate the variable value directly without expanding it first. */
4196
4197 install_variable_buffer (&buf, &len);
4198 eval_buffer (v->value);
4199 restore_variable_buffer (buf, len);
4200 }
4201 else /* evalcall2: */
4202 {
4203 /* Expand the body first and then evaluate the output. */
4204
4205 v->exp_count = EXP_COUNT_MAX;
4206 o = variable_expand_string (o, body, flen+3);
4207 v->exp_count = 0;
4208
4209 install_variable_buffer (&buf, &len);
4210 eval_buffer (o);
4211 restore_variable_buffer (buf, len);
4212 }
4213#endif /* CONFIG_WITH_EVALPLUS */
4214
4215 max_args = saved_args;
4216
4217 pop_variable_scope ();
4218
4219 return o;
4220}
4221
4222void
4223hash_init_function_table (void)
4224{
4225 hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2,
4226 function_table_entry_hash_1, function_table_entry_hash_2,
4227 function_table_entry_hash_cmp);
4228 hash_load (&function_table, function_table_init,
4229 FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry));
4230#ifdef CONFIG_WITH_OPTIMIZATION_HACKS
4231 {
4232 unsigned i;
4233 for (i = 0; i < FUNCTION_TABLE_ENTRIES; i++)
4234 assert (function_table_init[i].len <= MAX_FUNCTION_LENGTH);
4235 }
4236#endif
4237}
Note: See TracBrowser for help on using the repository browser.