VirtualBox

source: kBuild/trunk/src/gmakenew/read.c@ 920

Last change on this file since 920 was 919, checked in by bird, 18 years ago

Avoid LOCALEDIR, ALIASDIR, LIBDIR and INCLUDEDIR.

  • Property svn:eol-style set to native
File size: 93.2 KB
Line 
1/* Reading and parsing of makefiles 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
21#include <assert.h>
22
23#include <glob.h>
24
25#include "dep.h"
26#include "filedef.h"
27#include "job.h"
28#include "commands.h"
29#include "variable.h"
30#include "rule.h"
31#include "debug.h"
32#include "hash.h"
33#ifdef KMK
34# include "kbuild.h"
35#endif
36
37
38#ifndef WINDOWS32
39#ifndef _AMIGA
40#ifndef VMS
41#include <pwd.h>
42#else
43struct passwd *getpwnam (char *name);
44#endif
45#endif
46#endif /* !WINDOWS32 */
47
48/* A 'struct ebuffer' controls the origin of the makefile we are currently
49 eval'ing.
50*/
51
52struct ebuffer
53 {
54 char *buffer; /* Start of the current line in the buffer. */
55 char *bufnext; /* Start of the next line in the buffer. */
56 char *bufstart; /* Start of the entire buffer. */
57 unsigned int size; /* Malloc'd size of buffer. */
58 FILE *fp; /* File, or NULL if this is an internal buffer. */
59 struct floc floc; /* Info on the file in fp (if any). */
60 };
61
62/* Types of "words" that can be read in a makefile. */
63enum make_word_type
64 {
65 w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon,
66 w_varassign
67 };
68
69
70/* A `struct conditionals' contains the information describing
71 all the active conditionals in a makefile.
72
73 The global variable `conditionals' contains the conditionals
74 information for the current makefile. It is initialized from
75 the static structure `toplevel_conditionals' and is later changed
76 to new structures for included makefiles. */
77
78struct conditionals
79 {
80 unsigned int if_cmds; /* Depth of conditional nesting. */
81 unsigned int allocated; /* Elts allocated in following arrays. */
82 char *ignoring; /* Are we ignoring or interpreting?
83 0=interpreting, 1=not yet interpreted,
84 2=already interpreted */
85 char *seen_else; /* Have we already seen an `else'? */
86 };
87
88static struct conditionals toplevel_conditionals;
89static struct conditionals *conditionals = &toplevel_conditionals;
90
91
92/* Default directories to search for include files in */
93
94static const char *default_include_directories[] =
95 {
96#ifndef KMK
97#if defined(WINDOWS32) && !defined(INCLUDEDIR)
98/* This completely up to the user when they install MSVC or other packages.
99 This is defined as a placeholder. */
100# define INCLUDEDIR "."
101#endif
102# ifdef INCLUDEDIR /* bird */
103 INCLUDEDIR,
104# else /* bird */
105 ".", /* bird */
106# endif /* bird */
107#ifndef _AMIGA
108 "/usr/gnu/include",
109 "/usr/local/include",
110 "/usr/include",
111#endif
112#endif /* !KMK */
113 0
114 };
115
116/* List of directories to search for include files in */
117
118static const char **include_directories;
119
120/* Maximum length of an element of the above. */
121
122static unsigned int max_incl_len;
123
124/* The filename and pointer to line number of the
125 makefile currently being read in. */
126
127const struct floc *reading_file = 0;
128
129/* The chain of makefiles read by read_makefile. */
130
131static struct dep *read_makefiles = 0;
132
133static int eval_makefile (const char *filename, int flags);
134static int eval (struct ebuffer *buffer, int flags);
135
136static long readline (struct ebuffer *ebuf);
137static void do_define (char *name, unsigned int namelen,
138 enum variable_origin origin, struct ebuffer *ebuf);
139static int conditional_line (char *line, int len, const struct floc *flocp);
140static void record_files (struct nameseq *filenames, const char *pattern,
141 const char *pattern_percent, struct dep *deps,
142 unsigned int cmds_started, char *commands,
143 unsigned int commands_idx, int two_colon,
144 const struct floc *flocp);
145static void record_target_var (struct nameseq *filenames, char *defn,
146 enum variable_origin origin, int enabled,
147 const struct floc *flocp);
148static enum make_word_type get_next_mword (char *buffer, char *delim,
149 char **startp, unsigned int *length);
150static void remove_comments (char *line);
151static char *find_char_unquote (char *string, int stop1, int stop2,
152 int blank, int ignorevars);
153
154
155/* Read in all the makefiles and return the chain of their names. */
156
157struct dep *
158read_all_makefiles (const char **makefiles)
159{
160 unsigned int num_makefiles = 0;
161
162 /* Create *_LIST variables, to hold the makefiles, targets, and variables
163 we will be reading. */
164
165 define_variable ("MAKEFILE_LIST", sizeof ("MAKEFILE_LIST")-1, "", o_file, 0);
166
167 DB (DB_BASIC, (_("Reading makefiles...\n")));
168
169 /* If there's a non-null variable MAKEFILES, its value is a list of
170 files to read first thing. But don't let it prevent reading the
171 default makefiles and don't let the default goal come from there. */
172
173 {
174 char *value;
175 char *name, *p;
176 unsigned int length;
177
178 {
179 /* Turn off --warn-undefined-variables while we expand MAKEFILES. */
180 int save = warn_undefined_variables_flag;
181 warn_undefined_variables_flag = 0;
182
183 value = allocated_variable_expand ("$(MAKEFILES)");
184
185 warn_undefined_variables_flag = save;
186 }
187
188 /* Set NAME to the start of next token and LENGTH to its length.
189 MAKEFILES is updated for finding remaining tokens. */
190 p = value;
191
192 while ((name = find_next_token ((const char **)&p, &length)) != 0)
193 {
194 if (*p != '\0')
195 *p++ = '\0';
196 eval_makefile (name, RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE);
197 }
198
199 free (value);
200 }
201
202 /* Read makefiles specified with -f switches. */
203
204 if (makefiles != 0)
205 while (*makefiles != 0)
206 {
207 struct dep *tail = read_makefiles;
208 register struct dep *d;
209
210 if (! eval_makefile (*makefiles, 0))
211 perror_with_name ("", *makefiles);
212
213 /* Find the right element of read_makefiles. */
214 d = read_makefiles;
215 while (d->next != tail)
216 d = d->next;
217
218 /* Use the storage read_makefile allocates. */
219 *makefiles = dep_name (d);
220 ++num_makefiles;
221 ++makefiles;
222 }
223
224 /* If there were no -f switches, try the default names. */
225
226 if (num_makefiles == 0)
227 {
228 static char *default_makefiles[] =
229#ifdef VMS
230 /* all lower case since readdir() (the vms version) 'lowercasifies' */
231# ifdef KMK
232 { "makefile.kmk", "makefile.vms", "gnumakefile.", "makefile.", 0 };
233# else
234 { "makefile.vms", "gnumakefile.", "makefile.", 0 };
235# endif
236#else
237#ifdef _AMIGA
238 /* what's the deal here? no dots? */
239# ifdef KMK
240 { "Makefile.kmk", "makefile.kmk", "GNUmakefile", "Makefile", "SMakefile", 0 };
241# else
242 { "GNUmakefile", "Makefile", "SMakefile", 0 };
243# endif
244#else /* !Amiga && !VMS */
245# ifdef KMK
246 { "Makefile.kmk", "makefile.kmk", "GNUmakefile", "makefile", "Makefile", 0 };
247# else
248 { "GNUmakefile", "makefile", "Makefile", 0 };
249# endif
250#endif /* AMIGA */
251#endif /* VMS */
252 register char **p = default_makefiles;
253 while (*p != 0 && !file_exists_p (*p))
254 ++p;
255
256 if (*p != 0)
257 {
258 if (! eval_makefile (*p, 0))
259 perror_with_name ("", *p);
260 }
261 else
262 {
263 /* No default makefile was found. Add the default makefiles to the
264 `read_makefiles' chain so they will be updated if possible. */
265 struct dep *tail = read_makefiles;
266 /* Add them to the tail, after any MAKEFILES variable makefiles. */
267 while (tail != 0 && tail->next != 0)
268 tail = tail->next;
269 for (p = default_makefiles; *p != 0; ++p)
270 {
271 struct dep *d = alloc_dep ();
272 d->file = enter_file (strcache_add (*p));
273 d->file->dontcare = 1;
274 /* Tell update_goal_chain to bail out as soon as this file is
275 made, and main not to die if we can't make this file. */
276 d->changed = RM_DONTCARE;
277 if (tail == 0)
278 read_makefiles = d;
279 else
280 tail->next = d;
281 tail = d;
282 }
283 if (tail != 0)
284 tail->next = 0;
285 }
286 }
287
288 return read_makefiles;
289}
290
291
292/* Install a new conditional and return the previous one. */
293
294static struct conditionals *
295install_conditionals (struct conditionals *new)
296{
297 struct conditionals *save = conditionals;
298
299 memset (new, '\0', sizeof (*new));
300 conditionals = new;
301
302 return save;
303}
304
305/* Free the current conditionals and reinstate a saved one. */
306
307static void
308restore_conditionals (struct conditionals *saved)
309{
310 /* Free any space allocated by conditional_line. */
311 if (conditionals->ignoring)
312 free (conditionals->ignoring);
313 if (conditionals->seen_else)
314 free (conditionals->seen_else);
315
316 /* Restore state. */
317 conditionals = saved;
318}
319
320
321static int
322eval_makefile (const char *filename, int flags)
323{
324 struct dep *deps;
325 struct ebuffer ebuf;
326 const struct floc *curfile;
327 char *expanded = 0;
328 int makefile_errno;
329 int r;
330
331 filename = strcache_add (filename);
332 ebuf.floc.filenm = filename;
333 ebuf.floc.lineno = 1;
334
335 if (ISDB (DB_VERBOSE))
336 {
337 printf (_("Reading makefile `%s'"), filename);
338 if (flags & RM_NO_DEFAULT_GOAL)
339 printf (_(" (no default goal)"));
340 if (flags & RM_INCLUDED)
341 printf (_(" (search path)"));
342 if (flags & RM_DONTCARE)
343 printf (_(" (don't care)"));
344 if (flags & RM_NO_TILDE)
345 printf (_(" (no ~ expansion)"));
346 puts ("...");
347 }
348
349 /* First, get a stream to read. */
350
351 /* Expand ~ in FILENAME unless it came from `include',
352 in which case it was already done. */
353 if (!(flags & RM_NO_TILDE) && filename[0] == '~')
354 {
355 expanded = tilde_expand (filename);
356 if (expanded != 0)
357 filename = expanded;
358 }
359
360 ebuf.fp = fopen (filename, "r");
361 /* Save the error code so we print the right message later. */
362 makefile_errno = errno;
363
364 /* If the makefile wasn't found and it's either a makefile from
365 the `MAKEFILES' variable or an included makefile,
366 search the included makefile search path for this makefile. */
367 if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/')
368 {
369 unsigned int i;
370 for (i = 0; include_directories[i] != 0; ++i)
371 {
372 const char *included = concat (include_directories[i], "/", filename);
373 ebuf.fp = fopen (included, "r");
374 if (ebuf.fp)
375 {
376 filename = strcache_add (included);
377 break;
378 }
379 }
380 }
381
382 /* Add FILENAME to the chain of read makefiles. */
383 deps = alloc_dep ();
384 deps->next = read_makefiles;
385 read_makefiles = deps;
386 deps->file = lookup_file (filename);
387 if (deps->file == 0)
388 deps->file = enter_file (filename);
389 filename = deps->file->name;
390 deps->changed = flags;
391 if (flags & RM_DONTCARE)
392 deps->file->dontcare = 1;
393
394 if (expanded)
395 free (expanded);
396
397 /* If the makefile can't be found at all, give up entirely. */
398
399 if (ebuf.fp == 0)
400 {
401 /* If we did some searching, errno has the error from the last
402 attempt, rather from FILENAME itself. Restore it in case the
403 caller wants to use it in a message. */
404 errno = makefile_errno;
405 return 0;
406 }
407
408 /* Add this makefile to the list. */
409 do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
410 f_append, 0);
411
412 /* Evaluate the makefile */
413
414 ebuf.size = 200;
415 ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size);
416
417 curfile = reading_file;
418 reading_file = &ebuf.floc;
419
420 r = eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL));
421
422 reading_file = curfile;
423
424 fclose (ebuf.fp);
425
426 free (ebuf.bufstart);
427 alloca (0);
428 return r;
429}
430
431int
432eval_buffer (char *buffer)
433{
434 struct ebuffer ebuf;
435 struct conditionals *saved;
436 struct conditionals new;
437 const struct floc *curfile;
438 int r;
439
440 /* Evaluate the buffer */
441
442 ebuf.size = strlen (buffer);
443 ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
444 ebuf.fp = NULL;
445
446 ebuf.floc = *reading_file;
447
448 curfile = reading_file;
449 reading_file = &ebuf.floc;
450
451 saved = install_conditionals (&new);
452
453 r = eval (&ebuf, 1);
454
455 restore_conditionals (saved);
456
457 reading_file = curfile;
458
459 alloca (0);
460 return r;
461}
462
463#ifdef CONFIG_WITH_INCLUDEDEP
464/* no nonsense dependency file including. */
465void
466eval_include_dep (const char *name, struct floc *f)
467{
468 FILE *fp;
469 long max_size;
470 long size;
471 char *buf;
472 unsigned int saved_var_len;
473 char *saved_var_buf;
474
475 /* ignore non-existing dependency files. */
476 if (!file_exists_p (name))
477 return;
478
479 /* open it and determin the size. */
480 errno = 0;
481 fp = fopen (name, "r");
482 if (!fp)
483 {
484 error (f, "%s: %s", name, strerror (errno));
485 return;
486 }
487
488 if (fseek (fp, 0, SEEK_END))
489 fatal (f, "%s: fseek failed - %s", name, strerror (errno));
490 max_size = ftell (fp);
491 if (max_size < 0)
492 fatal (f, "%s: ftell failed - %s", name, strerror (errno));
493 if (fseek (fp, 0, SEEK_SET))
494 fatal (f, "%s: fseek failed - %s", name, strerror (errno));
495
496 /* ignore empty files. */
497 if (max_size == 0)
498 {
499 fclose (fp);
500 return;
501 }
502
503 /* allocate a buffer and read the file. \r\n -> \n conversion
504 make this intersting ... */
505 buf = xmalloc (max_size + 1);
506 size = fread (buf, 1, max_size, fp); /* FIXME: EINTR? incomplete reads? */
507 if ( size == -1
508 || (ferror (fp) && !feof (fp)))
509 fatal (f, "%s: fread failed - %s", name, strerror (errno));
510 if (size < max_size / 2)
511 fatal (f, "%s: fread failed - %s", name, strerror (errno));
512 buf[size] = '\0';
513
514 /* evaluate the buffer and cleanup. */
515 install_variable_buffer (&saved_var_buf, &saved_var_len);
516 eval_buffer (buf);
517 restore_variable_buffer (saved_var_buf, saved_var_len);
518
519 free (buf);
520 fclose (fp);
521}
522#endif /* CONFIG_WITH_INCLUDEDEP */
523
524
525
526/* Read file FILENAME as a makefile and add its contents to the data base.
527
528 SET_DEFAULT is true if we are allowed to set the default goal. */
529
530
531static int
532eval (struct ebuffer *ebuf, int set_default)
533{
534 char *collapsed = 0;
535 unsigned int collapsed_length = 0;
536 unsigned int commands_len = 200;
537 char *commands;
538 unsigned int commands_idx = 0;
539 unsigned int cmds_started, tgts_started;
540 int ignoring = 0, in_ignored_define = 0;
541 int no_targets = 0; /* Set when reading a rule without targets. */
542 struct nameseq *filenames = 0;
543 struct dep *deps = 0;
544 long nlines = 0;
545 int two_colon = 0;
546 const char *pattern = 0;
547 const char *pattern_percent;
548 struct floc *fstart;
549 struct floc fi;
550
551#define record_waiting_files() \
552 do \
553 { \
554 if (filenames != 0) \
555 { \
556 fi.lineno = tgts_started; \
557 record_files (filenames, pattern, pattern_percent, deps, \
558 cmds_started, commands, commands_idx, two_colon, \
559 &fi); \
560 } \
561 filenames = 0; \
562 commands_idx = 0; \
563 no_targets = 0; \
564 pattern = 0; \
565 } while (0)
566
567 pattern_percent = 0;
568 cmds_started = tgts_started = 1;
569
570 fstart = &ebuf->floc;
571 fi.filenm = ebuf->floc.filenm;
572
573 /* Loop over lines in the file.
574 The strategy is to accumulate target names in FILENAMES, dependencies
575 in DEPS and commands in COMMANDS. These are used to define a rule
576 when the start of the next rule (or eof) is encountered.
577
578 When you see a "continue" in the loop below, that means we are moving on
579 to the next line _without_ ending any rule that we happen to be working
580 with at the moment. If you see a "goto rule_complete", then the
581 statement we just parsed also finishes the previous rule. */
582
583 commands = xmalloc (200);
584
585 while (1)
586 {
587 unsigned int linelen;
588 char *line;
589 unsigned int wlen;
590 char *p;
591 char *p2;
592
593 /* Grab the next line to be evaluated */
594 ebuf->floc.lineno += nlines;
595 nlines = readline (ebuf);
596
597 /* If there is nothing left to eval, we're done. */
598 if (nlines < 0)
599 break;
600
601 /* If this line is empty, skip it. */
602 line = ebuf->buffer;
603 if (line[0] == '\0')
604 continue;
605
606 linelen = strlen (line);
607
608 /* Check for a shell command line first.
609 If it is not one, we can stop treating tab specially. */
610 if (line[0] == cmd_prefix)
611 {
612 if (no_targets)
613 /* Ignore the commands in a rule with no targets. */
614 continue;
615
616 /* If there is no preceding rule line, don't treat this line
617 as a command, even though it begins with a tab character.
618 SunOS 4 make appears to behave this way. */
619
620 if (filenames != 0)
621 {
622 if (ignoring)
623 /* Yep, this is a shell command, and we don't care. */
624 continue;
625
626 /* Append this command line to the line being accumulated. */
627 if (commands_idx == 0)
628 cmds_started = ebuf->floc.lineno;
629
630 if (linelen + 1 + commands_idx > commands_len)
631 {
632 commands_len = (linelen + 1 + commands_idx) * 2;
633 commands = xrealloc (commands, commands_len);
634 }
635 memcpy (&commands[commands_idx], line, linelen);
636 commands_idx += linelen;
637 commands[commands_idx++] = '\n';
638
639 continue;
640 }
641 }
642
643 /* This line is not a shell command line. Don't worry about tabs.
644 Get more space if we need it; we don't need to preserve the current
645 contents of the buffer. */
646
647 if (collapsed_length < linelen+1)
648 {
649 collapsed_length = linelen+1;
650 if (collapsed)
651 free (collapsed);
652 collapsed = xmalloc (collapsed_length);
653 }
654 strcpy (collapsed, line);
655 /* Collapse continuation lines. */
656 collapse_continuations (collapsed);
657 remove_comments (collapsed);
658
659 /* Compare a word, both length and contents. */
660#define word1eq(s) (wlen == sizeof(s)-1 && strneq (s, p, sizeof(s)-1))
661 p = collapsed;
662 while (isspace ((unsigned char)*p))
663 ++p;
664
665 if (*p == '\0')
666 /* This line is completely empty--ignore it. */
667 continue;
668
669 /* Find the end of the first token. Note we don't need to worry about
670 * ":" here since we compare tokens by length (so "export" will never
671 * be equal to "export:").
672 */
673 for (p2 = p+1; *p2 != '\0' && !isspace ((unsigned char)*p2); ++p2)
674 ;
675 wlen = p2 - p;
676
677 /* Find the start of the second token. If it looks like a target or
678 variable definition it can't be a preprocessor token so skip
679 them--this allows variables/targets named `ifdef', `export', etc. */
680 while (isspace ((unsigned char)*p2))
681 ++p2;
682
683 if ((p2[0] == ':' || p2[0] == '+' || p2[0] == '=') && p2[1] == '\0')
684 {
685 /* It can't be a preprocessor token so skip it if we're ignoring */
686 if (ignoring)
687 continue;
688
689 goto skip_conditionals;
690 }
691
692 /* We must first check for conditional and `define' directives before
693 ignoring anything, since they control what we will do with
694 following lines. */
695
696 if (!in_ignored_define)
697 {
698 int i = conditional_line (p, wlen, fstart);
699 if (i != -2)
700 {
701 if (i == -1)
702 fatal (fstart, _("invalid syntax in conditional"));
703
704 ignoring = i;
705 continue;
706 }
707 }
708
709 if (word1eq ("endef"))
710 {
711 if (!in_ignored_define)
712 fatal (fstart, _("extraneous `endef'"));
713 in_ignored_define = 0;
714 continue;
715 }
716
717 if (word1eq ("define"))
718 {
719 if (ignoring)
720 in_ignored_define = 1;
721 else
722 {
723 if (*p2 == '\0')
724 fatal (fstart, _("empty variable name"));
725
726 /* Let the variable name be the whole rest of the line,
727 with trailing blanks stripped (comments have already been
728 removed), so it could be a complex variable/function
729 reference that might contain blanks. */
730 p = strchr (p2, '\0');
731 while (isblank ((unsigned char)p[-1]))
732 --p;
733 do_define (p2, p - p2, o_file, ebuf);
734 }
735 continue;
736 }
737
738 if (word1eq ("override"))
739 {
740 if (*p2 == '\0')
741 error (fstart, _("empty `override' directive"));
742
743 if (strneq (p2, "define", 6)
744 && (isblank ((unsigned char)p2[6]) || p2[6] == '\0'))
745 {
746 if (ignoring)
747 in_ignored_define = 1;
748 else
749 {
750 p2 = next_token (p2 + 6);
751 if (*p2 == '\0')
752 fatal (fstart, _("empty variable name"));
753
754 /* Let the variable name be the whole rest of the line,
755 with trailing blanks stripped (comments have already been
756 removed), so it could be a complex variable/function
757 reference that might contain blanks. */
758 p = strchr (p2, '\0');
759 while (isblank ((unsigned char)p[-1]))
760 --p;
761 do_define (p2, p - p2, o_override, ebuf);
762 }
763 }
764 else if (!ignoring
765 && !try_variable_definition (fstart, p2, o_override, 0))
766 error (fstart, _("invalid `override' directive"));
767
768 continue;
769 }
770
771 if (ignoring)
772 /* Ignore the line. We continue here so conditionals
773 can appear in the middle of a rule. */
774 continue;
775
776 if (word1eq ("export"))
777 {
778 /* 'export' by itself causes everything to be exported. */
779 if (*p2 == '\0')
780 export_all_variables = 1;
781 else
782 {
783 struct variable *v;
784
785 v = try_variable_definition (fstart, p2, o_file, 0);
786 if (v != 0)
787 v->export = v_export;
788 else
789 {
790 unsigned int l;
791 const char *cp;
792 char *ap;
793
794 /* Expand the line so we can use indirect and constructed
795 variable names in an export command. */
796 cp = ap = allocated_variable_expand (p2);
797
798 for (p = find_next_token (&cp, &l); p != 0;
799 p = find_next_token (&cp, &l))
800 {
801 v = lookup_variable (p, l);
802 if (v == 0)
803 v = define_variable_loc (p, l, "", o_file, 0, fstart);
804 v->export = v_export;
805 }
806
807 free (ap);
808 }
809 }
810 goto rule_complete;
811 }
812
813 if (word1eq ("unexport"))
814 {
815 if (*p2 == '\0')
816 export_all_variables = 0;
817 else
818 {
819 unsigned int l;
820 struct variable *v;
821 const char *cp;
822 char *ap;
823
824 /* Expand the line so we can use indirect and constructed
825 variable names in an unexport command. */
826 cp = ap = allocated_variable_expand (p2);
827
828 for (p = find_next_token (&cp, &l); p != 0;
829 p = find_next_token (&cp, &l))
830 {
831 v = lookup_variable (p, l);
832 if (v == 0)
833 v = define_variable_loc (p, l, "", o_file, 0, fstart);
834
835 v->export = v_noexport;
836 }
837
838 free (ap);
839 }
840 goto rule_complete;
841 }
842
843 skip_conditionals:
844 if (word1eq ("vpath"))
845 {
846 const char *cp;
847 char *vpat;
848 unsigned int l;
849 cp = variable_expand (p2);
850 p = find_next_token (&cp, &l);
851 if (p != 0)
852 {
853 vpat = savestring (p, l);
854 p = find_next_token (&cp, &l);
855 /* No searchpath means remove all previous
856 selective VPATH's with the same pattern. */
857 }
858 else
859 /* No pattern means remove all previous selective VPATH's. */
860 vpat = 0;
861 construct_vpath_list (vpat, p);
862 if (vpat != 0)
863 free (vpat);
864
865 goto rule_complete;
866 }
867
868#ifdef CONFIG_WITH_INCLUDEDEP
869 if (word1eq ("includedep"))
870 {
871 /* We have found an `includedep' line specifying a single nested
872 makefile to be read at this point. This include variation
873 does not globbing and doesn't support multiple names. It's
874 trying to save time by being dead simple. */
875 char *name = p2;
876 char *end = strchr(name, '\0');
877 char saved;
878
879 while (end > name && isspace ((unsigned char)end[-1]))
880 --end;
881
882 saved = *end; /* not sure if this is required... */
883 *end = '\0';
884 eval_include_dep (name, fstart);
885 *end = saved;
886
887 goto rule_complete;
888 }
889#endif /* CONFIG_WITH_INCLUDEDEP */
890
891 if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude"))
892 {
893 /* We have found an `include' line specifying a nested
894 makefile to be read at this point. */
895 struct conditionals *save;
896 struct conditionals new_conditionals;
897 struct nameseq *files;
898 /* "-include" (vs "include") says no error if the file does not
899 exist. "sinclude" is an alias for this from SGI. */
900 int noerror = (p[0] != 'i');
901
902 p = allocated_variable_expand (p2);
903
904 /* If no filenames, it's a no-op. */
905 if (*p == '\0')
906 {
907 free (p);
908 continue;
909 }
910
911 /* Parse the list of file names. */
912 p2 = p;
913 files = multi_glob (parse_file_seq (&p2, '\0',
914 sizeof (struct nameseq),
915 1),
916 sizeof (struct nameseq));
917 free (p);
918
919 /* Save the state of conditionals and start
920 the included makefile with a clean slate. */
921 save = install_conditionals (&new_conditionals);
922
923 /* Record the rules that are waiting so they will determine
924 the default goal before those in the included makefile. */
925 record_waiting_files ();
926
927 /* Read each included makefile. */
928 while (files != 0)
929 {
930 struct nameseq *next = files->next;
931 const char *name = files->name;
932 int r;
933
934 free (files);
935 files = next;
936
937 r = eval_makefile (name, (RM_INCLUDED | RM_NO_TILDE
938 | (noerror ? RM_DONTCARE : 0)));
939 if (!r && !noerror)
940 error (fstart, "%s: %s", name, strerror (errno));
941 }
942
943 /* Restore conditional state. */
944 restore_conditionals (save);
945
946 goto rule_complete;
947 }
948
949 if (try_variable_definition (fstart, p, o_file, 0))
950 /* This line has been dealt with. */
951 goto rule_complete;
952
953 /* This line starts with a tab but was not caught above because there
954 was no preceding target, and the line might have been usable as a
955 variable definition. But now we know it is definitely lossage. */
956 if (line[0] == cmd_prefix)
957 fatal(fstart, _("commands commence before first target"));
958
959 /* This line describes some target files. This is complicated by
960 the existence of target-specific variables, because we can't
961 expand the entire line until we know if we have one or not. So
962 we expand the line word by word until we find the first `:',
963 then check to see if it's a target-specific variable.
964
965 In this algorithm, `lb_next' will point to the beginning of the
966 unexpanded parts of the input buffer, while `p2' points to the
967 parts of the expanded buffer we haven't searched yet. */
968
969 {
970 enum make_word_type wtype;
971 enum variable_origin v_origin;
972 int exported;
973 char *cmdleft, *semip, *lb_next;
974 unsigned int plen = 0;
975 char *colonp;
976 const char *end, *beg; /* Helpers for whitespace stripping. */
977
978 /* Record the previous rule. */
979
980 record_waiting_files ();
981 tgts_started = fstart->lineno;
982
983 /* Search the line for an unquoted ; that is not after an
984 unquoted #. */
985 cmdleft = find_char_unquote (line, ';', '#', 0, 1);
986 if (cmdleft != 0 && *cmdleft == '#')
987 {
988 /* We found a comment before a semicolon. */
989 *cmdleft = '\0';
990 cmdleft = 0;
991 }
992 else if (cmdleft != 0)
993 /* Found one. Cut the line short there before expanding it. */
994 *(cmdleft++) = '\0';
995 semip = cmdleft;
996
997 collapse_continuations (line);
998
999 /* We can't expand the entire line, since if it's a per-target
1000 variable we don't want to expand it. So, walk from the
1001 beginning, expanding as we go, and looking for "interesting"
1002 chars. The first word is always expandable. */
1003 wtype = get_next_mword(line, NULL, &lb_next, &wlen);
1004 switch (wtype)
1005 {
1006 case w_eol:
1007 if (cmdleft != 0)
1008 fatal(fstart, _("missing rule before commands"));
1009 /* This line contained something but turned out to be nothing
1010 but whitespace (a comment?). */
1011 continue;
1012
1013 case w_colon:
1014 case w_dcolon:
1015 /* We accept and ignore rules without targets for
1016 compatibility with SunOS 4 make. */
1017 no_targets = 1;
1018 continue;
1019
1020 default:
1021 break;
1022 }
1023
1024 p2 = variable_expand_string(NULL, lb_next, wlen);
1025
1026 while (1)
1027 {
1028 lb_next += wlen;
1029 if (cmdleft == 0)
1030 {
1031 /* Look for a semicolon in the expanded line. */
1032 cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
1033
1034 if (cmdleft != 0)
1035 {
1036 unsigned long p2_off = p2 - variable_buffer;
1037 unsigned long cmd_off = cmdleft - variable_buffer;
1038 char *pend = p2 + strlen(p2);
1039
1040 /* Append any remnants of lb, then cut the line short
1041 at the semicolon. */
1042 *cmdleft = '\0';
1043
1044 /* One school of thought says that you shouldn't expand
1045 here, but merely copy, since now you're beyond a ";"
1046 and into a command script. However, the old parser
1047 expanded the whole line, so we continue that for
1048 backwards-compatiblity. Also, it wouldn't be
1049 entirely consistent, since we do an unconditional
1050 expand below once we know we don't have a
1051 target-specific variable. */
1052 (void)variable_expand_string(pend, lb_next, (long)-1);
1053 lb_next += strlen(lb_next);
1054 p2 = variable_buffer + p2_off;
1055 cmdleft = variable_buffer + cmd_off + 1;
1056 }
1057 }
1058
1059 colonp = find_char_unquote(p2, ':', 0, 0, 0);
1060#ifdef HAVE_DOS_PATHS
1061 /* The drive spec brain-damage strikes again... */
1062 /* Note that the only separators of targets in this context
1063 are whitespace and a left paren. If others are possible,
1064 they should be added to the string in the call to index. */
1065 while (colonp && (colonp[1] == '/' || colonp[1] == '\\') &&
1066 colonp > p2 && isalpha ((unsigned char)colonp[-1]) &&
1067 (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0))
1068 colonp = find_char_unquote(colonp + 1, ':', 0, 0, 0);
1069#endif
1070 if (colonp != 0)
1071 break;
1072
1073 wtype = get_next_mword(lb_next, NULL, &lb_next, &wlen);
1074 if (wtype == w_eol)
1075 break;
1076
1077 p2 += strlen(p2);
1078 *(p2++) = ' ';
1079 p2 = variable_expand_string(p2, lb_next, wlen);
1080 /* We don't need to worry about cmdleft here, because if it was
1081 found in the variable_buffer the entire buffer has already
1082 been expanded... we'll never get here. */
1083 }
1084
1085 p2 = next_token (variable_buffer);
1086
1087 /* If the word we're looking at is EOL, see if there's _anything_
1088 on the line. If not, a variable expanded to nothing, so ignore
1089 it. If so, we can't parse this line so punt. */
1090 if (wtype == w_eol)
1091 {
1092 if (*p2 != '\0')
1093 /* There's no need to be ivory-tower about this: check for
1094 one of the most common bugs found in makefiles... */
1095 fatal (fstart, _("missing separator%s"),
1096 !strneq(line, " ", 8) ? ""
1097 : _(" (did you mean TAB instead of 8 spaces?)"));
1098 continue;
1099 }
1100
1101 /* Make the colon the end-of-string so we know where to stop
1102 looking for targets. */
1103 *colonp = '\0';
1104 filenames = multi_glob (parse_file_seq (&p2, '\0',
1105 sizeof (struct nameseq),
1106 1),
1107 sizeof (struct nameseq));
1108 *p2 = ':';
1109
1110 if (!filenames)
1111 {
1112 /* We accept and ignore rules without targets for
1113 compatibility with SunOS 4 make. */
1114 no_targets = 1;
1115 continue;
1116 }
1117 /* This should never be possible; we handled it above. */
1118 assert (*p2 != '\0');
1119 ++p2;
1120
1121 /* Is this a one-colon or two-colon entry? */
1122 two_colon = *p2 == ':';
1123 if (two_colon)
1124 p2++;
1125
1126 /* Test to see if it's a target-specific variable. Copy the rest
1127 of the buffer over, possibly temporarily (we'll expand it later
1128 if it's not a target-specific variable). PLEN saves the length
1129 of the unparsed section of p2, for later. */
1130 if (*lb_next != '\0')
1131 {
1132 unsigned int l = p2 - variable_buffer;
1133 plen = strlen (p2);
1134 variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1);
1135 p2 = variable_buffer + l;
1136 }
1137
1138 /* See if it's an "override" or "export" keyword; if so see if what
1139 comes after it looks like a variable definition. */
1140
1141 wtype = get_next_mword (p2, NULL, &p, &wlen);
1142
1143 v_origin = o_file;
1144 exported = 0;
1145 if (wtype == w_static)
1146 {
1147 if (word1eq ("override"))
1148 {
1149 v_origin = o_override;
1150 wtype = get_next_mword (p+wlen, NULL, &p, &wlen);
1151 }
1152 else if (word1eq ("export"))
1153 {
1154 exported = 1;
1155 wtype = get_next_mword (p+wlen, NULL, &p, &wlen);
1156 }
1157 }
1158
1159 if (wtype != w_eol)
1160 wtype = get_next_mword (p+wlen, NULL, NULL, NULL);
1161
1162 if (wtype == w_varassign)
1163 {
1164 /* If there was a semicolon found, add it back, plus anything
1165 after it. */
1166 if (semip)
1167 {
1168 unsigned int l = p - variable_buffer;
1169 *(--semip) = ';';
1170 variable_buffer_output (p2 + strlen (p2),
1171 semip, strlen (semip)+1);
1172 p = variable_buffer + l;
1173 }
1174 record_target_var (filenames, p, v_origin, exported, fstart);
1175 filenames = 0;
1176 continue;
1177 }
1178
1179 /* This is a normal target, _not_ a target-specific variable.
1180 Unquote any = in the dependency list. */
1181 find_char_unquote (lb_next, '=', 0, 0, 0);
1182
1183 /* We have some targets, so don't ignore the following commands. */
1184 no_targets = 0;
1185
1186 /* Expand the dependencies, etc. */
1187 if (*lb_next != '\0')
1188 {
1189 unsigned int l = p2 - variable_buffer;
1190 (void) variable_expand_string (p2 + plen, lb_next, (long)-1);
1191 p2 = variable_buffer + l;
1192
1193 /* Look for a semicolon in the expanded line. */
1194 if (cmdleft == 0)
1195 {
1196 cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
1197 if (cmdleft != 0)
1198 *(cmdleft++) = '\0';
1199 }
1200 }
1201
1202 /* Is this a static pattern rule: `target: %targ: %dep; ...'? */
1203 p = strchr (p2, ':');
1204 while (p != 0 && p[-1] == '\\')
1205 {
1206 register char *q = &p[-1];
1207 register int backslash = 0;
1208 while (*q-- == '\\')
1209 backslash = !backslash;
1210 if (backslash)
1211 p = strchr (p + 1, ':');
1212 else
1213 break;
1214 }
1215#ifdef _AMIGA
1216 /* Here, the situation is quite complicated. Let's have a look
1217 at a couple of targets:
1218
1219 install: dev:make
1220
1221 dev:make: make
1222
1223 dev:make:: xyz
1224
1225 The rule is that it's only a target, if there are TWO :'s
1226 OR a space around the :.
1227 */
1228 if (p && !(isspace ((unsigned char)p[1]) || !p[1]
1229 || isspace ((unsigned char)p[-1])))
1230 p = 0;
1231#endif
1232#ifdef HAVE_DOS_PATHS
1233 {
1234 int check_again;
1235 do {
1236 check_again = 0;
1237 /* For DOS-style paths, skip a "C:\..." or a "C:/..." */
1238 if (p != 0 && (p[1] == '\\' || p[1] == '/') &&
1239 isalpha ((unsigned char)p[-1]) &&
1240 (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) {
1241 p = strchr (p + 1, ':');
1242 check_again = 1;
1243 }
1244 } while (check_again);
1245 }
1246#endif
1247 if (p != 0)
1248 {
1249 struct nameseq *target;
1250 target = parse_file_seq (&p2, ':', sizeof (struct nameseq), 1);
1251 ++p2;
1252 if (target == 0)
1253 fatal (fstart, _("missing target pattern"));
1254 else if (target->next != 0)
1255 fatal (fstart, _("multiple target patterns (target `%s')"), target->name); /* bird */
1256 pattern_percent = find_percent_cached (&target->name);
1257 pattern = target->name;
1258 if (pattern_percent == 0)
1259 fatal (fstart, _("target pattern contains no `%%' (target `%s')"), target->name); /* bird */
1260 free (target);
1261 }
1262 else
1263 pattern = 0;
1264
1265 /* Strip leading and trailing whitespaces. */
1266 beg = p2;
1267 end = beg + strlen (beg) - 1;
1268 strip_whitespace (&beg, &end);
1269
1270 if (beg <= end && *beg != '\0')
1271 {
1272 /* Put all the prerequisites here; they'll be parsed later. */
1273 deps = alloc_dep ();
1274 deps->name = strcache_add_len (beg, end - beg + 1);
1275 }
1276 else
1277 deps = 0;
1278
1279 commands_idx = 0;
1280 if (cmdleft != 0)
1281 {
1282 /* Semicolon means rest of line is a command. */
1283 unsigned int l = strlen (cmdleft);
1284
1285 cmds_started = fstart->lineno;
1286
1287 /* Add this command line to the buffer. */
1288 if (l + 2 > commands_len)
1289 {
1290 commands_len = (l + 2) * 2;
1291 commands = xrealloc (commands, commands_len);
1292 }
1293 memcpy (commands, cmdleft, l);
1294 commands_idx += l;
1295 commands[commands_idx++] = '\n';
1296 }
1297
1298 /* Determine if this target should be made default. We used to do
1299 this in record_files() but because of the delayed target recording
1300 and because preprocessor directives are legal in target's commands
1301 it is too late. Consider this fragment for example:
1302
1303 foo:
1304
1305 ifeq ($(.DEFAULT_GOAL),foo)
1306 ...
1307 endif
1308
1309 Because the target is not recorded until after ifeq directive is
1310 evaluated the .DEFAULT_GOAL does not contain foo yet as one
1311 would expect. Because of this we have to move some of the logic
1312 here. */
1313
1314 if (**default_goal_name == '\0' && set_default)
1315 {
1316 const char *name;
1317 struct dep *d;
1318 struct nameseq *t = filenames;
1319
1320 for (; t != 0; t = t->next)
1321 {
1322 int reject = 0;
1323 name = t->name;
1324
1325 /* We have nothing to do if this is an implicit rule. */
1326 if (strchr (name, '%') != 0)
1327 break;
1328
1329 /* See if this target's name does not start with a `.',
1330 unless it contains a slash. */
1331 if (*name == '.' && strchr (name, '/') == 0
1332#ifdef HAVE_DOS_PATHS
1333 && strchr (name, '\\') == 0
1334#endif
1335 )
1336 continue;
1337
1338
1339 /* If this file is a suffix, don't let it be
1340 the default goal file. */
1341 for (d = suffix_file->deps; d != 0; d = d->next)
1342 {
1343 register struct dep *d2;
1344 if (*dep_name (d) != '.' && streq (name, dep_name (d)))
1345 {
1346 reject = 1;
1347 break;
1348 }
1349 for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
1350 {
1351 unsigned int l = strlen (dep_name (d2));
1352 if (!strneq (name, dep_name (d2), l))
1353 continue;
1354 if (streq (name + l, dep_name (d)))
1355 {
1356 reject = 1;
1357 break;
1358 }
1359 }
1360
1361 if (reject)
1362 break;
1363 }
1364
1365 if (!reject)
1366 {
1367 define_variable_global (".DEFAULT_GOAL", 13, t->name,
1368 o_file, 0, NILF);
1369 break;
1370 }
1371 }
1372 }
1373
1374 continue;
1375 }
1376
1377 /* We get here except in the case that we just read a rule line.
1378 Record now the last rule we read, so following spurious
1379 commands are properly diagnosed. */
1380 rule_complete:
1381 record_waiting_files ();
1382 }
1383
1384#undef word1eq
1385
1386 if (conditionals->if_cmds)
1387 fatal (fstart, _("missing `endif'"));
1388
1389 /* At eof, record the last rule. */
1390 record_waiting_files ();
1391
1392 if (collapsed)
1393 free (collapsed);
1394 free (commands);
1395
1396 return 1;
1397}
1398
1399
1400
1401/* Remove comments from LINE.
1402 This is done by copying the text at LINE onto itself. */
1403
1404static void
1405remove_comments (char *line)
1406{
1407 char *comment;
1408
1409 comment = find_char_unquote (line, '#', 0, 0, 0);
1410
1411 if (comment != 0)
1412 /* Cut off the line at the #. */
1413 *comment = '\0';
1414}
1415
1416/* Execute a `define' directive.
1417 The first line has already been read, and NAME is the name of
1418 the variable to be defined. The following lines remain to be read. */
1419
1420static void
1421do_define (char *name, unsigned int namelen,
1422 enum variable_origin origin, struct ebuffer *ebuf)
1423{
1424 struct floc defstart;
1425 long nlines = 0;
1426 int nlevels = 1;
1427 unsigned int length = 100;
1428 char *definition = xmalloc (length);
1429 unsigned int idx = 0;
1430 char *p;
1431
1432 /* Expand the variable name. */
1433 char *var = alloca (namelen + 1);
1434 memcpy (var, name, namelen);
1435 var[namelen] = '\0';
1436 var = variable_expand (var);
1437
1438 defstart = ebuf->floc;
1439
1440 while (1)
1441 {
1442 unsigned int len;
1443 char *line;
1444
1445 nlines = readline (ebuf);
1446 ebuf->floc.lineno += nlines;
1447
1448 /* If there is nothing left to eval, we're done. */
1449 if (nlines < 0)
1450 break;
1451
1452 line = ebuf->buffer;
1453
1454 collapse_continuations (line);
1455
1456 /* If the line doesn't begin with a tab, test to see if it introduces
1457 another define, or ends one. */
1458
1459 /* Stop if we find an 'endef' */
1460 if (line[0] != cmd_prefix)
1461 {
1462 p = next_token (line);
1463 len = strlen (p);
1464
1465 /* If this is another 'define', increment the level count. */
1466 if ((len == 6 || (len > 6 && isblank ((unsigned char)p[6])))
1467 && strneq (p, "define", 6))
1468 ++nlevels;
1469
1470 /* If this is an 'endef', decrement the count. If it's now 0,
1471 we've found the last one. */
1472 else if ((len == 5 || (len > 5 && isblank ((unsigned char)p[5])))
1473 && strneq (p, "endef", 5))
1474 {
1475 p += 5;
1476 remove_comments (p);
1477 if (*next_token (p) != '\0')
1478 error (&ebuf->floc,
1479 _("Extraneous text after `endef' directive"));
1480
1481 if (--nlevels == 0)
1482 {
1483 /* Define the variable. */
1484 if (idx == 0)
1485 definition[0] = '\0';
1486 else
1487 definition[idx - 1] = '\0';
1488
1489 /* Always define these variables in the global set. */
1490 define_variable_global (var, strlen (var), definition,
1491 origin, 1, &defstart);
1492 free (definition);
1493 return;
1494 }
1495 }
1496 }
1497
1498 /* Otherwise add this line to the variable definition. */
1499 len = strlen (line);
1500 if (idx + len + 1 > length)
1501 {
1502 length = (idx + len) * 2;
1503 definition = xrealloc (definition, length + 1);
1504 }
1505
1506 memcpy (&definition[idx], line, len);
1507 idx += len;
1508 /* Separate lines with a newline. */
1509 definition[idx++] = '\n';
1510 }
1511
1512 /* No `endef'!! */
1513 fatal (&defstart, _("missing `endef', unterminated `define'"));
1514
1515 /* NOTREACHED */
1516 return;
1517}
1518
1519
1520/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
1521 "ifneq", "else" and "endif".
1522 LINE is the input line, with the command as its first word.
1523
1524 FILENAME and LINENO are the filename and line number in the
1525 current makefile. They are used for error messages.
1526
1527 Value is -2 if the line is not a conditional at all,
1528 -1 if the line is an invalid conditional,
1529 0 if following text should be interpreted,
1530 1 if following text should be ignored. */
1531
1532static int
1533conditional_line (char *line, int len, const struct floc *flocp)
1534{
1535 char *cmdname;
1536 enum { c_ifdef, c_ifndef, c_ifeq, c_ifneq, c_else, c_endif } cmdtype;
1537 unsigned int i;
1538 unsigned int o;
1539
1540 /* Compare a word, both length and contents. */
1541#define word1eq(s) (len == sizeof(s)-1 && strneq (s, line, sizeof(s)-1))
1542#define chkword(s, t) if (word1eq (s)) { cmdtype = (t); cmdname = (s); }
1543
1544 /* Make sure this line is a conditional. */
1545 chkword ("ifdef", c_ifdef)
1546 else chkword ("ifndef", c_ifndef)
1547 else chkword ("ifeq", c_ifeq)
1548 else chkword ("ifneq", c_ifneq)
1549 else chkword ("else", c_else)
1550 else chkword ("endif", c_endif)
1551 else
1552 return -2;
1553
1554 /* Found one: skip past it and any whitespace after it. */
1555 line = next_token (line + len);
1556
1557#define EXTRANEOUS() error (flocp, _("Extraneous text after `%s' directive"), cmdname)
1558
1559 /* An 'endif' cannot contain extra text, and reduces the if-depth by 1 */
1560 if (cmdtype == c_endif)
1561 {
1562 if (*line != '\0')
1563 EXTRANEOUS ();
1564
1565 if (!conditionals->if_cmds)
1566 fatal (flocp, _("extraneous `%s'"), cmdname);
1567
1568 --conditionals->if_cmds;
1569
1570 goto DONE;
1571 }
1572
1573 /* An 'else' statement can either be simple, or it can have another
1574 conditional after it. */
1575 if (cmdtype == c_else)
1576 {
1577 const char *p;
1578
1579 if (!conditionals->if_cmds)
1580 fatal (flocp, _("extraneous `%s'"), cmdname);
1581
1582 o = conditionals->if_cmds - 1;
1583
1584 if (conditionals->seen_else[o])
1585 fatal (flocp, _("only one `else' per conditional"));
1586
1587 /* Change the state of ignorance. */
1588 switch (conditionals->ignoring[o])
1589 {
1590 case 0:
1591 /* We've just been interpreting. Never do it again. */
1592 conditionals->ignoring[o] = 2;
1593 break;
1594 case 1:
1595 /* We've never interpreted yet. Maybe this time! */
1596 conditionals->ignoring[o] = 0;
1597 break;
1598 }
1599
1600 /* It's a simple 'else'. */
1601 if (*line == '\0')
1602 {
1603 conditionals->seen_else[o] = 1;
1604 goto DONE;
1605 }
1606
1607 /* The 'else' has extra text. That text must be another conditional
1608 and cannot be an 'else' or 'endif'. */
1609
1610 /* Find the length of the next word. */
1611 for (p = line+1; *p != '\0' && !isspace ((unsigned char)*p); ++p)
1612 ;
1613 len = p - line;
1614
1615 /* If it's 'else' or 'endif' or an illegal conditional, fail. */
1616 if (word1eq("else") || word1eq("endif")
1617 || conditional_line (line, len, flocp) < 0)
1618 EXTRANEOUS ();
1619 else
1620 {
1621 /* conditional_line() created a new level of conditional.
1622 Raise it back to this level. */
1623 if (conditionals->ignoring[o] < 2)
1624 conditionals->ignoring[o] = conditionals->ignoring[o+1];
1625 --conditionals->if_cmds;
1626 }
1627
1628 goto DONE;
1629 }
1630
1631 if (conditionals->allocated == 0)
1632 {
1633 conditionals->allocated = 5;
1634 conditionals->ignoring = xmalloc (conditionals->allocated);
1635 conditionals->seen_else = xmalloc (conditionals->allocated);
1636 }
1637
1638 o = conditionals->if_cmds++;
1639 if (conditionals->if_cmds > conditionals->allocated)
1640 {
1641 conditionals->allocated += 5;
1642 conditionals->ignoring = xrealloc (conditionals->ignoring,
1643 conditionals->allocated);
1644 conditionals->seen_else = xrealloc (conditionals->seen_else,
1645 conditionals->allocated);
1646 }
1647
1648 /* Record that we have seen an `if...' but no `else' so far. */
1649 conditionals->seen_else[o] = 0;
1650
1651 /* Search through the stack to see if we're already ignoring. */
1652 for (i = 0; i < o; ++i)
1653 if (conditionals->ignoring[i])
1654 {
1655 /* We are already ignoring, so just push a level to match the next
1656 "else" or "endif", and keep ignoring. We don't want to expand
1657 variables in the condition. */
1658 conditionals->ignoring[o] = 1;
1659 return 1;
1660 }
1661
1662 if (cmdtype == c_ifdef || cmdtype == c_ifndef)
1663 {
1664 char *var;
1665 struct variable *v;
1666 char *p;
1667
1668 /* Expand the thing we're looking up, so we can use indirect and
1669 constructed variable names. */
1670 var = allocated_variable_expand (line);
1671
1672 /* Make sure there's only one variable name to test. */
1673 p = end_of_token (var);
1674 i = p - var;
1675 p = next_token (p);
1676 if (*p != '\0')
1677 return -1;
1678
1679 var[i] = '\0';
1680 v = lookup_variable (var, i);
1681
1682 conditionals->ignoring[o] =
1683 ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef));
1684
1685 free (var);
1686 }
1687 else
1688 {
1689 /* "ifeq" or "ifneq". */
1690 char *s1, *s2;
1691 unsigned int l;
1692 char termin = *line == '(' ? ',' : *line;
1693
1694 if (termin != ',' && termin != '"' && termin != '\'')
1695 return -1;
1696
1697 s1 = ++line;
1698 /* Find the end of the first string. */
1699 if (termin == ',')
1700 {
1701 int count = 0;
1702 for (; *line != '\0'; ++line)
1703 if (*line == '(')
1704 ++count;
1705 else if (*line == ')')
1706 --count;
1707 else if (*line == ',' && count <= 0)
1708 break;
1709 }
1710 else
1711 while (*line != '\0' && *line != termin)
1712 ++line;
1713
1714 if (*line == '\0')
1715 return -1;
1716
1717 if (termin == ',')
1718 {
1719 /* Strip blanks after the first string. */
1720 char *p = line++;
1721 while (isblank ((unsigned char)p[-1]))
1722 --p;
1723 *p = '\0';
1724 }
1725 else
1726 *line++ = '\0';
1727
1728 s2 = variable_expand (s1);
1729 /* We must allocate a new copy of the expanded string because
1730 variable_expand re-uses the same buffer. */
1731 l = strlen (s2);
1732 s1 = alloca (l + 1);
1733 memcpy (s1, s2, l + 1);
1734
1735 if (termin != ',')
1736 /* Find the start of the second string. */
1737 line = next_token (line);
1738
1739 termin = termin == ',' ? ')' : *line;
1740 if (termin != ')' && termin != '"' && termin != '\'')
1741 return -1;
1742
1743 /* Find the end of the second string. */
1744 if (termin == ')')
1745 {
1746 int count = 0;
1747 s2 = next_token (line);
1748 for (line = s2; *line != '\0'; ++line)
1749 {
1750 if (*line == '(')
1751 ++count;
1752 else if (*line == ')')
1753 {
1754 if (count <= 0)
1755 break;
1756 else
1757 --count;
1758 }
1759 }
1760 }
1761 else
1762 {
1763 ++line;
1764 s2 = line;
1765 while (*line != '\0' && *line != termin)
1766 ++line;
1767 }
1768
1769 if (*line == '\0')
1770 return -1;
1771
1772 *line = '\0';
1773 line = next_token (++line);
1774 if (*line != '\0')
1775 EXTRANEOUS ();
1776
1777 s2 = variable_expand (s2);
1778 conditionals->ignoring[o] = (streq (s1, s2) == (cmdtype == c_ifneq));
1779 }
1780
1781 DONE:
1782 /* Search through the stack to see if we're ignoring. */
1783 for (i = 0; i < conditionals->if_cmds; ++i)
1784 if (conditionals->ignoring[i])
1785 return 1;
1786 return 0;
1787}
1788
1789
1790/* Remove duplicate dependencies in CHAIN. */
1791
1792static unsigned long
1793dep_hash_1 (const void *key)
1794{
1795 return_STRING_HASH_1 (dep_name ((struct dep const *) key));
1796}
1797
1798static unsigned long
1799dep_hash_2 (const void *key)
1800{
1801 return_STRING_HASH_2 (dep_name ((struct dep const *) key));
1802}
1803
1804static int
1805dep_hash_cmp (const void *x, const void *y)
1806{
1807 struct dep *dx = (struct dep *) x;
1808 struct dep *dy = (struct dep *) y;
1809 int cmp = strcmp (dep_name (dx), dep_name (dy));
1810
1811 /* If the names are the same but ignore_mtimes are not equal, one of these
1812 is an order-only prerequisite and one isn't. That means that we should
1813 remove the one that isn't and keep the one that is. */
1814
1815 if (!cmp && dx->ignore_mtime != dy->ignore_mtime)
1816 dx->ignore_mtime = dy->ignore_mtime = 0;
1817
1818 return cmp;
1819}
1820
1821
1822void
1823uniquize_deps (struct dep *chain)
1824{
1825 struct hash_table deps;
1826 register struct dep **depp;
1827
1828 hash_init (&deps, 500, dep_hash_1, dep_hash_2, dep_hash_cmp);
1829
1830 /* Make sure that no dependencies are repeated. This does not
1831 really matter for the purpose of updating targets, but it
1832 might make some names be listed twice for $^ and $?. */
1833
1834 depp = &chain;
1835 while (*depp)
1836 {
1837 struct dep *dep = *depp;
1838 struct dep **dep_slot = (struct dep **) hash_find_slot (&deps, dep);
1839 if (HASH_VACANT (*dep_slot))
1840 {
1841 hash_insert_at (&deps, dep, dep_slot);
1842 depp = &dep->next;
1843 }
1844 else
1845 {
1846 /* Don't bother freeing duplicates.
1847 It's dangerous and little benefit accrues. */
1848 *depp = dep->next;
1849 }
1850 }
1851
1852 hash_free (&deps, 0);
1853}
1854
1855
1856/* Record target-specific variable values for files FILENAMES.
1857 TWO_COLON is nonzero if a double colon was used.
1858
1859 The links of FILENAMES are freed, and so are any names in it
1860 that are not incorporated into other data structures.
1861
1862 If the target is a pattern, add the variable to the pattern-specific
1863 variable value list. */
1864
1865static void
1866record_target_var (struct nameseq *filenames, char *defn,
1867 enum variable_origin origin, int exported,
1868 const struct floc *flocp)
1869{
1870 struct nameseq *nextf;
1871 struct variable_set_list *global;
1872
1873 global = current_variable_set_list;
1874
1875 /* If the variable is an append version, store that but treat it as a
1876 normal recursive variable. */
1877
1878 for (; filenames != 0; filenames = nextf)
1879 {
1880 struct variable *v;
1881 const char *name = filenames->name;
1882 const char *fname;
1883 const char *percent;
1884 struct pattern_var *p;
1885
1886 nextf = filenames->next;
1887 free (filenames);
1888
1889 /* If it's a pattern target, then add it to the pattern-specific
1890 variable list. */
1891 percent = find_percent_cached (&name);
1892 if (percent)
1893 {
1894 /* Get a reference for this pattern-specific variable struct. */
1895 p = create_pattern_var (name, percent);
1896 p->variable.fileinfo = *flocp;
1897 /* I don't think this can fail since we already determined it was a
1898 variable definition. */
1899 v = parse_variable_definition (&p->variable, defn);
1900 assert (v != 0);
1901
1902 if (v->flavor == f_simple)
1903 v->value = allocated_variable_expand (v->value);
1904 else
1905 v->value = xstrdup (v->value);
1906
1907 fname = p->target;
1908 }
1909 else
1910 {
1911 struct file *f;
1912
1913 /* Get a file reference for this file, and initialize it.
1914 We don't want to just call enter_file() because that allocates a
1915 new entry if the file is a double-colon, which we don't want in
1916 this situation. */
1917 f = lookup_file (name);
1918 if (!f)
1919 f = enter_file (strcache_add (name));
1920 else if (f->double_colon)
1921 f = f->double_colon;
1922
1923 initialize_file_variables (f, 1);
1924 fname = f->name;
1925
1926 current_variable_set_list = f->variables;
1927 v = try_variable_definition (flocp, defn, origin, 1);
1928 if (!v)
1929 error (flocp, _("Malformed target-specific variable definition"));
1930 current_variable_set_list = global;
1931 }
1932
1933 /* Set up the variable to be *-specific. */
1934 v->origin = origin;
1935 v->per_target = 1;
1936 v->export = exported ? v_export : v_default;
1937
1938 /* If it's not an override, check to see if there was a command-line
1939 setting. If so, reset the value. */
1940 if (origin != o_override)
1941 {
1942 struct variable *gv;
1943 int len = strlen(v->name);
1944
1945 gv = lookup_variable (v->name, len);
1946 if (gv && (gv->origin == o_env_override || gv->origin == o_command))
1947 {
1948 if (v->value != 0)
1949 free (v->value);
1950 v->value = xstrdup (gv->value);
1951 v->origin = gv->origin;
1952 v->recursive = gv->recursive;
1953 v->append = 0;
1954 }
1955 }
1956 }
1957}
1958
1959
1960/* Record a description line for files FILENAMES,
1961 with dependencies DEPS, commands to execute described
1962 by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED.
1963 TWO_COLON is nonzero if a double colon was used.
1964 If not nil, PATTERN is the `%' pattern to make this
1965 a static pattern rule, and PATTERN_PERCENT is a pointer
1966 to the `%' within it.
1967
1968 The links of FILENAMES are freed, and so are any names in it
1969 that are not incorporated into other data structures. */
1970
1971static void
1972record_files (struct nameseq *filenames, const char *pattern,
1973 const char *pattern_percent, struct dep *deps,
1974 unsigned int cmds_started, char *commands,
1975 unsigned int commands_idx, int two_colon,
1976 const struct floc *flocp)
1977{
1978 struct nameseq *nextf;
1979 int implicit = 0;
1980 unsigned int max_targets = 0, target_idx = 0;
1981 const char **targets = 0, **target_percents = 0;
1982 struct commands *cmds;
1983
1984 /* If we've already snapped deps, that means we're in an eval being
1985 resolved after the makefiles have been read in. We can't add more rules
1986 at this time, since they won't get snapped and we'll get core dumps.
1987 See Savannah bug # 12124. */
1988 if (snapped_deps)
1989 fatal (flocp, _("prerequisites cannot be defined in command scripts"));
1990
1991 if (commands_idx > 0)
1992 {
1993 cmds = xmalloc (sizeof (struct commands));
1994 cmds->fileinfo.filenm = flocp->filenm;
1995 cmds->fileinfo.lineno = cmds_started;
1996 cmds->commands = savestring (commands, commands_idx);
1997 cmds->command_lines = 0;
1998 }
1999 else
2000 cmds = 0;
2001
2002 for (; filenames != 0; filenames = nextf)
2003 {
2004 const char *name = filenames->name;
2005 struct file *f;
2006 struct dep *this = 0;
2007 const char *implicit_percent;
2008
2009 nextf = filenames->next;
2010 free (filenames);
2011
2012 /* Check for special targets. Do it here instead of, say, snap_deps()
2013 so that we can immediately use the value. */
2014
2015 if (streq (name, ".POSIX"))
2016 posix_pedantic = 1;
2017 else if (streq (name, ".SECONDEXPANSION"))
2018 second_expansion = 1;
2019
2020 implicit_percent = find_percent_cached (&name);
2021 implicit |= implicit_percent != 0;
2022
2023 if (implicit)
2024 {
2025 if (pattern != 0)
2026 fatal (flocp, _("mixed implicit and static pattern rules"));
2027
2028 if (implicit_percent == 0)
2029 fatal (flocp, _("mixed implicit and normal rules"));
2030
2031 if (targets == 0)
2032 {
2033 max_targets = 5;
2034 targets = xmalloc (5 * sizeof (char *));
2035 target_percents = xmalloc (5 * sizeof (char *));
2036 target_idx = 0;
2037 }
2038 else if (target_idx == max_targets - 1)
2039 {
2040 max_targets += 5;
2041 targets = xrealloc (targets, max_targets * sizeof (char *));
2042 target_percents = xrealloc (target_percents,
2043 max_targets * sizeof (char *));
2044 }
2045 targets[target_idx] = name;
2046 target_percents[target_idx] = implicit_percent;
2047 ++target_idx;
2048 continue;
2049 }
2050
2051 /* If this is a static pattern rule:
2052 `targets: target%pattern: dep%pattern; cmds',
2053 make sure the pattern matches this target name. */
2054 if (pattern && !pattern_matches (pattern, pattern_percent, name))
2055 error (flocp, _("target `%s' doesn't match the target pattern"), name);
2056 else if (deps)
2057 {
2058 /* If there are multiple filenames, copy the chain DEPS for all but
2059 the last one. It is not safe for the same deps to go in more
2060 than one place in the database. */
2061 this = nextf != 0 ? copy_dep_chain (deps) : deps;
2062 this->need_2nd_expansion = (second_expansion
2063 && strchr (this->name, '$'));
2064 }
2065
2066 if (!two_colon)
2067 {
2068 /* Single-colon. Combine these dependencies
2069 with others in file's existing record, if any. */
2070 f = enter_file (strcache_add (name));
2071
2072 if (f->double_colon)
2073 fatal (flocp,
2074 _("target file `%s' has both : and :: entries"), f->name);
2075
2076 /* If CMDS == F->CMDS, this target was listed in this rule
2077 more than once. Just give a warning since this is harmless. */
2078 if (cmds != 0 && cmds == f->cmds)
2079 error (flocp,
2080 _("target `%s' given more than once in the same rule."),
2081 f->name);
2082
2083 /* Check for two single-colon entries both with commands.
2084 Check is_target so that we don't lose on files such as .c.o
2085 whose commands were preinitialized. */
2086 else if (cmds != 0 && f->cmds != 0 && f->is_target)
2087 {
2088 error (&cmds->fileinfo,
2089 _("warning: overriding commands for target `%s'"),
2090 f->name);
2091 error (&f->cmds->fileinfo,
2092 _("warning: ignoring old commands for target `%s'"),
2093 f->name);
2094 }
2095
2096 f->is_target = 1;
2097
2098 /* Defining .DEFAULT with no deps or cmds clears it. */
2099 if (f == default_file && this == 0 && cmds == 0)
2100 f->cmds = 0;
2101 if (cmds != 0)
2102 f->cmds = cmds;
2103
2104 /* Defining .SUFFIXES with no dependencies clears out the list of
2105 suffixes. */
2106 if (f == suffix_file && this == 0)
2107 {
2108 free_dep_chain (f->deps);
2109 f->deps = 0;
2110 }
2111 else if (this != 0)
2112 {
2113 /* Add the file's old deps and the new ones in THIS together. */
2114
2115 if (f->deps != 0)
2116 {
2117 struct dep **d_ptr = &f->deps;
2118
2119 while ((*d_ptr)->next != 0)
2120 d_ptr = &(*d_ptr)->next;
2121
2122 if (cmds != 0)
2123 /* This is the rule with commands, so put its deps
2124 last. The rationale behind this is that $< expands to
2125 the first dep in the chain, and commands use $<
2126 expecting to get the dep that rule specifies. However
2127 the second expansion algorithm reverses the order thus
2128 we need to make it last here. */
2129 (*d_ptr)->next = this;
2130 else
2131 {
2132 /* This is the rule without commands. Put its
2133 dependencies at the end but before dependencies from
2134 the rule with commands (if any). This way everything
2135 appears in makefile order. */
2136
2137 if (f->cmds != 0)
2138 {
2139 this->next = *d_ptr;
2140 *d_ptr = this;
2141 }
2142 else
2143 (*d_ptr)->next = this;
2144 }
2145 }
2146 else
2147 f->deps = this;
2148
2149 /* This is a hack. I need a way to communicate to snap_deps()
2150 that the last dependency line in this file came with commands
2151 (so that logic in snap_deps() can put it in front and all
2152 this $< -logic works). I cannot simply rely on file->cmds
2153 being not 0 because of the cases like the following:
2154
2155 foo: bar
2156 foo:
2157 ...
2158
2159 I am going to temporarily "borrow" UPDATING member in
2160 `struct file' for this. */
2161
2162 if (cmds != 0)
2163 f->updating = 1;
2164 }
2165 }
2166 else
2167 {
2168 /* Double-colon. Make a new record even if there already is one. */
2169 f = lookup_file (name);
2170
2171 /* Check for both : and :: rules. Check is_target so
2172 we don't lose on default suffix rules or makefiles. */
2173 if (f != 0 && f->is_target && !f->double_colon)
2174 fatal (flocp,
2175 _("target file `%s' has both : and :: entries"), f->name);
2176 f = enter_file (strcache_add (name));
2177 /* If there was an existing entry and it was a double-colon entry,
2178 enter_file will have returned a new one, making it the prev
2179 pointer of the old one, and setting its double_colon pointer to
2180 the first one. */
2181 if (f->double_colon == 0)
2182 /* This is the first entry for this name, so we must set its
2183 double_colon pointer to itself. */
2184 f->double_colon = f;
2185 f->is_target = 1;
2186 f->deps = this;
2187 f->cmds = cmds;
2188 }
2189
2190 /* If this is a static pattern rule, set the stem to the part of its
2191 name that matched the `%' in the pattern, so you can use $* in the
2192 commands. */
2193 if (pattern)
2194 {
2195 static const char *percent = "%";
2196 char *buffer = variable_expand ("");
2197 const size_t buffer_offset = buffer - variable_buffer; /* bird */
2198 char *o = patsubst_expand_pat (buffer, name, pattern, percent,
2199 pattern_percent+1, percent+1);
2200 buffer = variable_buffer + buffer_offset; /* bird - variable_buffer may have been reallocated. */
2201 f->stem = strcache_add_len (buffer, o - buffer);
2202 if (this)
2203 {
2204 this->staticpattern = 1;
2205 this->stem = f->stem;
2206 }
2207 }
2208
2209 name = f->name;
2210
2211 /* If this target is a default target, update DEFAULT_GOAL_FILE. */
2212 if (streq (*default_goal_name, name)
2213 && (default_goal_file == 0
2214 || ! streq (default_goal_file->name, name)))
2215 default_goal_file = f;
2216 }
2217
2218 if (implicit)
2219 {
2220 if (deps)
2221 deps->need_2nd_expansion = second_expansion;
2222 create_pattern_rule (targets, target_percents, target_idx,
2223 two_colon, deps, cmds, 1);
2224 }
2225}
2226
2227
2228/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero).
2229 Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash.
2230 Quoting backslashes are removed from STRING by compacting it into
2231 itself. Returns a pointer to the first unquoted STOPCHAR if there is
2232 one, or nil if there are none. STOPCHARs inside variable references are
2233 ignored if IGNOREVARS is true.
2234
2235 STOPCHAR _cannot_ be '$' if IGNOREVARS is true. */
2236
2237static char *
2238find_char_unquote (char *string, int stop1, int stop2, int blank,
2239 int ignorevars)
2240{
2241 unsigned int string_len = 0;
2242 char *p = string;
2243 register int ch; /* bird: 'optimiziations' */
2244
2245 if (ignorevars)
2246 ignorevars = '$';
2247
2248 while (1)
2249 {
2250 if (stop2 && blank)
2251 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1 && ch != stop2
2252 && ! isblank ((unsigned char) ch))
2253 ++p;
2254 else if (stop2)
2255 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1 && ch != stop2)
2256 ++p;
2257 else if (blank)
2258 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1
2259 && ! isblank ((unsigned char) ch))
2260 ++p;
2261 else
2262 while ((ch = *p) != '\0' && ch != ignorevars && ch != stop1)
2263 ++p;
2264
2265 if (ch == '\0')
2266 break;
2267
2268 /* If we stopped due to a variable reference, skip over its contents. */
2269 if (ch == ignorevars)
2270 {
2271 char openparen = p[1];
2272
2273 p += 2;
2274
2275 /* Skip the contents of a non-quoted, multi-char variable ref. */
2276 if (openparen == '(' || openparen == '{')
2277 {
2278 unsigned int pcount = 1;
2279 char closeparen = (openparen == '(' ? ')' : '}');
2280
2281 while ((ch = *p))
2282 {
2283 if (ch == openparen)
2284 ++pcount;
2285 else if (ch == closeparen)
2286 if (--pcount == 0)
2287 {
2288 ++p;
2289 break;
2290 }
2291 ++p;
2292 }
2293 }
2294
2295 /* Skipped the variable reference: look for STOPCHARS again. */
2296 continue;
2297 }
2298
2299 if (p > string && p[-1] == '\\')
2300 {
2301 /* Search for more backslashes. */
2302 int i = -2;
2303 while (&p[i] >= string && p[i] == '\\')
2304 --i;
2305 ++i;
2306 /* Only compute the length if really needed. */
2307 if (string_len == 0)
2308 string_len = strlen (string);
2309 /* The number of backslashes is now -I.
2310 Copy P over itself to swallow half of them. */
2311 memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1);
2312 p += i/2;
2313 if (i % 2 == 0)
2314 /* All the backslashes quoted each other; the STOPCHAR was
2315 unquoted. */
2316 return p;
2317
2318 /* The STOPCHAR was quoted by a backslash. Look for another. */
2319 }
2320 else
2321 /* No backslash in sight. */
2322 return p;
2323 }
2324
2325 /* Never hit a STOPCHAR or blank (with BLANK nonzero). */
2326 return 0;
2327}
2328
2329/* Search PATTERN for an unquoted % and handle quoting. */
2330
2331char *
2332find_percent (char *pattern)
2333{
2334 return find_char_unquote (pattern, '%', 0, 0, 0);
2335}
2336
2337/* Search STRING for an unquoted % and handle quoting. Returns a pointer to
2338 the % or NULL if no % was found.
2339 This version is used with strings in the string cache: if there's a need to
2340 modify the string a new version will be added to the string cache and
2341 *STRING will be set to that. */
2342
2343const char *
2344find_percent_cached (const char **string)
2345{
2346 const char *p = *string;
2347 char *new = 0;
2348 int slen;
2349
2350 /* If the first char is a % return now. This lets us avoid extra tests
2351 inside the loop. */
2352 if (*p == '%')
2353 return p;
2354
2355 while (1)
2356 {
2357 while (*p != '\0' && *p != '%')
2358 ++p;
2359
2360 if (*p == '\0')
2361 break;
2362
2363 /* See if this % is escaped with a backslash; if not we're done. */
2364 if (p[-1] != '\\')
2365 break;
2366
2367 {
2368 /* Search for more backslashes. */
2369 char *pv;
2370 int i = -2;
2371
2372 while (&p[i] >= *string && p[i] == '\\')
2373 --i;
2374 ++i;
2375
2376 /* At this point we know we'll need to allocate a new string.
2377 Make a copy if we haven't yet done so. */
2378 if (! new)
2379 {
2380 slen = strlen (*string);
2381 new = alloca (slen + 1);
2382 memcpy (new, *string, slen + 1);
2383 p = new + (p - *string);
2384 *string = new;
2385 }
2386
2387 /* At this point *string, p, and new all point into the same string.
2388 Get a non-const version of p so we can modify new. */
2389 pv = new + (p - *string);
2390
2391 /* The number of backslashes is now -I.
2392 Copy P over itself to swallow half of them. */
2393 memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1);
2394 p += i/2;
2395
2396 /* If the backslashes quoted each other; the % was unquoted. */
2397 if (i % 2 == 0)
2398 break;
2399 }
2400 }
2401
2402 /* If we had to change STRING, add it to the strcache. */
2403 if (new)
2404 {
2405 *string = strcache_add (*string);
2406 p = *string + (p - new);
2407 }
2408
2409 /* If we didn't find a %, return NULL. Otherwise return a ptr to it. */
2410 return (*p == '\0') ? NULL : p;
2411}
2412
2413
2414/* Parse a string into a sequence of filenames represented as a
2415 chain of struct nameseq's in reverse order and return that chain.
2416
2417 The string is passed as STRINGP, the address of a string pointer.
2418 The string pointer is updated to point at the first character
2419 not parsed, which either is a null char or equals STOPCHAR.
2420
2421 SIZE is how big to construct chain elements.
2422 This is useful if we want them actually to be other structures
2423 that have room for additional info.
2424
2425 If STRIP is nonzero, strip `./'s off the beginning. */
2426
2427struct nameseq *
2428parse_file_seq (char **stringp, int stopchar, unsigned int size, int strip)
2429{
2430 struct nameseq *new = 0;
2431 struct nameseq *new1;
2432#ifndef NO_ARCHIVES /* bird: MSC warning */
2433 struct nameseq *lastnew1;
2434#endif
2435 char *p = *stringp;
2436
2437#ifdef VMS
2438# define VMS_COMMA ','
2439#else
2440# define VMS_COMMA 0
2441#endif
2442
2443 while (1)
2444 {
2445 const char *name;
2446 char *q;
2447
2448 /* Skip whitespace; see if any more names are left. */
2449 p = next_token (p);
2450 if (*p == '\0')
2451 break;
2452 if (*p == stopchar)
2453 break;
2454
2455 /* There are, so find the end of the next name. */
2456 q = p;
2457 p = find_char_unquote (q, stopchar, VMS_COMMA, 1, 0);
2458#ifdef VMS
2459 /* convert comma separated list to space separated */
2460 if (p && *p == ',')
2461 *p =' ';
2462#endif
2463#ifdef _AMIGA
2464 if (stopchar == ':' && p && *p == ':'
2465 && !(isspace ((unsigned char)p[1]) || !p[1]
2466 || isspace ((unsigned char)p[-1])))
2467 p = find_char_unquote (p+1, stopchar, VMS_COMMA, 1, 0);
2468#endif
2469#ifdef HAVE_DOS_PATHS
2470 /* For DOS paths, skip a "C:\..." or a "C:/..." until we find the
2471 first colon which isn't followed by a slash or a backslash.
2472 Note that tokens separated by spaces should be treated as separate
2473 tokens since make doesn't allow path names with spaces */
2474 if (stopchar == ':')
2475 while (p != 0 && !isspace ((unsigned char)*p) &&
2476 (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1]))
2477 p = find_char_unquote (p + 1, stopchar, VMS_COMMA, 1, 0);
2478#endif
2479 if (p == 0)
2480 p = q + strlen (q);
2481
2482 if (strip)
2483#ifdef VMS
2484 /* Skip leading `[]'s. */
2485 while (p - q > 2 && q[0] == '[' && q[1] == ']')
2486#else
2487 /* Skip leading `./'s. */
2488 while (p - q > 2 && q[0] == '.' && q[1] == '/')
2489#endif
2490 {
2491 q += 2; /* Skip "./". */
2492 while (q < p && *q == '/')
2493 /* Skip following slashes: ".//foo" is "foo", not "/foo". */
2494 ++q;
2495 }
2496
2497 /* Extract the filename just found, and skip it. */
2498
2499 if (q == p)
2500 /* ".///" was stripped to "". */
2501#if defined(VMS)
2502 continue;
2503#elif defined(_AMIGA)
2504 name = "";
2505#else
2506 name = "./";
2507#endif
2508 else
2509#ifdef VMS
2510/* VMS filenames can have a ':' in them but they have to be '\'ed but we need
2511 * to remove this '\' before we can use the filename.
2512 * Savestring called because q may be read-only string constant.
2513 */
2514 {
2515 char *qbase = xstrdup (q);
2516 char *pbase = qbase + (p-q);
2517 char *q1 = qbase;
2518 char *q2 = q1;
2519 char *p1 = pbase;
2520
2521 while (q1 != pbase)
2522 {
2523 if (*q1 == '\\' && *(q1+1) == ':')
2524 {
2525 q1++;
2526 p1--;
2527 }
2528 *q2++ = *q1++;
2529 }
2530 name = strcache_add_len (qbase, p1 - qbase);
2531 free (qbase);
2532 }
2533#else
2534 name = strcache_add_len (q, p - q);
2535#endif
2536
2537 /* Add it to the front of the chain. */
2538 new1 = xmalloc (size);
2539 new1->name = name;
2540 new1->next = new;
2541 new = new1;
2542 }
2543
2544#ifndef NO_ARCHIVES
2545
2546 /* Look for multi-word archive references.
2547 They are indicated by a elt ending with an unmatched `)' and
2548 an elt further down the chain (i.e., previous in the file list)
2549 with an unmatched `(' (e.g., "lib(mem"). */
2550
2551 new1 = new;
2552 lastnew1 = 0;
2553 while (new1 != 0)
2554 if (new1->name[0] != '(' /* Don't catch "(%)" and suchlike. */
2555 && new1->name[strlen (new1->name) - 1] == ')'
2556 && strchr (new1->name, '(') == 0)
2557 {
2558 /* NEW1 ends with a `)' but does not contain a `('.
2559 Look back for an elt with an opening `(' but no closing `)'. */
2560
2561 struct nameseq *n = new1->next, *lastn = new1;
2562 char *paren = 0;
2563 while (n != 0 && (paren = strchr (n->name, '(')) == 0)
2564 {
2565 lastn = n;
2566 n = n->next;
2567 }
2568 if (n != 0
2569 /* Ignore something starting with `(', as that cannot actually
2570 be an archive-member reference (and treating it as such
2571 results in an empty file name, which causes much lossage). */
2572 && n->name[0] != '(')
2573 {
2574 /* N is the first element in the archive group.
2575 Its name looks like "lib(mem" (with no closing `)'). */
2576
2577 char *libname;
2578
2579 /* Copy "lib(" into LIBNAME. */
2580 ++paren;
2581 libname = alloca (paren - n->name + 1);
2582 memcpy (libname, n->name, paren - n->name);
2583 libname[paren - n->name] = '\0';
2584
2585 if (*paren == '\0')
2586 {
2587 /* N was just "lib(", part of something like "lib( a b)".
2588 Edit it out of the chain and free its storage. */
2589 lastn->next = n->next;
2590 free (n);
2591 /* LASTN->next is the new stopping elt for the loop below. */
2592 n = lastn->next;
2593 }
2594 else
2595 {
2596 /* Replace N's name with the full archive reference. */
2597 n->name = strcache_add (concat (libname, paren, ")"));
2598 }
2599
2600 if (new1->name[1] == '\0')
2601 {
2602 /* NEW1 is just ")", part of something like "lib(a b )".
2603 Omit it from the chain and free its storage. */
2604 if (lastnew1 == 0)
2605 new = new1->next;
2606 else
2607 lastnew1->next = new1->next;
2608 lastn = new1;
2609 new1 = new1->next;
2610 free (lastn);
2611 }
2612 else
2613 {
2614 /* Replace also NEW1->name, which already has closing `)'. */
2615 new1->name = strcache_add (concat (libname, new1->name, ""));
2616 new1 = new1->next;
2617 }
2618
2619 /* Trace back from NEW1 (the end of the list) until N
2620 (the beginning of the list), rewriting each name
2621 with the full archive reference. */
2622
2623 while (new1 != n)
2624 {
2625 new1->name = strcache_add (concat (libname, new1->name, ")"));
2626 lastnew1 = new1;
2627 new1 = new1->next;
2628 }
2629 }
2630 else
2631 {
2632 /* No frobnication happening. Just step down the list. */
2633 lastnew1 = new1;
2634 new1 = new1->next;
2635 }
2636 }
2637 else
2638 {
2639 lastnew1 = new1;
2640 new1 = new1->next;
2641 }
2642
2643#endif
2644
2645 *stringp = p;
2646 return new;
2647}
2648
2649
2650/* Find the next line of text in an eval buffer, combining continuation lines
2651 into one line.
2652 Return the number of actual lines read (> 1 if continuation lines).
2653 Returns -1 if there's nothing left in the buffer.
2654
2655 After this function, ebuf->buffer points to the first character of the
2656 line we just found.
2657 */
2658
2659/* Read a line of text from a STRING.
2660 Since we aren't really reading from a file, don't bother with linenumbers.
2661 */
2662
2663static unsigned long
2664readstring (struct ebuffer *ebuf)
2665{
2666 char *eol;
2667
2668 /* If there is nothing left in this buffer, return 0. */
2669 if (ebuf->bufnext >= ebuf->bufstart + ebuf->size)
2670 return -1;
2671
2672 /* Set up a new starting point for the buffer, and find the end of the
2673 next logical line (taking into account backslash/newline pairs). */
2674
2675 eol = ebuf->buffer = ebuf->bufnext;
2676
2677 while (1)
2678 {
2679 int backslash = 0;
2680 char *bol = eol;
2681 char *p;
2682
2683 /* Find the next newline. At EOS, stop. */
2684 eol = p = strchr (eol , '\n');
2685 if (!eol)
2686 {
2687 ebuf->bufnext = ebuf->bufstart + ebuf->size + 1;
2688 return 0;
2689 }
2690
2691 /* Found a newline; if it's escaped continue; else we're done. */
2692 while (p > bol && *(--p) == '\\')
2693 backslash = !backslash;
2694 if (!backslash)
2695 break;
2696 ++eol;
2697 }
2698
2699 /* Overwrite the newline char. */
2700 *eol = '\0';
2701 ebuf->bufnext = eol+1;
2702
2703 return 0;
2704}
2705
2706static long
2707readline (struct ebuffer *ebuf)
2708{
2709 char *p;
2710 char *end;
2711 char *start;
2712 long nlines = 0;
2713
2714 /* The behaviors between string and stream buffers are different enough to
2715 warrant different functions. Do the Right Thing. */
2716
2717 if (!ebuf->fp)
2718 return readstring (ebuf);
2719
2720 /* When reading from a file, we always start over at the beginning of the
2721 buffer for each new line. */
2722
2723 p = start = ebuf->bufstart;
2724 end = p + ebuf->size;
2725 *p = '\0';
2726
2727 while (fgets (p, end - p, ebuf->fp) != 0)
2728 {
2729 char *p2;
2730 unsigned long len;
2731 int backslash;
2732
2733 len = strlen (p);
2734 if (len == 0)
2735 {
2736 /* This only happens when the first thing on the line is a '\0'.
2737 It is a pretty hopeless case, but (wonder of wonders) Athena
2738 lossage strikes again! (xmkmf puts NULs in its makefiles.)
2739 There is nothing really to be done; we synthesize a newline so
2740 the following line doesn't appear to be part of this line. */
2741 error (&ebuf->floc,
2742 _("warning: NUL character seen; rest of line ignored"));
2743 p[0] = '\n';
2744 len = 1;
2745 }
2746
2747 /* Jump past the text we just read. */
2748 p += len;
2749
2750 /* If the last char isn't a newline, the whole line didn't fit into the
2751 buffer. Get some more buffer and try again. */
2752 if (p[-1] != '\n')
2753 goto more_buffer;
2754
2755 /* We got a newline, so add one to the count of lines. */
2756 ++nlines;
2757
2758#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__)
2759 /* Check to see if the line was really ended with CRLF; if so ignore
2760 the CR. */
2761 if ((p - start) > 1 && p[-2] == '\r')
2762 {
2763 --p;
2764 p[-1] = '\n';
2765 }
2766#endif
2767
2768 backslash = 0;
2769 for (p2 = p - 2; p2 >= start; --p2)
2770 {
2771 if (*p2 != '\\')
2772 break;
2773 backslash = !backslash;
2774 }
2775
2776 if (!backslash)
2777 {
2778 p[-1] = '\0';
2779 break;
2780 }
2781
2782 /* It was a backslash/newline combo. If we have more space, read
2783 another line. */
2784 if (end - p >= 80)
2785 continue;
2786
2787 /* We need more space at the end of our buffer, so realloc it.
2788 Make sure to preserve the current offset of p. */
2789 more_buffer:
2790 {
2791 unsigned long off = p - start;
2792 ebuf->size *= 2;
2793 start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size);
2794 p = start + off;
2795 end = start + ebuf->size;
2796 *p = '\0';
2797 }
2798 }
2799
2800 if (ferror (ebuf->fp))
2801 pfatal_with_name (ebuf->floc.filenm);
2802
2803 /* If we found some lines, return how many.
2804 If we didn't, but we did find _something_, that indicates we read the last
2805 line of a file with no final newline; return 1.
2806 If we read nothing, we're at EOF; return -1. */
2807
2808 return nlines ? nlines : p == ebuf->bufstart ? -1 : 1;
2809}
2810
2811
2812/* Parse the next "makefile word" from the input buffer, and return info
2813 about it.
2814
2815 A "makefile word" is one of:
2816
2817 w_bogus Should never happen
2818 w_eol End of input
2819 w_static A static word; cannot be expanded
2820 w_variable A word containing one or more variables/functions
2821 w_colon A colon
2822 w_dcolon A double-colon
2823 w_semicolon A semicolon
2824 w_varassign A variable assignment operator (=, :=, +=, or ?=)
2825
2826 Note that this function is only used when reading certain parts of the
2827 makefile. Don't use it where special rules hold sway (RHS of a variable,
2828 in a command list, etc.) */
2829
2830static enum make_word_type
2831get_next_mword (char *buffer, char *delim, char **startp, unsigned int *length)
2832{
2833 enum make_word_type wtype = w_bogus;
2834 char *p = buffer, *beg;
2835 char c;
2836
2837 /* Skip any leading whitespace. */
2838 while (isblank ((unsigned char)*p))
2839 ++p;
2840
2841 beg = p;
2842 c = *(p++);
2843 switch (c)
2844 {
2845 case '\0':
2846 wtype = w_eol;
2847 break;
2848
2849 case ';':
2850 wtype = w_semicolon;
2851 break;
2852
2853 case '=':
2854 wtype = w_varassign;
2855 break;
2856
2857 case ':':
2858 wtype = w_colon;
2859 switch (*p)
2860 {
2861 case ':':
2862 ++p;
2863 wtype = w_dcolon;
2864 break;
2865
2866 case '=':
2867 ++p;
2868 wtype = w_varassign;
2869 break;
2870 }
2871 break;
2872
2873 case '+':
2874 case '?':
2875 if (*p == '=')
2876 {
2877 ++p;
2878 wtype = w_varassign;
2879 break;
2880 }
2881
2882 default:
2883 if (delim && strchr (delim, c))
2884 wtype = w_static;
2885 break;
2886 }
2887
2888 /* Did we find something? If so, return now. */
2889 if (wtype != w_bogus)
2890 goto done;
2891
2892 /* This is some non-operator word. A word consists of the longest
2893 string of characters that doesn't contain whitespace, one of [:=#],
2894 or [?+]=, or one of the chars in the DELIM string. */
2895
2896 /* We start out assuming a static word; if we see a variable we'll
2897 adjust our assumptions then. */
2898 wtype = w_static;
2899
2900 /* We already found the first value of "c", above. */
2901 while (1)
2902 {
2903 char closeparen;
2904 int count;
2905
2906 switch (c)
2907 {
2908 case '\0':
2909 case ' ':
2910 case '\t':
2911 case '=':
2912 goto done_word;
2913
2914 case ':':
2915#ifdef HAVE_DOS_PATHS
2916 /* A word CAN include a colon in its drive spec. The drive
2917 spec is allowed either at the beginning of a word, or as part
2918 of the archive member name, like in "libfoo.a(d:/foo/bar.o)". */
2919 if (!(p - beg >= 2
2920 && (*p == '/' || *p == '\\') && isalpha ((unsigned char)p[-2])
2921 && (p - beg == 2 || p[-3] == '(')))
2922#endif
2923 goto done_word;
2924
2925 case '$':
2926 c = *(p++);
2927 if (c == '$')
2928 break;
2929
2930 /* This is a variable reference, so note that it's expandable.
2931 Then read it to the matching close paren. */
2932 wtype = w_variable;
2933
2934 if (c == '(')
2935 closeparen = ')';
2936 else if (c == '{')
2937 closeparen = '}';
2938 else
2939 /* This is a single-letter variable reference. */
2940 break;
2941
2942 for (count=0; *p != '\0'; ++p)
2943 {
2944 if (*p == c)
2945 ++count;
2946 else if (*p == closeparen && --count < 0)
2947 {
2948 ++p;
2949 break;
2950 }
2951 }
2952 break;
2953
2954 case '?':
2955 case '+':
2956 if (*p == '=')
2957 goto done_word;
2958 break;
2959
2960 case '\\':
2961 switch (*p)
2962 {
2963 case ':':
2964 case ';':
2965 case '=':
2966 case '\\':
2967 ++p;
2968 break;
2969 }
2970 break;
2971
2972 default:
2973 if (delim && strchr (delim, c))
2974 goto done_word;
2975 break;
2976 }
2977
2978 c = *(p++);
2979 }
2980 done_word:
2981 --p;
2982
2983 done:
2984 if (startp)
2985 *startp = beg;
2986 if (length)
2987 *length = p - beg;
2988 return wtype;
2989}
2990
2991
2992/* Construct the list of include directories
2993 from the arguments and the default list. */
2994
2995void
2996construct_include_path (const char **arg_dirs)
2997{
2998#ifdef VAXC /* just don't ask ... */
2999 stat_t stbuf;
3000#else
3001 struct stat stbuf;
3002#endif
3003 const char **dirs;
3004 const char **cpp;
3005 unsigned int idx;
3006
3007 /* Compute the number of pointers we need in the table. */
3008 idx = sizeof (default_include_directories) / sizeof (const char *);
3009 if (arg_dirs)
3010 for (cpp = arg_dirs; *cpp != 0; ++cpp)
3011 ++idx;
3012
3013#ifdef __MSDOS__
3014 /* Add one for $DJDIR. */
3015 ++idx;
3016#endif
3017#ifdef KMK
3018 /* Add one for the kBuild directory. */
3019 ++idx;
3020#endif
3021
3022 dirs = xmalloc (idx * sizeof (const char *));
3023
3024 idx = 0;
3025 max_incl_len = 0;
3026
3027 /* First consider any dirs specified with -I switches.
3028 Ignore any that don't exist. Remember the maximum string length. */
3029
3030 if (arg_dirs)
3031 while (*arg_dirs != 0)
3032 {
3033 const char *dir = *(arg_dirs++);
3034 char *expanded = 0;
3035 int e;
3036
3037 if (dir[0] == '~')
3038 {
3039 expanded = tilde_expand (dir);
3040 if (expanded != 0)
3041 dir = expanded;
3042 }
3043
3044 EINTRLOOP (e, stat (dir, &stbuf));
3045 if (e == 0 && S_ISDIR (stbuf.st_mode))
3046 {
3047 unsigned int len = strlen (dir);
3048 /* If dir name is written with trailing slashes, discard them. */
3049 while (len > 1 && dir[len - 1] == '/')
3050 --len;
3051 if (len > max_incl_len)
3052 max_incl_len = len;
3053 dirs[idx++] = strcache_add_len (dir, len);
3054 }
3055
3056 if (expanded)
3057 free (expanded);
3058 }
3059
3060 /* Now add the standard default dirs at the end. */
3061
3062#ifdef __MSDOS__
3063 {
3064 /* The environment variable $DJDIR holds the root of the DJGPP directory
3065 tree; add ${DJDIR}/include. */
3066 struct variable *djdir = lookup_variable ("DJDIR", 5);
3067
3068 if (djdir)
3069 {
3070 unsigned int len = strlen (djdir->value) + 8;
3071 char *defdir = alloca (len + 1);
3072
3073 strcat (strcpy (defdir, djdir->value), "/include");
3074 dirs[idx++] = strcache_add (defdir);
3075
3076 if (len > max_incl_len)
3077 max_incl_len = len;
3078 }
3079 }
3080#endif
3081#ifdef KMK
3082 /* Add $(PATH_KBUILD). */
3083 {
3084 size_t len = strlen (get_path_kbuild ());
3085 dirs[idx++] = strcache_add_len (get_path_kbuild (), len);
3086 if (len > max_incl_len)
3087 max_incl_len = len;
3088 }
3089#endif
3090
3091 for (cpp = default_include_directories; *cpp != 0; ++cpp)
3092 {
3093 int e;
3094
3095 EINTRLOOP (e, stat (*cpp, &stbuf));
3096 if (e == 0 && S_ISDIR (stbuf.st_mode))
3097 {
3098 unsigned int len = strlen (*cpp);
3099 /* If dir name is written with trailing slashes, discard them. */
3100 while (len > 1 && (*cpp)[len - 1] == '/')
3101 --len;
3102 if (len > max_incl_len)
3103 max_incl_len = len;
3104 dirs[idx++] = strcache_add_len (*cpp, len - 1);
3105 }
3106 }
3107
3108 dirs[idx] = 0;
3109
3110 /* Now add each dir to the .INCLUDE_DIRS variable. */
3111
3112 for (cpp = dirs; *cpp != 0; ++cpp)
3113 do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp,
3114 o_default, f_append, 0);
3115
3116 include_directories = dirs;
3117}
3118
3119
3120/* Expand ~ or ~USER at the beginning of NAME.
3121 Return a newly malloc'd string or 0. */
3122
3123char *
3124tilde_expand (const char *name)
3125{
3126#ifndef VMS
3127 if (name[1] == '/' || name[1] == '\0')
3128 {
3129 extern char *getenv ();
3130 char *home_dir;
3131 int is_variable;
3132
3133 {
3134 /* Turn off --warn-undefined-variables while we expand HOME. */
3135 int save = warn_undefined_variables_flag;
3136 warn_undefined_variables_flag = 0;
3137
3138 home_dir = allocated_variable_expand ("$(HOME)");
3139
3140 warn_undefined_variables_flag = save;
3141 }
3142
3143 is_variable = home_dir[0] != '\0';
3144 if (!is_variable)
3145 {
3146 free (home_dir);
3147 home_dir = getenv ("HOME");
3148 }
3149# if !defined(_AMIGA) && !defined(WINDOWS32)
3150 if (home_dir == 0 || home_dir[0] == '\0')
3151 {
3152 extern char *getlogin ();
3153 char *logname = getlogin ();
3154 home_dir = 0;
3155 if (logname != 0)
3156 {
3157 struct passwd *p = getpwnam (logname);
3158 if (p != 0)
3159 home_dir = p->pw_dir;
3160 }
3161 }
3162# endif /* !AMIGA && !WINDOWS32 */
3163 if (home_dir != 0)
3164 {
3165 char *new = xstrdup (concat (home_dir, "", name + 1));
3166 if (is_variable)
3167 free (home_dir);
3168 return new;
3169 }
3170 }
3171# if !defined(_AMIGA) && !defined(WINDOWS32)
3172 else
3173 {
3174 struct passwd *pwent;
3175 char *userend = strchr (name + 1, '/');
3176 if (userend != 0)
3177 *userend = '\0';
3178 pwent = getpwnam (name + 1);
3179 if (pwent != 0)
3180 {
3181 if (userend == 0)
3182 return xstrdup (pwent->pw_dir);
3183 else
3184 return xstrdup (concat (pwent->pw_dir, "/", userend + 1));
3185 }
3186 else if (userend != 0)
3187 *userend = '/';
3188 }
3189# endif /* !AMIGA && !WINDOWS32 */
3190#endif /* !VMS */
3191 return 0;
3192}
3193
3194/* Given a chain of struct nameseq's describing a sequence of filenames,
3195 in reverse of the intended order, return a new chain describing the
3196 result of globbing the filenames. The new chain is in forward order.
3197 The links of the old chain are freed or used in the new chain.
3198 Likewise for the names in the old chain.
3199
3200 SIZE is how big to construct chain elements.
3201 This is useful if we want them actually to be other structures
3202 that have room for additional info. */
3203
3204struct nameseq *
3205multi_glob (struct nameseq *chain, unsigned int size)
3206{
3207 void dir_setup_glob (glob_t *);
3208 struct nameseq *new = 0;
3209 struct nameseq *old;
3210 struct nameseq *nexto;
3211 glob_t gl;
3212#if defined(KMK) || defined(__EMX__) /* speed optimization */
3213 int rc;
3214#endif
3215
3216 dir_setup_glob (&gl);
3217
3218 for (old = chain; old != 0; old = nexto)
3219 {
3220 const char *gname;
3221#ifndef NO_ARCHIVES
3222 char *arname = 0;
3223 char *memname = 0;
3224#endif
3225 nexto = old->next;
3226 gname = old->name;
3227
3228 if (gname[0] == '~')
3229 {
3230 char *newname = tilde_expand (old->name);
3231 if (newname != 0)
3232 gname = newname;
3233 }
3234
3235#ifndef NO_ARCHIVES
3236 if (ar_name (gname))
3237 {
3238 /* OLD->name is an archive member reference. Replace it with the
3239 archive file name, and save the member name in MEMNAME. We will
3240 glob on the archive name and then reattach MEMNAME later. */
3241 ar_parse_name (gname, &arname, &memname);
3242 gname = arname;
3243 }
3244#endif /* !NO_ARCHIVES */
3245
3246#if defined(KMK) || defined(__EMX__) /* speed optimization */
3247 if (!strpbrk(gname, "*?["))
3248 {
3249 gl.gl_pathc = 1;
3250 gl.gl_pathv = (char **)&gname;
3251 rc = 0;
3252 }
3253 else
3254 rc = glob (gname, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl);
3255 switch (rc)
3256#else
3257 switch (glob (gname, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl))
3258#endif
3259 {
3260 case 0: /* Success. */
3261 {
3262 int i = gl.gl_pathc;
3263 while (i-- > 0)
3264 {
3265#ifndef NO_ARCHIVES
3266 if (memname != 0)
3267 {
3268 /* Try to glob on MEMNAME within the archive. */
3269 struct nameseq *found
3270 = ar_glob (gl.gl_pathv[i], memname, size);
3271 if (! found)
3272 {
3273 /* No matches. Use MEMNAME as-is. */
3274 unsigned int alen = strlen (gl.gl_pathv[i]);
3275 unsigned int mlen = strlen (memname);
3276 char *name;
3277 struct nameseq *elt = xmalloc (size);
3278 memset (elt, '\0', size);
3279
3280 name = alloca (alen + 1 + mlen + 2);
3281 memcpy (name, gl.gl_pathv[i], alen);
3282 name[alen] = '(';
3283 memcpy (name+alen+1, memname, mlen);
3284 name[alen + 1 + mlen] = ')';
3285 name[alen + 1 + mlen + 1] = '\0';
3286 elt->name = strcache_add (name);
3287 elt->next = new;
3288 new = elt;
3289 }
3290 else
3291 {
3292 /* Find the end of the FOUND chain. */
3293 struct nameseq *f = found;
3294 while (f->next != 0)
3295 f = f->next;
3296
3297 /* Attach the chain being built to the end of the FOUND
3298 chain, and make FOUND the new NEW chain. */
3299 f->next = new;
3300 new = found;
3301 }
3302 }
3303 else
3304#endif /* !NO_ARCHIVES */
3305 {
3306 struct nameseq *elt = xmalloc (size);
3307 memset (elt, '\0', size);
3308 elt->name = strcache_add (gl.gl_pathv[i]);
3309 elt->next = new;
3310 new = elt;
3311 }
3312 }
3313#if defined(KMK) || defined(__EMX__) /* speed optimization */
3314 if (gl.gl_pathv != &gname)
3315#endif
3316 globfree (&gl);
3317 free (old);
3318 break;
3319 }
3320
3321 case GLOB_NOSPACE:
3322 fatal (NILF, _("virtual memory exhausted"));
3323 break;
3324
3325 default:
3326 old->next = new;
3327 new = old;
3328 break;
3329 }
3330
3331#ifndef NO_ARCHIVES
3332 if (arname)
3333 free (arname);
3334#endif
3335 }
3336
3337 return new;
3338}
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette