1 /* Builtin function expansion for GNU Make.
2 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4 Foundation, Inc.
5 This file is part of GNU Make.
6
7 GNU Make is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation; either version 2, or (at your option) any later version.
10
11 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13 A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along with
16 GNU Make; see the file COPYING. If not, write to the Free Software
17 Foundation, 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
32 struct function_table_entry
33 {
34 const char *name;
35 unsigned char len;
36 unsigned char minimum_args;
37 unsigned char maximum_args;
38 char expand_args;
39 char *(*func_ptr) PARAMS ((char *output, char **argv, const char *fname));
40 };
41
42 static unsigned long
function_table_entry_hash_1(const void * keyv)43 function_table_entry_hash_1 (const void *keyv)
44 {
45 struct function_table_entry const *key = (struct function_table_entry const *) keyv;
46 return_STRING_N_HASH_1 (key->name, key->len);
47 }
48
49 static unsigned long
function_table_entry_hash_2(const void * keyv)50 function_table_entry_hash_2 (const void *keyv)
51 {
52 struct function_table_entry const *key = (struct function_table_entry const *) keyv;
53 return_STRING_N_HASH_2 (key->name, key->len);
54 }
55
56 static int
function_table_entry_hash_cmp(const void * xv,const void * yv)57 function_table_entry_hash_cmp (const void *xv, const void *yv)
58 {
59 struct function_table_entry const *x = (struct function_table_entry const *) xv;
60 struct function_table_entry const *y = (struct function_table_entry const *) yv;
61 int result = x->len - y->len;
62 if (result)
63 return result;
64 return_STRING_N_COMPARE (x->name, y->name, x->len);
65 }
66
67 static struct hash_table function_table;
68
69
70 /* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
71 each occurrence of SUBST with REPLACE. TEXT is null-terminated. SLEN is
72 the length of SUBST and RLEN is the length of REPLACE. If BY_WORD is
73 nonzero, substitutions are done only on matches which are complete
74 whitespace-delimited words. */
75
76 char *
subst_expand(char * o,char * text,char * subst,char * replace,unsigned int slen,unsigned int rlen,int by_word)77 subst_expand (char *o, char *text, char *subst, char *replace,
78 unsigned int slen, unsigned int rlen, int by_word)
79 {
80 char *t = text;
81 char *p;
82
83 if (slen == 0 && !by_word)
84 {
85 /* The first occurrence of "" in any string is its end. */
86 o = variable_buffer_output (o, t, strlen (t));
87 if (rlen > 0)
88 o = variable_buffer_output (o, replace, rlen);
89 return o;
90 }
91
92 do
93 {
94 if (by_word && slen == 0)
95 /* When matching by words, the empty string should match
96 the end of each word, rather than the end of the whole text. */
97 p = end_of_token (next_token (t));
98 else
99 {
100 p = strstr (t, subst);
101 if (p == 0)
102 {
103 /* No more matches. Output everything left on the end. */
104 o = variable_buffer_output (o, t, strlen (t));
105 return o;
106 }
107 }
108
109 /* Output everything before this occurrence of the string to replace. */
110 if (p > t)
111 o = variable_buffer_output (o, t, p - t);
112
113 /* If we're substituting only by fully matched words,
114 or only at the ends of words, check that this case qualifies. */
115 if (by_word
116 && ((p > text && !isblank ((unsigned char)p[-1]))
117 || (p[slen] != '\0' && !isblank ((unsigned char)p[slen]))))
118 /* Struck out. Output the rest of the string that is
119 no longer to be replaced. */
120 o = variable_buffer_output (o, subst, slen);
121 else if (rlen > 0)
122 /* Output the replacement string. */
123 o = variable_buffer_output (o, replace, rlen);
124
125 /* Advance T past the string to be replaced. */
126 {
127 char *nt = p + slen;
128 t = nt;
129 }
130 } while (*t != '\0');
131
132 return o;
133 }
134
135
136 /* Store into VARIABLE_BUFFER at O the result of scanning TEXT
137 and replacing strings matching PATTERN with REPLACE.
138 If PATTERN_PERCENT is not nil, PATTERN has already been
139 run through find_percent, and PATTERN_PERCENT is the result.
140 If REPLACE_PERCENT is not nil, REPLACE has already been
141 run through find_percent, and REPLACE_PERCENT is the result.
142 Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
143 character _AFTER_ the %, not to the % itself.
144 */
145
146 char *
patsubst_expand(char * o,char * text,char * pattern,char * replace,char * pattern_percent,char * replace_percent)147 patsubst_expand (char *o, char *text, char *pattern, char *replace,
148 char *pattern_percent, char *replace_percent)
149 {
150 unsigned int pattern_prepercent_len, pattern_postpercent_len;
151 unsigned int replace_prepercent_len, replace_postpercent_len;
152 char *t;
153 unsigned int len;
154 int doneany = 0;
155
156 /* We call find_percent on REPLACE before checking PATTERN so that REPLACE
157 will be collapsed before we call subst_expand if PATTERN has no %. */
158 if (!replace_percent)
159 {
160 replace_percent = find_percent (replace);
161 if (replace_percent)
162 ++replace_percent;
163 }
164
165 /* Record the length of REPLACE before and after the % so we don't have to
166 compute these lengths more than once. */
167 if (replace_percent)
168 {
169 replace_prepercent_len = replace_percent - replace - 1;
170 replace_postpercent_len = strlen (replace_percent);
171 }
172 else
173 {
174 replace_prepercent_len = strlen (replace);
175 replace_postpercent_len = 0;
176 }
177
178 if (!pattern_percent)
179 {
180 pattern_percent = find_percent (pattern);
181 if (pattern_percent)
182 ++pattern_percent;
183 }
184 if (!pattern_percent)
185 /* With no % in the pattern, this is just a simple substitution. */
186 return subst_expand (o, text, pattern, replace,
187 strlen (pattern), strlen (replace), 1);
188
189 /* Record the length of PATTERN before and after the %
190 so we don't have to compute it more than once. */
191 pattern_prepercent_len = pattern_percent - pattern - 1;
192 pattern_postpercent_len = strlen (pattern_percent);
193
194 while ((t = find_next_token (&text, &len)) != 0)
195 {
196 int fail = 0;
197
198 /* Is it big enough to match? */
199 if (len < pattern_prepercent_len + pattern_postpercent_len)
200 fail = 1;
201
202 /* Does the prefix match? */
203 if (!fail && pattern_prepercent_len > 0
204 && (*t != *pattern
205 || t[pattern_prepercent_len - 1] != pattern_percent[-2]
206 || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1)))
207 fail = 1;
208
209 /* Does the suffix match? */
210 if (!fail && pattern_postpercent_len > 0
211 && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1]
212 || t[len - pattern_postpercent_len] != *pattern_percent
213 || !strneq (&t[len - pattern_postpercent_len],
214 pattern_percent, pattern_postpercent_len - 1)))
215 fail = 1;
216
217 if (fail)
218 /* It didn't match. Output the string. */
219 o = variable_buffer_output (o, t, len);
220 else
221 {
222 /* It matched. Output the replacement. */
223
224 /* Output the part of the replacement before the %. */
225 o = variable_buffer_output (o, replace, replace_prepercent_len);
226
227 if (replace_percent != 0)
228 {
229 /* Output the part of the matched string that
230 matched the % in the pattern. */
231 o = variable_buffer_output (o, t + pattern_prepercent_len,
232 len - (pattern_prepercent_len
233 + pattern_postpercent_len));
234 /* Output the part of the replacement after the %. */
235 o = variable_buffer_output (o, replace_percent,
236 replace_postpercent_len);
237 }
238 }
239
240 /* Output a space, but not if the replacement is "". */
241 if (fail || replace_prepercent_len > 0
242 || (replace_percent != 0 && len + replace_postpercent_len > 0))
243 {
244 o = variable_buffer_output (o, " ", 1);
245 doneany = 1;
246 }
247 }
248 if (doneany)
249 /* Kill the last space. */
250 --o;
251
252 return o;
253 }
254
255
256 /* Look up a function by name. */
257
258 static const struct function_table_entry *
lookup_function(const char * s)259 lookup_function (const char *s)
260 {
261 const char *e = s;
262
263 while (*e && ( (*e >= 'a' && *e <= 'z') || *e == '-'))
264 e++;
265 if (*e == '\0' || isblank ((unsigned char) *e))
266 {
267 struct function_table_entry function_table_entry_key;
268 function_table_entry_key.name = s;
269 function_table_entry_key.len = e - s;
270
271 return hash_find_item (&function_table, &function_table_entry_key);
272 }
273 return 0;
274 }
275
276
277 /* Return 1 if PATTERN matches STR, 0 if not. */
278
279 int
pattern_matches(char * pattern,char * percent,char * str)280 pattern_matches (char *pattern, char *percent, char *str)
281 {
282 unsigned int sfxlen, strlength;
283
284 if (percent == 0)
285 {
286 unsigned int len = strlen (pattern) + 1;
287 char *new_chars = (char *) alloca (len);
288 bcopy (pattern, new_chars, len);
289 pattern = new_chars;
290 percent = find_percent (pattern);
291 if (percent == 0)
292 return streq (pattern, str);
293 }
294
295 sfxlen = strlen (percent + 1);
296 strlength = strlen (str);
297
298 if (strlength < (percent - pattern) + sfxlen
299 || !strneq (pattern, str, percent - pattern))
300 return 0;
301
302 return !strcmp (percent + 1, str + (strlength - sfxlen));
303 }
304
305
306 /* Find the next comma or ENDPAREN (counting nested STARTPAREN and
307 ENDPARENtheses), starting at PTR before END. Return a pointer to
308 next character.
309
310 If no next argument is found, return NULL.
311 */
312
313 static char *
find_next_argument(char startparen,char endparen,const char * ptr,const char * end)314 find_next_argument (char startparen, char endparen,
315 const char *ptr, const char *end)
316 {
317 int count = 0;
318
319 for (; ptr < end; ++ptr)
320 if (*ptr == startparen)
321 ++count;
322
323 else if (*ptr == endparen)
324 {
325 --count;
326 if (count < 0)
327 return NULL;
328 }
329
330 else if (*ptr == ',' && !count)
331 return (char *)ptr;
332
333 /* We didn't find anything. */
334 return NULL;
335 }
336
337
338 /* Glob-expand LINE. The returned pointer is
339 only good until the next call to string_glob. */
340
341 static char *
string_glob(char * line)342 string_glob (char *line)
343 {
344 static char *result = 0;
345 static unsigned int length;
346 register struct nameseq *chain;
347 register unsigned int idx;
348
349 chain = multi_glob (parse_file_seq
350 (&line, '\0', sizeof (struct nameseq),
351 /* We do not want parse_file_seq to strip `./'s.
352 That would break examples like:
353 $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */
354 0),
355 sizeof (struct nameseq));
356
357 if (result == 0)
358 {
359 length = 100;
360 result = (char *) xmalloc (100);
361 }
362
363 idx = 0;
364 while (chain != 0)
365 {
366 register char *name = chain->name;
367 unsigned int len = strlen (name);
368
369 struct nameseq *next = chain->next;
370 free ((char *) chain);
371 chain = next;
372
373 /* multi_glob will pass names without globbing metacharacters
374 through as is, but we want only files that actually exist. */
375 if (file_exists_p (name))
376 {
377 if (idx + len + 1 > length)
378 {
379 length += (len + 1) * 2;
380 result = (char *) xrealloc (result, length);
381 }
382 bcopy (name, &result[idx], len);
383 idx += len;
384 result[idx++] = ' ';
385 }
386
387 free (name);
388 }
389
390 /* Kill the last space and terminate the string. */
391 if (idx == 0)
392 result[0] = '\0';
393 else
394 result[idx - 1] = '\0';
395
396 return result;
397 }
398
399 /*
400 Builtin functions
401 */
402
403 static char *
func_patsubst(char * o,char ** argv,const char * funcname UNUSED)404 func_patsubst (char *o, char **argv, const char *funcname UNUSED)
405 {
406 o = patsubst_expand (o, argv[2], argv[0], argv[1], (char *) 0, (char *) 0);
407 return o;
408 }
409
410
411 static char *
func_join(char * o,char ** argv,const char * funcname UNUSED)412 func_join (char *o, char **argv, const char *funcname UNUSED)
413 {
414 int doneany = 0;
415
416 /* Write each word of the first argument directly followed
417 by the corresponding word of the second argument.
418 If the two arguments have a different number of words,
419 the excess words are just output separated by blanks. */
420 register char *tp;
421 register char *pp;
422 char *list1_iterator = argv[0];
423 char *list2_iterator = argv[1];
424 do
425 {
426 unsigned int len1, len2;
427
428 tp = find_next_token (&list1_iterator, &len1);
429 if (tp != 0)
430 o = variable_buffer_output (o, tp, len1);
431
432 pp = find_next_token (&list2_iterator, &len2);
433 if (pp != 0)
434 o = variable_buffer_output (o, pp, len2);
435
436 if (tp != 0 || pp != 0)
437 {
438 o = variable_buffer_output (o, " ", 1);
439 doneany = 1;
440 }
441 }
442 while (tp != 0 || pp != 0);
443 if (doneany)
444 /* Kill the last blank. */
445 --o;
446
447 return o;
448 }
449
450
451 static char *
func_origin(char * o,char ** argv,const char * funcname UNUSED)452 func_origin (char *o, char **argv, const char *funcname UNUSED)
453 {
454 /* Expand the argument. */
455 register struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
456 if (v == 0)
457 o = variable_buffer_output (o, "undefined", 9);
458 else
459 switch (v->origin)
460 {
461 default:
462 case o_invalid:
463 abort ();
464 break;
465 case o_default:
466 o = variable_buffer_output (o, "default", 7);
467 break;
468 case o_env:
469 o = variable_buffer_output (o, "environment", 11);
470 break;
471 case o_file:
472 o = variable_buffer_output (o, "file", 4);
473 break;
474 case o_env_override:
475 o = variable_buffer_output (o, "environment override", 20);
476 break;
477 case o_command:
478 o = variable_buffer_output (o, "command line", 12);
479 break;
480 case o_override:
481 o = variable_buffer_output (o, "override", 8);
482 break;
483 case o_automatic:
484 o = variable_buffer_output (o, "automatic", 9);
485 break;
486 }
487
488 return o;
489 }
490
491 static char *
func_flavor(char * o,char ** argv,const char * funcname UNUSED)492 func_flavor (char *o, char **argv, const char *funcname UNUSED)
493 {
494 register struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
495
496 if (v == 0)
497 o = variable_buffer_output (o, "undefined", 9);
498 else
499 if (v->recursive)
500 o = variable_buffer_output (o, "recursive", 9);
501 else
502 o = variable_buffer_output (o, "simple", 6);
503
504 return o;
505 }
506
507 #ifdef VMS
508 # define IS_PATHSEP(c) ((c) == ']')
509 #else
510 # ifdef HAVE_DOS_PATHS
511 # define IS_PATHSEP(c) ((c) == '/' || (c) == '\\')
512 # else
513 # define IS_PATHSEP(c) ((c) == '/')
514 # endif
515 #endif
516
517
518 static char *
func_notdir_suffix(char * o,char ** argv,const char * funcname)519 func_notdir_suffix (char *o, char **argv, const char *funcname)
520 {
521 /* Expand the argument. */
522 char *list_iterator = argv[0];
523 char *p2 =0;
524 int doneany =0;
525 unsigned int len=0;
526
527 int is_suffix = streq (funcname, "suffix");
528 int is_notdir = !is_suffix;
529 while ((p2 = find_next_token (&list_iterator, &len)) != 0)
530 {
531 char *p = p2 + len;
532
533
534 while (p >= p2 && (!is_suffix || *p != '.'))
535 {
536 if (IS_PATHSEP (*p))
537 break;
538 --p;
539 }
540
541 if (p >= p2)
542 {
543 if (is_notdir)
544 ++p;
545 else if (*p != '.')
546 continue;
547 o = variable_buffer_output (o, p, len - (p - p2));
548 }
549 #ifdef HAVE_DOS_PATHS
550 /* Handle the case of "d:foo/bar". */
551 else if (streq (funcname, "notdir") && p2[0] && p2[1] == ':')
552 {
553 p = p2 + 2;
554 o = variable_buffer_output (o, p, len - (p - p2));
555 }
556 #endif
557 else if (is_notdir)
558 o = variable_buffer_output (o, p2, len);
559
560 if (is_notdir || p >= p2)
561 {
562 o = variable_buffer_output (o, " ", 1);
563 doneany = 1;
564 }
565 }
566 if (doneany)
567 /* Kill last space. */
568 --o;
569
570
571 return o;
572
573 }
574
575
576 static char *
func_basename_dir(char * o,char ** argv,const char * funcname)577 func_basename_dir (char *o, char **argv, const char *funcname)
578 {
579 /* Expand the argument. */
580 char *p3 = argv[0];
581 char *p2=0;
582 int doneany=0;
583 unsigned int len=0;
584 char *p=0;
585 int is_basename= streq (funcname, "basename");
586 int is_dir= !is_basename;
587
588 while ((p2 = find_next_token (&p3, &len)) != 0)
589 {
590 p = p2 + len;
591 while (p >= p2 && (!is_basename || *p != '.'))
592 {
593 if (IS_PATHSEP (*p))
594 break;
595 --p;
596 }
597
598 if (p >= p2 && (is_dir))
599 o = variable_buffer_output (o, p2, ++p - p2);
600 else if (p >= p2 && (*p == '.'))
601 o = variable_buffer_output (o, p2, p - p2);
602 #ifdef HAVE_DOS_PATHS
603 /* Handle the "d:foobar" case */
604 else if (p2[0] && p2[1] == ':' && is_dir)
605 o = variable_buffer_output (o, p2, 2);
606 #endif
607 else if (is_dir)
608 #ifdef VMS
609 o = variable_buffer_output (o, "[]", 2);
610 #else
611 #ifndef _AMIGA
612 o = variable_buffer_output (o, "./", 2);
613 #else
614 ; /* Just a nop... */
615 #endif /* AMIGA */
616 #endif /* !VMS */
617 else
618 /* The entire name is the basename. */
619 o = variable_buffer_output (o, p2, len);
620
621 o = variable_buffer_output (o, " ", 1);
622 doneany = 1;
623 }
624 if (doneany)
625 /* Kill last space. */
626 --o;
627
628
629 return o;
630 }
631
632 static char *
func_addsuffix_addprefix(char * o,char ** argv,const char * funcname)633 func_addsuffix_addprefix (char *o, char **argv, const char *funcname)
634 {
635 int fixlen = strlen (argv[0]);
636 char *list_iterator = argv[1];
637 int is_addprefix = streq (funcname, "addprefix");
638 int is_addsuffix = !is_addprefix;
639
640 int doneany = 0;
641 char *p;
642 unsigned int len;
643
644 while ((p = find_next_token (&list_iterator, &len)) != 0)
645 {
646 if (is_addprefix)
647 o = variable_buffer_output (o, argv[0], fixlen);
648 o = variable_buffer_output (o, p, len);
649 if (is_addsuffix)
650 o = variable_buffer_output (o, argv[0], fixlen);
651 o = variable_buffer_output (o, " ", 1);
652 doneany = 1;
653 }
654
655 if (doneany)
656 /* Kill last space. */
657 --o;
658
659 return o;
660 }
661
662 static char *
func_subst(char * o,char ** argv,const char * funcname UNUSED)663 func_subst (char *o, char **argv, const char *funcname UNUSED)
664 {
665 o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]),
666 strlen (argv[1]), 0);
667
668 return o;
669 }
670
671
672 static char *
func_firstword(char * o,char ** argv,const char * funcname UNUSED)673 func_firstword (char *o, char **argv, const char *funcname UNUSED)
674 {
675 unsigned int i;
676 char *words = argv[0]; /* Use a temp variable for find_next_token */
677 char *p = find_next_token (&words, &i);
678
679 if (p != 0)
680 o = variable_buffer_output (o, p, i);
681
682 return o;
683 }
684
685 static char *
func_lastword(char * o,char ** argv,const char * funcname UNUSED)686 func_lastword (char *o, char **argv, const char *funcname UNUSED)
687 {
688 unsigned int i;
689 char *words = argv[0]; /* Use a temp variable for find_next_token */
690 char *p = 0;
691 char *t;
692
693 while ((t = find_next_token (&words, &i)))
694 p = t;
695
696 if (p != 0)
697 o = variable_buffer_output (o, p, i);
698
699 return o;
700 }
701
702 static char *
func_words(char * o,char ** argv,const char * funcname UNUSED)703 func_words (char *o, char **argv, const char *funcname UNUSED)
704 {
705 int i = 0;
706 char *word_iterator = argv[0];
707 char buf[20];
708
709 while (find_next_token (&word_iterator, (unsigned int *) 0) != 0)
710 ++i;
711
712 sprintf (buf, "%d", i);
713 o = variable_buffer_output (o, buf, strlen (buf));
714
715
716 return o;
717 }
718
719 /* Set begpp to point to the first non-whitespace character of the string,
720 * and endpp to point to the last non-whitespace character of the string.
721 * If the string is empty or contains nothing but whitespace, endpp will be
722 * begpp-1.
723 */
724 char *
strip_whitespace(const char ** begpp,const char ** endpp)725 strip_whitespace (const char **begpp, const char **endpp)
726 {
727 while (*begpp <= *endpp && isspace ((unsigned char)**begpp))
728 (*begpp) ++;
729 while (*endpp >= *begpp && isspace ((unsigned char)**endpp))
730 (*endpp) --;
731 return (char *)*begpp;
732 }
733
734 static void
check_numeric(const char * s,const char * message)735 check_numeric (const char *s, const char *message)
736 {
737 const char *end = s + strlen (s) - 1;
738 const char *beg = s;
739 strip_whitespace (&s, &end);
740
741 for (; s <= end; ++s)
742 if (!ISDIGIT (*s)) /* ISDIGIT only evals its arg once: see make.h. */
743 break;
744
745 if (s <= end || end - beg < 0)
746 fatal (*expanding_var, "%s: '%s'", message, beg);
747 }
748
749
750
751 static char *
func_word(char * o,char ** argv,const char * funcname UNUSED)752 func_word (char *o, char **argv, const char *funcname UNUSED)
753 {
754 char *end_p=0;
755 int i=0;
756 char *p=0;
757
758 /* Check the first argument. */
759 check_numeric (argv[0], _("non-numeric first argument to `word' function"));
760 i = atoi (argv[0]);
761
762 if (i == 0)
763 fatal (*expanding_var,
764 _("first argument to `word' function must be greater than 0"));
765
766
767 end_p = argv[1];
768 while ((p = find_next_token (&end_p, 0)) != 0)
769 if (--i == 0)
770 break;
771
772 if (i == 0)
773 o = variable_buffer_output (o, p, end_p - p);
774
775 return o;
776 }
777
778 static char *
func_wordlist(char * o,char ** argv,const char * funcname UNUSED)779 func_wordlist (char *o, char **argv, const char *funcname UNUSED)
780 {
781 int start, count;
782
783 /* Check the arguments. */
784 check_numeric (argv[0],
785 _("non-numeric first argument to `wordlist' function"));
786 check_numeric (argv[1],
787 _("non-numeric second argument to `wordlist' function"));
788
789 start = atoi (argv[0]);
790 if (start < 1)
791 fatal (*expanding_var,
792 "invalid first argument to `wordlist' function: `%d'", start);
793
794 count = atoi (argv[1]) - start + 1;
795
796 if (count > 0)
797 {
798 char *p;
799 char *end_p = argv[2];
800
801 /* Find the beginning of the "start"th word. */
802 while (((p = find_next_token (&end_p, 0)) != 0) && --start)
803 ;
804
805 if (p)
806 {
807 /* Find the end of the "count"th word from start. */
808 while (--count && (find_next_token (&end_p, 0) != 0))
809 ;
810
811 /* Return the stuff in the middle. */
812 o = variable_buffer_output (o, p, end_p - p);
813 }
814 }
815
816 return o;
817 }
818
819 static char*
func_findstring(char * o,char ** argv,const char * funcname UNUSED)820 func_findstring (char *o, char **argv, const char *funcname UNUSED)
821 {
822 /* Find the first occurrence of the first string in the second. */
823 if (strstr (argv[1], argv[0]) != 0)
824 o = variable_buffer_output (o, argv[0], strlen (argv[0]));
825
826 return o;
827 }
828
829 static char *
func_foreach(char * o,char ** argv,const char * funcname UNUSED)830 func_foreach (char *o, char **argv, const char *funcname UNUSED)
831 {
832 /* expand only the first two. */
833 char *varname = expand_argument (argv[0], NULL);
834 char *list = expand_argument (argv[1], NULL);
835 char *body = argv[2];
836
837 int doneany = 0;
838 char *list_iterator = list;
839 char *p;
840 unsigned int len;
841 register struct variable *var;
842
843 push_new_variable_scope ();
844 var = define_variable (varname, strlen (varname), "", o_automatic, 0);
845
846 /* loop through LIST, put the value in VAR and expand BODY */
847 while ((p = find_next_token (&list_iterator, &len)) != 0)
848 {
849 char *result = 0;
850
851 {
852 char save = p[len];
853
854 p[len] = '\0';
855 free (var->value);
856 var->value = (char *) xstrdup ((char*) p);
857 p[len] = save;
858 }
859
860 result = allocated_variable_expand (body);
861
862 o = variable_buffer_output (o, result, strlen (result));
863 o = variable_buffer_output (o, " ", 1);
864 doneany = 1;
865 free (result);
866 }
867
868 if (doneany)
869 /* Kill the last space. */
870 --o;
871
872 pop_variable_scope ();
873 free (varname);
874 free (list);
875
876 return o;
877 }
878
879 struct a_word
880 {
881 struct a_word *next;
882 struct a_word *chain;
883 char *str;
884 int length;
885 int matched;
886 };
887
888 static unsigned long
a_word_hash_1(const void * key)889 a_word_hash_1 (const void *key)
890 {
891 return_STRING_HASH_1 (((struct a_word const *) key)->str);
892 }
893
894 static unsigned long
a_word_hash_2(const void * key)895 a_word_hash_2 (const void *key)
896 {
897 return_STRING_HASH_2 (((struct a_word const *) key)->str);
898 }
899
900 static int
a_word_hash_cmp(const void * x,const void * y)901 a_word_hash_cmp (const void *x, const void *y)
902 {
903 int result = ((struct a_word const *) x)->length - ((struct a_word const *) y)->length;
904 if (result)
905 return result;
906 return_STRING_COMPARE (((struct a_word const *) x)->str,
907 ((struct a_word const *) y)->str);
908 }
909
910 struct a_pattern
911 {
912 struct a_pattern *next;
913 char *str;
914 char *percent;
915 int length;
916 int save_c;
917 };
918
919 static char *
func_filter_filterout(char * o,char ** argv,const char * funcname)920 func_filter_filterout (char *o, char **argv, const char *funcname)
921 {
922 struct a_word *wordhead;
923 struct a_word **wordtail;
924 struct a_word *wp;
925 struct a_pattern *pathead;
926 struct a_pattern **pattail;
927 struct a_pattern *pp;
928
929 struct hash_table a_word_table;
930 int is_filter = streq (funcname, "filter");
931 char *pat_iterator = argv[0];
932 char *word_iterator = argv[1];
933 int literals = 0;
934 int words = 0;
935 int hashing = 0;
936 char *p;
937 unsigned int len;
938
939 /* Chop ARGV[0] up into patterns to match against the words. */
940
941 pattail = &pathead;
942 while ((p = find_next_token (&pat_iterator, &len)) != 0)
943 {
944 struct a_pattern *pat = (struct a_pattern *) alloca (sizeof (struct a_pattern));
945
946 *pattail = pat;
947 pattail = &pat->next;
948
949 if (*pat_iterator != '\0')
950 ++pat_iterator;
951
952 pat->str = p;
953 pat->length = len;
954 pat->save_c = p[len];
955 p[len] = '\0';
956 pat->percent = find_percent (p);
957 if (pat->percent == 0)
958 literals++;
959 }
960 *pattail = 0;
961
962 /* Chop ARGV[1] up into words to match against the patterns. */
963
964 wordtail = &wordhead;
965 while ((p = find_next_token (&word_iterator, &len)) != 0)
966 {
967 struct a_word *word = (struct a_word *) alloca (sizeof (struct a_word));
968
969 *wordtail = word;
970 wordtail = &word->next;
971
972 if (*word_iterator != '\0')
973 ++word_iterator;
974
975 p[len] = '\0';
976 word->str = p;
977 word->length = len;
978 word->matched = 0;
979 word->chain = 0;
980 words++;
981 }
982 *wordtail = 0;
983
984 /* Only use a hash table if arg list lengths justifies the cost. */
985 hashing = (literals >= 2 && (literals * words) >= 10);
986 if (hashing)
987 {
988 hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2, a_word_hash_cmp);
989 for (wp = wordhead; wp != 0; wp = wp->next)
990 {
991 struct a_word *owp = hash_insert (&a_word_table, wp);
992 if (owp)
993 wp->chain = owp;
994 }
995 }
996
997 if (words)
998 {
999 int doneany = 0;
1000
1001 /* Run each pattern through the words, killing words. */
1002 for (pp = pathead; pp != 0; pp = pp->next)
1003 {
1004 if (pp->percent)
1005 for (wp = wordhead; wp != 0; wp = wp->next)
1006 wp->matched |= pattern_matches (pp->str, pp->percent, wp->str);
1007 else if (hashing)
1008 {
1009 struct a_word a_word_key;
1010 a_word_key.str = pp->str;
1011 a_word_key.length = pp->length;
1012 wp = (struct a_word *) hash_find_item (&a_word_table, &a_word_key);
1013 while (wp)
1014 {
1015 wp->matched |= 1;
1016 wp = wp->chain;
1017 }
1018 }
1019 else
1020 for (wp = wordhead; wp != 0; wp = wp->next)
1021 wp->matched |= (wp->length == pp->length
1022 && strneq (pp->str, wp->str, wp->length));
1023 }
1024
1025 /* Output the words that matched (or didn't, for filter-out). */
1026 for (wp = wordhead; wp != 0; wp = wp->next)
1027 if (is_filter ? wp->matched : !wp->matched)
1028 {
1029 o = variable_buffer_output (o, wp->str, strlen (wp->str));
1030 o = variable_buffer_output (o, " ", 1);
1031 doneany = 1;
1032 }
1033
1034 if (doneany)
1035 /* Kill the last space. */
1036 --o;
1037 }
1038
1039 for (pp = pathead; pp != 0; pp = pp->next)
1040 pp->str[pp->length] = pp->save_c;
1041
1042 if (hashing)
1043 hash_free (&a_word_table, 0);
1044
1045 return o;
1046 }
1047
1048
1049 static char *
func_strip(char * o,char ** argv,const char * funcname UNUSED)1050 func_strip (char *o, char **argv, const char *funcname UNUSED)
1051 {
1052 char *p = argv[0];
1053 int doneany =0;
1054
1055 while (*p != '\0')
1056 {
1057 int i=0;
1058 char *word_start=0;
1059
1060 while (isspace ((unsigned char)*p))
1061 ++p;
1062 word_start = p;
1063 for (i=0; *p != '\0' && !isspace ((unsigned char)*p); ++p, ++i)
1064 {}
1065 if (!i)
1066 break;
1067 o = variable_buffer_output (o, word_start, i);
1068 o = variable_buffer_output (o, " ", 1);
1069 doneany = 1;
1070 }
1071
1072 if (doneany)
1073 /* Kill the last space. */
1074 --o;
1075 return o;
1076 }
1077
1078 /*
1079 Print a warning or fatal message.
1080 */
1081 static char *
func_error(char * o,char ** argv,const char * funcname)1082 func_error (char *o, char **argv, const char *funcname)
1083 {
1084 char **argvp;
1085 char *msg, *p;
1086 int len;
1087
1088 /* The arguments will be broken on commas. Rather than create yet
1089 another special case where function arguments aren't broken up,
1090 just create a format string that puts them back together. */
1091 for (len=0, argvp=argv; *argvp != 0; ++argvp)
1092 len += strlen (*argvp) + 2;
1093
1094 p = msg = (char *) alloca (len + 1);
1095
1096 for (argvp=argv; argvp[1] != 0; ++argvp)
1097 {
1098 strcpy (p, *argvp);
1099 p += strlen (*argvp);
1100 *(p++) = ',';
1101 *(p++) = ' ';
1102 }
1103 strcpy (p, *argvp);
1104
1105 switch (*funcname) {
1106 case 'e':
1107 fatal (reading_file, "%s", msg);
1108
1109 case 'w':
1110 error (reading_file, "%s", msg);
1111 break;
1112
1113 case 'i':
1114 printf ("%s\n", msg);
1115 fflush(stdout);
1116 break;
1117
1118 default:
1119 fatal (*expanding_var, "Internal error: func_error: '%s'", funcname);
1120 }
1121
1122 /* The warning function expands to the empty string. */
1123 return o;
1124 }
1125
1126
1127 /*
1128 chop argv[0] into words, and sort them.
1129 */
1130 static char *
func_sort(char * o,char ** argv,const char * funcname UNUSED)1131 func_sort (char *o, char **argv, const char *funcname UNUSED)
1132 {
1133 char **words = 0;
1134 int nwords = 0;
1135 register int wordi = 0;
1136
1137 /* Chop ARGV[0] into words and put them in WORDS. */
1138 char *t = argv[0];
1139 char *p;
1140 unsigned int len;
1141 int i;
1142
1143 while ((p = find_next_token (&t, &len)) != 0)
1144 {
1145 if (wordi >= nwords - 1)
1146 {
1147 nwords = (2 * nwords) + 5;
1148 words = (char **) xrealloc ((char *) words,
1149 nwords * sizeof (char *));
1150 }
1151 words[wordi++] = savestring (p, len);
1152 }
1153
1154 if (!wordi)
1155 return o;
1156
1157 /* Now sort the list of words. */
1158 qsort ((char *) words, wordi, sizeof (char *), alpha_compare);
1159
1160 /* Now write the sorted list. */
1161 for (i = 0; i < wordi; ++i)
1162 {
1163 len = strlen (words[i]);
1164 if (i == wordi - 1 || strlen (words[i + 1]) != len
1165 || strcmp (words[i], words[i + 1]))
1166 {
1167 o = variable_buffer_output (o, words[i], len);
1168 o = variable_buffer_output (o, " ", 1);
1169 }
1170 free (words[i]);
1171 }
1172 /* Kill the last space. */
1173 --o;
1174
1175 free (words);
1176
1177 return o;
1178 }
1179
1180 /*
1181 $(if condition,true-part[,false-part])
1182
1183 CONDITION is false iff it evaluates to an empty string. White
1184 space before and after condition are stripped before evaluation.
1185
1186 If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is
1187 evaluated (if it exists). Because only one of the two PARTs is evaluated,
1188 you can use $(if ...) to create side-effects (with $(shell ...), for
1189 example).
1190 */
1191
1192 static char *
func_if(char * o,char ** argv,const char * funcname UNUSED)1193 func_if (char *o, char **argv, const char *funcname UNUSED)
1194 {
1195 const char *begp = argv[0];
1196 const char *endp = begp + strlen (argv[0]) - 1;
1197 int result = 0;
1198
1199 /* Find the result of the condition: if we have a value, and it's not
1200 empty, the condition is true. If we don't have a value, or it's the
1201 empty string, then it's false. */
1202
1203 strip_whitespace (&begp, &endp);
1204
1205 if (begp <= endp)
1206 {
1207 char *expansion = expand_argument (begp, endp+1);
1208
1209 result = strlen (expansion);
1210 free (expansion);
1211 }
1212
1213 /* If the result is true (1) we want to eval the first argument, and if
1214 it's false (0) we want to eval the second. If the argument doesn't
1215 exist we do nothing, otherwise expand it and add to the buffer. */
1216
1217 argv += 1 + !result;
1218
1219 if (argv[0])
1220 {
1221 char *expansion;
1222
1223 expansion = expand_argument (argv[0], NULL);
1224
1225 o = variable_buffer_output (o, expansion, strlen (expansion));
1226
1227 free (expansion);
1228 }
1229
1230 return o;
1231 }
1232
1233 /*
1234 $(or condition1[,condition2[,condition3[...]]])
1235
1236 A CONDITION is false iff it evaluates to an empty string. White
1237 space before and after CONDITION are stripped before evaluation.
1238
1239 CONDITION1 is evaluated. If it's true, then this is the result of
1240 expansion. If it's false, CONDITION2 is evaluated, and so on. If none of
1241 the conditions are true, the expansion is the empty string.
1242
1243 Once a CONDITION is true no further conditions are evaluated
1244 (short-circuiting).
1245 */
1246
1247 static char *
func_or(char * o,char ** argv,const char * funcname UNUSED)1248 func_or (char *o, char **argv, const char *funcname UNUSED)
1249 {
1250 for ( ; *argv ; ++argv)
1251 {
1252 const char *begp = *argv;
1253 const char *endp = begp + strlen (*argv) - 1;
1254 char *expansion;
1255 int result = 0;
1256
1257 /* Find the result of the condition: if it's false keep going. */
1258
1259 strip_whitespace (&begp, &endp);
1260
1261 if (begp > endp)
1262 continue;
1263
1264 expansion = expand_argument (begp, endp+1);
1265 result = strlen (expansion);
1266
1267 /* If the result is false keep going. */
1268 if (!result)
1269 {
1270 free (expansion);
1271 continue;
1272 }
1273
1274 /* It's true! Keep this result and return. */
1275 o = variable_buffer_output (o, expansion, result);
1276 free (expansion);
1277 break;
1278 }
1279
1280 return o;
1281 }
1282
1283 /*
1284 $(and condition1[,condition2[,condition3[...]]])
1285
1286 A CONDITION is false iff it evaluates to an empty string. White
1287 space before and after CONDITION are stripped before evaluation.
1288
1289 CONDITION1 is evaluated. If it's false, then this is the result of
1290 expansion. If it's true, CONDITION2 is evaluated, and so on. If all of
1291 the conditions are true, the expansion is the result of the last condition.
1292
1293 Once a CONDITION is false no further conditions are evaluated
1294 (short-circuiting).
1295 */
1296
1297 static char *
func_and(char * o,char ** argv,const char * funcname UNUSED)1298 func_and (char *o, char **argv, const char *funcname UNUSED)
1299 {
1300 char *expansion;
1301 int result;
1302
1303 while (1)
1304 {
1305 const char *begp = *argv;
1306 const char *endp = begp + strlen (*argv) - 1;
1307
1308 /* An empty condition is always false. */
1309 strip_whitespace (&begp, &endp);
1310 if (begp > endp)
1311 return o;
1312
1313 expansion = expand_argument (begp, endp+1);
1314 result = strlen (expansion);
1315
1316 /* If the result is false, stop here: we're done. */
1317 if (!result)
1318 break;
1319
1320 /* Otherwise the result is true. If this is the last one, keep this
1321 result and quit. Otherwise go on to the next one! */
1322
1323 if (*(++argv))
1324 free (expansion);
1325 else
1326 {
1327 o = variable_buffer_output (o, expansion, result);
1328 break;
1329 }
1330 }
1331
1332 free (expansion);
1333
1334 return o;
1335 }
1336
1337 static char *
func_wildcard(char * o,char ** argv,const char * funcname UNUSED)1338 func_wildcard (char *o, char **argv, const char *funcname UNUSED)
1339 {
1340
1341 #ifdef _AMIGA
1342 o = wildcard_expansion (argv[0], o);
1343 #else
1344 char *p = string_glob (argv[0]);
1345 o = variable_buffer_output (o, p, strlen (p));
1346 #endif
1347 return o;
1348 }
1349
1350 /*
1351 $(eval <makefile string>)
1352
1353 Always resolves to the empty string.
1354
1355 Treat the arguments as a segment of makefile, and parse them.
1356 */
1357
1358 static char *
func_eval(char * o,char ** argv,const char * funcname UNUSED)1359 func_eval (char *o, char **argv, const char *funcname UNUSED)
1360 {
1361 char *buf;
1362 unsigned int len;
1363
1364 /* Eval the buffer. Pop the current variable buffer setting so that the
1365 eval'd code can use its own without conflicting. */
1366
1367 install_variable_buffer (&buf, &len);
1368
1369 eval_buffer (argv[0]);
1370
1371 restore_variable_buffer (buf, len);
1372
1373 return o;
1374 }
1375
1376
1377 static char *
func_value(char * o,char ** argv,const char * funcname UNUSED)1378 func_value (char *o, char **argv, const char *funcname UNUSED)
1379 {
1380 /* Look up the variable. */
1381 struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
1382
1383 /* Copy its value into the output buffer without expanding it. */
1384 if (v)
1385 o = variable_buffer_output (o, v->value, strlen(v->value));
1386
1387 return o;
1388 }
1389
1390 /*
1391 \r is replaced on UNIX as well. Is this desirable?
1392 */
1393 static void
fold_newlines(char * buffer,unsigned int * length)1394 fold_newlines (char *buffer, unsigned int *length)
1395 {
1396 char *dst = buffer;
1397 char *src = buffer;
1398 char *last_nonnl = buffer -1;
1399 src[*length] = 0;
1400 for (; *src != '\0'; ++src)
1401 {
1402 if (src[0] == '\r' && src[1] == '\n')
1403 continue;
1404 if (*src == '\n')
1405 {
1406 *dst++ = ' ';
1407 }
1408 else
1409 {
1410 last_nonnl = dst;
1411 *dst++ = *src;
1412 }
1413 }
1414 *(++last_nonnl) = '\0';
1415 *length = last_nonnl - buffer;
1416 }
1417
1418
1419
1420 int shell_function_pid = 0, shell_function_completed;
1421
1422
1423 #ifdef WINDOWS32
1424 /*untested*/
1425
1426 #include <windows.h>
1427 #include <io.h>
1428 #include "sub_proc.h"
1429
1430
1431 void
windows32_openpipe(int * pipedes,int * pid_p,char ** command_argv,char ** envp)1432 windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp)
1433 {
1434 SECURITY_ATTRIBUTES saAttr;
1435 HANDLE hIn;
1436 HANDLE hErr;
1437 HANDLE hChildOutRd;
1438 HANDLE hChildOutWr;
1439 HANDLE hProcess;
1440
1441
1442 saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
1443 saAttr.bInheritHandle = TRUE;
1444 saAttr.lpSecurityDescriptor = NULL;
1445
1446 if (DuplicateHandle (GetCurrentProcess(),
1447 GetStdHandle(STD_INPUT_HANDLE),
1448 GetCurrentProcess(),
1449 &hIn,
1450 0,
1451 TRUE,
1452 DUPLICATE_SAME_ACCESS) == FALSE) {
1453 fatal (NILF, _("create_child_process: DuplicateHandle(In) failed (e=%ld)\n"),
1454 GetLastError());
1455
1456 }
1457 if (DuplicateHandle(GetCurrentProcess(),
1458 GetStdHandle(STD_ERROR_HANDLE),
1459 GetCurrentProcess(),
1460 &hErr,
1461 0,
1462 TRUE,
1463 DUPLICATE_SAME_ACCESS) == FALSE) {
1464 fatal (NILF, _("create_child_process: DuplicateHandle(Err) failed (e=%ld)\n"),
1465 GetLastError());
1466 }
1467
1468 if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0))
1469 fatal (NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
1470
1471 hProcess = process_init_fd(hIn, hChildOutWr, hErr);
1472
1473 if (!hProcess)
1474 fatal (NILF, _("windows32_openpipe (): process_init_fd() failed\n"));
1475
1476 /* make sure that CreateProcess() has Path it needs */
1477 sync_Path_environment();
1478
1479 if (!process_begin(hProcess, command_argv, envp, command_argv[0], NULL)) {
1480 /* register process for wait */
1481 process_register(hProcess);
1482
1483 /* set the pid for returning to caller */
1484 *pid_p = (intptr_t) hProcess;
1485
1486 /* set up to read data from child */
1487 pipedes[0] = _open_osfhandle((intptr_t) hChildOutRd, O_RDONLY);
1488
1489 /* this will be closed almost right away */
1490 pipedes[1] = _open_osfhandle((intptr_t) hChildOutWr, O_APPEND);
1491 } else {
1492 /* reap/cleanup the failed process */
1493 process_cleanup(hProcess);
1494
1495 /* close handles which were duplicated, they weren't used */
1496 CloseHandle(hIn);
1497 CloseHandle(hErr);
1498
1499 /* close pipe handles, they won't be used */
1500 CloseHandle(hChildOutRd);
1501 CloseHandle(hChildOutWr);
1502
1503 /* set status for return */
1504 pipedes[0] = pipedes[1] = -1;
1505 *pid_p = -1;
1506 }
1507 }
1508 #endif
1509
1510
1511 #ifdef __MSDOS__
1512 FILE *
msdos_openpipe(int * pipedes,int * pidp,char * text)1513 msdos_openpipe (int* pipedes, int *pidp, char *text)
1514 {
1515 FILE *fpipe=0;
1516 /* MSDOS can't fork, but it has `popen'. */
1517 struct variable *sh = lookup_variable ("SHELL", 5);
1518 int e;
1519 extern int dos_command_running, dos_status;
1520
1521 /* Make sure not to bother processing an empty line. */
1522 while (isblank ((unsigned char)*text))
1523 ++text;
1524 if (*text == '\0')
1525 return 0;
1526
1527 if (sh)
1528 {
1529 char buf[PATH_MAX + 7];
1530 /* This makes sure $SHELL value is used by $(shell), even
1531 though the target environment is not passed to it. */
1532 sprintf (buf, "SHELL=%s", sh->value);
1533 putenv (buf);
1534 }
1535
1536 e = errno;
1537 errno = 0;
1538 dos_command_running = 1;
1539 dos_status = 0;
1540 /* If dos_status becomes non-zero, it means the child process
1541 was interrupted by a signal, like SIGINT or SIGQUIT. See
1542 fatal_error_signal in commands.c. */
1543 fpipe = popen (text, "rt");
1544 dos_command_running = 0;
1545 if (!fpipe || dos_status)
1546 {
1547 pipedes[0] = -1;
1548 *pidp = -1;
1549 if (dos_status)
1550 errno = EINTR;
1551 else if (errno == 0)
1552 errno = ENOMEM;
1553 shell_function_completed = -1;
1554 }
1555 else
1556 {
1557 pipedes[0] = fileno (fpipe);
1558 *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
1559 errno = e;
1560 shell_function_completed = 1;
1561 }
1562 return fpipe;
1563 }
1564 #endif
1565
1566 /*
1567 Do shell spawning, with the naughty bits for different OSes.
1568 */
1569
1570 #ifdef VMS
1571
1572 /* VMS can't do $(shell ...) */
1573 #define func_shell 0
1574
1575 #else
1576 #ifndef _AMIGA
1577 static char *
func_shell(char * o,char ** argv,const char * funcname UNUSED)1578 func_shell (char *o, char **argv, const char *funcname UNUSED)
1579 {
1580 char* batch_filename = NULL;
1581
1582 #ifdef __MSDOS__
1583 FILE *fpipe;
1584 #endif
1585 char **command_argv;
1586 char *error_prefix;
1587 char **envp;
1588 int pipedes[2];
1589 int pid;
1590
1591 #ifndef __MSDOS__
1592 /* Construct the argument list. */
1593 command_argv = construct_command_argv (argv[0],
1594 (char **) NULL, (struct file *) 0,
1595 &batch_filename);
1596 if (command_argv == 0)
1597 return o;
1598 #endif
1599
1600 /* Using a target environment for `shell' loses in cases like:
1601 export var = $(shell echo foobie)
1602 because target_environment hits a loop trying to expand $(var)
1603 to put it in the environment. This is even more confusing when
1604 var was not explicitly exported, but just appeared in the
1605 calling environment.
1606
1607 envp = target_environment (NILF);
1608 */
1609
1610 envp = environ;
1611
1612 /* For error messages. */
1613 if (reading_file && reading_file->filenm)
1614 {
1615 error_prefix = (char *) alloca (strlen (reading_file->filenm)+11+4);
1616 sprintf (error_prefix,
1617 "%s:%lu: ", reading_file->filenm, reading_file->lineno);
1618 }
1619 else
1620 error_prefix = "";
1621
1622 #ifdef WINDOWS32
1623
1624 windows32_openpipe (pipedes, &pid, command_argv, envp);
1625
1626 if (pipedes[0] < 0) {
1627 /* open of the pipe failed, mark as failed execution */
1628 shell_function_completed = -1;
1629
1630 return o;
1631 } else
1632
1633 #elif defined(__MSDOS__)
1634
1635 fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
1636 if (pipedes[0] < 0)
1637 {
1638 perror_with_name (error_prefix, "pipe");
1639 return o;
1640 }
1641
1642 #else
1643
1644 if (pipe (pipedes) < 0)
1645 {
1646 perror_with_name (error_prefix, "pipe");
1647 return o;
1648 }
1649
1650 # ifdef __EMX__
1651
1652 /* close some handles that are unnecessary for the child process */
1653 CLOSE_ON_EXEC(pipedes[1]);
1654 CLOSE_ON_EXEC(pipedes[0]);
1655 /* Never use fork()/exec() here! Use spawn() instead in exec_command() */
1656 pid = child_execute_job (0, pipedes[1], command_argv, envp);
1657 if (pid < 0)
1658 perror_with_name (error_prefix, "spawn");
1659
1660 # else /* ! __EMX__ */
1661
1662 pid = vfork ();
1663 if (pid < 0)
1664 perror_with_name (error_prefix, "fork");
1665 else if (pid == 0)
1666 child_execute_job (0, pipedes[1], command_argv, envp);
1667 else
1668
1669 # endif
1670
1671 #endif
1672 {
1673 /* We are the parent. */
1674 char *buffer;
1675 unsigned int maxlen, i;
1676 int cc;
1677
1678 /* Record the PID for reap_children. */
1679 shell_function_pid = pid;
1680 #ifndef __MSDOS__
1681 shell_function_completed = 0;
1682
1683 /* Free the storage only the child needed. */
1684 free (command_argv[0]);
1685 free ((char *) command_argv);
1686
1687 /* Close the write side of the pipe. */
1688 (void) close (pipedes[1]);
1689 #endif
1690
1691 /* Set up and read from the pipe. */
1692
1693 maxlen = 200;
1694 buffer = (char *) xmalloc (maxlen + 1);
1695
1696 /* Read from the pipe until it gets EOF. */
1697 for (i = 0; ; i += cc)
1698 {
1699 if (i == maxlen)
1700 {
1701 maxlen += 512;
1702 buffer = (char *) xrealloc (buffer, maxlen + 1);
1703 }
1704
1705 EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i));
1706 if (cc <= 0)
1707 break;
1708 }
1709 buffer[i] = '\0';
1710
1711 /* Close the read side of the pipe. */
1712 #ifdef __MSDOS__
1713 if (fpipe)
1714 (void) pclose (fpipe);
1715 #else
1716 (void) close (pipedes[0]);
1717 #endif
1718
1719 /* Loop until child_handler or reap_children() sets
1720 shell_function_completed to the status of our child shell. */
1721 while (shell_function_completed == 0)
1722 reap_children (1, 0);
1723
1724 if (batch_filename) {
1725 DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"),
1726 batch_filename));
1727 remove (batch_filename);
1728 free (batch_filename);
1729 }
1730 shell_function_pid = 0;
1731
1732 /* The child_handler function will set shell_function_completed
1733 to 1 when the child dies normally, or to -1 if it
1734 dies with status 127, which is most likely an exec fail. */
1735
1736 if (shell_function_completed == -1)
1737 {
1738 /* This likely means that the execvp failed, so we should just
1739 write the error message in the pipe from the child. */
1740 fputs (buffer, stderr);
1741 fflush (stderr);
1742 }
1743 else
1744 {
1745 /* The child finished normally. Replace all newlines in its output
1746 with spaces, and put that in the variable output buffer. */
1747 fold_newlines (buffer, &i);
1748 o = variable_buffer_output (o, buffer, i);
1749 }
1750
1751 free (buffer);
1752 }
1753
1754 return o;
1755 }
1756
1757 #else /* _AMIGA */
1758
1759 /* Do the Amiga version of func_shell. */
1760
1761 static char *
func_shell(char * o,char ** argv,const char * funcname)1762 func_shell (char *o, char **argv, const char *funcname)
1763 {
1764 /* Amiga can't fork nor spawn, but I can start a program with
1765 redirection of my choice. However, this means that we
1766 don't have an opportunity to reopen stdout to trap it. Thus,
1767 we save our own stdout onto a new descriptor and dup a temp
1768 file's descriptor onto our stdout temporarily. After we
1769 spawn the shell program, we dup our own stdout back to the
1770 stdout descriptor. The buffer reading is the same as above,
1771 except that we're now reading from a file. */
1772
1773 #include <dos/dos.h>
1774 #include <proto/dos.h>
1775
1776 BPTR child_stdout;
1777 char tmp_output[FILENAME_MAX];
1778 unsigned int maxlen = 200, i;
1779 int cc;
1780 char * buffer, * ptr;
1781 char ** aptr;
1782 int len = 0;
1783 char* batch_filename = NULL;
1784
1785 /* Construct the argument list. */
1786 command_argv = construct_command_argv (argv[0], (char **) NULL,
1787 (struct file *) 0, &batch_filename);
1788 if (command_argv == 0)
1789 return o;
1790
1791 /* Note the mktemp() is a security hole, but this only runs on Amiga.
1792 Ideally we would use main.c:open_tmpfile(), but this uses a special
1793 Open(), not fopen(), and I'm not familiar enough with the code to mess
1794 with it. */
1795 strcpy (tmp_output, "t:MakeshXXXXXXXX");
1796 mktemp (tmp_output);
1797 child_stdout = Open (tmp_output, MODE_NEWFILE);
1798
1799 for (aptr=command_argv; *aptr; aptr++)
1800 len += strlen (*aptr) + 1;
1801
1802 buffer = xmalloc (len + 1);
1803 ptr = buffer;
1804
1805 for (aptr=command_argv; *aptr; aptr++)
1806 {
1807 strcpy (ptr, *aptr);
1808 ptr += strlen (ptr) + 1;
1809 *ptr ++ = ' ';
1810 *ptr = 0;
1811 }
1812
1813 ptr[-1] = '\n';
1814
1815 Execute (buffer, NULL, child_stdout);
1816 free (buffer);
1817
1818 Close (child_stdout);
1819
1820 child_stdout = Open (tmp_output, MODE_OLDFILE);
1821
1822 buffer = xmalloc (maxlen);
1823 i = 0;
1824 do
1825 {
1826 if (i == maxlen)
1827 {
1828 maxlen += 512;
1829 buffer = (char *) xrealloc (buffer, maxlen + 1);
1830 }
1831
1832 cc = Read (child_stdout, &buffer[i], maxlen - i);
1833 if (cc > 0)
1834 i += cc;
1835 } while (cc > 0);
1836
1837 Close (child_stdout);
1838
1839 fold_newlines (buffer, &i);
1840 o = variable_buffer_output (o, buffer, i);
1841 free (buffer);
1842 return o;
1843 }
1844 #endif /* _AMIGA */
1845 #endif /* !VMS */
1846
1847 #ifdef EXPERIMENTAL
1848
1849 /*
1850 equality. Return is string-boolean, ie, the empty string is false.
1851 */
1852 static char *
func_eq(char * o,char ** argv,char * funcname)1853 func_eq (char *o, char **argv, char *funcname)
1854 {
1855 int result = ! strcmp (argv[0], argv[1]);
1856 o = variable_buffer_output (o, result ? "1" : "", result);
1857 return o;
1858 }
1859
1860
1861 /*
1862 string-boolean not operator.
1863 */
1864 static char *
func_not(char * o,char ** argv,char * funcname)1865 func_not (char *o, char **argv, char *funcname)
1866 {
1867 char *s = argv[0];
1868 int result = 0;
1869 while (isspace ((unsigned char)*s))
1870 s++;
1871 result = ! (*s);
1872 o = variable_buffer_output (o, result ? "1" : "", result);
1873 return o;
1874 }
1875 #endif
1876
1877
1878 /* Return the absolute name of file NAME which does not contain any `.',
1879 `..' components nor any repeated path separators ('/'). */
1880
1881 static char *
abspath(const char * name,char * apath)1882 abspath (const char *name, char *apath)
1883 {
1884 char *dest;
1885 const char *start, *end, *apath_limit;
1886
1887 if (name[0] == '\0' || apath == NULL)
1888 return NULL;
1889
1890 apath_limit = apath + GET_PATH_MAX;
1891
1892 if (name[0] != '/')
1893 {
1894 /* It is unlikely we would make it until here but just to make sure. */
1895 if (!starting_directory)
1896 return NULL;
1897
1898 strcpy (apath, starting_directory);
1899
1900 dest = strchr (apath, '\0');
1901 }
1902 else
1903 {
1904 apath[0] = '/';
1905 dest = apath + 1;
1906 }
1907
1908 for (start = end = name; *start != '\0'; start = end)
1909 {
1910 unsigned long len;
1911
1912 /* Skip sequence of multiple path-separators. */
1913 while (*start == '/')
1914 ++start;
1915
1916 /* Find end of path component. */
1917 for (end = start; *end != '\0' && *end != '/'; ++end)
1918 ;
1919
1920 len = end - start;
1921
1922 if (len == 0)
1923 break;
1924 else if (len == 1 && start[0] == '.')
1925 /* nothing */;
1926 else if (len == 2 && start[0] == '.' && start[1] == '.')
1927 {
1928 /* Back up to previous component, ignore if at root already. */
1929 if (dest > apath + 1)
1930 while ((--dest)[-1] != '/');
1931 }
1932 else
1933 {
1934 if (dest[-1] != '/')
1935 *dest++ = '/';
1936
1937 if (dest + len >= apath_limit)
1938 return NULL;
1939
1940 dest = memcpy (dest, start, len);
1941 dest += len;
1942 *dest = '\0';
1943 }
1944 }
1945
1946 /* Unless it is root strip trailing separator. */
1947 if (dest > apath + 1 && dest[-1] == '/')
1948 --dest;
1949
1950 *dest = '\0';
1951
1952 return apath;
1953 }
1954
1955
1956 static char *
func_realpath(char * o,char ** argv,const char * funcname UNUSED)1957 func_realpath (char *o, char **argv, const char *funcname UNUSED)
1958 {
1959 /* Expand the argument. */
1960 char *p = argv[0];
1961 char *path = 0;
1962 int doneany = 0;
1963 unsigned int len = 0;
1964 PATH_VAR (in);
1965 PATH_VAR (out);
1966
1967 while ((path = find_next_token (&p, &len)) != 0)
1968 {
1969 if (len < GET_PATH_MAX)
1970 {
1971 strncpy (in, path, len);
1972 in[len] = '\0';
1973
1974 if
1975 (
1976 #ifdef HAVE_REALPATH
1977 realpath (in, out)
1978 #else
1979 abspath (in, out)
1980 #endif
1981 )
1982 {
1983 o = variable_buffer_output (o, out, strlen (out));
1984 o = variable_buffer_output (o, " ", 1);
1985 doneany = 1;
1986 }
1987 }
1988 }
1989
1990 /* Kill last space. */
1991 if (doneany)
1992 --o;
1993
1994 return o;
1995 }
1996
1997 static char *
func_abspath(char * o,char ** argv,const char * funcname UNUSED)1998 func_abspath (char *o, char **argv, const char *funcname UNUSED)
1999 {
2000 /* Expand the argument. */
2001 char *p = argv[0];
2002 char *path = 0;
2003 int doneany = 0;
2004 unsigned int len = 0;
2005 PATH_VAR (in);
2006 PATH_VAR (out);
2007
2008 while ((path = find_next_token (&p, &len)) != 0)
2009 {
2010 if (len < GET_PATH_MAX)
2011 {
2012 strncpy (in, path, len);
2013 in[len] = '\0';
2014
2015 if (abspath (in, out))
2016 {
2017 o = variable_buffer_output (o, out, strlen (out));
2018 o = variable_buffer_output (o, " ", 1);
2019 doneany = 1;
2020 }
2021 }
2022 }
2023
2024 /* Kill last space. */
2025 if (doneany)
2026 --o;
2027
2028 return o;
2029 }
2030
2031 /* Lookup table for builtin functions.
2032
2033 This doesn't have to be sorted; we use a straight lookup. We might gain
2034 some efficiency by moving most often used functions to the start of the
2035 table.
2036
2037 If MAXIMUM_ARGS is 0, that means there is no maximum and all
2038 comma-separated values are treated as arguments.
2039
2040 EXPAND_ARGS means that all arguments should be expanded before invocation.
2041 Functions that do namespace tricks (foreach) don't automatically expand. */
2042
2043 static char *func_call PARAMS ((char *o, char **argv, const char *funcname));
2044
2045
2046 static struct function_table_entry function_table_init[] =
2047 {
2048 /* Name/size */ /* MIN MAX EXP? Function */
2049 { STRING_SIZE_TUPLE("abspath"), 0, 1, 1, func_abspath},
2050 { STRING_SIZE_TUPLE("addprefix"), 2, 2, 1, func_addsuffix_addprefix},
2051 { STRING_SIZE_TUPLE("addsuffix"), 2, 2, 1, func_addsuffix_addprefix},
2052 { STRING_SIZE_TUPLE("basename"), 0, 1, 1, func_basename_dir},
2053 { STRING_SIZE_TUPLE("dir"), 0, 1, 1, func_basename_dir},
2054 { STRING_SIZE_TUPLE("notdir"), 0, 1, 1, func_notdir_suffix},
2055 { STRING_SIZE_TUPLE("subst"), 3, 3, 1, func_subst},
2056 { STRING_SIZE_TUPLE("suffix"), 0, 1, 1, func_notdir_suffix},
2057 { STRING_SIZE_TUPLE("filter"), 2, 2, 1, func_filter_filterout},
2058 { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout},
2059 { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring},
2060 { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword},
2061 { STRING_SIZE_TUPLE("flavor"), 0, 1, 1, func_flavor},
2062 { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join},
2063 { STRING_SIZE_TUPLE("lastword"), 0, 1, 1, func_lastword},
2064 { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst},
2065 { STRING_SIZE_TUPLE("realpath"), 0, 1, 1, func_realpath},
2066 { STRING_SIZE_TUPLE("shell"), 0, 1, 1, func_shell},
2067 { STRING_SIZE_TUPLE("sort"), 0, 1, 1, func_sort},
2068 { STRING_SIZE_TUPLE("strip"), 0, 1, 1, func_strip},
2069 { STRING_SIZE_TUPLE("wildcard"), 0, 1, 1, func_wildcard},
2070 { STRING_SIZE_TUPLE("word"), 2, 2, 1, func_word},
2071 { STRING_SIZE_TUPLE("wordlist"), 3, 3, 1, func_wordlist},
2072 { STRING_SIZE_TUPLE("words"), 0, 1, 1, func_words},
2073 { STRING_SIZE_TUPLE("origin"), 0, 1, 1, func_origin},
2074 { STRING_SIZE_TUPLE("foreach"), 3, 3, 0, func_foreach},
2075 { STRING_SIZE_TUPLE("call"), 1, 0, 1, func_call},
2076 { STRING_SIZE_TUPLE("info"), 0, 1, 1, func_error},
2077 { STRING_SIZE_TUPLE("error"), 0, 1, 1, func_error},
2078 { STRING_SIZE_TUPLE("warning"), 0, 1, 1, func_error},
2079 { STRING_SIZE_TUPLE("if"), 2, 3, 0, func_if},
2080 { STRING_SIZE_TUPLE("or"), 1, 0, 0, func_or},
2081 { STRING_SIZE_TUPLE("and"), 1, 0, 0, func_and},
2082 { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value},
2083 { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval},
2084 #ifdef EXPERIMENTAL
2085 { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq},
2086 { STRING_SIZE_TUPLE("not"), 0, 1, 1, func_not},
2087 #endif
2088 };
2089
2090 #define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry))
2091
2092
2093 /* These must come after the definition of function_table. */
2094
2095 static char *
expand_builtin_function(char * o,int argc,char ** argv,const struct function_table_entry * entry_p)2096 expand_builtin_function (char *o, int argc, char **argv,
2097 const struct function_table_entry *entry_p)
2098 {
2099 if (argc < (int)entry_p->minimum_args)
2100 fatal (*expanding_var,
2101 _("insufficient number of arguments (%d) to function `%s'"),
2102 argc, entry_p->name);
2103
2104 /* I suppose technically some function could do something with no
2105 arguments, but so far none do, so just test it for all functions here
2106 rather than in each one. We can change it later if necessary. */
2107
2108 if (!argc)
2109 return o;
2110
2111 if (!entry_p->func_ptr)
2112 fatal (*expanding_var,
2113 _("unimplemented on this platform: function `%s'"), entry_p->name);
2114
2115 return entry_p->func_ptr (o, argv, entry_p->name);
2116 }
2117
2118 /* Check for a function invocation in *STRINGP. *STRINGP points at the
2119 opening ( or { and is not null-terminated. If a function invocation
2120 is found, expand it into the buffer at *OP, updating *OP, incrementing
2121 *STRINGP past the reference and returning nonzero. If not, return zero. */
2122
2123 int
handle_function(char ** op,char ** stringp)2124 handle_function (char **op, char **stringp)
2125 {
2126 const struct function_table_entry *entry_p;
2127 char openparen = (*stringp)[0];
2128 char closeparen = openparen == '(' ? ')' : '}';
2129 char *beg;
2130 char *end;
2131 int count = 0;
2132 register char *p;
2133 char **argv, **argvp;
2134 int nargs;
2135
2136 beg = *stringp + 1;
2137
2138 entry_p = lookup_function (beg);
2139
2140 if (!entry_p)
2141 return 0;
2142
2143 /* We found a builtin function. Find the beginning of its arguments (skip
2144 whitespace after the name). */
2145
2146 beg = next_token (beg + entry_p->len);
2147
2148 /* Find the end of the function invocation, counting nested use of
2149 whichever kind of parens we use. Since we're looking, count commas
2150 to get a rough estimate of how many arguments we might have. The
2151 count might be high, but it'll never be low. */
2152
2153 for (nargs=1, end=beg; *end != '\0'; ++end)
2154 if (*end == ',')
2155 ++nargs;
2156 else if (*end == openparen)
2157 ++count;
2158 else if (*end == closeparen && --count < 0)
2159 break;
2160
2161 if (count >= 0)
2162 fatal (*expanding_var,
2163 _("unterminated call to function `%s': missing `%c'"),
2164 entry_p->name, closeparen);
2165
2166 *stringp = end;
2167
2168 /* Get some memory to store the arg pointers. */
2169 argvp = argv = (char **) alloca (sizeof (char *) * (nargs + 2));
2170
2171 /* Chop the string into arguments, then a nul. As soon as we hit
2172 MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the
2173 last argument.
2174
2175 If we're expanding, store pointers to the expansion of each one. If
2176 not, make a duplicate of the string and point into that, nul-terminating
2177 each argument. */
2178
2179 if (!entry_p->expand_args)
2180 {
2181 int len = end - beg;
2182
2183 p = xmalloc (len+1);
2184 memcpy (p, beg, len);
2185 p[len] = '\0';
2186 beg = p;
2187 end = beg + len;
2188 }
2189
2190 for (p=beg, nargs=0; p <= end; ++argvp)
2191 {
2192 char *next;
2193
2194 ++nargs;
2195
2196 if (nargs == entry_p->maximum_args
2197 || (! (next = find_next_argument (openparen, closeparen, p, end))))
2198 next = end;
2199
2200 if (entry_p->expand_args)
2201 *argvp = expand_argument (p, next);
2202 else
2203 {
2204 *argvp = p;
2205 *next = '\0';
2206 }
2207
2208 p = next + 1;
2209 }
2210 *argvp = NULL;
2211
2212 /* Finally! Run the function... */
2213 *op = expand_builtin_function (*op, nargs, argv, entry_p);
2214
2215 /* Free memory. */
2216 if (entry_p->expand_args)
2217 for (argvp=argv; *argvp != 0; ++argvp)
2218 free (*argvp);
2219 else
2220 free (beg);
2221
2222 return 1;
2223 }
2224
2225
2226 /* User-defined functions. Expand the first argument as either a builtin
2227 function or a make variable, in the context of the rest of the arguments
2228 assigned to $1, $2, ... $N. $0 is the name of the function. */
2229
2230 static char *
func_call(char * o,char ** argv,const char * funcname UNUSED)2231 func_call (char *o, char **argv, const char *funcname UNUSED)
2232 {
2233 static int max_args = 0;
2234 char *fname;
2235 char *cp;
2236 char *body;
2237 int flen;
2238 int i;
2239 int saved_args;
2240 const struct function_table_entry *entry_p;
2241 struct variable *v;
2242
2243 /* There is no way to define a variable with a space in the name, so strip
2244 leading and trailing whitespace as a favor to the user. */
2245 fname = argv[0];
2246 while (*fname != '\0' && isspace ((unsigned char)*fname))
2247 ++fname;
2248
2249 cp = fname + strlen (fname) - 1;
2250 while (cp > fname && isspace ((unsigned char)*cp))
2251 --cp;
2252 cp[1] = '\0';
2253
2254 /* Calling nothing is a no-op */
2255 if (*fname == '\0')
2256 return o;
2257
2258 /* Are we invoking a builtin function? */
2259
2260 entry_p = lookup_function (fname);
2261
2262 if (entry_p)
2263 {
2264 /* How many arguments do we have? */
2265 for (i=0; argv[i+1]; ++i)
2266 ;
2267
2268 return expand_builtin_function (o, i, argv+1, entry_p);
2269 }
2270
2271 /* Not a builtin, so the first argument is the name of a variable to be
2272 expanded and interpreted as a function. Find it. */
2273 flen = strlen (fname);
2274
2275 v = lookup_variable (fname, flen);
2276
2277 if (v == 0)
2278 warn_undefined (fname, flen);
2279
2280 if (v == 0 || *v->value == '\0')
2281 return o;
2282
2283 body = (char *) alloca (flen + 4);
2284 body[0] = '$';
2285 body[1] = '(';
2286 memcpy (body + 2, fname, flen);
2287 body[flen+2] = ')';
2288 body[flen+3] = '\0';
2289
2290 /* Set up arguments $(1) .. $(N). $(0) is the function name. */
2291
2292 push_new_variable_scope ();
2293
2294 for (i=0; *argv; ++i, ++argv)
2295 {
2296 char num[11];
2297
2298 sprintf (num, "%d", i);
2299 define_variable (num, strlen (num), *argv, o_automatic, 0);
2300 }
2301
2302 /* If the number of arguments we have is < max_args, it means we're inside
2303 a recursive invocation of $(call ...). Fill in the remaining arguments
2304 in the new scope with the empty value, to hide them from this
2305 invocation. */
2306
2307 for (; i < max_args; ++i)
2308 {
2309 char num[11];
2310
2311 sprintf (num, "%d", i);
2312 define_variable (num, strlen (num), "", o_automatic, 0);
2313 }
2314
2315 /* Expand the body in the context of the arguments, adding the result to
2316 the variable buffer. */
2317
2318 v->exp_count = EXP_COUNT_MAX;
2319
2320 saved_args = max_args;
2321 max_args = i;
2322 o = variable_expand_string (o, body, flen+3);
2323 max_args = saved_args;
2324
2325 v->exp_count = 0;
2326
2327 pop_variable_scope ();
2328
2329 return o + strlen (o);
2330 }
2331
2332 void
hash_init_function_table(void)2333 hash_init_function_table (void)
2334 {
2335 hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2,
2336 function_table_entry_hash_1, function_table_entry_hash_2,
2337 function_table_entry_hash_cmp);
2338 hash_load (&function_table, function_table_init,
2339 FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry));
2340 }
2341