Updated from libc
[make.git] / read.c
blobc2de63bd00b5f9778ab26701b6b383a14c0a14ab
1 /* Reading and parsing of makefiles for GNU Make.
2 Copyright (C) 1988,89,90,91,92,93,94,95,96 Free Software Foundation, Inc.
3 This file is part of GNU Make.
5 GNU Make is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
8 any later version.
10 GNU Make is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNU Make; see the file COPYING. If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19 #include "make.h"
20 #include "dep.h"
21 #include "filedef.h"
22 #include "job.h"
23 #include "commands.h"
24 #include "variable.h"
26 /* This is POSIX.2, but most systems using -DPOSIX probably don't have it. */
27 #ifdef HAVE_GLOB_H
28 #include <glob.h>
29 #else
30 #include "glob/glob.h"
31 #endif
33 #ifndef WIN32
34 #ifndef _AMIGA
35 #ifndef VMS
36 #include <pwd.h>
37 #else
38 struct passwd *getpwnam PARAMS ((char *name));
39 #endif
40 #endif
41 #endif /* !WIN32 */
43 /* A `struct linebuffer' is a structure which holds a line of text.
44 `readline' reads a line from a stream into a linebuffer
45 and works regardless of the length of the line. */
47 struct linebuffer
49 /* Note: This is the number of bytes malloc'ed for `buffer'
50 It does not indicate `buffer's real length.
51 Instead, a null char indicates end-of-string. */
52 unsigned int size;
53 char *buffer;
56 #define initbuffer(lb) (lb)->buffer = (char *) xmalloc ((lb)->size = 200)
57 #define freebuffer(lb) free ((lb)->buffer)
60 /* A `struct conditionals' contains the information describing
61 all the active conditionals in a makefile.
63 The global variable `conditionals' contains the conditionals
64 information for the current makefile. It is initialized from
65 the static structure `toplevel_conditionals' and is later changed
66 to new structures for included makefiles. */
68 struct conditionals
70 unsigned int if_cmds; /* Depth of conditional nesting. */
71 unsigned int allocated; /* Elts allocated in following arrays. */
72 char *ignoring; /* Are we ignoring or interepreting? */
73 char *seen_else; /* Have we already seen an `else'? */
76 static struct conditionals toplevel_conditionals;
77 static struct conditionals *conditionals = &toplevel_conditionals;
80 /* Default directories to search for include files in */
82 static char *default_include_directories[] =
84 #if defined(WIN32) && !defined(INCLUDEDIR)
86 * This completly up to the user when they install MSVC or other packages.
87 * This is defined as a placeholder.
89 #define INCLUDEDIR "."
90 #endif
91 INCLUDEDIR,
92 #ifndef _AMIGA
93 "/usr/gnu/include",
94 "/usr/local/include",
95 "/usr/include",
96 #endif
100 /* List of directories to search for include files in */
102 static char **include_directories;
104 /* Maximum length of an element of the above. */
106 static unsigned int max_incl_len;
108 /* The filename and pointer to line number of the
109 makefile currently being read in. */
111 char *reading_filename;
112 unsigned int *reading_lineno_ptr;
114 /* The chain of makefiles read by read_makefile. */
116 static struct dep *read_makefiles = 0;
118 static int read_makefile PARAMS ((char *filename, int flags));
119 static unsigned int readline PARAMS ((struct linebuffer *linebuffer, FILE *stream,
120 char *filename, unsigned int lineno));
121 static unsigned int do_define PARAMS ((char *name, unsigned int namelen, enum variable_origin origin,
122 unsigned int lineno, FILE *infile, char *filename));
123 static int conditional_line PARAMS ((char *line, char *filename, unsigned int lineno));
124 static void record_files PARAMS ((struct nameseq *filenames, char *pattern, char *pattern_percent,
125 struct dep *deps, unsigned int commands_started, char *commands,
126 unsigned int commands_idx, int two_colon, char *filename,
127 unsigned int lineno, int set_default));
129 /* Read in all the makefiles and return the chain of their names. */
131 struct dep *
132 read_all_makefiles (makefiles)
133 char **makefiles;
135 unsigned int num_makefiles = 0;
137 if (debug_flag)
138 puts ("Reading makefiles...");
140 /* If there's a non-null variable MAKEFILES, its value is a list of
141 files to read first thing. But don't let it prevent reading the
142 default makefiles and don't let the default goal come from there. */
145 char *value;
146 char *name, *p;
147 unsigned int length;
150 /* Turn off --warn-undefined-variables while we expand MAKEFILES. */
151 int save = warn_undefined_variables_flag;
152 warn_undefined_variables_flag = 0;
154 value = allocated_variable_expand ("$(MAKEFILES)");
156 warn_undefined_variables_flag = save;
159 /* Set NAME to the start of next token and LENGTH to its length.
160 MAKEFILES is updated for finding remaining tokens. */
161 p = value;
163 while ((name = find_next_token (&p, &length)) != 0)
165 if (*p != '\0')
166 *p++ = '\0';
167 (void) read_makefile (name,
168 RM_NO_DEFAULT_GOAL | RM_INCLUDED | RM_DONTCARE);
171 free (value);
174 /* Read makefiles specified with -f switches. */
176 if (makefiles != 0)
177 while (*makefiles != 0)
179 struct dep *tail = read_makefiles;
180 register struct dep *d;
182 if (! read_makefile (*makefiles, 0))
183 perror_with_name ("", *makefiles);
185 /* Find the right element of read_makefiles. */
186 d = read_makefiles;
187 while (d->next != tail)
188 d = d->next;
190 /* Use the storage read_makefile allocates. */
191 *makefiles = dep_name (d);
192 ++num_makefiles;
193 ++makefiles;
196 /* If there were no -f switches, try the default names. */
198 if (num_makefiles == 0)
200 static char *default_makefiles[] =
201 #ifdef VMS
202 /* all lower case since readdir() (the vms version) 'lowercasifies' */
203 { "makefile.vms", "gnumakefile", "makefile", 0 };
204 #else
205 #ifdef _AMIGA
206 { "GNUmakefile", "Makefile", "SMakefile", 0 };
207 #else /* !Amiga && !VMS */
208 { "GNUmakefile", "makefile", "Makefile", 0 };
209 #endif /* AMIGA */
210 #endif /* VMS */
211 register char **p = default_makefiles;
212 while (*p != 0 && !file_exists_p (*p))
213 ++p;
215 if (*p != 0)
217 if (! read_makefile (*p, 0))
218 perror_with_name ("", *p);
220 else
222 /* No default makefile was found. Add the default makefiles to the
223 `read_makefiles' chain so they will be updated if possible. */
224 struct dep *tail = read_makefiles;
225 /* Add them to the tail, after any MAKEFILES variable makefiles. */
226 while (tail != 0 && tail->next != 0)
227 tail = tail->next;
228 for (p = default_makefiles; *p != 0; ++p)
230 struct dep *d = (struct dep *) xmalloc (sizeof (struct dep));
231 d->name = 0;
232 d->file = enter_file (*p);
233 d->file->dontcare = 1;
234 /* Tell update_goal_chain to bail out as soon as this file is
235 made, and main not to die if we can't make this file. */
236 d->changed = RM_DONTCARE;
237 if (tail == 0)
238 read_makefiles = d;
239 else
240 tail->next = d;
241 tail = d;
243 if (tail != 0)
244 tail->next = 0;
248 return read_makefiles;
251 /* Read file FILENAME as a makefile and add its contents to the data base.
253 FLAGS contains bits as above.
255 FILENAME is added to the `read_makefiles' chain.
257 Returns 1 if a file was found and read, 0 if not. */
259 static int
260 read_makefile (filename, flags)
261 char *filename;
262 int flags;
264 static char *collapsed = 0;
265 static unsigned int collapsed_length = 0;
266 register FILE *infile;
267 struct linebuffer lb;
268 unsigned int commands_len = 200;
269 char *commands = (char *) xmalloc (200);
270 unsigned int commands_idx = 0;
271 unsigned int commands_started;
272 register char *p;
273 char *p2;
274 int ignoring = 0, in_ignored_define = 0;
275 int no_targets = 0; /* Set when reading a rule without targets. */
276 char *passed_filename = filename;
278 struct nameseq *filenames = 0;
279 struct dep *deps;
280 unsigned int lineno = 1;
281 unsigned int nlines = 0;
282 int two_colon;
283 char *pattern = 0, *pattern_percent;
285 int makefile_errno;
286 #ifdef WIN32
287 int check_again;
288 #endif
290 #define record_waiting_files() \
291 do \
293 if (filenames != 0) \
294 record_files (filenames, pattern, pattern_percent, deps, \
295 commands_started, commands, commands_idx, \
296 two_colon, filename, lineno, \
297 !(flags & RM_NO_DEFAULT_GOAL)); \
298 filenames = 0; \
299 commands_idx = 0; \
300 pattern = 0; \
301 } while (0)
303 #ifdef lint /* Suppress `used before set' messages. */
304 two_colon = 0;
305 pattern_percent = 0;
306 #endif
308 if (debug_flag)
310 printf ("Reading makefile `%s'", filename);
311 if (flags & RM_NO_DEFAULT_GOAL)
312 printf (" (no default goal)");
313 if (flags & RM_INCLUDED)
314 printf (" (search path)");
315 if (flags & RM_DONTCARE)
316 printf (" (don't care)");
317 if (flags & RM_NO_TILDE)
318 printf (" (no ~ expansion)");
319 puts ("...");
322 /* First, get a stream to read. */
324 /* Expand ~ in FILENAME unless it came from `include',
325 in which case it was already done. */
326 if (!(flags & RM_NO_TILDE) && filename[0] == '~')
328 char *expanded = tilde_expand (filename);
329 if (expanded != 0)
330 filename = expanded;
333 infile = fopen (filename, "r");
334 /* Save the error code so we print the right message later. */
335 makefile_errno = errno;
337 /* If the makefile wasn't found and it's either a makefile from
338 the `MAKEFILES' variable or an included makefile,
339 search the included makefile search path for this makefile. */
340 if (infile == 0 && (flags & RM_INCLUDED) && *filename != '/')
342 register unsigned int i;
343 for (i = 0; include_directories[i] != 0; ++i)
345 char *name = concat (include_directories[i], "/", filename);
346 infile = fopen (name, "r");
347 if (infile == 0)
348 free (name);
349 else
351 filename = name;
352 break;
357 /* Add FILENAME to the chain of read makefiles. */
358 deps = (struct dep *) xmalloc (sizeof (struct dep));
359 deps->next = read_makefiles;
360 read_makefiles = deps;
361 deps->name = 0;
362 deps->file = lookup_file (filename);
363 if (deps->file == 0)
365 deps->file = enter_file (savestring (filename, strlen (filename)));
366 if (flags & RM_DONTCARE)
367 deps->file->dontcare = 1;
369 if (filename != passed_filename)
370 free (filename);
371 filename = deps->file->name;
372 deps->changed = flags;
373 deps = 0;
375 /* If the makefile can't be found at all, give up entirely. */
377 if (infile == 0)
379 /* If we did some searching, errno has the error from the last
380 attempt, rather from FILENAME itself. Restore it in case the
381 caller wants to use it in a message. */
382 errno = makefile_errno;
383 return 0;
386 reading_filename = filename;
387 reading_lineno_ptr = &lineno;
389 /* Loop over lines in the file.
390 The strategy is to accumulate target names in FILENAMES, dependencies
391 in DEPS and commands in COMMANDS. These are used to define a rule
392 when the start of the next rule (or eof) is encountered. */
394 initbuffer (&lb);
396 while (!feof (infile))
398 lineno += nlines;
399 nlines = readline (&lb, infile, filename, lineno);
401 /* Check for a shell command line first.
402 If it is not one, we can stop treating tab specially. */
403 if (lb.buffer[0] == '\t')
405 /* This line is a probably shell command. */
406 unsigned int len;
408 if (no_targets)
409 /* Ignore the commands in a rule with no targets. */
410 continue;
412 /* If there is no preceding rule line, don't treat this line
413 as a command, even though it begins with a tab character.
414 SunOS 4 make appears to behave this way. */
416 if (filenames != 0)
418 if (ignoring)
419 /* Yep, this is a shell command, and we don't care. */
420 continue;
422 /* Append this command line to the line being accumulated. */
423 p = lb.buffer;
424 if (commands_idx == 0)
425 commands_started = lineno;
426 len = strlen (p);
427 if (len + 1 + commands_idx > commands_len)
429 commands_len = (len + 1 + commands_idx) * 2;
430 commands = (char *) xrealloc (commands, commands_len);
432 bcopy (p, &commands[commands_idx], len);
433 commands_idx += len;
434 commands[commands_idx++] = '\n';
436 continue;
440 /* This line is not a shell command line. Don't worry about tabs. */
442 if (collapsed_length < lb.size)
444 collapsed_length = lb.size;
445 if (collapsed != 0)
446 free (collapsed);
447 collapsed = (char *) xmalloc (collapsed_length);
449 strcpy (collapsed, lb.buffer);
450 /* Collapse continuation lines. */
451 collapse_continuations (collapsed);
452 remove_comments (collapsed);
454 /* strncmp is first to avoid dereferencing out into space. */
455 #define word1eq(s, l) (!strncmp (s, p, l) \
456 && (p[l] == '\0' || isblank (p[l])))
457 p = collapsed;
458 while (isspace (*p))
459 ++p;
460 if (*p == '\0')
461 /* This line is completely empty. */
462 continue;
464 /* We must first check for conditional and `define' directives before
465 ignoring anything, since they control what we will do with
466 following lines. */
468 if (!in_ignored_define
469 && (word1eq ("ifdef", 5) || word1eq ("ifndef", 6)
470 || word1eq ("ifeq", 4) || word1eq ("ifneq", 5)
471 || word1eq ("else", 4) || word1eq ("endif", 5)))
473 int i = conditional_line (p, filename, lineno);
474 if (i >= 0)
475 ignoring = i;
476 else
477 makefile_fatal (filename, lineno,
478 "invalid syntax in conditional");
479 continue;
481 else if (word1eq ("endef", 5))
483 if (in_ignored_define)
484 in_ignored_define = 0;
485 else
486 makefile_fatal (filename, lineno, "extraneous `endef'");
487 continue;
489 else if (word1eq ("define", 6))
491 if (ignoring)
492 in_ignored_define = 1;
493 else
495 p2 = next_token (p + 6);
496 /* Let the variable name be the whole rest of the line,
497 with trailing blanks stripped (comments have already been
498 removed), so it could be a complex variable/function
499 reference that might contain blanks. */
500 p = index (p2, '\0');
501 while (isblank (p[-1]))
502 --p;
503 lineno = do_define (p2, p - p2, o_file,
504 lineno, infile, filename);
506 continue;
508 else if (word1eq ("override", 8))
510 p2 = next_token (p + 8);
511 if (p2 == 0)
512 makefile_error (filename, lineno, "empty `override' directive");
513 if (!strncmp (p2, "define", 6) && (isblank (p2[6]) || p2[6] == '\0'))
515 if (ignoring)
516 in_ignored_define = 1;
517 else
519 p2 = next_token (p2 + 6);
520 /* Let the variable name be the whole rest of the line,
521 with trailing blanks stripped (comments have already been
522 removed), so it could be a complex variable/function
523 reference that might contain blanks. */
524 p = index (p2, '\0');
525 while (isblank (p[-1]))
526 --p;
527 lineno = do_define (p2, p - p2, o_override,
528 lineno, infile, filename);
531 else if (!ignoring
532 && !try_variable_definition (filename, lineno,
533 p2, o_override))
534 makefile_error (filename, lineno, "empty `override' directive");
536 continue;
539 if (ignoring)
540 /* Ignore the line. We continue here so conditionals
541 can appear in the middle of a rule. */
542 continue;
543 else if (word1eq ("export", 6))
545 struct variable *v;
546 p2 = next_token (p + 6);
547 if (*p2 == '\0')
548 export_all_variables = 1;
549 v = try_variable_definition (filename, lineno, p2, o_file);
550 if (v != 0)
551 v->export = v_export;
552 else
554 unsigned int len;
555 for (p = find_next_token (&p2, &len); p != 0;
556 p = find_next_token (&p2, &len))
558 v = lookup_variable (p, len);
559 if (v == 0)
560 v = define_variable (p, len, "", o_file, 0);
561 v->export = v_export;
565 else if (word1eq ("unexport", 8))
567 unsigned int len;
568 struct variable *v;
569 p2 = next_token (p + 8);
570 if (*p2 == '\0')
571 export_all_variables = 0;
572 for (p = find_next_token (&p2, &len); p != 0;
573 p = find_next_token (&p2, &len))
575 v = lookup_variable (p, len);
576 if (v == 0)
577 v = define_variable (p, len, "", o_file, 0);
578 v->export = v_noexport;
581 else if (word1eq ("include", 7) || word1eq ("-include", 8)
582 || word1eq ("sinclude", 8))
584 /* We have found an `include' line specifying a nested
585 makefile to be read at this point. */
586 struct conditionals *save, new_conditionals;
587 struct nameseq *files;
588 /* "-include" (vs "include") says no error if the file does not
589 exist. "sinclude" is an alias for this from SGI. */
590 int noerror = p[0] != 'i';
592 p = allocated_variable_expand (next_token (p + (noerror ? 9 : 8)));
593 if (*p == '\0')
595 makefile_error (filename, lineno,
596 "no file name for `%sinclude'",
597 noerror ? "-" : "");
598 continue;
601 /* Parse the list of file names. */
602 p2 = p;
603 files = multi_glob (parse_file_seq (&p2, '\0',
604 sizeof (struct nameseq),
606 sizeof (struct nameseq));
607 free (p);
609 /* Save the state of conditionals and start
610 the included makefile with a clean slate. */
611 save = conditionals;
612 bzero ((char *) &new_conditionals, sizeof new_conditionals);
613 conditionals = &new_conditionals;
615 /* Record the rules that are waiting so they will determine
616 the default goal before those in the included makefile. */
617 record_waiting_files ();
619 /* Read each included makefile. */
620 while (files != 0)
622 struct nameseq *next = files->next;
623 char *name = files->name;
624 free ((char *)files);
625 files = next;
627 if (! read_makefile (name, (RM_INCLUDED | RM_NO_TILDE
628 | (noerror ? RM_DONTCARE : 0)))
629 && ! noerror)
630 makefile_error (filename, lineno,
631 "%s: %s", name, strerror (errno));
634 /* Free any space allocated by conditional_line. */
635 if (conditionals->ignoring)
636 free (conditionals->ignoring);
637 if (conditionals->seen_else)
638 free (conditionals->seen_else);
640 /* Restore state. */
641 conditionals = save;
642 reading_filename = filename;
643 reading_lineno_ptr = &lineno;
645 else if (word1eq ("vpath", 5))
647 char *pattern;
648 unsigned int len;
649 p2 = variable_expand (p + 5);
650 p = find_next_token (&p2, &len);
651 if (p != 0)
653 pattern = savestring (p, len);
654 p = find_next_token (&p2, &len);
655 /* No searchpath means remove all previous
656 selective VPATH's with the same pattern. */
658 else
659 /* No pattern means remove all previous selective VPATH's. */
660 pattern = 0;
661 construct_vpath_list (pattern, p);
662 if (pattern != 0)
663 free (pattern);
665 #undef word1eq
666 else if (try_variable_definition (filename, lineno, p, o_file))
667 /* This line has been dealt with. */
669 else if (lb.buffer[0] == '\t')
671 p = collapsed; /* Ignore comments. */
672 while (isblank (*p))
673 ++p;
674 if (*p == '\0')
675 /* The line is completely blank; that is harmless. */
676 continue;
677 /* This line starts with a tab but was not caught above
678 because there was no preceding target, and the line
679 might have been usable as a variable definition.
680 But now it is definitely lossage. */
681 makefile_fatal (filename, lineno,
682 "commands commence before first target");
684 else
686 /* This line describes some target files. */
688 char *cmdleft;
690 /* Record the previous rule. */
692 record_waiting_files ();
694 /* Search the line for an unquoted ; that is not after an
695 unquoted #. */
696 cmdleft = find_char_unquote (lb.buffer, ";#", 0);
697 if (cmdleft != 0 && *cmdleft == '#')
699 /* We found a comment before a semicolon. */
700 *cmdleft = '\0';
701 cmdleft = 0;
703 else if (cmdleft != 0)
704 /* Found one. Cut the line short there before expanding it. */
705 *cmdleft = '\0';
707 collapse_continuations (lb.buffer);
709 /* Expand variable and function references before doing anything
710 else so that special characters can be inside variables. */
711 p = variable_expand (lb.buffer);
713 if (cmdleft == 0)
714 /* Look for a semicolon in the expanded line. */
715 cmdleft = find_char_unquote (p, ";", 0);
717 if (cmdleft != 0)
718 /* Cut the line short at the semicolon. */
719 *cmdleft = '\0';
721 p2 = next_token (p);
722 if (*p2 == '\0')
724 if (cmdleft != 0)
725 makefile_fatal (filename, lineno,
726 "missing rule before commands");
727 else
728 /* This line contained a variable reference that
729 expanded to nothing but whitespace. */
730 continue;
732 else if (*p2 == ':')
734 /* We accept and ignore rules without targets for
735 compatibility with SunOS 4 make. */
736 no_targets = 1;
737 continue;
740 filenames = multi_glob (parse_file_seq (&p2, ':',
741 sizeof (struct nameseq),
743 sizeof (struct nameseq));
744 if (*p2++ == '\0')
745 makefile_fatal (filename, lineno, "missing separator");
746 /* Is this a one-colon or two-colon entry? */
747 two_colon = *p2 == ':';
748 if (two_colon)
749 p2++;
751 /* We have some targets, so don't ignore the following commands. */
752 no_targets = 0;
754 /* Is this a static pattern rule: `target: %targ: %dep; ...'? */
755 p = index (p2, ':');
756 while (p != 0 && p[-1] == '\\')
758 register char *q = &p[-1];
759 register int backslash = 0;
760 while (*q-- == '\\')
761 backslash = !backslash;
762 if (backslash)
763 p = index (p + 1, ':');
764 else
765 break;
767 #ifdef __MSDOS__
768 /* For MS-DOS, skip a "C:\...". */
769 if (p != 0 && p[1] == '\\' && isalpha (p[-1]))
770 p = 0;
771 #endif
772 #ifdef _AMIGA
773 /* Here, the situation is quite complicated. Let's have a look
774 at a couple of targets:
776 install: dev:make
778 dev:make: make
780 dev:make:: xyz
782 The rule is that it's only a target, if there are TWO :'s
783 OR a space around the :.
785 if (p && !(isspace(p[1]) || !p[1] || isspace(p[-1])))
786 p = 0;
787 #endif
788 #ifdef WIN32
789 do {
790 check_again = 0;
791 /* For WIN32, skip a "C:\..." or a "C:/..." */
792 if (p != 0 && (p[1] == '\\' || p[1] == '/') && isalpha (p[-1])) {
793 p = index(p + 1, ':');
794 check_again = 1;
796 } while (check_again);
797 #endif
798 if (p != 0)
800 struct nameseq *target;
801 target = parse_file_seq (&p2, ':', sizeof (struct nameseq), 1);
802 ++p2;
803 if (target == 0)
804 makefile_fatal (filename, lineno, "missing target pattern");
805 else if (target->next != 0)
806 makefile_fatal (filename, lineno, "multiple target patterns");
807 pattern = target->name;
808 pattern_percent = find_percent (pattern);
809 if (pattern_percent == 0)
810 makefile_fatal (filename, lineno,
811 "target pattern contains no `%%'");
813 else
814 pattern = 0;
816 /* Parse the dependencies. */
817 deps = (struct dep *)
818 multi_glob (parse_file_seq (&p2, '\0', sizeof (struct dep), 1),
819 sizeof (struct dep));
821 commands_idx = 0;
822 if (cmdleft != 0)
824 /* Semicolon means rest of line is a command. */
825 unsigned int len = strlen (cmdleft + 1);
827 commands_started = lineno;
829 /* Add this command line to the buffer. */
830 if (len + 2 > commands_len)
832 commands_len = (len + 2) * 2;
833 commands = (char *) xrealloc (commands, commands_len);
835 bcopy (cmdleft + 1, commands, len);
836 commands_idx += len;
837 commands[commands_idx++] = '\n';
840 continue;
843 /* We get here except in the case that we just read a rule line.
844 Record now the last rule we read, so following spurious
845 commands are properly diagnosed. */
846 record_waiting_files ();
847 no_targets = 0;
850 if (conditionals->if_cmds)
851 makefile_fatal (filename, lineno, "missing `endif'");
853 /* At eof, record the last rule. */
854 record_waiting_files ();
856 freebuffer (&lb);
857 free ((char *) commands);
858 fclose (infile);
860 reading_filename = 0;
861 reading_lineno_ptr = 0;
863 return 1;
866 /* Execute a `define' directive.
867 The first line has already been read, and NAME is the name of
868 the variable to be defined. The following lines remain to be read.
869 LINENO, INFILE and FILENAME refer to the makefile being read.
870 The value returned is LINENO, updated for lines read here. */
872 static unsigned int
873 do_define (name, namelen, origin, lineno, infile, filename)
874 char *name;
875 unsigned int namelen;
876 enum variable_origin origin;
877 unsigned int lineno;
878 FILE *infile;
879 char *filename;
881 struct linebuffer lb;
882 unsigned int nlines = 0;
883 unsigned int length = 100;
884 char *definition = (char *) xmalloc (100);
885 register unsigned int idx = 0;
886 register char *p;
888 /* Expand the variable name. */
889 char *var = (char *) alloca (namelen + 1);
890 bcopy (name, var, namelen);
891 var[namelen] = '\0';
892 var = variable_expand (var);
894 initbuffer (&lb);
895 while (!feof (infile))
897 lineno += nlines;
898 nlines = readline (&lb, infile, filename, lineno);
900 collapse_continuations (lb.buffer);
902 p = next_token (lb.buffer);
903 if ((p[5] == '\0' || isblank (p[5])) && !strncmp (p, "endef", 5))
905 p += 5;
906 remove_comments (p);
907 if (*next_token (p) != '\0')
908 makefile_error (filename, lineno,
909 "Extraneous text after `endef' directive");
910 /* Define the variable. */
911 if (idx == 0)
912 definition[0] = '\0';
913 else
914 definition[idx - 1] = '\0';
915 (void) define_variable (var, strlen (var), definition, origin, 1);
916 free (definition);
917 freebuffer (&lb);
918 return lineno;
920 else
922 unsigned int len = strlen (lb.buffer);
924 /* Increase the buffer size if necessary. */
925 if (idx + len + 1 > length)
927 length = (idx + len) * 2;
928 definition = (char *) xrealloc (definition, length + 1);
931 bcopy (lb.buffer, &definition[idx], len);
932 idx += len;
933 /* Separate lines with a newline. */
934 definition[idx++] = '\n';
938 /* No `endef'!! */
939 makefile_fatal (filename, lineno, "missing `endef', unterminated `define'");
941 /* NOTREACHED */
942 return 0;
945 /* Interpret conditional commands "ifdef", "ifndef", "ifeq",
946 "ifneq", "else" and "endif".
947 LINE is the input line, with the command as its first word.
949 FILENAME and LINENO are the filename and line number in the
950 current makefile. They are used for error messages.
952 Value is -1 if the line is invalid,
953 0 if following text should be interpreted,
954 1 if following text should be ignored. */
956 static int
957 conditional_line (line, filename, lineno)
958 char *line;
959 char *filename;
960 unsigned int lineno;
962 int notdef;
963 char *cmdname;
964 register unsigned int i;
966 if (*line == 'i')
968 /* It's an "if..." command. */
969 notdef = line[2] == 'n';
970 if (notdef)
972 cmdname = line[3] == 'd' ? "ifndef" : "ifneq";
973 line += cmdname[3] == 'd' ? 7 : 6;
975 else
977 cmdname = line[2] == 'd' ? "ifdef" : "ifeq";
978 line += cmdname[2] == 'd' ? 6 : 5;
981 else
983 /* It's an "else" or "endif" command. */
984 notdef = line[1] == 'n';
985 cmdname = notdef ? "endif" : "else";
986 line += notdef ? 5 : 4;
989 line = next_token (line);
991 if (*cmdname == 'e')
993 if (*line != '\0')
994 makefile_error (filename, lineno,
995 "Extraneous text after `%s' directive",
996 cmdname);
997 /* "Else" or "endif". */
998 if (conditionals->if_cmds == 0)
999 makefile_fatal (filename, lineno, "extraneous `%s'", cmdname);
1000 /* NOTDEF indicates an `endif' command. */
1001 if (notdef)
1002 --conditionals->if_cmds;
1003 else if (conditionals->seen_else[conditionals->if_cmds - 1])
1004 makefile_fatal (filename, lineno, "only one `else' per conditional");
1005 else
1007 /* Toggle the state of ignorance. */
1008 conditionals->ignoring[conditionals->if_cmds - 1]
1009 = !conditionals->ignoring[conditionals->if_cmds - 1];
1010 /* Record that we have seen an `else' in this conditional.
1011 A second `else' will be erroneous. */
1012 conditionals->seen_else[conditionals->if_cmds - 1] = 1;
1014 for (i = 0; i < conditionals->if_cmds; ++i)
1015 if (conditionals->ignoring[i])
1016 return 1;
1017 return 0;
1020 if (conditionals->allocated == 0)
1022 conditionals->allocated = 5;
1023 conditionals->ignoring = (char *) xmalloc (conditionals->allocated);
1024 conditionals->seen_else = (char *) xmalloc (conditionals->allocated);
1027 ++conditionals->if_cmds;
1028 if (conditionals->if_cmds > conditionals->allocated)
1030 conditionals->allocated += 5;
1031 conditionals->ignoring = (char *)
1032 xrealloc (conditionals->ignoring, conditionals->allocated);
1033 conditionals->seen_else = (char *)
1034 xrealloc (conditionals->seen_else, conditionals->allocated);
1037 /* Record that we have seen an `if...' but no `else' so far. */
1038 conditionals->seen_else[conditionals->if_cmds - 1] = 0;
1040 /* Search through the stack to see if we're already ignoring. */
1041 for (i = 0; i < conditionals->if_cmds - 1; ++i)
1042 if (conditionals->ignoring[i])
1044 /* We are already ignoring, so just push a level
1045 to match the next "else" or "endif", and keep ignoring.
1046 We don't want to expand variables in the condition. */
1047 conditionals->ignoring[conditionals->if_cmds - 1] = 1;
1048 return 1;
1051 if (cmdname[notdef ? 3 : 2] == 'd')
1053 /* "Ifdef" or "ifndef". */
1054 struct variable *v;
1055 register char *p = end_of_token (line);
1056 i = p - line;
1057 p = next_token (p);
1058 if (*p != '\0')
1059 return -1;
1060 v = lookup_variable (line, i);
1061 conditionals->ignoring[conditionals->if_cmds - 1]
1062 = (v != 0 && *v->value != '\0') == notdef;
1064 else
1066 /* "Ifeq" or "ifneq". */
1067 char *s1, *s2;
1068 unsigned int len;
1069 char termin = *line == '(' ? ',' : *line;
1071 if (termin != ',' && termin != '"' && termin != '\'')
1072 return -1;
1074 s1 = ++line;
1075 /* Find the end of the first string. */
1076 if (termin == ',')
1078 register int count = 0;
1079 for (; *line != '\0'; ++line)
1080 if (*line == '(')
1081 ++count;
1082 else if (*line == ')')
1083 --count;
1084 else if (*line == ',' && count <= 0)
1085 break;
1087 else
1088 while (*line != '\0' && *line != termin)
1089 ++line;
1091 if (*line == '\0')
1092 return -1;
1094 *line++ = '\0';
1096 s2 = variable_expand (s1);
1097 /* We must allocate a new copy of the expanded string because
1098 variable_expand re-uses the same buffer. */
1099 len = strlen (s2);
1100 s1 = (char *) alloca (len + 1);
1101 bcopy (s2, s1, len + 1);
1103 if (termin != ',')
1104 /* Find the start of the second string. */
1105 line = next_token (line);
1107 termin = termin == ',' ? ')' : *line;
1108 if (termin != ')' && termin != '"' && termin != '\'')
1109 return -1;
1111 /* Find the end of the second string. */
1112 if (termin == ')')
1114 register int count = 0;
1115 s2 = next_token (line);
1116 for (line = s2; *line != '\0'; ++line)
1118 if (*line == '(')
1119 ++count;
1120 else if (*line == ')')
1121 if (count <= 0)
1122 break;
1123 else
1124 --count;
1127 else
1129 ++line;
1130 s2 = line;
1131 while (*line != '\0' && *line != termin)
1132 ++line;
1135 if (*line == '\0')
1136 return -1;
1138 *line = '\0';
1139 line = next_token (++line);
1140 if (*line != '\0')
1141 makefile_error (filename, lineno,
1142 "Extraneous text after `%s' directive",
1143 cmdname);
1145 s2 = variable_expand (s2);
1146 conditionals->ignoring[conditionals->if_cmds - 1]
1147 = streq (s1, s2) == notdef;
1150 /* Search through the stack to see if we're ignoring. */
1151 for (i = 0; i < conditionals->if_cmds; ++i)
1152 if (conditionals->ignoring[i])
1153 return 1;
1154 return 0;
1157 /* Remove duplicate dependencies in CHAIN. */
1159 void
1160 uniquize_deps (chain)
1161 struct dep *chain;
1163 register struct dep *d;
1165 /* Make sure that no dependencies are repeated. This does not
1166 really matter for the purpose of updating targets, but it
1167 might make some names be listed twice for $^ and $?. */
1169 for (d = chain; d != 0; d = d->next)
1171 struct dep *last, *next;
1173 last = d;
1174 next = d->next;
1175 while (next != 0)
1176 if (streq (dep_name (d), dep_name (next)))
1178 struct dep *n = next->next;
1179 last->next = n;
1180 if (next->name != 0 && next->name != d->name)
1181 free (next->name);
1182 if (next != d)
1183 free ((char *) next);
1184 next = n;
1186 else
1188 last = next;
1189 next = next->next;
1194 /* Record a description line for files FILENAMES,
1195 with dependencies DEPS, commands to execute described
1196 by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED.
1197 TWO_COLON is nonzero if a double colon was used.
1198 If not nil, PATTERN is the `%' pattern to make this
1199 a static pattern rule, and PATTERN_PERCENT is a pointer
1200 to the `%' within it.
1202 The links of FILENAMES are freed, and so are any names in it
1203 that are not incorporated into other data structures. */
1205 static void
1206 record_files (filenames, pattern, pattern_percent, deps, commands_started,
1207 commands, commands_idx, two_colon, filename, lineno, set_default)
1208 struct nameseq *filenames;
1209 char *pattern, *pattern_percent;
1210 struct dep *deps;
1211 unsigned int commands_started;
1212 char *commands;
1213 unsigned int commands_idx;
1214 int two_colon;
1215 char *filename;
1216 unsigned int lineno;
1217 int set_default;
1219 struct nameseq *nextf;
1220 int implicit = 0;
1221 unsigned int max_targets, target_idx;
1222 char **targets = 0, **target_percents = 0;
1223 struct commands *cmds;
1225 if (commands_idx > 0)
1227 cmds = (struct commands *) xmalloc (sizeof (struct commands));
1228 cmds->filename = filename;
1229 cmds->lineno = commands_started;
1230 cmds->commands = savestring (commands, commands_idx);
1231 cmds->command_lines = 0;
1233 else
1234 cmds = 0;
1236 for (; filenames != 0; filenames = nextf)
1238 register char *name = filenames->name;
1239 register struct file *f;
1240 register struct dep *d;
1241 struct dep *this;
1242 char *implicit_percent;
1244 nextf = filenames->next;
1245 free ((char *) filenames);
1247 implicit_percent = find_percent (name);
1248 implicit |= implicit_percent != 0;
1250 if (implicit && pattern != 0)
1251 makefile_fatal (filename, lineno,
1252 "mixed implicit and static pattern rules");
1254 if (implicit && implicit_percent == 0)
1255 makefile_fatal (filename, lineno, "mixed implicit and normal rules");
1257 if (implicit)
1259 if (targets == 0)
1261 max_targets = 5;
1262 targets = (char **) xmalloc (5 * sizeof (char *));
1263 target_percents = (char **) xmalloc (5 * sizeof (char *));
1264 target_idx = 0;
1266 else if (target_idx == max_targets - 1)
1268 max_targets += 5;
1269 targets = (char **) xrealloc ((char *) targets,
1270 max_targets * sizeof (char *));
1271 target_percents
1272 = (char **) xrealloc ((char *) target_percents,
1273 max_targets * sizeof (char *));
1275 targets[target_idx] = name;
1276 target_percents[target_idx] = implicit_percent;
1277 ++target_idx;
1278 continue;
1281 /* If there are multiple filenames, copy the chain DEPS
1282 for all but the last one. It is not safe for the same deps
1283 to go in more than one place in the data base. */
1284 this = nextf != 0 ? copy_dep_chain (deps) : deps;
1286 if (pattern != 0)
1287 /* If this is an extended static rule:
1288 `targets: target%pattern: dep%pattern; cmds',
1289 translate each dependency pattern into a plain filename
1290 using the target pattern and this target's name. */
1291 if (!pattern_matches (pattern, pattern_percent, name))
1293 /* Give a warning if the rule is meaningless. */
1294 makefile_error (filename, lineno,
1295 "target `%s' doesn't match the target pattern",
1296 name);
1297 this = 0;
1299 else
1301 /* We use patsubst_expand to do the work of translating
1302 the target pattern, the target's name and the dependencies'
1303 patterns into plain dependency names. */
1304 char *buffer = variable_expand ("");
1306 for (d = this; d != 0; d = d->next)
1308 char *o;
1309 char *percent = find_percent (d->name);
1310 if (percent == 0)
1311 continue;
1312 o = patsubst_expand (buffer, name, pattern, d->name,
1313 pattern_percent, percent);
1314 free (d->name);
1315 d->name = savestring (buffer, o - buffer);
1319 if (!two_colon)
1321 /* Single-colon. Combine these dependencies
1322 with others in file's existing record, if any. */
1323 f = enter_file (name);
1325 if (f->double_colon)
1326 makefile_fatal (filename, lineno,
1327 "target file `%s' has both : and :: entries",
1328 f->name);
1330 /* If CMDS == F->CMDS, this target was listed in this rule
1331 more than once. Just give a warning since this is harmless. */
1332 if (cmds != 0 && cmds == f->cmds)
1333 makefile_error
1334 (filename, lineno,
1335 "target `%s' given more than once in the same rule.",
1336 f->name);
1338 /* Check for two single-colon entries both with commands.
1339 Check is_target so that we don't lose on files such as .c.o
1340 whose commands were preinitialized. */
1341 else if (cmds != 0 && f->cmds != 0 && f->is_target)
1343 makefile_error (cmds->filename, cmds->lineno,
1344 "warning: overriding commands for target `%s'",
1345 f->name);
1346 makefile_error (f->cmds->filename, f->cmds->lineno,
1347 "warning: ignoring old commands for target `%s'",
1348 f->name);
1351 f->is_target = 1;
1353 /* Defining .DEFAULT with no deps or cmds clears it. */
1354 if (f == default_file && this == 0 && cmds == 0)
1355 f->cmds = 0;
1356 if (cmds != 0)
1357 f->cmds = cmds;
1358 /* Defining .SUFFIXES with no dependencies
1359 clears out the list of suffixes. */
1360 if (f == suffix_file && this == 0)
1362 d = f->deps;
1363 while (d != 0)
1365 struct dep *nextd = d->next;
1366 free (d->name);
1367 free ((char *)d);
1368 d = nextd;
1370 f->deps = 0;
1372 else if (f->deps != 0)
1374 /* Add the file's old deps and the new ones in THIS together. */
1376 struct dep *firstdeps, *moredeps;
1377 if (cmds != 0)
1379 /* This is the rule with commands, so put its deps first.
1380 The rationale behind this is that $< expands to the
1381 first dep in the chain, and commands use $< expecting
1382 to get the dep that rule specifies. */
1383 firstdeps = this;
1384 moredeps = f->deps;
1386 else
1388 /* Append the new deps to the old ones. */
1389 firstdeps = f->deps;
1390 moredeps = this;
1393 if (firstdeps == 0)
1394 firstdeps = moredeps;
1395 else
1397 d = firstdeps;
1398 while (d->next != 0)
1399 d = d->next;
1400 d->next = moredeps;
1403 f->deps = firstdeps;
1405 else
1406 f->deps = this;
1408 /* If this is a static pattern rule, set the file's stem to
1409 the part of its name that matched the `%' in the pattern,
1410 so you can use $* in the commands. */
1411 if (pattern != 0)
1413 static char *percent = "%";
1414 char *buffer = variable_expand ("");
1415 char *o = patsubst_expand (buffer, name, pattern, percent,
1416 pattern_percent, percent);
1417 f->stem = savestring (buffer, o - buffer);
1420 else
1422 /* Double-colon. Make a new record
1423 even if the file already has one. */
1424 f = lookup_file (name);
1425 /* Check for both : and :: rules. Check is_target so
1426 we don't lose on default suffix rules or makefiles. */
1427 if (f != 0 && f->is_target && !f->double_colon)
1428 makefile_fatal (filename, lineno,
1429 "target file `%s' has both : and :: entries",
1430 f->name);
1431 f = enter_file (name);
1432 /* If there was an existing entry and it was a double-colon
1433 entry, enter_file will have returned a new one, making it the
1434 prev pointer of the old one, and setting its double_colon
1435 pointer to the first one. */
1436 if (f->double_colon == 0)
1437 /* This is the first entry for this name, so we must
1438 set its double_colon pointer to itself. */
1439 f->double_colon = f;
1440 f->is_target = 1;
1441 f->deps = this;
1442 f->cmds = cmds;
1445 /* Free name if not needed further. */
1446 if (f != 0 && name != f->name
1447 && (name < f->name || name > f->name + strlen (f->name)))
1449 free (name);
1450 name = f->name;
1453 /* See if this is first target seen whose name does
1454 not start with a `.', unless it contains a slash. */
1455 if (default_goal_file == 0 && set_default
1456 && (*name != '.' || index (name, '/') != 0))
1458 int reject = 0;
1460 /* If this file is a suffix, don't
1461 let it be the default goal file. */
1463 for (d = suffix_file->deps; d != 0; d = d->next)
1465 register struct dep *d2;
1466 if (*dep_name (d) != '.' && streq (name, dep_name (d)))
1468 reject = 1;
1469 break;
1471 for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
1473 register unsigned int len = strlen (dep_name (d2));
1474 if (strncmp (name, dep_name (d2), len))
1475 continue;
1476 if (streq (name + len, dep_name (d)))
1478 reject = 1;
1479 break;
1482 if (reject)
1483 break;
1486 if (!reject)
1487 default_goal_file = f;
1491 if (implicit)
1493 targets[target_idx] = 0;
1494 target_percents[target_idx] = 0;
1495 create_pattern_rule (targets, target_percents, two_colon, deps, cmds, 1);
1496 free ((char *) target_percents);
1500 /* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero).
1501 Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash.
1502 Quoting backslashes are removed from STRING by compacting it into
1503 itself. Returns a pointer to the first unquoted STOPCHAR if there is
1504 one, or nil if there are none. */
1506 char *
1507 find_char_unquote (string, stopchars, blank)
1508 char *string;
1509 char *stopchars;
1510 int blank;
1512 unsigned int string_len = 0;
1513 register char *p = string;
1515 while (1)
1517 while (*p != '\0' && index (stopchars, *p) == 0
1518 && (!blank || !isblank (*p)))
1519 ++p;
1520 if (*p == '\0')
1521 break;
1523 if (p > string && p[-1] == '\\')
1525 /* Search for more backslashes. */
1526 register int i = -2;
1527 while (&p[i] >= string && p[i] == '\\')
1528 --i;
1529 ++i;
1530 /* Only compute the length if really needed. */
1531 if (string_len == 0)
1532 string_len = strlen (string);
1533 /* The number of backslashes is now -I.
1534 Copy P over itself to swallow half of them. */
1535 bcopy (&p[i / 2], &p[i], (string_len - (p - string)) - (i / 2) + 1);
1536 p += i / 2;
1537 if (i % 2 == 0)
1538 /* All the backslashes quoted each other; the STOPCHAR was
1539 unquoted. */
1540 return p;
1542 /* The STOPCHAR was quoted by a backslash. Look for another. */
1544 else
1545 /* No backslash in sight. */
1546 return p;
1549 /* Never hit a STOPCHAR or blank (with BLANK nonzero). */
1550 return 0;
1553 /* Search PATTERN for an unquoted %. */
1555 char *
1556 find_percent (pattern)
1557 char *pattern;
1559 return find_char_unquote (pattern, "%", 0);
1562 /* Parse a string into a sequence of filenames represented as a
1563 chain of struct nameseq's in reverse order and return that chain.
1565 The string is passed as STRINGP, the address of a string pointer.
1566 The string pointer is updated to point at the first character
1567 not parsed, which either is a null char or equals STOPCHAR.
1569 SIZE is how big to construct chain elements.
1570 This is useful if we want them actually to be other structures
1571 that have room for additional info.
1573 If STRIP is nonzero, strip `./'s off the beginning. */
1575 struct nameseq *
1576 parse_file_seq (stringp, stopchar, size, strip)
1577 char **stringp;
1578 int stopchar;
1579 unsigned int size;
1580 int strip;
1582 register struct nameseq *new = 0;
1583 register struct nameseq *new1, *lastnew1;
1584 register char *p = *stringp;
1585 char *q;
1586 char *name;
1587 char stopchars[3];
1589 #ifdef VMS
1590 stopchars[0] = ',';
1591 stopchars[1] = stopchar;
1592 stopchars[2] = '\0';
1593 #else
1594 stopchars[0] = stopchar;
1595 stopchars[1] = '\0';
1596 #endif
1598 while (1)
1600 /* Skip whitespace; see if any more names are left. */
1601 p = next_token (p);
1602 if (*p == '\0')
1603 break;
1604 if (*p == stopchar)
1605 break;
1607 /* Yes, find end of next name. */
1608 q = p;
1609 p = find_char_unquote (q, stopchars, 1);
1610 #ifdef VMS
1611 /* convert comma separated list to space separated */
1612 if (p && *p == ',')
1613 *p =' ';
1614 #endif
1615 #ifdef __MSDOS__
1616 /* For MS-DOS, skip a "C:\...". */
1617 if (stopchar == ':' && p != 0 && p[1] == '\\' && isalpha (p[-1]))
1618 p = 0;
1619 #endif
1620 #ifdef _AMIGA
1621 if (stopchar == ':' && p && *p == ':' &&
1622 !(isspace(p[1]) || !p[1] || isspace(p[-1])))
1624 p = find_char_unquote (p+1, stopchars, 1);
1626 #endif
1627 #ifdef WIN32
1628 /* For WIN32, skip a "C:\..." or "C:/...". */
1629 if (stopchar == ':' &&
1630 p != 0 &&
1631 (p[1] == '\\' || p[1] == '/') &&
1632 isalpha (p[-1])) {
1633 p = end_of_token_w32(++p, ':');
1634 if (*p == '\0' && p[-1] == ':')
1635 p--;
1637 #endif
1638 if (p == 0)
1639 p = q + strlen (q);
1641 if (strip)
1642 #ifdef VMS
1643 /* Skip leading `[]'s. */
1644 while (p - q > 2 && q[0] == '[' && q[1] == ']')
1645 #else
1646 /* Skip leading `./'s. */
1647 while (p - q > 2 && q[0] == '.' && q[1] == '/')
1648 #endif
1650 q += 2; /* Skip "./". */
1651 while (q < p && *q == '/')
1652 /* Skip following slashes: ".//foo" is "foo", not "/foo". */
1653 ++q;
1656 /* Extract the filename just found, and skip it. */
1658 if (q == p)
1659 /* ".///" was stripped to "". */
1660 #ifdef VMS
1661 continue;
1662 #else
1663 #ifdef _AMIGA
1664 name = savestring ("", 0);
1665 #else
1666 name = savestring ("./", 2);
1667 #endif
1668 #endif
1669 else
1670 #ifdef VMS
1671 /* VMS filenames can have a ':' in them but they have to be '\'ed but we need
1672 * to remove this '\' before we can use the filename.
1673 * Savestring called because q may be read-only string constant.
1676 char *qbase = savestring(q, strlen(q));
1677 char *pbase = qbase + (p-q);
1678 char *q1 = qbase;
1679 char *q2 = q1;
1680 char *p1 = pbase;
1682 while (q1 != pbase)
1684 if (*q1 == '\\' && *(q1+1) == ':')
1686 q1++;
1687 p1--;
1689 *q2++ = *q1++;
1691 name = savestring (qbase, p1 - qbase);
1692 free (qbase);
1694 #else
1695 name = savestring (q, p - q);
1696 #endif
1698 /* Add it to the front of the chain. */
1699 new1 = (struct nameseq *) xmalloc (size);
1700 new1->name = name;
1701 new1->next = new;
1702 new = new1;
1705 #ifndef NO_ARCHIVES
1707 /* Look for multi-word archive references.
1708 They are indicated by a elt ending with an unmatched `)' and
1709 an elt further down the chain (i.e., previous in the file list)
1710 with an unmatched `(' (e.g., "lib(mem"). */
1712 new1 = new;
1713 lastnew1 = 0;
1714 while (new1 != 0)
1715 if (new1->name[0] != '(' /* Don't catch "(%)" and suchlike. */
1716 && new1->name[strlen (new1->name) - 1] == ')'
1717 && index (new1->name, '(') == 0)
1719 /* NEW1 ends with a `)' but does not contain a `('.
1720 Look back for an elt with an opening `(' but no closing `)'. */
1722 struct nameseq *n = new1->next, *lastn = new1;
1723 char *paren;
1724 while (n != 0 && (paren = index (n->name, '(')) == 0)
1726 lastn = n;
1727 n = n->next;
1729 if (n != 0
1730 /* Ignore something starting with `(', as that cannot actually
1731 be an archive-member reference (and treating it as such
1732 results in an empty file name, which causes much lossage). */
1733 && n->name[0] != '(')
1735 /* N is the first element in the archive group.
1736 Its name looks like "lib(mem" (with no closing `)'). */
1738 char *libname;
1740 /* Copy "lib(" into LIBNAME. */
1741 ++paren;
1742 libname = (char *) alloca (paren - n->name + 1);
1743 bcopy (n->name, libname, paren - n->name);
1744 libname[paren - n->name] = '\0';
1746 if (*paren == '\0')
1748 /* N was just "lib(", part of something like "lib( a b)".
1749 Edit it out of the chain and free its storage. */
1750 lastn->next = n->next;
1751 free (n->name);
1752 free ((char *) n);
1753 /* LASTN->next is the new stopping elt for the loop below. */
1754 n = lastn->next;
1756 else
1758 /* Replace N's name with the full archive reference. */
1759 name = concat (libname, paren, ")");
1760 free (n->name);
1761 n->name = name;
1764 if (new1->name[1] == '\0')
1766 /* NEW1 is just ")", part of something like "lib(a b )".
1767 Omit it from the chain and free its storage. */
1768 if (lastnew1 == 0)
1769 new = new1->next;
1770 else
1771 lastnew1->next = new1->next;
1772 lastn = new1;
1773 new1 = new1->next;
1774 free (lastn->name);
1775 free ((char *) lastn);
1777 else
1779 /* Replace also NEW1->name, which already has closing `)'. */
1780 name = concat (libname, new1->name, "");
1781 free (new1->name);
1782 new1->name = name;
1783 new1 = new1->next;
1786 /* Trace back from NEW1 (the end of the list) until N
1787 (the beginning of the list), rewriting each name
1788 with the full archive reference. */
1790 while (new1 != n)
1792 name = concat (libname, new1->name, ")");
1793 free (new1->name);
1794 new1->name = name;
1795 lastnew1 = new1;
1796 new1 = new1->next;
1799 else
1801 /* No frobnication happening. Just step down the list. */
1802 lastnew1 = new1;
1803 new1 = new1->next;
1806 else
1808 lastnew1 = new1;
1809 new1 = new1->next;
1812 #endif
1814 *stringp = p;
1815 return new;
1818 /* Read a line of text from STREAM into LINEBUFFER.
1819 Combine continuation lines into one line.
1820 Return the number of actual lines read (> 1 if hacked continuation lines).
1823 static unsigned int
1824 readline (linebuffer, stream, filename, lineno)
1825 struct linebuffer *linebuffer;
1826 FILE *stream;
1827 char *filename;
1828 unsigned int lineno;
1830 char *buffer = linebuffer->buffer;
1831 register char *p = linebuffer->buffer;
1832 register char *end = p + linebuffer->size;
1833 register int len, lastlen = 0;
1834 register char *p2;
1835 register unsigned int nlines = 0;
1836 register int backslash;
1838 *p = '\0';
1840 while (fgets (p, end - p, stream) != 0)
1842 len = strlen (p);
1843 if (len == 0)
1845 /* This only happens when the first thing on the line is a '\0'.
1846 It is a pretty hopeless case, but (wonder of wonders) Athena
1847 lossage strikes again! (xmkmf puts NULs in its makefiles.)
1848 There is nothing really to be done; we synthesize a newline so
1849 the following line doesn't appear to be part of this line. */
1850 makefile_error (filename, lineno,
1851 "warning: NUL character seen; rest of line ignored");
1852 p[0] = '\n';
1853 len = 1;
1856 p += len;
1857 if (p[-1] != '\n')
1859 /* Probably ran out of buffer space. */
1860 register unsigned int p_off = p - buffer;
1861 linebuffer->size *= 2;
1862 buffer = (char *) xrealloc (buffer, linebuffer->size);
1863 p = buffer + p_off;
1864 end = buffer + linebuffer->size;
1865 linebuffer->buffer = buffer;
1866 *p = '\0';
1867 lastlen = len;
1868 continue;
1871 ++nlines;
1873 if (len == 1 && p > buffer)
1874 /* P is pointing at a newline and it's the beginning of
1875 the buffer returned by the last fgets call. However,
1876 it is not necessarily the beginning of a line if P is
1877 pointing past the beginning of the holding buffer.
1878 If the buffer was just enlarged (right before the newline),
1879 we must account for that, so we pretend that the two lines
1880 were one line. */
1881 len += lastlen;
1882 lastlen = len;
1883 backslash = 0;
1884 for (p2 = p - 2; --len > 0; --p2)
1886 if (*p2 == '\\')
1887 backslash = !backslash;
1888 else
1889 break;
1892 if (!backslash)
1894 p[-1] = '\0';
1895 break;
1898 if (end - p <= 1)
1900 /* Enlarge the buffer. */
1901 register unsigned int p_off = p - buffer;
1902 linebuffer->size *= 2;
1903 buffer = (char *) xrealloc (buffer, linebuffer->size);
1904 p = buffer + p_off;
1905 end = buffer + linebuffer->size;
1906 linebuffer->buffer = buffer;
1910 if (ferror (stream))
1911 pfatal_with_name (filename);
1913 return nlines;
1916 /* Construct the list of include directories
1917 from the arguments and the default list. */
1919 void
1920 construct_include_path (arg_dirs)
1921 char **arg_dirs;
1923 register unsigned int i;
1924 #ifdef VAXC /* just don't ask ... */
1925 stat_t stbuf;
1926 #else
1927 struct stat stbuf;
1928 #endif
1929 /* Table to hold the dirs. */
1931 register unsigned int defsize = (sizeof (default_include_directories)
1932 / sizeof (default_include_directories[0]));
1933 register unsigned int max = 5;
1934 register char **dirs = (char **) xmalloc ((5 + defsize) * sizeof (char *));
1935 register unsigned int idx = 0;
1937 /* First consider any dirs specified with -I switches.
1938 Ignore dirs that don't exist. */
1940 if (arg_dirs != 0)
1941 while (*arg_dirs != 0)
1943 char *dir = *arg_dirs++;
1945 if (dir[0] == '~')
1947 char *expanded = tilde_expand (dir);
1948 if (expanded != 0)
1949 dir = expanded;
1952 if (stat (dir, &stbuf) == 0 && S_ISDIR (stbuf.st_mode))
1954 if (idx == max - 1)
1956 max += 5;
1957 dirs = (char **)
1958 xrealloc ((char *) dirs, (max + defsize) * sizeof (char *));
1960 dirs[idx++] = dir;
1962 else if (dir != arg_dirs[-1])
1963 free (dir);
1966 /* Now add at the end the standard default dirs. */
1968 for (i = 0; default_include_directories[i] != 0; ++i)
1969 if (stat (default_include_directories[i], &stbuf) == 0
1970 && S_ISDIR (stbuf.st_mode))
1971 dirs[idx++] = default_include_directories[i];
1973 dirs[idx] = 0;
1975 /* Now compute the maximum length of any name in it. */
1977 max_incl_len = 0;
1978 for (i = 0; i < idx; ++i)
1980 unsigned int len = strlen (dirs[i]);
1981 /* If dir name is written with a trailing slash, discard it. */
1982 if (dirs[i][len - 1] == '/')
1983 /* We can't just clobber a null in because it may have come from
1984 a literal string and literal strings may not be writable. */
1985 dirs[i] = savestring (dirs[i], len - 1);
1986 if (len > max_incl_len)
1987 max_incl_len = len;
1990 include_directories = dirs;
1993 /* Expand ~ or ~USER at the beginning of NAME.
1994 Return a newly malloc'd string or 0. */
1996 char *
1997 tilde_expand (name)
1998 char *name;
2000 #ifndef VMS
2001 if (name[1] == '/' || name[1] == '\0')
2003 extern char *getenv ();
2004 char *home_dir;
2005 int is_variable;
2008 /* Turn off --warn-undefined-variables while we expand HOME. */
2009 int save = warn_undefined_variables_flag;
2010 warn_undefined_variables_flag = 0;
2012 home_dir = allocated_variable_expand ("$(HOME)");
2014 warn_undefined_variables_flag = save;
2017 is_variable = home_dir[0] != '\0';
2018 if (!is_variable)
2020 free (home_dir);
2021 home_dir = getenv ("HOME");
2023 #if !defined(_AMIGA) && !defined(WIN32)
2024 if (home_dir == 0 || home_dir[0] == '\0')
2026 extern char *getlogin ();
2027 char *name = getlogin ();
2028 home_dir = 0;
2029 if (name != 0)
2031 struct passwd *p = getpwnam (name);
2032 if (p != 0)
2033 home_dir = p->pw_dir;
2036 #endif /* !AMIGA && !WIN32 */
2037 if (home_dir != 0)
2039 char *new = concat (home_dir, "", name + 1);
2040 if (is_variable)
2041 free (home_dir);
2042 return new;
2045 #if !defined(_AMIGA) && !defined(WIN32)
2046 else
2048 struct passwd *pwent;
2049 char *userend = index (name + 1, '/');
2050 if (userend != 0)
2051 *userend = '\0';
2052 pwent = getpwnam (name + 1);
2053 if (pwent != 0)
2055 if (userend == 0)
2056 return savestring (pwent->pw_dir, strlen (pwent->pw_dir));
2057 else
2058 return concat (pwent->pw_dir, "/", userend + 1);
2060 else if (userend != 0)
2061 *userend = '/';
2063 #endif /* !AMIGA && !WIN32 */
2064 #endif /* !VMS */
2065 return 0;
2068 /* Given a chain of struct nameseq's describing a sequence of filenames,
2069 in reverse of the intended order, return a new chain describing the
2070 result of globbing the filenames. The new chain is in forward order.
2071 The links of the old chain are freed or used in the new chain.
2072 Likewise for the names in the old chain.
2074 SIZE is how big to construct chain elements.
2075 This is useful if we want them actually to be other structures
2076 that have room for additional info. */
2078 struct nameseq *
2079 multi_glob (chain, size)
2080 struct nameseq *chain;
2081 unsigned int size;
2083 extern void dir_setup_glob ();
2084 register struct nameseq *new = 0;
2085 register struct nameseq *old;
2086 struct nameseq *nexto;
2087 glob_t gl;
2089 dir_setup_glob (&gl);
2091 for (old = chain; old != 0; old = nexto)
2093 #ifndef NO_ARCHIVES
2094 char *memname;
2095 #endif
2097 nexto = old->next;
2099 if (old->name[0] == '~')
2101 char *newname = tilde_expand (old->name);
2102 if (newname != 0)
2104 free (old->name);
2105 old->name = newname;
2109 #ifndef NO_ARCHIVES
2110 if (ar_name (old->name))
2112 /* OLD->name is an archive member reference.
2113 Replace it with the archive file name,
2114 and save the member name in MEMNAME.
2115 We will glob on the archive name and then
2116 reattach MEMNAME later. */
2117 char *arname;
2118 ar_parse_name (old->name, &arname, &memname);
2119 free (old->name);
2120 old->name = arname;
2122 else
2123 memname = 0;
2124 #endif /* !NO_ARCHIVES */
2126 switch (glob (old->name, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl))
2128 case 0: /* Success. */
2130 register int i = gl.gl_pathc;
2131 while (i-- > 0)
2133 #ifndef NO_ARCHIVES
2134 if (memname != 0)
2136 /* Try to glob on MEMNAME within the archive. */
2137 struct nameseq *found
2138 = ar_glob (gl.gl_pathv[i], memname, size);
2139 if (found == 0)
2141 /* No matches. Use MEMNAME as-is. */
2142 struct nameseq *elt
2143 = (struct nameseq *) xmalloc (size);
2144 unsigned int alen = strlen (gl.gl_pathv[i]);
2145 unsigned int mlen = strlen (memname);
2146 elt->name = (char *) xmalloc (alen + 1 + mlen + 2);
2147 bcopy (gl.gl_pathv[i], elt->name, alen);
2148 elt->name[alen] = '(';
2149 bcopy (memname, &elt->name[alen + 1], mlen);
2150 elt->name[alen + 1 + mlen] = ')';
2151 elt->name[alen + 1 + mlen + 1] = '\0';
2152 elt->next = new;
2153 new = elt;
2155 else
2157 /* Find the end of the FOUND chain. */
2158 struct nameseq *f = found;
2159 while (f->next != 0)
2160 f = f->next;
2162 /* Attach the chain being built to the end of the FOUND
2163 chain, and make FOUND the new NEW chain. */
2164 f->next = new;
2165 new = found;
2168 free (memname);
2170 else
2171 #endif /* !NO_ARCHIVES */
2173 struct nameseq *elt = (struct nameseq *) xmalloc (size);
2174 elt->name = savestring (gl.gl_pathv[i],
2175 strlen (gl.gl_pathv[i]));
2176 elt->next = new;
2177 new = elt;
2180 globfree (&gl);
2181 free (old->name);
2182 free ((char *)old);
2183 break;
2186 case GLOB_NOSPACE:
2187 fatal ("virtual memory exhausted");
2188 break;
2190 default:
2191 old->next = new;
2192 new = old;
2193 break;
2197 return new;