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

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

Fixed evalval and evalcall - eval_buffer will change the input, so a copy of the variable is necessary.

  • 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 *tmp;
1551 char *buf;
1552 unsigned int len;
1553 int var_ctx;
1554
1555 /* Eval the value. Pop the current variable buffer setting so that the
1556 eval'd code can use its own without conflicting. (really necessary?) */
1557
1558 install_variable_buffer (&buf, &len);
1559 var_ctx = !strcmp(funcname, "evalvalctx");
1560 if (var_ctx)
1561 push_new_variable_scope ();
1562
1563 tmp = xmalloc (v->value_length + 1);
1564 memcpy (tmp, v->value, v->value_length + 1);
1565 eval_buffer (tmp);
1566 free (tmp);
1567
1568 if (var_ctx)
1569 pop_variable_scope ();
1570 restore_variable_buffer (buf, len);
1571 }
1572
1573 return o;
1574}
1575#endif /* CONFIG_WITH_EVALPLUS */
1576
1577static char *
1578func_value (char *o, char **argv, const char *funcname UNUSED)
1579{
1580 /* Look up the variable. */
1581 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
1582
1583 /* Copy its value into the output buffer without expanding it. */
1584 if (v)
1585#ifdef CONFIG_WITH_VALUE_LENGTH
1586 o = variable_buffer_output (o, v->value,
1587 v->value_length >= 0 ? v->value_length : strlen(v->value));
1588#else
1589 o = variable_buffer_output (o, v->value, strlen(v->value));
1590#endif
1591
1592 return o;
1593}
1594
1595/*
1596 \r is replaced on UNIX as well. Is this desirable?
1597 */
1598static void
1599fold_newlines (char *buffer, unsigned int *length)
1600{
1601 char *dst = buffer;
1602 char *src = buffer;
1603 char *last_nonnl = buffer -1;
1604 src[*length] = 0;
1605 for (; *src != '\0'; ++src)
1606 {
1607 if (src[0] == '\r' && src[1] == '\n')
1608 continue;
1609 if (*src == '\n')
1610 {
1611 *dst++ = ' ';
1612 }
1613 else
1614 {
1615 last_nonnl = dst;
1616 *dst++ = *src;
1617 }
1618 }
1619 *(++last_nonnl) = '\0';
1620 *length = last_nonnl - buffer;
1621}
1622
1623
1624
1625int shell_function_pid = 0, shell_function_completed;
1626
1627
1628#ifdef WINDOWS32
1629/*untested*/
1630
1631#include <windows.h>
1632#include <io.h>
1633#include "sub_proc.h"
1634
1635
1636void
1637windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
1638{
1639 SECURITY_ATTRIBUTES saAttr;
1640 HANDLE hIn;
1641 HANDLE hErr;
1642 HANDLE hChildOutRd;
1643 HANDLE hChildOutWr;
1644 HANDLE hProcess;
1645
1646
1647 saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
1648 saAttr.bInheritHandle = TRUE;
1649 saAttr.lpSecurityDescriptor = NULL;
1650
1651 if (DuplicateHandle (GetCurrentProcess(),
1652 GetStdHandle(STD_INPUT_HANDLE),
1653 GetCurrentProcess(),
1654 &hIn,
1655 0,
1656 TRUE,
1657 DUPLICATE_SAME_ACCESS) == FALSE) {
1658 fatal (NILF, _("create_child_process: DuplicateHandle(In) failed (e=%ld)\n"),
1659 GetLastError());
1660
1661 }
1662 if (DuplicateHandle(GetCurrentProcess(),
1663 GetStdHandle(STD_ERROR_HANDLE),
1664 GetCurrentProcess(),
1665 &hErr,
1666 0,
1667 TRUE,
1668 DUPLICATE_SAME_ACCESS) == FALSE) {
1669 fatal (NILF, _("create_child_process: DuplicateHandle(Err) failed (e=%ld)\n"),
1670 GetLastError());
1671 }
1672
1673 if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
1674 fatal (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
1675
1676 hProcess = process_init_fd(hIn, hChildOutWr, hErr);
1677
1678 if (!hProcess)
1679 fatal (NILF, _("windows32_openpipe (): process_init_fd() failed\n"));
1680
1681 /* make sure that CreateProcess() has Path it needs */
1682 sync_Path_environment();
1683
1684 if (!process_begin(hProcess, command_argv, envp, command_argv[0], NULL)) {
1685 /* register process for wait */
1686 process_register(hProcess);
1687
1688 /* set the pid for returning to caller */
1689 *pid_p = (int) hProcess;
1690
1691 /* set up to read data from child */
1692 pipedes[0] = _open_osfhandle((long) hChildOutRd, O_RDONLY);
1693
1694 /* this will be closed almost right away */
1695 pipedes[1] = _open_osfhandle((long) hChildOutWr, O_APPEND);
1696 } else {
1697 /* reap/cleanup the failed process */
1698 process_cleanup(hProcess);
1699
1700 /* close handles which were duplicated, they weren't used */
1701 CloseHandle(hIn);
1702 CloseHandle(hErr);
1703
1704 /* close pipe handles, they won't be used */
1705 CloseHandle(hChildOutRd);
1706 CloseHandle(hChildOutWr);
1707
1708 /* set status for return */
1709 pipedes[0] = pipedes[1] = -1;
1710 *pid_p = -1;
1711 }
1712}
1713#endif
1714
1715
1716#ifdef __MSDOS__
1717FILE *
1718msdos_openpipe (int* pipedes, int *pidp, char *text)
1719{
1720 FILE *fpipe=0;
1721 /* MSDOS can't fork, but it has `popen'. */
1722 struct variable *sh = lookup_variable ("SHELL", 5);
1723 int e;
1724 extern int dos_command_running, dos_status;
1725
1726 /* Make sure not to bother processing an empty line. */
1727 while (isblank ((unsigned char)*text))
1728 ++text;
1729 if (*text == '\0')
1730 return 0;
1731
1732 if (sh)
1733 {
1734 char buf[PATH_MAX + 7];
1735 /* This makes sure $SHELL value is used by $(shell), even
1736 though the target environment is not passed to it. */
1737 sprintf (buf, "SHELL=%s", sh->value);
1738 putenv (buf);
1739 }
1740
1741 e = errno;
1742 errno = 0;
1743 dos_command_running = 1;
1744 dos_status = 0;
1745 /* If dos_status becomes non-zero, it means the child process
1746 was interrupted by a signal, like SIGINT or SIGQUIT. See
1747 fatal_error_signal in commands.c. */
1748 fpipe = popen (text, "rt");
1749 dos_command_running = 0;
1750 if (!fpipe || dos_status)
1751 {
1752 pipedes[0] = -1;
1753 *pidp = -1;
1754 if (dos_status)
1755 errno = EINTR;
1756 else if (errno == 0)
1757 errno = ENOMEM;
1758 shell_function_completed = -1;
1759 }
1760 else
1761 {
1762 pipedes[0] = fileno (fpipe);
1763 *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
1764 errno = e;
1765 shell_function_completed = 1;
1766 }
1767 return fpipe;
1768}
1769#endif
1770
1771/*
1772 Do shell spawning, with the naughty bits for different OSes.
1773 */
1774
1775#ifdef VMS
1776
1777/* VMS can't do $(shell ...) */
1778#define func_shell 0
1779
1780#else
1781#ifndef _AMIGA
1782static char *
1783func_shell (char *o, char **argv, const char *funcname UNUSED)
1784{
1785 char *batch_filename = NULL;
1786
1787#ifdef __MSDOS__
1788 FILE *fpipe;
1789#endif
1790 char **command_argv;
1791 const char *error_prefix;
1792 char **envp;
1793 int pipedes[2];
1794 int pid;
1795
1796#ifndef __MSDOS__
1797 /* Construct the argument list. */
1798 command_argv = construct_command_argv (argv[0], NULL, NULL, &batch_filename);
1799 if (command_argv == 0)
1800 return o;
1801#endif
1802
1803 /* Using a target environment for `shell' loses in cases like:
1804 export var = $(shell echo foobie)
1805 because target_environment hits a loop trying to expand $(var)
1806 to put it in the environment. This is even more confusing when
1807 var was not explicitly exported, but just appeared in the
1808 calling environment.
1809
1810 See Savannah bug #10593.
1811
1812 envp = target_environment (NILF);
1813 */
1814
1815 envp = environ;
1816
1817 /* For error messages. */
1818 if (reading_file && reading_file->filenm)
1819 {
1820 char *p = alloca (strlen (reading_file->filenm)+11+4);
1821 sprintf (p, "%s:%lu: ", reading_file->filenm, reading_file->lineno);
1822 error_prefix = p;
1823 }
1824 else
1825 error_prefix = "";
1826
1827#if defined(__MSDOS__)
1828 fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
1829 if (pipedes[0] < 0)
1830 {
1831 perror_with_name (error_prefix, "pipe");
1832 return o;
1833 }
1834#elif defined(WINDOWS32)
1835 windows32_openpipe (pipedes, &pid, command_argv, envp);
1836 if (pipedes[0] < 0)
1837 {
1838 /* open of the pipe failed, mark as failed execution */
1839 shell_function_completed = -1;
1840
1841 return o;
1842 }
1843 else
1844#else
1845 if (pipe (pipedes) < 0)
1846 {
1847 perror_with_name (error_prefix, "pipe");
1848 return o;
1849 }
1850
1851# ifdef __EMX__
1852 /* close some handles that are unnecessary for the child process */
1853 CLOSE_ON_EXEC(pipedes[1]);
1854 CLOSE_ON_EXEC(pipedes[0]);
1855 /* Never use fork()/exec() here! Use spawn() instead in exec_command() */
1856 pid = child_execute_job (0, pipedes[1], command_argv, envp);
1857 if (pid < 0)
1858 perror_with_name (error_prefix, "spawn");
1859# else /* ! __EMX__ */
1860 pid = vfork ();
1861 if (pid < 0)
1862 perror_with_name (error_prefix, "fork");
1863 else if (pid == 0)
1864 child_execute_job (0, pipedes[1], command_argv, envp);
1865 else
1866# endif
1867#endif
1868 {
1869 /* We are the parent. */
1870 char *buffer;
1871 unsigned int maxlen, i;
1872 int cc;
1873
1874 /* Record the PID for reap_children. */
1875 shell_function_pid = pid;
1876#ifndef __MSDOS__
1877 shell_function_completed = 0;
1878
1879 /* Free the storage only the child needed. */
1880 free (command_argv[0]);
1881 free (command_argv);
1882
1883 /* Close the write side of the pipe. */
1884# ifdef _MSC_VER /* Avoid annoying msvcrt when debugging. (bird) */
1885 if (pipedes[1] != -1)
1886# endif
1887 close (pipedes[1]);
1888#endif
1889
1890 /* Set up and read from the pipe. */
1891
1892 maxlen = 200;
1893 buffer = xmalloc (maxlen + 1);
1894
1895 /* Read from the pipe until it gets EOF. */
1896 for (i = 0; ; i += cc)
1897 {
1898 if (i == maxlen)
1899 {
1900 maxlen += 512;
1901 buffer = xrealloc (buffer, maxlen + 1);
1902 }
1903
1904 EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i));
1905 if (cc <= 0)
1906 break;
1907 }
1908 buffer[i] = '\0';
1909
1910 /* Close the read side of the pipe. */
1911#ifdef __MSDOS__
1912 if (fpipe)
1913 (void) pclose (fpipe);
1914#else
1915# ifdef _MSC_VER /* Avoid annoying msvcrt when debugging. (bird) */
1916 if (pipedes[0] != -1)
1917# endif
1918 (void) close (pipedes[0]);
1919#endif
1920
1921 /* Loop until child_handler or reap_children() sets
1922 shell_function_completed to the status of our child shell. */
1923 while (shell_function_completed == 0)
1924 reap_children (1, 0);
1925
1926 if (batch_filename) {
1927 DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"),
1928 batch_filename));
1929 remove (batch_filename);
1930 free (batch_filename);
1931 }
1932 shell_function_pid = 0;
1933
1934 /* The child_handler function will set shell_function_completed
1935 to 1 when the child dies normally, or to -1 if it
1936 dies with status 127, which is most likely an exec fail. */
1937
1938 if (shell_function_completed == -1)
1939 {
1940 /* This likely means that the execvp failed, so we should just
1941 write the error message in the pipe from the child. */
1942 fputs (buffer, stderr);
1943 fflush (stderr);
1944 }
1945 else
1946 {
1947 /* The child finished normally. Replace all newlines in its output
1948 with spaces, and put that in the variable output buffer. */
1949 fold_newlines (buffer, &i);
1950 o = variable_buffer_output (o, buffer, i);
1951 }
1952
1953 free (buffer);
1954 }
1955
1956 return o;
1957}
1958
1959#else /* _AMIGA */
1960
1961/* Do the Amiga version of func_shell. */
1962
1963static char *
1964func_shell (char *o, char **argv, const char *funcname)
1965{
1966 /* Amiga can't fork nor spawn, but I can start a program with
1967 redirection of my choice. However, this means that we
1968 don't have an opportunity to reopen stdout to trap it. Thus,
1969 we save our own stdout onto a new descriptor and dup a temp
1970 file's descriptor onto our stdout temporarily. After we
1971 spawn the shell program, we dup our own stdout back to the
1972 stdout descriptor. The buffer reading is the same as above,
1973 except that we're now reading from a file. */
1974
1975#include <dos/dos.h>
1976#include <proto/dos.h>
1977
1978 BPTR child_stdout;
1979 char tmp_output[FILENAME_MAX];
1980 unsigned int maxlen = 200, i;
1981 int cc;
1982 char * buffer, * ptr;
1983 char ** aptr;
1984 int len = 0;
1985 char* batch_filename = NULL;
1986
1987 /* Construct the argument list. */
1988 command_argv = construct_command_argv (argv[0], (char **) NULL,
1989 (struct file *) 0, &batch_filename);
1990 if (command_argv == 0)
1991 return o;
1992
1993 /* Note the mktemp() is a security hole, but this only runs on Amiga.
1994 Ideally we would use main.c:open_tmpfile(), but this uses a special
1995 Open(), not fopen(), and I'm not familiar enough with the code to mess
1996 with it. */
1997 strcpy (tmp_output, "t:MakeshXXXXXXXX");
1998 mktemp (tmp_output);
1999 child_stdout = Open (tmp_output, MODE_NEWFILE);
2000
2001 for (aptr=command_argv; *aptr; aptr++)
2002 len += strlen (*aptr) + 1;
2003
2004 buffer = xmalloc (len + 1);
2005 ptr = buffer;
2006
2007 for (aptr=command_argv; *aptr; aptr++)
2008 {
2009 strcpy (ptr, *aptr);
2010 ptr += strlen (ptr) + 1;
2011 *ptr ++ = ' ';
2012 *ptr = 0;
2013 }
2014
2015 ptr[-1] = '\n';
2016
2017 Execute (buffer, NULL, child_stdout);
2018 free (buffer);
2019
2020 Close (child_stdout);
2021
2022 child_stdout = Open (tmp_output, MODE_OLDFILE);
2023
2024 buffer = xmalloc (maxlen);
2025 i = 0;
2026 do
2027 {
2028 if (i == maxlen)
2029 {
2030 maxlen += 512;
2031 buffer = xrealloc (buffer, maxlen + 1);
2032 }
2033
2034 cc = Read (child_stdout, &buffer[i], maxlen - i);
2035 if (cc > 0)
2036 i += cc;
2037 } while (cc > 0);
2038
2039 Close (child_stdout);
2040
2041 fold_newlines (buffer, &i);
2042 o = variable_buffer_output (o, buffer, i);
2043 free (buffer);
2044 return o;
2045}
2046#endif /* _AMIGA */
2047#endif /* !VMS */
2048
2049#ifdef EXPERIMENTAL
2050
2051/*
2052 equality. Return is string-boolean, ie, the empty string is false.
2053 */
2054static char *
2055func_eq (char *o, char **argv, const char *funcname)
2056{
2057 int result = ! strcmp (argv[0], argv[1]);
2058 o = variable_buffer_output (o, result ? "1" : "", result);
2059 return o;
2060}
2061
2062
2063/*
2064 string-boolean not operator.
2065 */
2066static char *
2067func_not (char *o, char **argv, const char *funcname)
2068{
2069 const char *s = argv[0];
2070 int result = 0;
2071 while (isspace ((unsigned char)*s))
2072 s++;
2073 result = ! (*s);
2074 o = variable_buffer_output (o, result ? "1" : "", result);
2075 return o;
2076}
2077#endif
2078
2079
2080
2081/* Return the absolute name of file NAME which does not contain any `.',
2082 `..' components nor any repeated path separators ('/'). */
2083#ifdef KMK
2084char *
2085#else
2086static char *
2087#endif
2088abspath (const char *name, char *apath)
2089{
2090 char *dest;
2091 const char *start, *end, *apath_limit;
2092
2093 if (name[0] == '\0' || apath == NULL)
2094 return NULL;
2095
2096#ifdef WINDOWS32 /* bird */
2097 dest = w32ify((char *)name, 1);
2098 if (!dest)
2099 return NULL;
2100 {
2101 size_t len = strlen(dest);
2102 memcpy(apath, dest, len);
2103 dest = apath + len;
2104 }
2105
2106 (void)end; (void)start; (void)apath_limit;
2107
2108#elif defined __OS2__ /* bird */
2109 if (_abspath(apath, name, GET_PATH_MAX))
2110 return NULL;
2111 dest = strchr(apath, '\0');
2112
2113 (void)end; (void)start; (void)apath_limit; (void)dest;
2114
2115#else /* !WINDOWS32 && !__OS2__ */
2116 apath_limit = apath + GET_PATH_MAX;
2117
2118#ifdef HAVE_DOS_PATHS /* bird added this */
2119 if (isalpha(name[0]) && name[1] == ':')
2120 {
2121 /* drive spec */
2122 apath[0] = toupper(name[0]);
2123 apath[1] = ':';
2124 apath[2] = '/';
2125 name += 2;
2126 }
2127 else
2128#endif /* HAVE_DOS_PATHS */
2129 if (name[0] != '/')
2130 {
2131 /* It is unlikely we would make it until here but just to make sure. */
2132 if (!starting_directory)
2133 return NULL;
2134
2135 strcpy (apath, starting_directory);
2136
2137 dest = strchr (apath, '\0');
2138 }
2139 else
2140 {
2141 apath[0] = '/';
2142 dest = apath + 1;
2143 }
2144
2145 for (start = end = name; *start != '\0'; start = end)
2146 {
2147 unsigned long len;
2148
2149 /* Skip sequence of multiple path-separators. */
2150 while (*start == '/')
2151 ++start;
2152
2153 /* Find end of path component. */
2154 for (end = start; *end != '\0' && *end != '/'; ++end)
2155 ;
2156
2157 len = end - start;
2158
2159 if (len == 0)
2160 break;
2161 else if (len == 1 && start[0] == '.')
2162 /* nothing */;
2163 else if (len == 2 && start[0] == '.' && start[1] == '.')
2164 {
2165 /* Back up to previous component, ignore if at root already. */
2166 if (dest > apath + 1)
2167 while ((--dest)[-1] != '/');
2168 }
2169 else
2170 {
2171 if (dest[-1] != '/')
2172 *dest++ = '/';
2173
2174 if (dest + len >= apath_limit)
2175 return NULL;
2176
2177 dest = memcpy (dest, start, len);
2178 dest += len;
2179 *dest = '\0';
2180 }
2181 }
2182#endif /* !WINDOWS32 && !__OS2__ */
2183
2184 /* Unless it is root strip trailing separator. */
2185#ifdef HAVE_DOS_PATHS /* bird (is this correct? what about UNC?) */
2186 if (dest > apath + 1 + (apath[0] != '/') && dest[-1] == '/')
2187#else
2188 if (dest > apath + 1 && dest[-1] == '/')
2189#endif
2190 --dest;
2191
2192 *dest = '\0';
2193
2194 return apath;
2195}
2196
2197
2198static char *
2199func_realpath (char *o, char **argv, const char *funcname UNUSED)
2200{
2201 /* Expand the argument. */
2202 const char *p = argv[0];
2203 const char *path = 0;
2204 int doneany = 0;
2205 unsigned int len = 0;
2206 PATH_VAR (in);
2207 PATH_VAR (out);
2208
2209 while ((path = find_next_token (&p, &len)) != 0)
2210 {
2211 if (len < GET_PATH_MAX)
2212 {
2213 strncpy (in, path, len);
2214 in[len] = '\0';
2215
2216 if (
2217#ifdef HAVE_REALPATH
2218 realpath (in, out)
2219#else
2220 abspath (in, out)
2221#endif
2222 )
2223 {
2224 o = variable_buffer_output (o, out, strlen (out));
2225 o = variable_buffer_output (o, " ", 1);
2226 doneany = 1;
2227 }
2228 }
2229 }
2230
2231 /* Kill last space. */
2232 if (doneany)
2233 --o;
2234
2235 return o;
2236}
2237
2238static char *
2239func_abspath (char *o, char **argv, const char *funcname UNUSED)
2240{
2241 /* Expand the argument. */
2242 const char *p = argv[0];
2243 const char *path = 0;
2244 int doneany = 0;
2245 unsigned int len = 0;
2246 PATH_VAR (in);
2247 PATH_VAR (out);
2248
2249 while ((path = find_next_token (&p, &len)) != 0)
2250 {
2251 if (len < GET_PATH_MAX)
2252 {
2253 strncpy (in, path, len);
2254 in[len] = '\0';
2255
2256 if (abspath (in, out))
2257 {
2258 o = variable_buffer_output (o, out, strlen (out));
2259 o = variable_buffer_output (o, " ", 1);
2260 doneany = 1;
2261 }
2262 }
2263 }
2264
2265 /* Kill last space. */
2266 if (doneany)
2267 --o;
2268
2269 return o;
2270}
2271
2272#ifdef CONFIG_WITH_ABSPATHEX
2273/* same as abspath except that the current path is given as the 2nd argument. */
2274static char *
2275func_abspathex (char *o, char **argv, const char *funcname UNUSED)
2276{
2277 /* Expand the argument. */
2278 const char *p = argv[0];
2279 char *cwd = argv[1];
2280 unsigned int cwd_len = ~0U;
2281 char *path = 0;
2282 int doneany = 0;
2283 unsigned int len = 0;
2284 PATH_VAR (in);
2285 PATH_VAR (out);
2286
2287 while ((path = find_next_token (&p, &len)) != 0)
2288 {
2289 if (len < GET_PATH_MAX)
2290 {
2291#ifdef HAVE_DOS_PATHS
2292 if (path[0] != '/' && path[0] != '\\' && (len < 2 || path[1] != ':') && cwd)
2293#else
2294 if (path[0] != '/' && cwd)
2295#endif
2296 {
2297 /* relative path, prefix with cwd. */
2298 if (cwd_len == ~0U)
2299 cwd_len = strlen (cwd);
2300 if (cwd_len + len + 1 >= GET_PATH_MAX)
2301 continue;
2302 memcpy (in, cwd, cwd_len);
2303 in[cwd_len] = '/';
2304 memcpy (in + cwd_len + 1, path, len);
2305 in[cwd_len + len + 1] = '\0';
2306 }
2307 else
2308 {
2309 /* absolute path pass it as-is. */
2310 memcpy (in, path, len);
2311 in[len] = '\0';
2312 }
2313
2314 if (abspath (in, out))
2315 {
2316 o = variable_buffer_output (o, out, strlen (out));
2317 o = variable_buffer_output (o, " ", 1);
2318 doneany = 1;
2319 }
2320 }
2321 }
2322
2323 /* Kill last space. */
2324 if (doneany)
2325 --o;
2326
2327 return o;
2328}
2329#endif
2330
2331#ifdef CONFIG_WITH_XARGS
2332/* Create one or more command lines avoiding the max argument
2333 lenght restriction of the host OS.
2334
2335 The last argument is the list of arguments that the normal
2336 xargs command would be fed from stdin.
2337
2338 The first argument is initial command and it's arguments.
2339
2340 If there are three or more arguments, the 2nd argument is
2341 the command and arguments to be used on subsequent
2342 command lines. Defaults to the initial command.
2343
2344 If there are four or more arguments, the 3rd argument is
2345 the command to be used at the final command line. Defaults
2346 to the sub sequent or initial command .
2347
2348 A future version of this function may define more arguments
2349 and therefor anyone specifying six or more arguments will
2350 cause fatal errors.
2351
2352 Typical usage is:
2353 $(xargs ar cas mylib.a,$(objects))
2354 or
2355 $(xargs ar cas mylib.a,ar as mylib.a,$(objects))
2356
2357 It will then create one or more "ar mylib.a ..." command
2358 lines with proper \n\t separation so it can be used when
2359 writing rules. */
2360static char *
2361func_xargs (char *o, char **argv, const char *funcname UNUSED)
2362{
2363 int argc;
2364 const char *initial_cmd;
2365 size_t initial_cmd_len;
2366 const char *subsequent_cmd;
2367 size_t subsequent_cmd_len;
2368 const char *final_cmd;
2369 size_t final_cmd_len;
2370 const char *args;
2371 size_t max_args;
2372 int i;
2373
2374#ifdef ARG_MAX
2375 /* ARG_MAX is a bit unreliable (environment), so drop 25% of the max. */
2376# define XARGS_MAX (ARG_MAX - (ARG_MAX / 4))
2377#else /* FIXME: update configure with a command line length test. */
2378# define XARGS_MAX 10240
2379#endif
2380
2381 argc = 0;
2382 while (argv[argc])
2383 argc++;
2384 if (argc > 4)
2385 fatal (NILF, _("Too many arguments for $(xargs)!\n"));
2386
2387 /* first: the initial / default command.*/
2388 initial_cmd = argv[0];
2389 while (isspace ((unsigned char)*initial_cmd))
2390 initial_cmd++;
2391 max_args = initial_cmd_len = strlen (initial_cmd);
2392
2393 /* second: the command for the subsequent command lines. defaults to the initial cmd. */
2394 subsequent_cmd = argc > 2 && argv[1][0] != '\0' ? argv[1] : "";
2395 while (isspace ((unsigned char)*subsequent_cmd))
2396 subsequent_cmd++;
2397 if (*subsequent_cmd)
2398 {
2399 subsequent_cmd_len = strlen (subsequent_cmd);
2400 if (subsequent_cmd_len > max_args)
2401 max_args = subsequent_cmd_len;
2402 }
2403 else
2404 {
2405 subsequent_cmd = initial_cmd;
2406 subsequent_cmd_len = initial_cmd_len;
2407 }
2408
2409 /* third: the final command. defaults to the subseq cmd. */
2410 final_cmd = argc > 3 && argv[2][0] != '\0' ? argv[2] : "";
2411 while (isspace ((unsigned char)*final_cmd))
2412 final_cmd++;
2413 if (*final_cmd)
2414 {
2415 final_cmd_len = strlen (final_cmd);
2416 if (final_cmd_len > max_args)
2417 max_args = final_cmd_len;
2418 }
2419 else
2420 {
2421 final_cmd = subsequent_cmd;
2422 final_cmd_len = subsequent_cmd_len;
2423 }
2424
2425 /* last: the arguments to split up into sensible portions. */
2426 args = argv[argc - 1];
2427
2428 /* calc the max argument length. */
2429 if (XARGS_MAX <= max_args + 2)
2430 fatal (NILF, _("$(xargs): the commands are longer than the max exec argument length. (%lu <= %lu)\n"),
2431 (unsigned long)XARGS_MAX, (unsigned long)max_args + 2);
2432 max_args = XARGS_MAX - max_args - 1;
2433
2434 /* generate the commands. */
2435 i = 0;
2436 for (i = 0; ; i++)
2437 {
2438 unsigned int len;
2439 const char *iterator = args;
2440 const char *end = args;
2441 const char *cur;
2442 const char *tmp;
2443
2444 /* scan the arguments till we reach the end or the max length. */
2445 while ((cur = find_next_token(&iterator, &len))
2446 && (size_t)((cur + len) - args) < max_args)
2447 end = cur + len;
2448 if (cur && end == args)
2449 fatal (NILF, _("$(xargs): command + one single arg is too much. giving up.\n"));
2450
2451 /* emit the command. */
2452 if (i == 0)
2453 {
2454 o = variable_buffer_output (o, (char *)initial_cmd, initial_cmd_len);
2455 o = variable_buffer_output (o, " ", 1);
2456 }
2457 else if (cur)
2458 {
2459 o = variable_buffer_output (o, "\n\t", 2);
2460 o = variable_buffer_output (o, (char *)subsequent_cmd, subsequent_cmd_len);
2461 o = variable_buffer_output (o, " ", 1);
2462 }
2463 else
2464 {
2465 o = variable_buffer_output (o, "\n\t", 2);
2466 o = variable_buffer_output (o, (char *)final_cmd, final_cmd_len);
2467 o = variable_buffer_output (o, " ", 1);
2468 }
2469
2470 tmp = end;
2471 while (tmp > args && isspace ((unsigned char)tmp[-1])) /* drop trailing spaces. */
2472 tmp--;
2473 o = variable_buffer_output (o, (char *)args, tmp - args);
2474
2475
2476 /* next */
2477 if (!cur)
2478 break;
2479 args = end;
2480 while (isspace ((unsigned char)*args))
2481 args++;
2482 }
2483
2484 return o;
2485}
2486#endif
2487
2488#ifdef CONFIG_WITH_TOUPPER_TOLOWER
2489static char *
2490func_toupper_tolower (char *o, char **argv, const char *funcname)
2491{
2492 /* Expand the argument. */
2493 const char *p = argv[0];
2494 while (*p)
2495 {
2496 /* convert to temporary buffer */
2497 char tmp[256];
2498 unsigned int i;
2499 if (!strcmp(funcname, "toupper"))
2500 for (i = 0; i < sizeof(tmp) && *p; i++, p++)
2501 tmp[i] = toupper(*p);
2502 else
2503 for (i = 0; i < sizeof(tmp) && *p; i++, p++)
2504 tmp[i] = tolower(*p);
2505 o = variable_buffer_output (o, tmp, i);
2506 }
2507
2508 return o;
2509}
2510#endif /* CONFIG_WITH_TOUPPER_TOLOWER */
2511
2512#if defined(CONFIG_WITH_VALUE_LENGTH) && defined(CONFIG_WITH_COMPARE)
2513
2514/* Strip leading spaces and other things off a command. */
2515static const char *
2516comp_cmds_strip_leading (const char *s, const char *e)
2517{
2518 while (s < e)
2519 {
2520 const char ch = *s;
2521 if (!isblank (ch)
2522 && ch != '@'
2523#ifdef CONFIG_WITH_COMMANDS_FUNC
2524 && ch != '%'
2525#endif
2526 && ch != '+'
2527 && ch != '-')
2528 break;
2529 s++;
2530 }
2531 return s;
2532}
2533
2534/* Worker for func_comp_vars() which is called if the comparision failed.
2535 It will do the slow command by command comparision of the commands
2536 when there invoked as comp-cmds. */
2537static char *
2538comp_vars_ne (char *o, const char *s1, const char *e1, const char *s2, const char *e2,
2539 char *ne_retval, const char *funcname)
2540{
2541 /* give up at once if not comp-cmds or comp-cmds-ex. */
2542 if (strcmp (funcname, "comp-cmds") != 0
2543 && strcmp (funcname, "comp-cmds-ex") != 0)
2544 o = variable_buffer_output (o, ne_retval, strlen (ne_retval));
2545 else
2546 {
2547 const char * const s1_start = s1;
2548 int new_cmd = 1;
2549 int diff;
2550 for (;;)
2551 {
2552 /* if it's a new command, strip leading stuff. */
2553 if (new_cmd)
2554 {
2555 s1 = comp_cmds_strip_leading (s1, e1);
2556 s2 = comp_cmds_strip_leading (s2, e2);
2557 new_cmd = 0;
2558 }
2559 if (s1 >= e1 || s2 >= e2)
2560 break;
2561
2562 /*
2563 * Inner compare loop which compares one line.
2564 * FIXME: parse quoting!
2565 */
2566 for (;;)
2567 {
2568 const char ch1 = *s1;
2569 const char ch2 = *s2;
2570 diff = ch1 - ch2;
2571 if (diff)
2572 break;
2573 if (ch1 == '\n')
2574 break;
2575 assert (ch1 != '\r');
2576
2577 /* next */
2578 s1++;
2579 s2++;
2580 if (s1 >= e1 || s2 >= e2)
2581 break;
2582 }
2583
2584 /*
2585 * If we exited because of a difference try to end-of-command
2586 * comparision, e.g. ignore trailing spaces.
2587 */
2588 if (diff)
2589 {
2590 /* strip */
2591 while (s1 < e1 && isblank (*s1))
2592 s1++;
2593 while (s2 < e2 && isblank (*s2))
2594 s2++;
2595 if (s1 >= e1 || s2 >= e2)
2596 break;
2597
2598 /* compare again and check that it's a newline. */
2599 if (*s2 != '\n' || *s1 != '\n')
2600 break;
2601 }
2602 /* Break out if we exited because of EOS. */
2603 else if (s1 >= e1 || s2 >= e2)
2604 break;
2605
2606 /*
2607 * Detect the end of command lines.
2608 */
2609 if (*s1 == '\n')
2610 new_cmd = s1 == s1_start || s1[-1] != '\\';
2611 s1++;
2612 s2++;
2613 }
2614
2615 /*
2616 * Ignore trailing empty lines.
2617 */
2618 if (s1 < e1 || s2 < e2)
2619 {
2620 while (s1 < e1 && (isblank (*s1) || *s1 == '\n'))
2621 if (*s1++ == '\n')
2622 s1 = comp_cmds_strip_leading (s1, e1);
2623 while (s2 < e2 && (isblank (*s2) || *s2 == '\n'))
2624 if (*s2++ == '\n')
2625 s2 = comp_cmds_strip_leading (s2, e2);
2626 }
2627
2628 /* emit the result. */
2629 if (s1 == e1 && s2 == e2)
2630 o = variable_buffer_output (o, "", 1);
2631 else
2632 o = variable_buffer_output (o, ne_retval, strlen (ne_retval));
2633 }
2634 return o;
2635}
2636
2637/*
2638 $(comp-vars var1,var2,not-equal-return)
2639 or
2640 $(comp-cmds cmd-var1,cmd-var2,not-equal-return)
2641
2642 Compares the two variables (that's given by name to avoid unnecessary
2643 expanding) and return the string in the third argument if not equal.
2644 If equal, nothing is returned.
2645
2646 comp-vars will to an exact comparision only stripping leading and
2647 trailing spaces.
2648
2649 comp-cmds will compare command by command, ignoring not only leading
2650 and trailing spaces on each line but also leading one leading '@',
2651 '-', '+' and '%'
2652*/
2653static char *
2654func_comp_vars (char *o, char **argv, const char *funcname)
2655{
2656 const char *s1, *e1, *x1, *s2, *e2, *x2;
2657 char *a1 = NULL, *a2 = NULL;
2658 size_t l, l1, l2;
2659 struct variable *var1 = lookup_variable (argv[0], strlen (argv[0]));
2660 struct variable *var2 = lookup_variable (argv[1], strlen (argv[1]));
2661
2662 /* the simple cases */
2663 if (var1 == var2)
2664 return variable_buffer_output (o, "", 0); /* eq */
2665 if (!var1 || !var2)
2666 return variable_buffer_output (o, argv[2], strlen(argv[2]));
2667 if (var1->value == var2->value)
2668 return variable_buffer_output (o, "", 0); /* eq */
2669 if (!var1->recursive && !var2->recursive)
2670 {
2671 if ( var1->value_length == var2->value_length
2672 && !memcmp (var1->value, var2->value, var1->value_length))
2673 return variable_buffer_output (o, "", 0); /* eq */
2674
2675 /* ignore trailing and leading blanks */
2676 s1 = var1->value;
2677 e1 = s1 + var1->value_length;
2678 while (isblank ((unsigned char) *s1))
2679 s1++;
2680 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2681 e1--;
2682
2683 s2 = var2->value;
2684 e2 = s2 + var2->value_length;
2685 while (isblank ((unsigned char) *s2))
2686 s2++;
2687 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2688 e2--;
2689
2690 if (e1 - s1 != e2 - s2)
2691 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2692l_simple_compare:
2693 if (!memcmp (s1, s2, e1 - s1))
2694 return variable_buffer_output (o, "", 0); /* eq */
2695 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2696 }
2697
2698 /* ignore trailing and leading blanks */
2699 s1 = var1->value;
2700 e1 = s1 + var1->value_length;
2701 while (isblank ((unsigned char) *s1))
2702 s1++;
2703 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2704 e1--;
2705
2706 s2 = var2->value;
2707 e2 = s2 + var2->value_length;
2708 while (isblank((unsigned char)*s2))
2709 s2++;
2710 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2711 e2--;
2712
2713 /* both empty after stripping? */
2714 if (s1 == e1 && s2 == e2)
2715 return variable_buffer_output (o, "", 0); /* eq */
2716
2717 /* optimist. */
2718 if ( e1 - s1 == e2 - s2
2719 && !memcmp(s1, s2, e1 - s1))
2720 return variable_buffer_output (o, "", 0); /* eq */
2721
2722 /* compare up to the first '$' or the end. */
2723 x1 = var1->recursive ? memchr (s1, '$', e1 - s1) : NULL;
2724 x2 = var2->recursive ? memchr (s2, '$', e2 - s2) : NULL;
2725 if (!x1 && !x2)
2726 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2727
2728 l1 = x1 ? x1 - s1 : e1 - s1;
2729 l2 = x2 ? x2 - s2 : e2 - s2;
2730 l = l1 <= l2 ? l1 : l2;
2731 if (l && memcmp (s1, s2, l))
2732 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2733
2734 /* one or both buffers now require expanding. */
2735 if (!x1)
2736 s1 += l;
2737 else
2738 {
2739 s1 = a1 = allocated_variable_expand ((char *)s1 + l);
2740 if (!l)
2741 while (isblank ((unsigned char) *s1))
2742 s1++;
2743 e1 = strchr (s1, '\0');
2744 while (e1 > s1 && isblank ((unsigned char) e1[-1]))
2745 e1--;
2746 }
2747
2748 if (!x2)
2749 s2 += l;
2750 else
2751 {
2752 s2 = a2 = allocated_variable_expand ((char *)s2 + l);
2753 if (!l)
2754 while (isblank ((unsigned char) *s2))
2755 s2++;
2756 e2 = strchr (s2, '\0');
2757 while (e2 > s2 && isblank ((unsigned char) e2[-1]))
2758 e2--;
2759 }
2760
2761 /* the final compare */
2762 if ( e1 - s1 != e2 - s2
2763 || memcmp (s1, s2, e1 - s1))
2764 o = comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2765 else
2766 o = variable_buffer_output (o, "", 1); /* eq */
2767 if (a1)
2768 free (a1);
2769 if (a2)
2770 free (a2);
2771 return o;
2772}
2773
2774/*
2775 $(comp-cmds-ex cmds1,cmds2,not-equal-return)
2776
2777 Compares the two strings and return the string in the third argument
2778 if not equal. If equal, nothing is returned.
2779
2780 The comparision will be performed command by command, ignoring not
2781 only leading and trailing spaces on each line but also leading one
2782 leading '@', '-', '+' and '%'.
2783*/
2784static char *
2785func_comp_cmds_ex (char *o, char **argv, const char *funcname)
2786{
2787 const char *s1, *e1, *s2, *e2;
2788 size_t l, l1, l2;
2789
2790 /* the simple cases */
2791 s1 = argv[0];
2792 s2 = argv[1];
2793 if (s1 == s2)
2794 return variable_buffer_output (o, "", 0); /* eq */
2795 l1 = strlen (argv[0]);
2796 l2 = strlen (argv[1]);
2797
2798 if ( l1 == l2
2799 && !memcmp (s1, s2, l1))
2800 return variable_buffer_output (o, "", 0); /* eq */
2801
2802 /* ignore trailing and leading blanks */
2803 e1 = s1 + l1;
2804 s1 = comp_cmds_strip_leading (s1, e1);
2805
2806 e2 = s2 + l2;
2807 s2 = comp_cmds_strip_leading (s2, e2);
2808
2809 if (e1 - s1 != e2 - s2)
2810 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2811 if (!memcmp (s1, s2, e1 - s1))
2812 return variable_buffer_output (o, "", 0); /* eq */
2813 return comp_vars_ne (o, s1, e1, s2, e2, argv[2], funcname);
2814}
2815#endif
2816
2817#ifdef CONFIG_WITH_DATE
2818# if defined (_MSC_VER) /* FIXME: !defined (HAVE_STRPTIME) */
2819char *strptime(const char *s, const char *format, struct tm *tm)
2820{
2821 return (char *)"strptime is not implemented";
2822}
2823# endif
2824/* Check if the string is all blanks or not. */
2825static int
2826all_blanks (const char *s)
2827{
2828 if (!s)
2829 return 1;
2830 while (isspace ((unsigned char)*s))
2831 s++;
2832 return *s == '\0';
2833}
2834
2835/* The first argument is the strftime format string, a iso
2836 timestamp is the default if nothing is given.
2837
2838 The second argument is a time value if given. The format
2839 is either the format from the first argument or given as
2840 an additional third argument. */
2841static char *
2842func_date (char *o, char **argv, const char *funcname)
2843{
2844 char *p;
2845 char *buf;
2846 size_t buf_size;
2847 struct tm t;
2848 const char *format;
2849
2850 /* determin the format - use a single word as the default. */
2851 format = !strcmp (funcname, "date-utc")
2852 ? "%Y-%m-%dT%H:%M:%SZ"
2853 : "%Y-%m-%dT%H:%M:%S";
2854 if (!all_blanks (argv[0]))
2855 format = argv[0];
2856
2857 /* get the time. */
2858 memset (&t, 0, sizeof(t));
2859 if (argv[0] && !all_blanks (argv[1]))
2860 {
2861 const char *input_format = !all_blanks (argv[2]) ? argv[2] : format;
2862 p = strptime (argv[1], input_format, &t);
2863 if (!p || *p != '\0')
2864 {
2865 error (NILF, _("$(%s): strptime(%s,%s,) -> %s\n"), funcname,
2866 argv[1], input_format, p ? p : "<null>");
2867 return variable_buffer_output (o, "", 0);
2868 }
2869 }
2870 else
2871 {
2872 time_t tval;
2873 time (&tval);
2874 if (!strcmp (funcname, "date-utc"))
2875 t = *gmtime (&tval);
2876 else
2877 t = *localtime (&tval);
2878 }
2879
2880 /* format it. note that zero isn't necessarily an error, so we'll
2881 have to keep shut about failures. */
2882 buf_size = 64;
2883 buf = xmalloc (buf_size);
2884 while (strftime (buf, buf_size, format, &t) == 0)
2885 {
2886 if (buf_size >= 4096)
2887 {
2888 *buf = '\0';
2889 break;
2890 }
2891 buf = xrealloc (buf, buf_size <<= 1);
2892 }
2893 o = variable_buffer_output (o, buf, strlen (buf));
2894 free (buf);
2895 return o;
2896}
2897#endif
2898
2899#ifdef CONFIG_WITH_FILE_SIZE
2900/* Prints the size of the specified file. Only one file is
2901 permitted, notthing is stripped. -1 is returned if stat
2902 fails. */
2903static char *
2904func_file_size (char *o, char **argv, const char *funcname UNUSED)
2905{
2906 struct stat st;
2907 if (stat (argv[0], &st))
2908 return variable_buffer_output (o, "-1", 2);
2909 return math_int_to_variable_buffer (o, st.st_size);
2910}
2911#endif
2912
2913#ifdef CONFIG_WITH_WHICH
2914/* Checks if the specified file exists an is executable.
2915 On systems employing executable extensions, the name may
2916 be modified to include the extension. */
2917static int func_which_test_x (char *file)
2918{
2919 struct stat st;
2920# if defined(WINDOWS32) || defined(__OS2__)
2921 char *ext;
2922 char *slash;
2923
2924 /* fix slashes first. */
2925 slash = file;
2926 while ((slash = strchr (slash, '\\')) != NULL)
2927 *slash++ = '/';
2928
2929 /* straight */
2930 if (stat (file, &st) == 0
2931 && S_ISREG (st.st_mode))
2932 return 1;
2933
2934 /* don't try add an extension if there already is one */
2935 ext = strchr (file, '\0');
2936 if (ext - file >= 4
2937 && ( !stricmp (ext - 4, ".exe")
2938 || !stricmp (ext - 4, ".cmd")
2939 || !stricmp (ext - 4, ".bat")
2940 || !stricmp (ext - 4, ".com")))
2941 return 0;
2942
2943 /* try the extensions. */
2944 strcpy (ext, ".exe");
2945 if (stat (file, &st) == 0
2946 && S_ISREG (st.st_mode))
2947 return 1;
2948
2949 strcpy (ext, ".cmd");
2950 if (stat (file, &st) == 0
2951 && S_ISREG (st.st_mode))
2952 return 1;
2953
2954 strcpy (ext, ".bat");
2955 if (stat (file, &st) == 0
2956 && S_ISREG (st.st_mode))
2957 return 1;
2958
2959 strcpy (ext, ".com");
2960 if (stat (file, &st) == 0
2961 && S_ISREG (st.st_mode))
2962 return 1;
2963
2964 return 0;
2965
2966# else
2967
2968 return access (file, X_OK) == 0
2969 && stat (file, &st) == 0
2970 && S_ISREG (st.st_mode);
2971# endif
2972}
2973
2974/* Searches for the specified programs in the PATH and print
2975 their full location if found. Prints nothing if not found. */
2976static char *
2977func_which (char *o, char **argv, const char *funcname UNUSED)
2978{
2979 const char *path;
2980 struct variable *path_var;
2981 unsigned i;
2982 PATH_VAR (buf);
2983
2984 path_var = lookup_variable ("PATH", 4);
2985 if (path_var)
2986 path = path_var->value;
2987 else
2988 path = ".";
2989
2990 /* iterate input */
2991 for (i = 0; argv[i]; i++)
2992 {
2993 unsigned int len;
2994 const char *iterator = argv[i];
2995 char *cur;
2996
2997 while ((cur = find_next_token (&iterator, &len)))
2998 {
2999 /* if there is a separator, don't walk the path. */
3000 if (memchr (cur, '/', len)
3001#ifdef HAVE_DOS_PATHS
3002 || memchr (cur, '\\', len)
3003 || memchr (cur, ':', len)
3004#endif
3005 )
3006 {
3007 if (len + 1 + 4 < GET_PATH_MAX) /* +4 for .exe */
3008 {
3009 memcpy (buf, cur, len);
3010 buf[len] = '\0';
3011 if (func_which_test_x (buf))
3012 o = variable_buffer_output (o, buf, strlen (buf));
3013 }
3014 }
3015 else
3016 {
3017 const char *comp = path;
3018 for (;;)
3019 {
3020 const char *src = comp;
3021 const char *end = strchr (comp, PATH_SEPARATOR_CHAR);
3022 size_t comp_len = end ? end - comp : strlen (comp);
3023 if (!comp_len)
3024 {
3025 comp_len = 1;
3026 src = ".";
3027 }
3028 if (len + comp_len + 2 + 4 < GET_PATH_MAX) /* +4 for .exe */
3029 {
3030 memcpy (buf, comp, comp_len);
3031 buf [comp_len] = '/';
3032 memcpy (&buf[comp_len + 1], cur, len);
3033 buf[comp_len + 1 + len] = '\0';
3034
3035 if (func_which_test_x (buf))
3036 {
3037 o = variable_buffer_output (o, buf, strlen (buf));
3038 break;
3039 }
3040 }
3041
3042 /* next */
3043 if (!end)
3044 break;
3045 comp = end + 1;
3046 }
3047 }
3048 }
3049 }
3050
3051 return variable_buffer_output (o, "", 0);
3052}
3053#endif
3054
3055#ifdef CONFIG_WITH_STACK
3056
3057/* Push an item (string without spaces). */
3058static char *
3059func_stack_push (char *o, char **argv, const char *funcname UNUSED)
3060{
3061 do_variable_definition(NILF, argv[0], argv[1], o_file, f_append, 0 /* !target_var */);
3062 return o;
3063}
3064
3065/* Pops an item off the stack / get the top stack element.
3066 (This is what's tricky to do in pure GNU make syntax.) */
3067static char *
3068func_stack_pop_top (char *o, char **argv, const char *funcname)
3069{
3070 struct variable *stack_var;
3071 const char *stack = argv[0];
3072 const int return_item = argv[0][sizeof("stack-pop") - 1] == '\0';
3073
3074 stack_var = lookup_variable (stack, strlen (stack) );
3075 if (stack_var)
3076 {
3077 unsigned int len;
3078 const char *iterator = stack_var->value;
3079 char *lastitem = NULL;
3080 char *cur;
3081
3082 while ((cur = find_next_token (&iterator, &len)))
3083 lastitem = cur;
3084
3085 if (lastitem != NULL)
3086 {
3087 if (strcmp (funcname, "stack-popv") != 0)
3088 o = variable_buffer_output (o, lastitem, len);
3089 if (strcmp (funcname, "stack-top") != 0)
3090 {
3091 *lastitem = '\0';
3092 while (lastitem > stack_var->value && isspace (lastitem[-1]))
3093 *--lastitem = '\0';
3094#ifdef CONFIG_WITH_VALUE_LENGTH
3095 stack_var->value_length = lastitem - stack_var->value;
3096#endif
3097 }
3098 }
3099 }
3100 return o;
3101}
3102#endif /* CONFIG_WITH_STACK */
3103
3104#if defined (CONFIG_WITH_MATH) || defined (CONFIG_WITH_NANOTS) || defined (CONFIG_WITH_FILE_SIZE)
3105/* outputs the number (as a string) into the variable buffer. */
3106static char *
3107math_int_to_variable_buffer (char *o, math_int num)
3108{
3109 static const char xdigits[17] = "0123456789abcdef";
3110 int negative;
3111 char strbuf[24]; /* 16 hex + 2 prefix + sign + term => 20
3112 or 20 dec + sign + term => 22 */
3113 char *str = &strbuf[sizeof (strbuf) - 1];
3114
3115 negative = num < 0;
3116 if (negative)
3117 num = -num;
3118
3119 *str = '\0';
3120
3121 do
3122 {
3123#ifdef HEX_MATH_NUMBERS
3124 *--str = xdigits[num & 0xf];
3125 num >>= 4;
3126#else
3127 *--str = xdigits[num % 10];
3128 num /= 10;
3129#endif
3130 }
3131 while (num);
3132
3133#ifdef HEX_MATH_NUMBERS
3134 *--str = 'x';
3135 *--str = '0';
3136#endif
3137
3138 if (negative)
3139 *--str = '-';
3140
3141 return variable_buffer_output (o, str, &strbuf[sizeof (strbuf) - 1] - str);
3142}
3143#endif /* CONFIG_WITH_MATH || CONFIG_WITH_NANOTS */
3144
3145#ifdef CONFIG_WITH_MATH
3146
3147/* Converts a string to an integer, causes an error if the format is invalid. */
3148static math_int
3149math_int_from_string (const char *str)
3150{
3151 const char *start;
3152 unsigned base = 0;
3153 int negative = 0;
3154 math_int num = 0;
3155
3156 /* strip spaces */
3157 while (isspace (*str))
3158 str++;
3159 if (!*str)
3160 {
3161 error (NILF, _("bad number: empty\n"));
3162 return 0;
3163 }
3164 start = str;
3165
3166 /* check for +/- */
3167 while (*str == '+' || *str == '-' || isspace (*str))
3168 if (*str++ == '-')
3169 negative = !negative;
3170
3171 /* check for prefix - we do not accept octal numbers, sorry. */
3172 if (*str == '0' && (str[1] == 'x' || str[1] == 'X'))
3173 {
3174 base = 16;
3175 str += 2;
3176 }
3177 else
3178 {
3179 /* look for a hex digit, if not found treat it as decimal */
3180 const char *p2 = str;
3181 for ( ; *p2; p2++)
3182 if (isxdigit (*p2) && !isdigit (*p2) && isascii (*p2) )
3183 {
3184 base = 16;
3185 break;
3186 }
3187 if (base == 0)
3188 base = 10;
3189 }
3190
3191 /* must have at least one digit! */
3192 if ( !isascii (*str)
3193 || !(base == 16 ? isxdigit (*str) : isdigit (*str)) )
3194 {
3195 error (NILF, _("bad number: '%s'\n"), start);
3196 return 0;
3197 }
3198
3199 /* convert it! */
3200 while (*str && !isspace (*str))
3201 {
3202 int ch = *str++;
3203 if (ch >= '0' && ch <= '9')
3204 ch -= '0';
3205 else if (base == 16 && ch >= 'a' && ch <= 'f')
3206 ch -= 'a' - 10;
3207 else if (base == 16 && ch >= 'A' && ch <= 'F')
3208 ch -= 'A' - 10;
3209 else
3210 {
3211 error (NILF, _("bad number: '%s' (base=%d, pos=%d)\n"), start, base, str - start);
3212 return 0;
3213 }
3214 num *= base;
3215 num += ch;
3216 }
3217
3218 /* check trailing spaces. */
3219 while (isspace (*str))
3220 str++;
3221 if (*str)
3222 {
3223 error (NILF, _("bad number: '%s'\n"), start);
3224 return 0;
3225 }
3226
3227 return negative ? -num : num;
3228}
3229
3230/* Add two or more integer numbers. */
3231static char *
3232func_int_add (char *o, char **argv, const char *funcname UNUSED)
3233{
3234 math_int num;
3235 int i;
3236
3237 num = math_int_from_string (argv[0]);
3238 for (i = 1; argv[i]; i++)
3239 num += math_int_from_string (argv[i]);
3240
3241 return math_int_to_variable_buffer (o, num);
3242}
3243
3244/* Subtract two or more integer numbers. */
3245static char *
3246func_int_sub (char *o, char **argv, const char *funcname UNUSED)
3247{
3248 math_int num;
3249 int i;
3250
3251 num = math_int_from_string (argv[0]);
3252 for (i = 1; argv[i]; i++)
3253 num -= math_int_from_string (argv[i]);
3254
3255 return math_int_to_variable_buffer (o, num);
3256}
3257
3258/* Multiply two or more integer numbers. */
3259static char *
3260func_int_mul (char *o, char **argv, const char *funcname UNUSED)
3261{
3262 math_int num;
3263 int i;
3264
3265 num = math_int_from_string (argv[0]);
3266 for (i = 1; argv[i]; i++)
3267 num *= math_int_from_string (argv[i]);
3268
3269 return math_int_to_variable_buffer (o, num);
3270}
3271
3272/* Divide an integer number by one or more divisors. */
3273static char *
3274func_int_div (char *o, char **argv, const char *funcname UNUSED)
3275{
3276 math_int num;
3277 math_int divisor;
3278 int i;
3279
3280 num = math_int_from_string (argv[0]);
3281 for (i = 1; argv[i]; i++)
3282 {
3283 divisor = math_int_from_string (argv[i]);
3284 if (!divisor)
3285 {
3286 error (NILF, _("divide by zero ('%s')\n"), argv[i]);
3287 return math_int_to_variable_buffer (o, 0);
3288 }
3289 num /= divisor;
3290 }
3291
3292 return math_int_to_variable_buffer (o, num);
3293}
3294
3295
3296/* Divide and return the remainder. */
3297static char *
3298func_int_mod (char *o, char **argv, const char *funcname UNUSED)
3299{
3300 math_int num;
3301 math_int divisor;
3302
3303 num = math_int_from_string (argv[0]);
3304 divisor = math_int_from_string (argv[1]);
3305 if (!divisor)
3306 {
3307 error (NILF, _("divide by zero ('%s')\n"), argv[1]);
3308 return math_int_to_variable_buffer (o, 0);
3309 }
3310 num %= divisor;
3311
3312 return math_int_to_variable_buffer (o, num);
3313}
3314
3315/* 2-complement. */
3316static char *
3317func_int_not (char *o, char **argv, const char *funcname UNUSED)
3318{
3319 math_int num;
3320
3321 num = math_int_from_string (argv[0]);
3322 num = ~num;
3323
3324 return math_int_to_variable_buffer (o, num);
3325}
3326
3327/* Bitwise AND (two or more numbers). */
3328static char *
3329func_int_and (char *o, char **argv, const char *funcname UNUSED)
3330{
3331 math_int num;
3332 int i;
3333
3334 num = math_int_from_string (argv[0]);
3335 for (i = 1; argv[i]; i++)
3336 num &= math_int_from_string (argv[i]);
3337
3338 return math_int_to_variable_buffer (o, num);
3339}
3340
3341/* Bitwise OR (two or more numbers). */
3342static char *
3343func_int_or (char *o, char **argv, const char *funcname UNUSED)
3344{
3345 math_int num;
3346 int i;
3347
3348 num = math_int_from_string (argv[0]);
3349 for (i = 1; argv[i]; i++)
3350 num |= math_int_from_string (argv[i]);
3351
3352 return math_int_to_variable_buffer (o, num);
3353}
3354
3355/* Bitwise XOR (two or more numbers). */
3356static char *
3357func_int_xor (char *o, char **argv, const char *funcname UNUSED)
3358{
3359 math_int num;
3360 int i;
3361
3362 num = math_int_from_string (argv[0]);
3363 for (i = 1; argv[i]; i++)
3364 num ^= math_int_from_string (argv[i]);
3365
3366 return math_int_to_variable_buffer (o, num);
3367}
3368
3369/* Compare two integer numbers. Returns make boolean (true="1"; false=""). */
3370static char *
3371func_int_cmp (char *o, char **argv, const char *funcname)
3372{
3373 math_int num1;
3374 math_int num2;
3375 int rc;
3376
3377 num1 = math_int_from_string (argv[0]);
3378 num2 = math_int_from_string (argv[1]);
3379
3380 funcname += sizeof ("int-") - 1;
3381 if (!strcmp (funcname, "eq"))
3382 rc = num1 == num2;
3383 else if (!strcmp (funcname, "ne"))
3384 rc = num1 != num2;
3385 else if (!strcmp (funcname, "gt"))
3386 rc = num1 > num2;
3387 else if (!strcmp (funcname, "ge"))
3388 rc = num1 >= num2;
3389 else if (!strcmp (funcname, "lt"))
3390 rc = num1 < num2;
3391 else /*if (!strcmp (funcname, "le"))*/
3392 rc = num1 <= num2;
3393
3394 return variable_buffer_output (o, rc ? "1" : "", rc);
3395}
3396
3397#endif /* CONFIG_WITH_MATH */
3398
3399#ifdef CONFIG_WITH_NANOTS
3400/* Returns the current timestamp as nano seconds. The time
3401 source is a high res monotone one if the platform provides
3402 this (and we know about it).
3403
3404 Tip. Use this with int-sub to profile makefile reading
3405 and similar. */
3406static char *
3407func_nanots (char *o, char **argv, const char *funcname)
3408{
3409 math_int ts;
3410
3411#if defined (WINDOWS32)
3412 static int s_state = -1;
3413 static LARGE_INTEGER s_freq;
3414
3415 if (s_state == -1)
3416 s_state = QueryPerformanceFrequency (&s_freq);
3417 if (s_state)
3418 {
3419 LARGE_INTEGER pc;
3420 if (!QueryPerformanceCounter (&pc))
3421 {
3422 s_state = 0;
3423 return func_nanots (o, argv, funcname);
3424 }
3425 ts = (math_int)((long double)pc.QuadPart / (long double)s_freq.QuadPart * 1000000000);
3426 }
3427 else
3428 {
3429 /* fall back to low resolution system time. */
3430 LARGE_INTEGER bigint;
3431 FILETIME ft = {0,0};
3432 GetSystemTimeAsFileTime (&ft);
3433 bigint.u.LowPart = ft.dwLowDateTime;
3434 bigint.u.HighPart = ft.dwLowDateTime;
3435 ts = bigint.QuadPart * 100;
3436 }
3437
3438/* FIXME: Linux and others have the realtime clock_* api, detect and use it. */
3439
3440#elif HAVE_GETTIMEOFDAY
3441 struct timeval tv;
3442 if (!gettimeofday (&tv, NULL))
3443 ts = (math_int)tv.tv_sec * 1000000000
3444 + tv.tv_usec * 1000;
3445 else
3446 {
3447 error (NILF, _("$(nanots): gettimeofday failed"));
3448 ts = 0;
3449 }
3450
3451#else
3452# error "PORTME"
3453#endif
3454
3455 return math_int_to_variable_buffer (o, ts);
3456}
3457#endif
3458
3459#ifdef CONFIG_WITH_OS2_LIBPATH
3460/* Sets or gets the OS/2 libpath variables.
3461
3462 The first argument indicates which variable - BEGINLIBPATH,
3463 ENDLIBPATH, LIBPATHSTRICT or LIBPATH.
3464
3465 The second indicates whether this is a get (not present) or
3466 set (present) operation. When present it is the new value for
3467 the variable. */
3468static char *
3469func_os2_libpath (char *o, char **argv, const char *funcname UNUSED)
3470{
3471 char buf[4096];
3472 ULONG fVar;
3473 APIRET rc;
3474
3475 /* translate variable name (first arg) */
3476 if (!strcmp (argv[0], "BEGINLIBPATH"))
3477 fVar = BEGIN_LIBPATH;
3478 else if (!strcmp (argv[0], "ENDLIBPATH"))
3479 fVar = END_LIBPATH;
3480 else if (!strcmp (argv[0], "LIBPATHSTRICT"))
3481 fVar = LIBPATHSTRICT;
3482 else if (!strcmp (argv[0], "LIBPATH"))
3483 fVar = 0;
3484 else
3485 {
3486 error (NILF, _("$(libpath): unknown variable `%s'"), argv[0]);
3487 return variable_buffer_output (o, "", 0);
3488 }
3489
3490 if (!argv[1])
3491 {
3492 /* get the variable value. */
3493 if (fVar != 0)
3494 {
3495 buf[0] = buf[1] = buf[2] = buf[3] = '\0';
3496 rc = DosQueryExtLIBPATH (buf, fVar);
3497 }
3498 else
3499 rc = DosQueryHeaderInfo (NULLHANDLE, 0, buf, sizeof(buf), QHINF_LIBPATH);
3500 if (rc != NO_ERROR)
3501 {
3502 error (NILF, _("$(libpath): failed to query `%s', rc=%d"), argv[0], rc);
3503 return variable_buffer_output (o, "", 0);
3504 }
3505 o = variable_buffer_output (o, buf, strlen (buf));
3506 }
3507 else
3508 {
3509 /* set the variable value. */
3510 size_t len;
3511 size_t len_max = sizeof (buf) < 2048 ? sizeof (buf) : 2048;
3512 const char *val;
3513 const char *end;
3514
3515 if (fVar == 0)
3516 {
3517 error (NILF, _("$(libpath): LIBPATH is read-only"));
3518 return variable_buffer_output (o, "", 0);
3519 }
3520
3521 /* strip leading and trailing spaces and check for max length. */
3522 val = argv[1];
3523 while (isspace (*val))
3524 val++;
3525 end = strchr (val, '\0');
3526 while (end > val && isspace (end[-1]))
3527 end--;
3528
3529 len = end - val;
3530 if (len >= len_max)
3531 {
3532 error (NILF, _("$(libpath): The new `%s' value is too long (%d bytes, max %d)"),
3533 argv[0], len, len_max);
3534 return variable_buffer_output (o, "", 0);
3535 }
3536
3537 /* make a stripped copy in low memory and try set it. */
3538 memcpy (buf, val, len);
3539 buf[len] = '\0';
3540 rc = DosSetExtLIBPATH (buf, fVar);
3541 if (rc != NO_ERROR)
3542 {
3543 error (NILF, _("$(libpath): failed to set `%s' to `%s', rc=%d"), argv[0], buf, rc);
3544 return variable_buffer_output (o, "", 0);
3545 }
3546
3547 o = variable_buffer_output (o, "", 0);
3548 }
3549 return o;
3550}
3551#endif /* CONFIG_WITH_OS2_LIBPATH */
3552
3553#ifdef CONFIG_WITH_MAKE_STATS
3554/* Retrieve make statistics. */
3555static char *
3556func_make_stats (char *o, char **argv, const char *funcname UNUSED)
3557{
3558 char buf[512];
3559 int len;
3560
3561 if (!argv[0] || (!argv[0][0] && !argv[1]))
3562 {
3563 len = sprintf (buf, "alloc-cur: %5lu %6luKB (/%3luMB) hash: %5lu %2lu%%",
3564 make_stats_allocations,
3565 make_stats_allocated / 1024,
3566 make_stats_allocated_sum / (1024*1024),
3567 make_stats_ht_lookups,
3568 (make_stats_ht_collisions * 100) / make_stats_ht_lookups);
3569 o = variable_buffer_output (o, buf, len);
3570 }
3571 else
3572 {
3573 /* selective */
3574 int i;
3575 for (i = 0; argv[i]; i++)
3576 {
3577 unsigned long val;
3578 if (i != 0)
3579 o = variable_buffer_output (o, " ", 1);
3580 if (!strcmp(argv[i], "allocations"))
3581 val = make_stats_allocations;
3582 else if (!strcmp(argv[i], "allocated"))
3583 val = make_stats_allocated;
3584 else if (!strcmp(argv[i], "allocated_sum"))
3585 val = make_stats_allocated_sum;
3586 else if (!strcmp(argv[i], "ht_lookups"))
3587 val = make_stats_ht_lookups;
3588 else if (!strcmp(argv[i], "ht_collisions"))
3589 val = make_stats_ht_collisions;
3590 else if (!strcmp(argv[i], "ht_collisions_pct"))
3591 val = (make_stats_ht_collisions * 100) / make_stats_ht_lookups;
3592 else
3593 {
3594 o = variable_buffer_output (o, argv[i], strlen (argv[i]));
3595 continue;
3596 }
3597
3598 len = sprintf (buf, "%ld", val);
3599 o = variable_buffer_output (o, buf, len);
3600 }
3601 }
3602 return o;
3603}
3604#endif /* CONFIG_WITH_MAKE_STATS */
3605
3606#ifdef CONFIG_WITH_COMMANDS_FUNC
3607/* Gets all the commands for a target, separated by newlines.
3608
3609 This is useful when creating and checking target dependencies since
3610 it reduces the amount of work and the memory consuption. A new prefix
3611 character '%' has been introduced for skipping certain lines, like
3612 for instance the one calling this function and pushing to a dep file.
3613 Blank lines are also skipped.
3614
3615 The commands function takes exactly one argument, which is the name of
3616 the target which commands should be returned.
3617
3618 The commands-sc is identical to commands except that it uses a ';' to
3619 separate the commands.
3620
3621 The commands-usr is similar to commands except that it takes a 2nd
3622 argument that is used to separate the commands. */
3623char *
3624func_commands (char *o, char **argv, const char *funcname)
3625{
3626 struct file *file;
3627 static int recursive = 0;
3628
3629 if (recursive)
3630 return variable_buffer_output (o, "recursive", sizeof ("recursive") - 1);
3631 recursive = 1;
3632
3633 file = lookup_file (argv[0]);
3634 if (file)
3635 {
3636 int i, cmd_sep_len;
3637 struct commands *cmds = file->cmds;
3638 const char *cmd_sep;
3639
3640 if (!strcmp (funcname, "commands"))
3641 {
3642 cmd_sep = "\n";
3643 cmd_sep_len = 1;
3644 }
3645 else if (!strcmp (funcname, "commands-sc"))
3646 {
3647 cmd_sep = ";";
3648 cmd_sep_len = 1;
3649 }
3650 else /*if (!strcmp (funcname, "commands-usr"))*/
3651 {
3652 cmd_sep = argv[1];
3653 cmd_sep_len = strlen (cmd_sep);
3654 }
3655
3656 initialize_file_variables (file, 1 /* reading - FIXME: we don't know? */);
3657 set_file_variables (file);
3658 chop_commands (cmds);
3659
3660 for (i = 0; i < cmds->ncommand_lines; i++)
3661 {
3662 char *p;
3663 char *in, *out, *ref;
3664
3665 /* Skip it if it has a '%' prefix or is blank. */
3666 if (cmds->lines_flags[i] & COMMAND_GETTER_SKIP_IT)
3667 continue;
3668 p = cmds->command_lines[i];
3669 while (isblank ((unsigned char)*p))
3670 p++;
3671 if (*p == '\0')
3672 continue;
3673
3674 /* --- copied from new_job() in job.c --- */
3675
3676 /* Collapse backslash-newline combinations that are inside variable
3677 or function references. These are left alone by the parser so
3678 that they will appear in the echoing of commands (where they look
3679 nice); and collapsed by construct_command_argv when it tokenizes.
3680 But letting them survive inside function invocations loses because
3681 we don't want the functions to see them as part of the text. */
3682
3683 /* IN points to where in the line we are scanning.
3684 OUT points to where in the line we are writing.
3685 When we collapse a backslash-newline combination,
3686 IN gets ahead of OUT. */
3687
3688 in = out = p;
3689 while ((ref = strchr (in, '$')) != 0)
3690 {
3691 ++ref; /* Move past the $. */
3692
3693 if (out != in)
3694 /* Copy the text between the end of the last chunk
3695 we processed (where IN points) and the new chunk
3696 we are about to process (where REF points). */
3697 memmove (out, in, ref - in);
3698
3699 /* Move both pointers past the boring stuff. */
3700 out += ref - in;
3701 in = ref;
3702
3703 if (*ref == '(' || *ref == '{')
3704 {
3705 char openparen = *ref;
3706 char closeparen = openparen == '(' ? ')' : '}';
3707 int count;
3708 char *p;
3709
3710 *out++ = *in++; /* Copy OPENPAREN. */
3711 /* IN now points past the opening paren or brace.
3712 Count parens or braces until it is matched. */
3713 count = 0;
3714 while (*in != '\0')
3715 {
3716 if (*in == closeparen && --count < 0)
3717 break;
3718 else if (*in == '\\' && in[1] == '\n')
3719 {
3720 /* We have found a backslash-newline inside a
3721 variable or function reference. Eat it and
3722 any following whitespace. */
3723
3724 int quoted = 0;
3725 for (p = in - 1; p > ref && *p == '\\'; --p)
3726 quoted = !quoted;
3727
3728 if (quoted)
3729 /* There were two or more backslashes, so this is
3730 not really a continuation line. We don't collapse
3731 the quoting backslashes here as is done in
3732 collapse_continuations, because the line will
3733 be collapsed again after expansion. */
3734 *out++ = *in++;
3735 else
3736 {
3737 /* Skip the backslash, newline and
3738 any following whitespace. */
3739 in = next_token (in + 2);
3740
3741 /* Discard any preceding whitespace that has
3742 already been written to the output. */
3743 while (out > ref
3744 && isblank ((unsigned char)out[-1]))
3745 --out;
3746
3747 /* Replace it all with a single space. */
3748 *out++ = ' ';
3749 }
3750 }
3751 else
3752 {
3753 if (*in == openparen)
3754 ++count;
3755
3756 *out++ = *in++;
3757 }
3758 }
3759 }
3760 }
3761
3762 /* There are no more references in this line to worry about.
3763 Copy the remaining uninteresting text to the output. */
3764 if (out != in)
3765 strcpy (out, in);
3766
3767 /* --- copied from new_job() in job.c --- */
3768
3769 /* Finally, expand the line. */
3770 if (i)
3771 o = variable_buffer_output (o, cmd_sep, cmd_sep_len);
3772 o = variable_expand_for_file_2 (o, cmds->command_lines[i], file);
3773
3774 /* Skip it if it has a '%' prefix or is blank. */
3775 p = o;
3776 while (isblank ((unsigned char)*o)
3777 || strchr("@-+", *o))
3778 o++;
3779 if (*o != '\0' && *o != '%')
3780 o = strchr (o, '\0');
3781 else
3782 o = p - cmd_sep_len;
3783 }
3784 }
3785 /* else FIXME: bitch about it? */
3786
3787 recursive = 0;
3788 return o;
3789}
3790#endif /* CONFIG_WITH_COMMANDS_FUNC */
3791
3792/* Lookup table for builtin functions.
3793
3794 This doesn't have to be sorted; we use a straight lookup. We might gain
3795 some efficiency by moving most often used functions to the start of the
3796 table.
3797
3798 If MAXIMUM_ARGS is 0, that means there is no maximum and all
3799 comma-separated values are treated as arguments.
3800
3801 EXPAND_ARGS means that all arguments should be expanded before invocation.
3802 Functions that do namespace tricks (foreach) don't automatically expand. */
3803
3804static char *func_call (char *o, char **argv, const char *funcname);
3805
3806
3807static struct function_table_entry function_table_init[] =
3808{
3809 /* Name/size */ /* MIN MAX EXP? Function */
3810 { STRING_SIZE_TUPLE("abspath"), 0, 1, 1, func_abspath},
3811 { STRING_SIZE_TUPLE("addprefix"), 2, 2, 1, func_addsuffix_addprefix},
3812 { STRING_SIZE_TUPLE("addsuffix"), 2, 2, 1, func_addsuffix_addprefix},
3813 { STRING_SIZE_TUPLE("basename"), 0, 1, 1, func_basename_dir},
3814 { STRING_SIZE_TUPLE("dir"), 0, 1, 1, func_basename_dir},
3815 { STRING_SIZE_TUPLE("notdir"), 0, 1, 1, func_notdir_suffix},
3816 { STRING_SIZE_TUPLE("subst"), 3, 3, 1, func_subst},
3817 { STRING_SIZE_TUPLE("suffix"), 0, 1, 1, func_notdir_suffix},
3818 { STRING_SIZE_TUPLE("filter"), 2, 2, 1, func_filter_filterout},
3819 { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout},
3820 { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring},
3821 { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword},
3822 { STRING_SIZE_TUPLE("flavor"), 0, 1, 1, func_flavor},
3823 { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join},
3824 { STRING_SIZE_TUPLE("lastword"), 0, 1, 1, func_lastword},
3825 { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst},
3826 { STRING_SIZE_TUPLE("realpath"), 0, 1, 1, func_realpath},
3827#ifdef CONFIG_WITH_RSORT
3828 { STRING_SIZE_TUPLE("rsort"), 0, 1, 1, func_sort},
3829#endif
3830 { STRING_SIZE_TUPLE("shell"), 0, 1, 1, func_shell},
3831 { STRING_SIZE_TUPLE("sort"), 0, 1, 1, func_sort},
3832 { STRING_SIZE_TUPLE("strip"), 0, 1, 1, func_strip},
3833 { STRING_SIZE_TUPLE("wildcard"), 0, 1, 1, func_wildcard},
3834 { STRING_SIZE_TUPLE("word"), 2, 2, 1, func_word},
3835 { STRING_SIZE_TUPLE("wordlist"), 3, 3, 1, func_wordlist},
3836 { STRING_SIZE_TUPLE("words"), 0, 1, 1, func_words},
3837 { STRING_SIZE_TUPLE("origin"), 0, 1, 1, func_origin},
3838 { STRING_SIZE_TUPLE("foreach"), 3, 3, 0, func_foreach},
3839 { STRING_SIZE_TUPLE("call"), 1, 0, 1, func_call},
3840 { STRING_SIZE_TUPLE("info"), 0, 1, 1, func_error},
3841 { STRING_SIZE_TUPLE("error"), 0, 1, 1, func_error},
3842 { STRING_SIZE_TUPLE("warning"), 0, 1, 1, func_error},
3843 { STRING_SIZE_TUPLE("if"), 2, 3, 0, func_if},
3844 { STRING_SIZE_TUPLE("or"), 1, 0, 0, func_or},
3845 { STRING_SIZE_TUPLE("and"), 1, 0, 0, func_and},
3846 { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value},
3847 { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval},
3848#ifdef CONFIG_WITH_EVALPLUS
3849 { STRING_SIZE_TUPLE("evalctx"), 0, 1, 1, func_evalctx},
3850 { STRING_SIZE_TUPLE("evalval"), 1, 1, 1, func_evalval},
3851 { STRING_SIZE_TUPLE("evalvalctx"), 1, 1, 1, func_evalval},
3852 { STRING_SIZE_TUPLE("evalcall"), 1, 0, 1, func_call},
3853 { STRING_SIZE_TUPLE("evalcall2"), 1, 0, 1, func_call},
3854#endif
3855#ifdef EXPERIMENTAL
3856 { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq},
3857 { STRING_SIZE_TUPLE("not"), 0, 1, 1, func_not},
3858#endif
3859#ifdef CONFIG_WITH_TOUPPER_TOLOWER
3860 { STRING_SIZE_TUPLE("toupper"), 0, 1, 1, func_toupper_tolower},
3861 { STRING_SIZE_TUPLE("tolower"), 0, 1, 1, func_toupper_tolower},
3862#endif
3863#ifdef CONFIG_WITH_ABSPATHEX
3864 { STRING_SIZE_TUPLE("abspathex"), 0, 2, 1, func_abspathex},
3865#endif
3866#ifdef CONFIG_WITH_XARGS
3867 { STRING_SIZE_TUPLE("xargs"), 2, 0, 1, func_xargs},
3868#endif
3869#if defined(CONFIG_WITH_VALUE_LENGTH) && defined(CONFIG_WITH_COMPARE)
3870 { STRING_SIZE_TUPLE("comp-vars"), 3, 3, 1, func_comp_vars},
3871 { STRING_SIZE_TUPLE("comp-cmds"), 3, 3, 1, func_comp_vars},
3872 { STRING_SIZE_TUPLE("comp-cmds-ex"), 3, 3, 1, func_comp_cmds_ex},
3873#endif
3874#ifdef CONFIG_WITH_DATE
3875 { STRING_SIZE_TUPLE("date"), 0, 1, 1, func_date},
3876 { STRING_SIZE_TUPLE("date-utc"), 0, 3, 1, func_date},
3877#endif
3878#ifdef CONFIG_WITH_FILE_SIZE
3879 { STRING_SIZE_TUPLE("file-size"), 1, 1, 1, func_file_size},
3880#endif
3881#ifdef CONFIG_WITH_WHICH
3882 { STRING_SIZE_TUPLE("which"), 0, 0, 1, func_which},
3883#endif
3884#ifdef CONFIG_WITH_STACK
3885 { STRING_SIZE_TUPLE("stack-push"), 2, 2, 1, func_stack_push},
3886 { STRING_SIZE_TUPLE("stack-pop"), 1, 1, 1, func_stack_pop_top},
3887 { STRING_SIZE_TUPLE("stack-popv"), 1, 1, 1, func_stack_pop_top},
3888 { STRING_SIZE_TUPLE("stack-top"), 1, 1, 1, func_stack_pop_top},
3889#endif
3890#ifdef CONFIG_WITH_MATH
3891 { STRING_SIZE_TUPLE("int-add"), 2, 0, 1, func_int_add},
3892 { STRING_SIZE_TUPLE("int-sub"), 2, 0, 1, func_int_sub},
3893 { STRING_SIZE_TUPLE("int-mul"), 2, 0, 1, func_int_mul},
3894 { STRING_SIZE_TUPLE("int-div"), 2, 0, 1, func_int_div},
3895 { STRING_SIZE_TUPLE("int-mod"), 2, 2, 1, func_int_mod},
3896 { STRING_SIZE_TUPLE("int-not"), 1, 1, 1, func_int_not},
3897 { STRING_SIZE_TUPLE("int-and"), 2, 0, 1, func_int_and},
3898 { STRING_SIZE_TUPLE("int-or"), 2, 0, 1, func_int_or},
3899 { STRING_SIZE_TUPLE("int-xor"), 2, 0, 1, func_int_xor},
3900 { STRING_SIZE_TUPLE("int-eq"), 2, 2, 1, func_int_cmp},
3901 { STRING_SIZE_TUPLE("int-ne"), 2, 2, 1, func_int_cmp},
3902 { STRING_SIZE_TUPLE("int-gt"), 2, 2, 1, func_int_cmp},
3903 { STRING_SIZE_TUPLE("int-ge"), 2, 2, 1, func_int_cmp},
3904 { STRING_SIZE_TUPLE("int-lt"), 2, 2, 1, func_int_cmp},
3905 { STRING_SIZE_TUPLE("int-le"), 2, 2, 1, func_int_cmp},
3906#endif
3907#ifdef CONFIG_WITH_NANOTS
3908 { STRING_SIZE_TUPLE("nanots"), 0, 0, 0, func_nanots},
3909#endif
3910#ifdef CONFIG_WITH_OS2_LIBPATH
3911 { STRING_SIZE_TUPLE("libpath"), 1, 2, 1, func_os2_libpath},
3912#endif
3913#ifdef CONFIG_WITH_MAKE_STATS
3914 { STRING_SIZE_TUPLE("make-stats"), 0, 0, 0, func_make_stats},
3915#endif
3916#ifdef CONFIG_WITH_COMMANDS_FUNC
3917 { STRING_SIZE_TUPLE("commands"), 1, 1, 1, func_commands},
3918 { STRING_SIZE_TUPLE("commands-sc"), 1, 1, 1, func_commands},
3919 { STRING_SIZE_TUPLE("commands-usr"), 2, 2, 1, func_commands},
3920#endif
3921#ifdef KMK_HELPERS
3922 { STRING_SIZE_TUPLE("kb-src-tool"), 1, 1, 0, func_kbuild_source_tool},
3923 { STRING_SIZE_TUPLE("kb-obj-base"), 1, 1, 0, func_kbuild_object_base},
3924 { STRING_SIZE_TUPLE("kb-obj-suff"), 1, 1, 0, func_kbuild_object_suffix},
3925 { STRING_SIZE_TUPLE("kb-src-prop"), 4, 4, 0, func_kbuild_source_prop},
3926 { STRING_SIZE_TUPLE("kb-src-one"), 0, 1, 0, func_kbuild_source_one},
3927#endif
3928};
3929
3930#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry))
3931
3932
3933
3934/* These must come after the definition of function_table. */
3935
3936static char *
3937expand_builtin_function (char *o, int argc, char **argv,
3938 const struct function_table_entry *entry_p)
3939{
3940 if (argc < (int)entry_p->minimum_args)
3941 fatal (*expanding_var,
3942 _("insufficient number of arguments (%d) to function `%s'"),
3943 argc, entry_p->name);
3944
3945 /* I suppose technically some function could do something with no
3946 arguments, but so far none do, so just test it for all functions here
3947 rather than in each one. We can change it later if necessary. */
3948
3949 if (!argc)
3950 return o;
3951
3952 if (!entry_p->func_ptr)
3953 fatal (*expanding_var,
3954 _("unimplemented on this platform: function `%s'"), entry_p->name);
3955
3956 return entry_p->func_ptr (o, argv, entry_p->name);
3957}
3958
3959/* Check for a function invocation in *STRINGP. *STRINGP points at the
3960 opening ( or { and is not null-terminated. If a function invocation
3961 is found, expand it into the buffer at *OP, updating *OP, incrementing
3962 *STRINGP past the reference and returning nonzero. If not, return zero. */
3963
3964static int
3965handle_function2 (const struct function_table_entry *entry_p, char **op, const char **stringp) /* bird split it up. */
3966{
3967 char openparen = (*stringp)[0];
3968 char closeparen = openparen == '(' ? ')' : '}';
3969 const char *beg;
3970 const char *end;
3971 int count = 0;
3972 char *abeg = NULL;
3973 char **argv, **argvp;
3974 int nargs;
3975
3976 beg = *stringp + 1;
3977
3978 /* We found a builtin function. Find the beginning of its arguments (skip
3979 whitespace after the name). */
3980
3981 beg = next_token (beg + entry_p->len);
3982
3983 /* Find the end of the function invocation, counting nested use of
3984 whichever kind of parens we use. Since we're looking, count commas
3985 to get a rough estimate of how many arguments we might have. The
3986 count might be high, but it'll never be low. */
3987
3988 for (nargs=1, end=beg; *end != '\0'; ++end)
3989 if (*end == ',')
3990 ++nargs;
3991 else if (*end == openparen)
3992 ++count;
3993 else if (*end == closeparen && --count < 0)
3994 break;
3995
3996 if (count >= 0)
3997 fatal (*expanding_var,
3998 _("unterminated call to function `%s': missing `%c'"),
3999 entry_p->name, closeparen);
4000
4001 *stringp = end;
4002
4003 /* Get some memory to store the arg pointers. */
4004 argvp = argv = alloca (sizeof (char *) * (nargs + 2));
4005
4006 /* Chop the string into arguments, then a nul. As soon as we hit
4007 MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the
4008 last argument.
4009
4010 If we're expanding, store pointers to the expansion of each one. If
4011 not, make a duplicate of the string and point into that, nul-terminating
4012 each argument. */
4013
4014 if (entry_p->expand_args)
4015 {
4016 const char *p;
4017 for (p=beg, nargs=0; p <= end; ++argvp)
4018 {
4019 const char *next;
4020
4021 ++nargs;
4022
4023 if (nargs == entry_p->maximum_args
4024 || (! (next = find_next_argument (openparen, closeparen, p, end))))
4025 next = end;
4026
4027 *argvp = expand_argument (p, next);
4028 p = next + 1;
4029 }
4030 }
4031 else
4032 {
4033 int len = end - beg;
4034 char *p, *aend;
4035
4036 abeg = xmalloc (len+1);
4037 memcpy (abeg, beg, len);
4038 abeg[len] = '\0';
4039 aend = abeg + len;
4040
4041 for (p=abeg, nargs=0; p <= aend; ++argvp)
4042 {
4043 char *next;
4044
4045 ++nargs;
4046
4047 if (nargs == entry_p->maximum_args
4048 || (! (next = find_next_argument (openparen, closeparen, p, aend))))
4049 next = aend;
4050
4051 *argvp = p;
4052 *next = '\0';
4053 p = next + 1;
4054 }
4055 }
4056 *argvp = NULL;
4057
4058 /* Finally! Run the function... */
4059 *op = expand_builtin_function (*op, nargs, argv, entry_p);
4060
4061 /* Free memory. */
4062 if (entry_p->expand_args)
4063 for (argvp=argv; *argvp != 0; ++argvp)
4064 free (*argvp);
4065 if (abeg)
4066 free (abeg);
4067
4068 return 1;
4069}
4070
4071int
4072handle_function (char **op, const char **stringp) /* bird split it up */
4073{
4074 const struct function_table_entry *entry_p = lookup_function (*stringp + 1);
4075 if (!entry_p)
4076 return 0;
4077 return handle_function2 (entry_p, op, stringp);
4078}
4079
4080
4081
4082/* User-defined functions. Expand the first argument as either a builtin
4083 function or a make variable, in the context of the rest of the arguments
4084 assigned to $1, $2, ... $N. $0 is the name of the function. */
4085
4086static char *
4087func_call (char *o, char **argv, const char *funcname UNUSED)
4088{
4089 static int max_args = 0;
4090 char *fname;
4091 char *cp;
4092 char *body;
4093 int flen;
4094 int i;
4095 int saved_args;
4096 const struct function_table_entry *entry_p;
4097 struct variable *v;
4098#ifdef CONFIG_WITH_EVALPLUS
4099 char *buf;
4100 unsigned int len;
4101#endif
4102
4103 /* There is no way to define a variable with a space in the name, so strip
4104 leading and trailing whitespace as a favor to the user. */
4105 fname = argv[0];
4106 while (*fname != '\0' && isspace ((unsigned char)*fname))
4107 ++fname;
4108
4109 cp = fname + strlen (fname) - 1;
4110 while (cp > fname && isspace ((unsigned char)*cp))
4111 --cp;
4112 cp[1] = '\0';
4113
4114 /* Calling nothing is a no-op */
4115 if (*fname == '\0')
4116 return o;
4117
4118 /* Are we invoking a builtin function? */
4119
4120 entry_p = lookup_function (fname);
4121 if (entry_p)
4122 {
4123 /* How many arguments do we have? */
4124 for (i=0; argv[i+1]; ++i)
4125 ;
4126 return expand_builtin_function (o, i, argv+1, entry_p);
4127 }
4128
4129 /* Not a builtin, so the first argument is the name of a variable to be
4130 expanded and interpreted as a function. Find it. */
4131 flen = strlen (fname);
4132
4133 v = lookup_variable (fname, flen);
4134
4135 if (v == 0)
4136 warn_undefined (fname, flen);
4137
4138 if (v == 0 || *v->value == '\0')
4139 return o;
4140
4141 body = alloca (flen + 4);
4142 body[0] = '$';
4143 body[1] = '(';
4144 memcpy (body + 2, fname, flen);
4145 body[flen+2] = ')';
4146 body[flen+3] = '\0';
4147
4148 /* Set up arguments $(1) .. $(N). $(0) is the function name. */
4149
4150 push_new_variable_scope ();
4151
4152 for (i=0; *argv; ++i, ++argv)
4153 {
4154 char num[11];
4155
4156 sprintf (num, "%d", i);
4157 define_variable (num, strlen (num), *argv, o_automatic, 0);
4158 }
4159
4160 /* If the number of arguments we have is < max_args, it means we're inside
4161 a recursive invocation of $(call ...). Fill in the remaining arguments
4162 in the new scope with the empty value, to hide them from this
4163 invocation. */
4164
4165 for (; i < max_args; ++i)
4166 {
4167 char num[11];
4168
4169 sprintf (num, "%d", i);
4170 define_variable (num, strlen (num), "", o_automatic, 0);
4171 }
4172
4173 saved_args = max_args;
4174 max_args = i;
4175
4176#ifdef CONFIG_WITH_EVALPLUS
4177 if (!strcmp (funcname, "call"))
4178 {
4179#endif
4180 /* Expand the body in the context of the arguments, adding the result to
4181 the variable buffer. */
4182
4183 v->exp_count = EXP_COUNT_MAX;
4184 o = variable_expand_string (o, body, flen+3);
4185 v->exp_count = 0;
4186
4187 o += strlen (o);
4188#ifdef CONFIG_WITH_EVALPLUS
4189 }
4190 else if (!strcmp (funcname, "evalcall"))
4191 {
4192 /* Evaluate the variable value directly without expanding it first. */
4193 char *tmp;
4194
4195 install_variable_buffer (&buf, &len);
4196
4197 tmp = xmalloc (v->value_length + 1);
4198 memcpy (tmp, v->value, v->value_length + 1);
4199 eval_buffer (tmp);
4200 free (tmp);
4201
4202 restore_variable_buffer (buf, len);
4203 }
4204 else /* evalcall2: */
4205 {
4206 /* Expand the body first and then evaluate the output. */
4207
4208 v->exp_count = EXP_COUNT_MAX;
4209 o = variable_expand_string (o, body, flen+3);
4210 v->exp_count = 0;
4211
4212 install_variable_buffer (&buf, &len);
4213 eval_buffer (o);
4214 restore_variable_buffer (buf, len);
4215 }
4216#endif /* CONFIG_WITH_EVALPLUS */
4217
4218 max_args = saved_args;
4219
4220 pop_variable_scope ();
4221
4222 return o;
4223}
4224
4225void
4226hash_init_function_table (void)
4227{
4228 hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2,
4229 function_table_entry_hash_1, function_table_entry_hash_2,
4230 function_table_entry_hash_cmp);
4231 hash_load (&function_table, function_table_init,
4232 FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry));
4233#ifdef CONFIG_WITH_OPTIMIZATION_HACKS
4234 {
4235 unsigned i;
4236 for (i = 0; i < FUNCTION_TABLE_ENTRIES; i++)
4237 assert (function_table_init[i].len <= MAX_FUNCTION_LENGTH);
4238 }
4239#endif
4240}
Note: See TracBrowser for help on using the repository browser.