xref: /illumos-gate/usr/src/cmd/make/bin/read.cc (revision ae389aa9)
110d63b7dSRichard Lowe /*
210d63b7dSRichard Lowe  * CDDL HEADER START
310d63b7dSRichard Lowe  *
410d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
510d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
610d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
710d63b7dSRichard Lowe  *
810d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
1010d63b7dSRichard Lowe  * See the License for the specific language governing permissions
1110d63b7dSRichard Lowe  * and limitations under the License.
1210d63b7dSRichard Lowe  *
1310d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
1410d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
1610d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
1710d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
1810d63b7dSRichard Lowe  *
1910d63b7dSRichard Lowe  * CDDL HEADER END
2010d63b7dSRichard Lowe  */
2110d63b7dSRichard Lowe /*
2210d63b7dSRichard Lowe  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
2310d63b7dSRichard Lowe  * Use is subject to license terms.
248e0c8248SAndrew Stormont  *
258e0c8248SAndrew Stormont  * Copyright 2019 RackTop Systems.
2610d63b7dSRichard Lowe  */
2710d63b7dSRichard Lowe 
2810d63b7dSRichard Lowe /*
2910d63b7dSRichard Lowe  *	read.c
3010d63b7dSRichard Lowe  *
3110d63b7dSRichard Lowe  *	This file contains the makefile reader.
3210d63b7dSRichard Lowe  */
3310d63b7dSRichard Lowe 
3410d63b7dSRichard Lowe /*
3510d63b7dSRichard Lowe  * Included files
3610d63b7dSRichard Lowe  */
3710d63b7dSRichard Lowe #include <alloca.h>		/* alloca() */
3810d63b7dSRichard Lowe #include <errno.h>		/* errno */
3910d63b7dSRichard Lowe #include <fcntl.h>		/* fcntl() */
4010d63b7dSRichard Lowe #include <mk/defs.h>
4110d63b7dSRichard Lowe #include <mksh/macro.h>		/* expand_value(), expand_macro() */
4210d63b7dSRichard Lowe #include <mksh/misc.h>		/* getmem() */
4310d63b7dSRichard Lowe #include <mksh/read.h>		/* get_next_block_fn() */
4410d63b7dSRichard Lowe #include <sys/uio.h>		/* read() */
4510d63b7dSRichard Lowe #include <unistd.h>		/* read(), unlink() */
4610d63b7dSRichard Lowe #include <libintl.h>
4710d63b7dSRichard Lowe 
4810d63b7dSRichard Lowe 
4910d63b7dSRichard Lowe /*
5010d63b7dSRichard Lowe  * typedefs & structs
5110d63b7dSRichard Lowe  */
5210d63b7dSRichard Lowe 
5310d63b7dSRichard Lowe /*
5410d63b7dSRichard Lowe  * Static variables
5510d63b7dSRichard Lowe  */
5610d63b7dSRichard Lowe 
5710d63b7dSRichard Lowe static int line_started_with_space=0; // Used to diagnose spaces instead of tabs
5810d63b7dSRichard Lowe 
5910d63b7dSRichard Lowe /*
6010d63b7dSRichard Lowe  * File table of contents
6110d63b7dSRichard Lowe  */
6210d63b7dSRichard Lowe static	void		parse_makefile(register Name true_makefile_name, register Source source);
6310d63b7dSRichard Lowe static	Source		push_macro_value(register Source bp, register wchar_t *buffer, int size, register Source source);
64*ae389aa9SAndy Fiddaman extern  void		enter_target_groups_and_dependencies(Name_vector target, Name_vector depes, Cmd_line command, Separator separator, Boolean target_group_seen);
6510d63b7dSRichard Lowe extern	Name		normalize_name(register wchar_t *name_string, register int length);
6610d63b7dSRichard Lowe 
6710d63b7dSRichard Lowe /*
6810d63b7dSRichard Lowe  *	read_simple_file(makefile_name, chase_path, doname_it,
6910d63b7dSRichard Lowe  *		 complain, must_exist, report_file, lock_makefile)
7010d63b7dSRichard Lowe  *
7110d63b7dSRichard Lowe  *	Make the makefile and setup to read it. Actually read it if it is stdio
7210d63b7dSRichard Lowe  *
7310d63b7dSRichard Lowe  *	Return value:
7410d63b7dSRichard Lowe  *				false if the read failed
7510d63b7dSRichard Lowe  *
7610d63b7dSRichard Lowe  *	Parameters:
7710d63b7dSRichard Lowe  *		makefile_name	Name of the file to read
7810d63b7dSRichard Lowe  *		chase_path	Use the makefile path when opening file
7910d63b7dSRichard Lowe  *		doname_it	Call doname() to build the file first
8010d63b7dSRichard Lowe  *		complain	Print message if doname/open fails
8110d63b7dSRichard Lowe  *		must_exist	Generate fatal if file is missing
8210d63b7dSRichard Lowe  *		report_file	Report file when running -P
8310d63b7dSRichard Lowe  *		lock_makefile	Lock the makefile when reading
8410d63b7dSRichard Lowe  *
8510d63b7dSRichard Lowe  *	Static variables used:
8610d63b7dSRichard Lowe  *
8710d63b7dSRichard Lowe  *	Global variables used:
8810d63b7dSRichard Lowe  *		do_not_exec_rule Is -n on?
8910d63b7dSRichard Lowe  *		file_being_read	Set to the name of the new file
9010d63b7dSRichard Lowe  *		line_number	The number of the current makefile line
9110d63b7dSRichard Lowe  *		makefiles_used	A list of all makefiles used, appended to
9210d63b7dSRichard Lowe  */
9310d63b7dSRichard Lowe 
9410d63b7dSRichard Lowe 
9510d63b7dSRichard Lowe Boolean
9610d63b7dSRichard Lowe read_simple_file(register Name makefile_name, register Boolean chase_path, register Boolean doname_it, Boolean complain, Boolean must_exist, Boolean report_file, Boolean lock_makefile)
9710d63b7dSRichard Lowe {
9810d63b7dSRichard Lowe 	static short		max_include_depth;
9910d63b7dSRichard Lowe 	register Property	makefile = maybe_append_prop(makefile_name,
10010d63b7dSRichard Lowe 							     makefile_prop);
10110d63b7dSRichard Lowe 	Boolean			forget_after_parse = false;
10210d63b7dSRichard Lowe 	static pathpt		makefile_path;
10310d63b7dSRichard Lowe 	register int		n;
10410d63b7dSRichard Lowe 	char			*path;
10510d63b7dSRichard Lowe 	register Source		source = ALLOC(Source);
10610d63b7dSRichard Lowe 	Property		orig_makefile = makefile;
10710d63b7dSRichard Lowe 	Dependency		*dpp;
10810d63b7dSRichard Lowe 	Dependency		dp;
10910d63b7dSRichard Lowe 	register int		length;
11010d63b7dSRichard Lowe 	wchar_t			*previous_file_being_read = file_being_read;
11110d63b7dSRichard Lowe 	int			previous_line_number = line_number;
11210d63b7dSRichard Lowe 	wchar_t			previous_current_makefile[MAXPATHLEN];
11310d63b7dSRichard Lowe 	Makefile_type		save_makefile_type;
114*ae389aa9SAndy Fiddaman 	Name			normalized_makefile_name;
11510d63b7dSRichard Lowe 	register wchar_t        *string_start;
11610d63b7dSRichard Lowe 	register wchar_t        *string_end;
11710d63b7dSRichard Lowe 
11810d63b7dSRichard Lowe 
11910d63b7dSRichard Lowe 
12010d63b7dSRichard Lowe 	wchar_t * wcb = get_wstring(makefile_name->string_mb);
12110d63b7dSRichard Lowe 
12210d63b7dSRichard Lowe 	if (max_include_depth++ >= 40) {
12310d63b7dSRichard Lowe 		fatal(gettext("Too many nested include statements"));
12410d63b7dSRichard Lowe 	}
12510d63b7dSRichard Lowe 	if (makefile->body.makefile.contents != NULL) {
12610d63b7dSRichard Lowe 		retmem(makefile->body.makefile.contents);
12710d63b7dSRichard Lowe 	}
12810d63b7dSRichard Lowe 	source->inp_buf =
12910d63b7dSRichard Lowe 	  source->inp_buf_ptr =
13010d63b7dSRichard Lowe 	    source->inp_buf_end = NULL;
13110d63b7dSRichard Lowe 	source->error_converting = false;
13210d63b7dSRichard Lowe 	makefile->body.makefile.contents = NULL;
13310d63b7dSRichard Lowe 	makefile->body.makefile.size = 0;
13410d63b7dSRichard Lowe 	if ((makefile_name->hash.length != 1) ||
13510d63b7dSRichard Lowe 	    (wcb[0] != (int) hyphen_char)) {
13610d63b7dSRichard Lowe 		if ((makefile->body.makefile.contents == NULL) &&
13710d63b7dSRichard Lowe 		    (doname_it)) {
13810d63b7dSRichard Lowe 			if (makefile_path == NULL) {
13910d63b7dSRichard Lowe 				char *pfx = make_install_prefix();
14010d63b7dSRichard Lowe 				char *path;
14110d63b7dSRichard Lowe 
14210d63b7dSRichard Lowe 				add_dir_to_path(".",
14310d63b7dSRichard Lowe 						&makefile_path,
14410d63b7dSRichard Lowe 						-1);
14510d63b7dSRichard Lowe 
14610d63b7dSRichard Lowe 				// As regularly installed
14710d63b7dSRichard Lowe 				asprintf(&path, "%s/../share/lib/make", pfx);
14810d63b7dSRichard Lowe 				add_dir_to_path(path, &makefile_path, -1);
14910d63b7dSRichard Lowe 				free(path);
15010d63b7dSRichard Lowe 
15110d63b7dSRichard Lowe 				// Tools build
15210d63b7dSRichard Lowe 				asprintf(&path, "%s/../../share/", pfx);
15310d63b7dSRichard Lowe 				add_dir_to_path(path, &makefile_path, -1);
15410d63b7dSRichard Lowe 				free(path);
155*ae389aa9SAndy Fiddaman 
15610d63b7dSRichard Lowe 				add_dir_to_path("/usr/share/lib/make",
15710d63b7dSRichard Lowe 						&makefile_path,
15810d63b7dSRichard Lowe 						-1);
15910d63b7dSRichard Lowe 				add_dir_to_path("/etc/default",
16010d63b7dSRichard Lowe 						&makefile_path,
16110d63b7dSRichard Lowe 						-1);
16210d63b7dSRichard Lowe 
16310d63b7dSRichard Lowe 				free(pfx);
16410d63b7dSRichard Lowe 			}
16510d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
16610d63b7dSRichard Lowe 			makefile_type = reading_nothing;
16710d63b7dSRichard Lowe 			if (doname(makefile_name, true, false) == build_dont_know) {
16810d63b7dSRichard Lowe 				/* Try normalized filename */
16910d63b7dSRichard Lowe 				string_start=get_wstring(makefile_name->string_mb);
17010d63b7dSRichard Lowe 				for (string_end=string_start+1; *string_end != L'\0'; string_end++);
17110d63b7dSRichard Lowe 				normalized_makefile_name=normalize_name(string_start, string_end - string_start);
172*ae389aa9SAndy Fiddaman 				if ((strcmp(makefile_name->string_mb, normalized_makefile_name->string_mb) == 0) ||
17310d63b7dSRichard Lowe 					(doname(normalized_makefile_name, true, false) == build_dont_know)) {
17410d63b7dSRichard Lowe 					n = access_vroot(makefile_name->string_mb,
17510d63b7dSRichard Lowe 						 4,
17610d63b7dSRichard Lowe 						 chase_path ?
17710d63b7dSRichard Lowe 						 makefile_path : NULL,
17810d63b7dSRichard Lowe 						 VROOT_DEFAULT);
17910d63b7dSRichard Lowe 					if (n == 0) {
18010d63b7dSRichard Lowe 						get_vroot_path((char **) NULL,
18110d63b7dSRichard Lowe 						       &path,
18210d63b7dSRichard Lowe 						       (char **) NULL);
18310d63b7dSRichard Lowe 						if ((path[0] == (int) period_char) &&
18410d63b7dSRichard Lowe 						    (path[1] == (int) slash_char)) {
18510d63b7dSRichard Lowe 							path += 2;
18610d63b7dSRichard Lowe 						}
18710d63b7dSRichard Lowe 						MBSTOWCS(wcs_buffer, path);
18810d63b7dSRichard Lowe 						makefile_name = GETNAME(wcs_buffer,
18910d63b7dSRichard Lowe 								FIND_LENGTH);
19010d63b7dSRichard Lowe 					}
19110d63b7dSRichard Lowe 				}
19210d63b7dSRichard Lowe 				retmem(string_start);
193*ae389aa9SAndy Fiddaman 				/*
19410d63b7dSRichard Lowe 				 * Commented out: retmem_mb(normalized_makefile_name->string_mb);
19510d63b7dSRichard Lowe 				 * We have to return this memory, but it seems to trigger a bug
19610d63b7dSRichard Lowe 				 * in dmake or in Sun C++ 5.7 compiler (it works ok if this code
19710d63b7dSRichard Lowe 				 * is compiled using Sun C++ 5.6).
19810d63b7dSRichard Lowe 				 */
199*ae389aa9SAndy Fiddaman 				// retmem_mb(normalized_makefile_name->string_mb);
20010d63b7dSRichard Lowe 			}
20110d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
20210d63b7dSRichard Lowe 		}
20310d63b7dSRichard Lowe 		source->string.free_after_use = false;
20410d63b7dSRichard Lowe 		source->previous = NULL;
20510d63b7dSRichard Lowe 		source->already_expanded = false;
20610d63b7dSRichard Lowe 		/* Lock the file for read, but not when -n. */
207*ae389aa9SAndy Fiddaman 		if (lock_makefile &&
20810d63b7dSRichard Lowe 		    !do_not_exec_rule) {
20910d63b7dSRichard Lowe 
21010d63b7dSRichard Lowe 			 make_state_lockfile = getmem(strlen(make_state->string_mb) + strlen(".lock") + 1);
21110d63b7dSRichard Lowe 			 (void) sprintf(make_state_lockfile,
21210d63b7dSRichard Lowe 						"%s.lock",
21310d63b7dSRichard Lowe 						make_state->string_mb);
21410d63b7dSRichard Lowe 			(void) file_lock(make_state->string_mb,
21510d63b7dSRichard Lowe 					 make_state_lockfile,
21610d63b7dSRichard Lowe 					 (int *) &make_state_locked,
21710d63b7dSRichard Lowe 					 0);
21810d63b7dSRichard Lowe 			if(!make_state_locked) {
21910d63b7dSRichard Lowe 				printf("-- NO LOCKING for read\n");
22010d63b7dSRichard Lowe 				retmem_mb(make_state_lockfile);
22110d63b7dSRichard Lowe 				make_state_lockfile = 0;
22210d63b7dSRichard Lowe 				return failed;
22310d63b7dSRichard Lowe 			}
22410d63b7dSRichard Lowe 		}
22510d63b7dSRichard Lowe 		if (makefile->body.makefile.contents == NULL) {
22610d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
22710d63b7dSRichard Lowe 			makefile_type = reading_nothing;
22810d63b7dSRichard Lowe 			if ((doname_it) &&
22910d63b7dSRichard Lowe 			    (doname(makefile_name, true, false) == build_failed)) {
23010d63b7dSRichard Lowe 				if (complain) {
23110d63b7dSRichard Lowe 					(void) fprintf(stderr,
23210d63b7dSRichard Lowe 						       gettext("%s: Couldn't make `%s'\n"),
23310d63b7dSRichard Lowe 						       getprogname(),
23410d63b7dSRichard Lowe 						       makefile_name->string_mb);
23510d63b7dSRichard Lowe 				}
23610d63b7dSRichard Lowe 				max_include_depth--;
23710d63b7dSRichard Lowe 				makefile_type = save_makefile_type;
23810d63b7dSRichard Lowe 				return failed;
23910d63b7dSRichard Lowe 			}
24010d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
24110d63b7dSRichard Lowe 			//
24210d63b7dSRichard Lowe 			// Before calling exists() make sure that we have the right timestamp
24310d63b7dSRichard Lowe 			//
24410d63b7dSRichard Lowe 			makefile_name->stat.time = file_no_time;
24510d63b7dSRichard Lowe 
24610d63b7dSRichard Lowe 			if (exists(makefile_name) == file_doesnt_exist) {
24710d63b7dSRichard Lowe 				if (complain ||
24810d63b7dSRichard Lowe 				    (makefile_name->stat.stat_errno != ENOENT)) {
24910d63b7dSRichard Lowe 					if (must_exist) {
25010d63b7dSRichard Lowe 						fatal(gettext("Can't find `%s': %s"),
25110d63b7dSRichard Lowe 						      makefile_name->string_mb,
25210d63b7dSRichard Lowe 						      errmsg(makefile_name->
25310d63b7dSRichard Lowe 							     stat.stat_errno));
25410d63b7dSRichard Lowe 					} else {
25510d63b7dSRichard Lowe 						warning(gettext("Can't find `%s': %s"),
25610d63b7dSRichard Lowe 							makefile_name->string_mb,
25710d63b7dSRichard Lowe 							errmsg(makefile_name->
25810d63b7dSRichard Lowe 							       stat.stat_errno));
25910d63b7dSRichard Lowe 					}
26010d63b7dSRichard Lowe 				}
26110d63b7dSRichard Lowe 				max_include_depth--;
26210d63b7dSRichard Lowe 				if(make_state_locked && (make_state_lockfile != NULL)) {
26310d63b7dSRichard Lowe 					(void) unlink(make_state_lockfile);
26410d63b7dSRichard Lowe 					retmem_mb(make_state_lockfile);
26510d63b7dSRichard Lowe 					make_state_lockfile = NULL;
26610d63b7dSRichard Lowe 					make_state_locked = false;
26710d63b7dSRichard Lowe 				}
26810d63b7dSRichard Lowe 				retmem(wcb);
26910d63b7dSRichard Lowe 				retmem_mb((char *)source);
27010d63b7dSRichard Lowe 				return failed;
27110d63b7dSRichard Lowe 			}
27210d63b7dSRichard Lowe 			/*
27310d63b7dSRichard Lowe 			 * These values are the size and bytes of
27410d63b7dSRichard Lowe 			 * the MULTI-BYTE makefile.
27510d63b7dSRichard Lowe 			 */
27610d63b7dSRichard Lowe 			orig_makefile->body.makefile.size =
27710d63b7dSRichard Lowe 			  makefile->body.makefile.size =
27810d63b7dSRichard Lowe 			    source->bytes_left_in_file =
27910d63b7dSRichard Lowe 			      makefile_name->stat.size;
28010d63b7dSRichard Lowe 			if (report_file) {
28110d63b7dSRichard Lowe 				for (dpp = &makefiles_used;
28210d63b7dSRichard Lowe 				     *dpp != NULL;
28310d63b7dSRichard Lowe 				     dpp = &(*dpp)->next);
28410d63b7dSRichard Lowe 				dp = ALLOC(Dependency);
28510d63b7dSRichard Lowe 				dp->next = NULL;
28610d63b7dSRichard Lowe 				dp->name = makefile_name;
28710d63b7dSRichard Lowe 				dp->automatic = false;
28810d63b7dSRichard Lowe 				dp->stale = false;
28910d63b7dSRichard Lowe 				dp->built = false;
29010d63b7dSRichard Lowe 				*dpp = dp;
29110d63b7dSRichard Lowe 			}
29210d63b7dSRichard Lowe 			source->fd = open_vroot(makefile_name->string_mb,
29310d63b7dSRichard Lowe 						O_RDONLY,
29410d63b7dSRichard Lowe 						0,
29510d63b7dSRichard Lowe 						NULL,
29610d63b7dSRichard Lowe 						VROOT_DEFAULT);
29710d63b7dSRichard Lowe 			if (source->fd < 0) {
29810d63b7dSRichard Lowe 				if (complain || (errno != ENOENT)) {
29910d63b7dSRichard Lowe 					if (must_exist) {
30010d63b7dSRichard Lowe 						fatal(gettext("Can't open `%s': %s"),
30110d63b7dSRichard Lowe 						      makefile_name->string_mb,
30210d63b7dSRichard Lowe 						      errmsg(errno));
30310d63b7dSRichard Lowe 					} else {
30410d63b7dSRichard Lowe 						warning(gettext("Can't open `%s': %s"),
30510d63b7dSRichard Lowe 							makefile_name->string_mb,
30610d63b7dSRichard Lowe 							errmsg(errno));
30710d63b7dSRichard Lowe 					}
30810d63b7dSRichard Lowe 				}
30910d63b7dSRichard Lowe 				max_include_depth--;
31010d63b7dSRichard Lowe 				return failed;
31110d63b7dSRichard Lowe 			}
31210d63b7dSRichard Lowe 			(void) fcntl(source->fd, F_SETFD, 1);
31310d63b7dSRichard Lowe 			orig_makefile->body.makefile.contents =
31410d63b7dSRichard Lowe 			  makefile->body.makefile.contents =
31510d63b7dSRichard Lowe 			    source->string.text.p =
31610d63b7dSRichard Lowe 			      source->string.buffer.start =
31710d63b7dSRichard Lowe 				ALLOC_WC((int) (makefile_name->stat.size + 2));
31810d63b7dSRichard Lowe 			if (makefile_type == reading_cpp_file) {
31910d63b7dSRichard Lowe 				forget_after_parse = true;
32010d63b7dSRichard Lowe 			}
32110d63b7dSRichard Lowe 			source->string.text.end = source->string.text.p;
32210d63b7dSRichard Lowe 			source->string.buffer.end =
32310d63b7dSRichard Lowe 			  source->string.text.p + makefile_name->stat.size;
32410d63b7dSRichard Lowe 		} else {
32510d63b7dSRichard Lowe 			/* Do we ever reach here? */
32610d63b7dSRichard Lowe 			source->fd = -1;
32710d63b7dSRichard Lowe 			source->string.text.p =
32810d63b7dSRichard Lowe 			  source->string.buffer.start =
32910d63b7dSRichard Lowe 			    makefile->body.makefile.contents;
33010d63b7dSRichard Lowe 			source->string.text.end =
33110d63b7dSRichard Lowe 			  source->string.buffer.end =
33210d63b7dSRichard Lowe 			    source->string.text.p + makefile->body.makefile.size;
33310d63b7dSRichard Lowe 			source->bytes_left_in_file =
33410d63b7dSRichard Lowe 			  makefile->body.makefile.size;
33510d63b7dSRichard Lowe 		}
33610d63b7dSRichard Lowe 		file_being_read = wcb;
33710d63b7dSRichard Lowe 	} else {
33810d63b7dSRichard Lowe 		char		*stdin_text_p;
33910d63b7dSRichard Lowe 		char		*stdin_text_end;
34010d63b7dSRichard Lowe 		char		*stdin_buffer_start;
34110d63b7dSRichard Lowe 		char		*stdin_buffer_end;
34210d63b7dSRichard Lowe 		char		*p_mb;
34310d63b7dSRichard Lowe 		int		num_mb_chars;
34410d63b7dSRichard Lowe 		size_t		num_wc_chars;
34510d63b7dSRichard Lowe 
34610d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "Standard in");
34710d63b7dSRichard Lowe 		makefile_name = GETNAME(wcs_buffer, FIND_LENGTH);
34810d63b7dSRichard Lowe 		/*
34910d63b7dSRichard Lowe 		 * Memory to read standard in, then convert it
35010d63b7dSRichard Lowe 		 * to wide char strings.
35110d63b7dSRichard Lowe 		 */
35210d63b7dSRichard Lowe 		stdin_buffer_start =
35310d63b7dSRichard Lowe 		  stdin_text_p = getmem(length = 1024);
35410d63b7dSRichard Lowe 		stdin_buffer_end = stdin_text_p + length;
35510d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "standard input");
35610d63b7dSRichard Lowe 		file_being_read = (wchar_t *) wcsdup(wcs_buffer);
35710d63b7dSRichard Lowe 		line_number = 0;
35810d63b7dSRichard Lowe 		while ((n = read(fileno(stdin),
35910d63b7dSRichard Lowe 				 stdin_text_p,
36010d63b7dSRichard Lowe 				 length)) > 0) {
36110d63b7dSRichard Lowe 			length -= n;
36210d63b7dSRichard Lowe 			stdin_text_p += n;
36310d63b7dSRichard Lowe 			if (length == 0) {
36410d63b7dSRichard Lowe 				p_mb = getmem(length = 1024 +
36510d63b7dSRichard Lowe 					      (stdin_buffer_end -
36610d63b7dSRichard Lowe 					       stdin_buffer_start));
36710d63b7dSRichard Lowe 				(void) strncpy(p_mb,
36810d63b7dSRichard Lowe 					       stdin_buffer_start,
36910d63b7dSRichard Lowe 					       (stdin_buffer_end -
37010d63b7dSRichard Lowe 					        stdin_buffer_start));
37110d63b7dSRichard Lowe 				retmem_mb(stdin_buffer_start);
37210d63b7dSRichard Lowe 				stdin_text_p = p_mb +
37310d63b7dSRichard Lowe 				  (stdin_buffer_end - stdin_buffer_start);
37410d63b7dSRichard Lowe 				stdin_buffer_start = p_mb;
37510d63b7dSRichard Lowe 				stdin_buffer_end =
37610d63b7dSRichard Lowe 				  stdin_buffer_start + length;
37710d63b7dSRichard Lowe 				length = 1024;
37810d63b7dSRichard Lowe 			}
37910d63b7dSRichard Lowe 		}
38010d63b7dSRichard Lowe 		if (n < 0) {
38110d63b7dSRichard Lowe 			fatal(gettext("Error reading standard input: %s"),
38210d63b7dSRichard Lowe 			      errmsg(errno));
38310d63b7dSRichard Lowe 		}
38410d63b7dSRichard Lowe 		stdin_text_p = stdin_buffer_start;
38510d63b7dSRichard Lowe 		stdin_text_end = stdin_buffer_end - length;
38610d63b7dSRichard Lowe 		num_mb_chars = stdin_text_end - stdin_text_p;
38710d63b7dSRichard Lowe 
38810d63b7dSRichard Lowe 		/*
38910d63b7dSRichard Lowe 		 * Now, convert the sequence of multibyte chars into
39010d63b7dSRichard Lowe 		 * a sequence of corresponding wide character codes.
39110d63b7dSRichard Lowe 		 */
39210d63b7dSRichard Lowe 		source->string.free_after_use = false;
39310d63b7dSRichard Lowe 		source->previous = NULL;
39410d63b7dSRichard Lowe 		source->bytes_left_in_file = 0;
39510d63b7dSRichard Lowe 		source->fd = -1;
39610d63b7dSRichard Lowe 		source->already_expanded = false;
39710d63b7dSRichard Lowe 		source->string.buffer.start =
39810d63b7dSRichard Lowe 		  source->string.text.p = ALLOC_WC(num_mb_chars + 1);
39910d63b7dSRichard Lowe 		source->string.buffer.end =
40010d63b7dSRichard Lowe 		    source->string.text.p + num_mb_chars;
40110d63b7dSRichard Lowe 		num_wc_chars = mbstowcs(source->string.text.p,
40210d63b7dSRichard Lowe 					stdin_text_p,
40310d63b7dSRichard Lowe 					num_mb_chars);
40410d63b7dSRichard Lowe 		if ((int) num_wc_chars >= 0) {
40510d63b7dSRichard Lowe 			source->string.text.end =
40610d63b7dSRichard Lowe 			  source->string.text.p + num_wc_chars;
40710d63b7dSRichard Lowe 		}
40810d63b7dSRichard Lowe 		(void) retmem_mb(stdin_text_p);
40910d63b7dSRichard Lowe 	}
41010d63b7dSRichard Lowe 	line_number = 1;
41110d63b7dSRichard Lowe 	if (trace_reader) {
41210d63b7dSRichard Lowe 		(void) printf(gettext(">>>>>>>>>>>>>>>> Reading makefile %s\n"),
41310d63b7dSRichard Lowe 			      makefile_name->string_mb);
41410d63b7dSRichard Lowe 	}
41510d63b7dSRichard Lowe 	parse_makefile(makefile_name, source);
41610d63b7dSRichard Lowe 	if (trace_reader) {
41710d63b7dSRichard Lowe 		(void) printf(gettext(">>>>>>>>>>>>>>>> End of makefile %s\n"),
41810d63b7dSRichard Lowe 			      makefile_name->string_mb);
41910d63b7dSRichard Lowe 	}
42010d63b7dSRichard Lowe 	if(file_being_read) {
42110d63b7dSRichard Lowe 		retmem(file_being_read);
42210d63b7dSRichard Lowe 	}
42310d63b7dSRichard Lowe 	file_being_read = previous_file_being_read;
42410d63b7dSRichard Lowe 	line_number = previous_line_number;
42510d63b7dSRichard Lowe 	makefile_type = reading_nothing;
42610d63b7dSRichard Lowe 	max_include_depth--;
42710d63b7dSRichard Lowe 	if (make_state_locked) {
42810d63b7dSRichard Lowe 		/* Unlock .make.state. */
42910d63b7dSRichard Lowe 		unlink(make_state_lockfile);
43010d63b7dSRichard Lowe 		make_state_locked = false;
43110d63b7dSRichard Lowe 		retmem_mb(make_state_lockfile);
43210d63b7dSRichard Lowe 	}
43310d63b7dSRichard Lowe 	if (forget_after_parse) {
43410d63b7dSRichard Lowe 		retmem(makefile->body.makefile.contents);
43510d63b7dSRichard Lowe 		makefile->body.makefile.contents = NULL;
43610d63b7dSRichard Lowe 	}
43710d63b7dSRichard Lowe 	retmem_mb((char *)source);
43810d63b7dSRichard Lowe 	return succeeded;
43910d63b7dSRichard Lowe }
44010d63b7dSRichard Lowe 
44110d63b7dSRichard Lowe /*
44210d63b7dSRichard Lowe  *	parse_makefile(true_makefile_name, source)
44310d63b7dSRichard Lowe  *
44410d63b7dSRichard Lowe  *	Strings are read from Sources.
44510d63b7dSRichard Lowe  *	When macros are found, their values are represented by a
44610d63b7dSRichard Lowe  *	Source that is pushed on a stack. At end of string
44710d63b7dSRichard Lowe  *	(that is returned from GET_CHAR() as 0), the block is popped.
44810d63b7dSRichard Lowe  *
44910d63b7dSRichard Lowe  *	Parameters:
45010d63b7dSRichard Lowe  *		true_makefile_name	The name of makefile we are parsing
45110d63b7dSRichard Lowe  *		source			The source block to read from
45210d63b7dSRichard Lowe  *
45310d63b7dSRichard Lowe  *	Global variables used:
45410d63b7dSRichard Lowe  *		do_not_exec_rule Is -n on?
45510d63b7dSRichard Lowe  *		line_number	The number of the current makefile line
45610d63b7dSRichard Lowe  *		makefile_type	What kind of makefile are we reading?
45710d63b7dSRichard Lowe  *		empty_name	The Name ""
45810d63b7dSRichard Lowe  */
45910d63b7dSRichard Lowe static void
46010d63b7dSRichard Lowe parse_makefile(register Name true_makefile_name, register Source source)
46110d63b7dSRichard Lowe {
46210d63b7dSRichard Lowe /*
46310d63b7dSRichard Lowe 	char			mb_buffer[MB_LEN_MAX];
46410d63b7dSRichard Lowe  */
46510d63b7dSRichard Lowe 	register wchar_t	*source_p;
46610d63b7dSRichard Lowe 	register wchar_t	*source_end;
46710d63b7dSRichard Lowe 	register wchar_t	*string_start;
46810d63b7dSRichard Lowe 	wchar_t			*string_end;
46910d63b7dSRichard Lowe 	register Boolean	macro_seen_in_string;
47010d63b7dSRichard Lowe 	Boolean			append;
47110d63b7dSRichard Lowe 	String_rec		name_string;
47210d63b7dSRichard Lowe 	wchar_t			name_buffer[STRING_BUFFER_LENGTH];
47310d63b7dSRichard Lowe 	register int		distance;
47410d63b7dSRichard Lowe 	register int		paren_count;
47510d63b7dSRichard Lowe 	int			brace_count;
47610d63b7dSRichard Lowe 	int			char_number;
47710d63b7dSRichard Lowe 	Cmd_line		command;
47810d63b7dSRichard Lowe 	Cmd_line		command_tail;
47910d63b7dSRichard Lowe 	Name			macro_value;
48010d63b7dSRichard Lowe 
48110d63b7dSRichard Lowe 	Name_vector_rec		target;
48210d63b7dSRichard Lowe 	Name_vector_rec		depes;
48310d63b7dSRichard Lowe 	Name_vector_rec		extra_name_vector;
48410d63b7dSRichard Lowe 	Name_vector		current_names;
48510d63b7dSRichard Lowe 	Name_vector		extra_names = &extra_name_vector;
48610d63b7dSRichard Lowe 	Name_vector		nvp;
48710d63b7dSRichard Lowe 	Boolean			target_group_seen;
48810d63b7dSRichard Lowe 
48910d63b7dSRichard Lowe 	register Reader_state   state;
49010d63b7dSRichard Lowe 	register Reader_state   on_eoln_state;
49110d63b7dSRichard Lowe 	register Separator	separator;
49210d63b7dSRichard Lowe 
49310d63b7dSRichard Lowe 	wchar_t                 buffer[4 * STRING_BUFFER_LENGTH];
49410d63b7dSRichard Lowe 	Source			extrap;
49510d63b7dSRichard Lowe 
49610d63b7dSRichard Lowe 	Boolean                 save_do_not_exec_rule = do_not_exec_rule;
49710d63b7dSRichard Lowe 	Name                    makefile_name;
49810d63b7dSRichard Lowe 
49910d63b7dSRichard Lowe 	static Name		sh_name;
50010d63b7dSRichard Lowe 	static Name		shell_name;
50110d63b7dSRichard Lowe 	int			i;
50210d63b7dSRichard Lowe 
50310d63b7dSRichard Lowe 	static wchar_t		include_space[10];
50410d63b7dSRichard Lowe 	static wchar_t		include_tab[10];
50510d63b7dSRichard Lowe 	int			tmp_bytes_left_in_string;
50610d63b7dSRichard Lowe 	Boolean			tmp_maybe_include = false;
507*ae389aa9SAndy Fiddaman 	int			emptycount = 0;
50810d63b7dSRichard Lowe 	Boolean			first_target;
50910d63b7dSRichard Lowe 
51010d63b7dSRichard Lowe 	String_rec		include_name;
51110d63b7dSRichard Lowe 	wchar_t			include_buffer[STRING_BUFFER_LENGTH];
51210d63b7dSRichard Lowe 
51310d63b7dSRichard Lowe 	target.next = depes.next = NULL;
51410d63b7dSRichard Lowe 	/* Move some values from their struct to register declared locals */
51510d63b7dSRichard Lowe 	CACHE_SOURCE(0);
51610d63b7dSRichard Lowe 
51710d63b7dSRichard Lowe  start_new_line:
51810d63b7dSRichard Lowe 	/*
51910d63b7dSRichard Lowe 	 * Read whitespace on old line. Leave pointer on first char on
52010d63b7dSRichard Lowe 	 * next line.
52110d63b7dSRichard Lowe 	 */
52210d63b7dSRichard Lowe 	first_target = true;
52310d63b7dSRichard Lowe 	on_eoln_state = exit_state;
52410d63b7dSRichard Lowe /*
52510d63b7dSRichard Lowe 	for (WCTOMB(mb_buffer, GET_CHAR());
52610d63b7dSRichard Lowe 	     1;
52710d63b7dSRichard Lowe 	     source_p++, WCTOMB(mb_buffer, GET_CHAR()))
52810d63b7dSRichard Lowe 		switch (mb_buffer[0]) {
52910d63b7dSRichard Lowe  */
53010d63b7dSRichard Lowe 	for (char_number=0; 1; source_p++,char_number++) switch (GET_CHAR()) {
53110d63b7dSRichard Lowe 	case nul_char:
53210d63b7dSRichard Lowe 		/* End of this string. Pop it and return to the previous one */
53310d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
53410d63b7dSRichard Lowe 		source_p--;
53510d63b7dSRichard Lowe 		if (source == NULL) {
53610d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
53710d63b7dSRichard Lowe 		}
53810d63b7dSRichard Lowe 		break;
53910d63b7dSRichard Lowe 	case newline_char:
54010d63b7dSRichard Lowe 	end_of_line:
54110d63b7dSRichard Lowe 		source_p++;
54210d63b7dSRichard Lowe 		if (source->fd >= 0) {
54310d63b7dSRichard Lowe 			line_number++;
54410d63b7dSRichard Lowe 		}
54510d63b7dSRichard Lowe 		switch (GET_CHAR()) {
54610d63b7dSRichard Lowe 		case nul_char:
54710d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
54810d63b7dSRichard Lowe 			if (source == NULL) {
54910d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
55010d63b7dSRichard Lowe 			}
55110d63b7dSRichard Lowe 			/* Go back to the top of this loop */
55210d63b7dSRichard Lowe 			goto start_new_line;
55310d63b7dSRichard Lowe 		case newline_char:
55410d63b7dSRichard Lowe 		case numbersign_char:
55510d63b7dSRichard Lowe 		case dollar_char:
55610d63b7dSRichard Lowe 		case space_char:
55710d63b7dSRichard Lowe 		case tab_char:
55810d63b7dSRichard Lowe 			/*
55910d63b7dSRichard Lowe 			 * Go back to the top of this loop since the
56010d63b7dSRichard Lowe 			 * new line does not start with a regular char.
56110d63b7dSRichard Lowe 			 */
56210d63b7dSRichard Lowe 			goto start_new_line;
56310d63b7dSRichard Lowe 		default:
56410d63b7dSRichard Lowe 			/* We found the first proper char on the new line */
56510d63b7dSRichard Lowe 			goto start_new_line_no_skip;
56610d63b7dSRichard Lowe 		}
56710d63b7dSRichard Lowe 	case space_char:
56810d63b7dSRichard Lowe 		if (char_number == 0)
56910d63b7dSRichard Lowe 			line_started_with_space=line_number;
57010d63b7dSRichard Lowe 	case tab_char:
57110d63b7dSRichard Lowe 		/* Whitespace. Just keep going in this loop */
57210d63b7dSRichard Lowe 		break;
57310d63b7dSRichard Lowe 	case numbersign_char:
57410d63b7dSRichard Lowe 		/* Comment. Skip over it */
57510d63b7dSRichard Lowe 		for (; 1; source_p++) {
57610d63b7dSRichard Lowe 			switch (GET_CHAR()) {
57710d63b7dSRichard Lowe 			case nul_char:
57810d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
57910d63b7dSRichard Lowe 				if (source == NULL) {
58010d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
58110d63b7dSRichard Lowe 				}
58210d63b7dSRichard Lowe 				if (source->error_converting) {
58310d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
58410d63b7dSRichard Lowe 					source->inp_buf_ptr++;
58510d63b7dSRichard Lowe 				}
58610d63b7dSRichard Lowe 				source_p--;
58710d63b7dSRichard Lowe 				break;
58810d63b7dSRichard Lowe 			case backslash_char:
58910d63b7dSRichard Lowe 				/* Comments can be continued */
59010d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
59110d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
59210d63b7dSRichard Lowe 					if (source == NULL) {
59310d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
59410d63b7dSRichard Lowe 					}
59510d63b7dSRichard Lowe 					if (source->error_converting) {
59610d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
59710d63b7dSRichard Lowe 						source->inp_buf_ptr++;
59810d63b7dSRichard Lowe 						source_p--;
59910d63b7dSRichard Lowe 						break;
60010d63b7dSRichard Lowe 					}
60110d63b7dSRichard Lowe 				}
60210d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
60310d63b7dSRichard Lowe 					if (source->fd >= 0) {
60410d63b7dSRichard Lowe 						line_number++;
60510d63b7dSRichard Lowe 					}
60610d63b7dSRichard Lowe 				}
60710d63b7dSRichard Lowe 				break;
60810d63b7dSRichard Lowe 			case newline_char:
60910d63b7dSRichard Lowe 				/*
61010d63b7dSRichard Lowe 				 * After we skip the comment we go to
61110d63b7dSRichard Lowe 				 * the end of line handler since end of
61210d63b7dSRichard Lowe 				 * line terminates comments.
61310d63b7dSRichard Lowe 				 */
61410d63b7dSRichard Lowe 				goto end_of_line;
61510d63b7dSRichard Lowe 			}
61610d63b7dSRichard Lowe 		}
61710d63b7dSRichard Lowe 	case dollar_char:
61810d63b7dSRichard Lowe 		/* Macro reference */
61910d63b7dSRichard Lowe 		if (source->already_expanded) {
62010d63b7dSRichard Lowe 			/*
62110d63b7dSRichard Lowe 			 * If we are reading from the expansion of a
62210d63b7dSRichard Lowe 			 * macro we already expanded everything enough.
62310d63b7dSRichard Lowe 			 */
62410d63b7dSRichard Lowe 			goto start_new_line_no_skip;
62510d63b7dSRichard Lowe 		}
62610d63b7dSRichard Lowe 		/*
62710d63b7dSRichard Lowe 		 * Expand the value and push the Source on the stack of
62810d63b7dSRichard Lowe 		 * things being read.
62910d63b7dSRichard Lowe 		 */
63010d63b7dSRichard Lowe 		source_p++;
63110d63b7dSRichard Lowe 		UNCACHE_SOURCE();
63210d63b7dSRichard Lowe 		{
63310d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
63410d63b7dSRichard Lowe 			source = push_macro_value(t,
63510d63b7dSRichard Lowe 						  buffer,
63610d63b7dSRichard Lowe 						  sizeof buffer,
63710d63b7dSRichard Lowe 						  source);
63810d63b7dSRichard Lowe 		}
63910d63b7dSRichard Lowe 		CACHE_SOURCE(1);
64010d63b7dSRichard Lowe 		break;
64110d63b7dSRichard Lowe 	default:
64210d63b7dSRichard Lowe 		/* We found the first proper char on the new line */
64310d63b7dSRichard Lowe 		goto start_new_line_no_skip;
64410d63b7dSRichard Lowe 	}
64510d63b7dSRichard Lowe 
64610d63b7dSRichard Lowe 	/*
64710d63b7dSRichard Lowe 	 * We found the first normal char (one that starts an identifier)
64810d63b7dSRichard Lowe 	 * on the newline.
64910d63b7dSRichard Lowe 	 */
65010d63b7dSRichard Lowe start_new_line_no_skip:
65110d63b7dSRichard Lowe 	/* Inspect that first char to see if it maybe is special anyway */
65210d63b7dSRichard Lowe 	switch (GET_CHAR()) {
65310d63b7dSRichard Lowe 	case nul_char:
65410d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
65510d63b7dSRichard Lowe 		if (source == NULL) {
65610d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
65710d63b7dSRichard Lowe 		}
65810d63b7dSRichard Lowe 		goto start_new_line_no_skip;
65910d63b7dSRichard Lowe 	case newline_char:
66010d63b7dSRichard Lowe 		/* Just in case */
66110d63b7dSRichard Lowe 		goto start_new_line;
66210d63b7dSRichard Lowe 	case exclam_char:
66310d63b7dSRichard Lowe 		/* Evaluate the line before it is read */
66410d63b7dSRichard Lowe 		string_start = source_p + 1;
66510d63b7dSRichard Lowe 		macro_seen_in_string = false;
66610d63b7dSRichard Lowe 		/* Stuff the line in a string so we can eval it. */
66710d63b7dSRichard Lowe 		for (; 1; source_p++) {
66810d63b7dSRichard Lowe 			switch (GET_CHAR()) {
66910d63b7dSRichard Lowe 			case newline_char:
67010d63b7dSRichard Lowe 				goto eoln_1;
67110d63b7dSRichard Lowe 			case nul_char:
67210d63b7dSRichard Lowe 				if (source->fd > 0) {
67310d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
67410d63b7dSRichard Lowe 						macro_seen_in_string = true;
67510d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(
67610d63b7dSRichard Lowe 						      name_string, name_buffer);
67710d63b7dSRichard Lowe 					}
67810d63b7dSRichard Lowe 					append_string(string_start,
67910d63b7dSRichard Lowe 						      &name_string,
68010d63b7dSRichard Lowe 						      source_p - string_start);
68110d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
68210d63b7dSRichard Lowe 					string_start = source_p;
68310d63b7dSRichard Lowe 					source_p--;
68410d63b7dSRichard Lowe 					break;
68510d63b7dSRichard Lowe 				}
68610d63b7dSRichard Lowe 			eoln_1:
68710d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
68810d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
68910d63b7dSRichard Lowe 							       name_buffer);
69010d63b7dSRichard Lowe 				}
69110d63b7dSRichard Lowe 				append_string(string_start,
69210d63b7dSRichard Lowe 					      &name_string,
69310d63b7dSRichard Lowe 					      source_p - string_start);
69410d63b7dSRichard Lowe 				extrap = (Source)
69510d63b7dSRichard Lowe 				  alloca((int) sizeof (Source_rec));
69610d63b7dSRichard Lowe 				extrap->string.buffer.start = NULL;
69710d63b7dSRichard Lowe 				extrap->inp_buf =
69810d63b7dSRichard Lowe 				  extrap->inp_buf_ptr =
69910d63b7dSRichard Lowe 				    extrap->inp_buf_end = NULL;
70010d63b7dSRichard Lowe 				extrap->error_converting = false;
70110d63b7dSRichard Lowe 				if (*source_p == (int) nul_char) {
70210d63b7dSRichard Lowe 					source_p++;
70310d63b7dSRichard Lowe 				}
70410d63b7dSRichard Lowe 				/* Eval the macro */
70510d63b7dSRichard Lowe 				expand_value(GETNAME(name_string.buffer.start,
70610d63b7dSRichard Lowe 						     FIND_LENGTH),
70710d63b7dSRichard Lowe 					     &extrap->string,
70810d63b7dSRichard Lowe 					     false);
70910d63b7dSRichard Lowe 				if (name_string.free_after_use) {
71010d63b7dSRichard Lowe 					retmem(name_string.buffer.start);
71110d63b7dSRichard Lowe 				}
71210d63b7dSRichard Lowe 				UNCACHE_SOURCE();
71310d63b7dSRichard Lowe 				extrap->string.text.p =
71410d63b7dSRichard Lowe 				  extrap->string.buffer.start;
71510d63b7dSRichard Lowe 				extrap->fd = -1;
71610d63b7dSRichard Lowe 				/* And push the value */
71710d63b7dSRichard Lowe 				extrap->previous = source;
71810d63b7dSRichard Lowe 				source = extrap;
71910d63b7dSRichard Lowe 				CACHE_SOURCE(0);
72010d63b7dSRichard Lowe 				goto line_evald;
72110d63b7dSRichard Lowe 			}
72210d63b7dSRichard Lowe 		}
72310d63b7dSRichard Lowe 	default:
72410d63b7dSRichard Lowe 		goto line_evald;
72510d63b7dSRichard Lowe 	}
72610d63b7dSRichard Lowe 
72710d63b7dSRichard Lowe 	/* We now have a line we can start reading */
72810d63b7dSRichard Lowe  line_evald:
72910d63b7dSRichard Lowe 	if (source == NULL) {
73010d63b7dSRichard Lowe 		GOTO_STATE(exit_state);
73110d63b7dSRichard Lowe 	}
73210d63b7dSRichard Lowe 	/* Check if this is an include command */
73310d63b7dSRichard Lowe 	if ((makefile_type == reading_makefile) &&
73410d63b7dSRichard Lowe 	    !source->already_expanded) {
73510d63b7dSRichard Lowe 	    if (include_space[0] == (int) nul_char) {
73610d63b7dSRichard Lowe 		MBSTOWCS(include_space, "include ");
73710d63b7dSRichard Lowe 		MBSTOWCS(include_tab, "include\t");
73810d63b7dSRichard Lowe 	    }
73910d63b7dSRichard Lowe 	    if ((IS_WEQUALN(source_p, include_space, 8)) ||
74010d63b7dSRichard Lowe 		(IS_WEQUALN(source_p, include_tab, 8))) {
74110d63b7dSRichard Lowe 		source_p += 7;
74210d63b7dSRichard Lowe 		if (iswspace(*source_p)) {
74310d63b7dSRichard Lowe 			Makefile_type save_makefile_type;
74410d63b7dSRichard Lowe 			wchar_t		*name_start;
74510d63b7dSRichard Lowe 			int		name_length;
74610d63b7dSRichard Lowe 
74710d63b7dSRichard Lowe 			/*
74810d63b7dSRichard Lowe 			 * Yes, this is an include.
74910d63b7dSRichard Lowe 			 * Skip spaces to get to the filename.
75010d63b7dSRichard Lowe 			 */
75110d63b7dSRichard Lowe 			while (iswspace(*source_p) ||
75210d63b7dSRichard Lowe 			       (*source_p == (int) nul_char)) {
75310d63b7dSRichard Lowe 				switch (GET_CHAR()) {
75410d63b7dSRichard Lowe 				case nul_char:
75510d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
75610d63b7dSRichard Lowe 					if (source == NULL) {
75710d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
75810d63b7dSRichard Lowe 					}
75910d63b7dSRichard Lowe 					break;
76010d63b7dSRichard Lowe 
76110d63b7dSRichard Lowe 				default:
76210d63b7dSRichard Lowe 					source_p++;
76310d63b7dSRichard Lowe 					break;
76410d63b7dSRichard Lowe 				}
76510d63b7dSRichard Lowe 			}
76610d63b7dSRichard Lowe 
76710d63b7dSRichard Lowe 			string_start = source_p;
76810d63b7dSRichard Lowe 			/* Find the end of the filename */
76910d63b7dSRichard Lowe 			macro_seen_in_string = false;
77010d63b7dSRichard Lowe 			while (!iswspace(*source_p) ||
77110d63b7dSRichard Lowe 			       (*source_p == (int) nul_char)) {
77210d63b7dSRichard Lowe 				switch (GET_CHAR()) {
77310d63b7dSRichard Lowe 				case nul_char:
77410d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
77510d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
77610d63b7dSRichard Lowe 								       name_buffer);
77710d63b7dSRichard Lowe 					}
77810d63b7dSRichard Lowe 					append_string(string_start,
77910d63b7dSRichard Lowe 						      &name_string,
78010d63b7dSRichard Lowe 						      source_p - string_start);
78110d63b7dSRichard Lowe 					macro_seen_in_string = true;
78210d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
78310d63b7dSRichard Lowe 					string_start = source_p;
78410d63b7dSRichard Lowe 					if (source == NULL) {
78510d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
78610d63b7dSRichard Lowe 					}
78710d63b7dSRichard Lowe 					break;
78810d63b7dSRichard Lowe 
78910d63b7dSRichard Lowe 				default:
79010d63b7dSRichard Lowe 					source_p++;
79110d63b7dSRichard Lowe 					break;
79210d63b7dSRichard Lowe 				}
79310d63b7dSRichard Lowe 			}
79410d63b7dSRichard Lowe 
79510d63b7dSRichard Lowe 			source->string.text.p = source_p;
79610d63b7dSRichard Lowe 			if (macro_seen_in_string) {
79710d63b7dSRichard Lowe 				append_string(string_start,
79810d63b7dSRichard Lowe 					      &name_string,
79910d63b7dSRichard Lowe 					      source_p - string_start);
80010d63b7dSRichard Lowe 				name_start = name_string.buffer.start;
80110d63b7dSRichard Lowe 				name_length = name_string.text.p - name_start;
80210d63b7dSRichard Lowe 			} else {
80310d63b7dSRichard Lowe 				name_start = string_start;
80410d63b7dSRichard Lowe 				name_length = source_p - string_start;
80510d63b7dSRichard Lowe 			}
80610d63b7dSRichard Lowe 
80710d63b7dSRichard Lowe 			/* Strip "./" from the head of the name */
80810d63b7dSRichard Lowe 			if ((name_start[0] == (int) period_char) &&
809*ae389aa9SAndy Fiddaman 			   (name_start[1] == (int) slash_char)) {
81010d63b7dSRichard Lowe 				name_start += 2;
81110d63b7dSRichard Lowe 				name_length -= 2;
81210d63b7dSRichard Lowe 			}
81310d63b7dSRichard Lowe 			/* if include file name is surrounded by double quotes */
81410d63b7dSRichard Lowe 			if ((name_start[0] == (int) doublequote_char) &&
81510d63b7dSRichard Lowe 			    (name_start[name_length - 1] == (int) doublequote_char)) {
816*ae389aa9SAndy Fiddaman 				name_start += 1;
817*ae389aa9SAndy Fiddaman 				name_length -= 2;
81810d63b7dSRichard Lowe 
819*ae389aa9SAndy Fiddaman 				/* if name does not begin with a slash char */
820*ae389aa9SAndy Fiddaman 				if (name_start[0] != (int) slash_char) {
82110d63b7dSRichard Lowe 					if ((name_start[0] == (int) period_char) &&
82210d63b7dSRichard Lowe 					    (name_start[1] == (int) slash_char)) {
82310d63b7dSRichard Lowe 						name_start += 2;
82410d63b7dSRichard Lowe 						name_length -= 2;
82510d63b7dSRichard Lowe 					}
82610d63b7dSRichard Lowe 
82710d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(include_name, include_buffer);
82810d63b7dSRichard Lowe 					APPEND_NAME(true_makefile_name,
82910d63b7dSRichard Lowe 						      &include_name,
83010d63b7dSRichard Lowe 						      true_makefile_name->hash.length);
83110d63b7dSRichard Lowe 
83210d63b7dSRichard Lowe 					wchar_t *slash = wcsrchr(include_name.buffer.start, (int) slash_char);
83310d63b7dSRichard Lowe 					if (slash != NULL) {
83410d63b7dSRichard Lowe 						include_name.text.p = slash + 1;
83510d63b7dSRichard Lowe 						append_string(name_start,
83610d63b7dSRichard Lowe 							      &include_name,
83710d63b7dSRichard Lowe 							      name_length);
83810d63b7dSRichard Lowe 
83910d63b7dSRichard Lowe 						name_start = include_name.buffer.start;
840*ae389aa9SAndy Fiddaman 						name_length = include_name.text.p - name_start;
84110d63b7dSRichard Lowe 					}
84210d63b7dSRichard Lowe 				}
84310d63b7dSRichard Lowe 			}
84410d63b7dSRichard Lowe 
84510d63b7dSRichard Lowe 			/* Even when we run -n we want to create makefiles */
84610d63b7dSRichard Lowe 			do_not_exec_rule = false;
84710d63b7dSRichard Lowe 			makefile_name = GETNAME(name_start, name_length);
84810d63b7dSRichard Lowe 			if (makefile_name->dollar) {
84910d63b7dSRichard Lowe 				String_rec	destination;
85010d63b7dSRichard Lowe 				wchar_t		buffer[STRING_BUFFER_LENGTH];
85110d63b7dSRichard Lowe 				wchar_t		*p;
85210d63b7dSRichard Lowe 				wchar_t		*q;
85310d63b7dSRichard Lowe 
85410d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(destination, buffer);
85510d63b7dSRichard Lowe 				expand_value(makefile_name,
85610d63b7dSRichard Lowe 					     &destination,
85710d63b7dSRichard Lowe 					     false);
85810d63b7dSRichard Lowe 				for (p = destination.buffer.start;
85910d63b7dSRichard Lowe 				     (*p != (int) nul_char) && iswspace(*p);
86010d63b7dSRichard Lowe 				     p++);
86110d63b7dSRichard Lowe 				for (q = p;
86210d63b7dSRichard Lowe 				     (*q != (int) nul_char) && !iswspace(*q);
86310d63b7dSRichard Lowe 				     q++);
86410d63b7dSRichard Lowe 				makefile_name = GETNAME(p, q-p);
86510d63b7dSRichard Lowe 				if (destination.free_after_use) {
86610d63b7dSRichard Lowe 					retmem(destination.buffer.start);
86710d63b7dSRichard Lowe 				}
86810d63b7dSRichard Lowe 			}
86910d63b7dSRichard Lowe 			source_p++;
87010d63b7dSRichard Lowe 			UNCACHE_SOURCE();
87110d63b7dSRichard Lowe 			/* Read the file */
87210d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
87310d63b7dSRichard Lowe 			if (read_simple_file(makefile_name,
87410d63b7dSRichard Lowe 					     true,
87510d63b7dSRichard Lowe 					     true,
87610d63b7dSRichard Lowe 					     true,
87710d63b7dSRichard Lowe 					     false,
87810d63b7dSRichard Lowe 					     true,
87910d63b7dSRichard Lowe 					     false) == failed) {
88010d63b7dSRichard Lowe 				fatal_reader(gettext("Read of include file `%s' failed"),
88110d63b7dSRichard Lowe 					     makefile_name->string_mb);
88210d63b7dSRichard Lowe 			}
88310d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
88410d63b7dSRichard Lowe 			do_not_exec_rule = save_do_not_exec_rule;
88510d63b7dSRichard Lowe 			CACHE_SOURCE(0);
88610d63b7dSRichard Lowe 			goto start_new_line;
88710d63b7dSRichard Lowe 		} else {
88810d63b7dSRichard Lowe 			source_p -= 7;
88910d63b7dSRichard Lowe 		}
89010d63b7dSRichard Lowe 	    } else {
89110d63b7dSRichard Lowe 		/* Check if the word include was split across 8K boundary. */
892*ae389aa9SAndy Fiddaman 
89310d63b7dSRichard Lowe 		tmp_bytes_left_in_string = source->string.text.end - source_p;
89410d63b7dSRichard Lowe 		if (tmp_bytes_left_in_string < 8) {
89510d63b7dSRichard Lowe 			tmp_maybe_include = false;
89610d63b7dSRichard Lowe 			if (IS_WEQUALN(source_p,
89710d63b7dSRichard Lowe 				       include_space,
89810d63b7dSRichard Lowe 				       tmp_bytes_left_in_string)) {
89910d63b7dSRichard Lowe 				tmp_maybe_include = true;
90010d63b7dSRichard Lowe 			}
90110d63b7dSRichard Lowe 			if (tmp_maybe_include) {
90210d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
90310d63b7dSRichard Lowe 				tmp_maybe_include = false;
90410d63b7dSRichard Lowe 				goto line_evald;
90510d63b7dSRichard Lowe 			}
90610d63b7dSRichard Lowe 		}
90710d63b7dSRichard Lowe 	    }
90810d63b7dSRichard Lowe 	}
90910d63b7dSRichard Lowe 
91010d63b7dSRichard Lowe 	/* Reset the status in preparation for the new line */
91110d63b7dSRichard Lowe 	for (nvp = &target; nvp != NULL; nvp = nvp->next) {
91210d63b7dSRichard Lowe 		nvp->used = 0;
91310d63b7dSRichard Lowe 	}
91410d63b7dSRichard Lowe 	for (nvp = &depes; nvp != NULL; nvp = nvp->next) {
91510d63b7dSRichard Lowe 		nvp->used = 0;
91610d63b7dSRichard Lowe 	}
91710d63b7dSRichard Lowe 	target_group_seen = false;
91810d63b7dSRichard Lowe 	command = command_tail = NULL;
91910d63b7dSRichard Lowe 	macro_value = NULL;
92010d63b7dSRichard Lowe 	append = false;
92110d63b7dSRichard Lowe 	current_names = &target;
92210d63b7dSRichard Lowe 	SET_STATE(scan_name_state);
92310d63b7dSRichard Lowe 	on_eoln_state = illegal_eoln_state;
92410d63b7dSRichard Lowe 	separator = none_seen;
92510d63b7dSRichard Lowe 
92610d63b7dSRichard Lowe 	/* The state machine starts here */
92710d63b7dSRichard Lowe  enter_state:
92810d63b7dSRichard Lowe 	while (1) switch (state) {
92910d63b7dSRichard Lowe 
93010d63b7dSRichard Lowe /****************************************************************
93110d63b7dSRichard Lowe  *	Scan name state
93210d63b7dSRichard Lowe  */
93310d63b7dSRichard Lowe case scan_name_state:
93410d63b7dSRichard Lowe 	/* Scan an identifier. We skip over chars until we find a break char */
93510d63b7dSRichard Lowe 	/* First skip white space. */
93610d63b7dSRichard Lowe 	for (; 1; source_p++) switch (GET_CHAR()) {
93710d63b7dSRichard Lowe 	case nul_char:
93810d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
93910d63b7dSRichard Lowe 		source_p--;
94010d63b7dSRichard Lowe 		if (source == NULL) {
94110d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
94210d63b7dSRichard Lowe 		}
94310d63b7dSRichard Lowe 		break;
94410d63b7dSRichard Lowe 	case newline_char:
94510d63b7dSRichard Lowe 		/* We found the end of the line. */
94610d63b7dSRichard Lowe 		/* Do postprocessing or return error */
94710d63b7dSRichard Lowe 		source_p++;
94810d63b7dSRichard Lowe 		if (source->fd >= 0) {
94910d63b7dSRichard Lowe 			line_number++;
95010d63b7dSRichard Lowe 		}
95110d63b7dSRichard Lowe 		GOTO_STATE(on_eoln_state);
95210d63b7dSRichard Lowe 	case backslash_char:
95310d63b7dSRichard Lowe 		/* Continuation */
95410d63b7dSRichard Lowe 		if (*++source_p == (int) nul_char) {
95510d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
95610d63b7dSRichard Lowe 			if (source == NULL) {
95710d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
95810d63b7dSRichard Lowe 			}
95910d63b7dSRichard Lowe 		}
96010d63b7dSRichard Lowe 		if (*source_p == (int) newline_char) {
96110d63b7dSRichard Lowe 			if (source->fd >= 0) {
96210d63b7dSRichard Lowe 				line_number++;
96310d63b7dSRichard Lowe 			}
96410d63b7dSRichard Lowe 		} else {
96510d63b7dSRichard Lowe 			source_p--;
96610d63b7dSRichard Lowe 		}
96710d63b7dSRichard Lowe 		break;
96810d63b7dSRichard Lowe 	case tab_char:
96910d63b7dSRichard Lowe 	case space_char:
97010d63b7dSRichard Lowe 		/* Whitespace is skipped */
97110d63b7dSRichard Lowe 		break;
97210d63b7dSRichard Lowe 	case numbersign_char:
97310d63b7dSRichard Lowe 		/* Comment. Skip over it */
97410d63b7dSRichard Lowe 		for (; 1; source_p++) {
97510d63b7dSRichard Lowe 			switch (GET_CHAR()) {
97610d63b7dSRichard Lowe 			case nul_char:
97710d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
97810d63b7dSRichard Lowe 				if (source == NULL) {
97910d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
98010d63b7dSRichard Lowe 				}
98110d63b7dSRichard Lowe 				if (source->error_converting) {
98210d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
98310d63b7dSRichard Lowe 					source->inp_buf_ptr++;
98410d63b7dSRichard Lowe 				}
98510d63b7dSRichard Lowe 				source_p--;
98610d63b7dSRichard Lowe 				break;
98710d63b7dSRichard Lowe 			case backslash_char:
98810d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
98910d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
99010d63b7dSRichard Lowe 					if (source == NULL) {
99110d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
99210d63b7dSRichard Lowe 					}
99310d63b7dSRichard Lowe 					if (source->error_converting) {
99410d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
99510d63b7dSRichard Lowe 						source->inp_buf_ptr++;
99610d63b7dSRichard Lowe 						source_p--;
99710d63b7dSRichard Lowe 						break;
99810d63b7dSRichard Lowe 					}
99910d63b7dSRichard Lowe 				}
100010d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
100110d63b7dSRichard Lowe 					if (source->fd >= 0) {
100210d63b7dSRichard Lowe 						line_number++;
100310d63b7dSRichard Lowe 					}
100410d63b7dSRichard Lowe 				}
100510d63b7dSRichard Lowe 				break;
100610d63b7dSRichard Lowe 			case newline_char:
100710d63b7dSRichard Lowe 				source_p++;
100810d63b7dSRichard Lowe 				if (source->fd >= 0) {
100910d63b7dSRichard Lowe 					line_number++;
101010d63b7dSRichard Lowe 				}
101110d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
101210d63b7dSRichard Lowe 			}
101310d63b7dSRichard Lowe 		}
101410d63b7dSRichard Lowe 	case dollar_char:
101510d63b7dSRichard Lowe 		/* Macro reference. Expand and push value */
101610d63b7dSRichard Lowe 		if (source->already_expanded) {
101710d63b7dSRichard Lowe 			goto scan_name;
101810d63b7dSRichard Lowe 		}
101910d63b7dSRichard Lowe 		source_p++;
102010d63b7dSRichard Lowe 		UNCACHE_SOURCE();
102110d63b7dSRichard Lowe 		{
102210d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
102310d63b7dSRichard Lowe 			source = push_macro_value(t,
102410d63b7dSRichard Lowe 						  buffer,
102510d63b7dSRichard Lowe 						  sizeof buffer,
102610d63b7dSRichard Lowe 						  source);
102710d63b7dSRichard Lowe 		}
102810d63b7dSRichard Lowe 		CACHE_SOURCE(1);
102910d63b7dSRichard Lowe 		break;
103010d63b7dSRichard Lowe 	default:
103110d63b7dSRichard Lowe 		/* End of white space */
103210d63b7dSRichard Lowe 		goto scan_name;
103310d63b7dSRichard Lowe 	}
103410d63b7dSRichard Lowe 
103510d63b7dSRichard Lowe 	/* First proper identifier character */
103610d63b7dSRichard Lowe  scan_name:
103710d63b7dSRichard Lowe 
103810d63b7dSRichard Lowe 	string_start = source_p;
103910d63b7dSRichard Lowe 	paren_count = brace_count = 0;
104010d63b7dSRichard Lowe 	macro_seen_in_string = false;
104110d63b7dSRichard Lowe 	resume_name_scan:
104210d63b7dSRichard Lowe 	for (; 1; source_p++) {
104310d63b7dSRichard Lowe 		switch (GET_CHAR()) {
104410d63b7dSRichard Lowe 		case nul_char:
104510d63b7dSRichard Lowe 			/* Save what we have seen so far of the identifier */
104610d63b7dSRichard Lowe 			if (source_p != string_start) {
104710d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
104810d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
104910d63b7dSRichard Lowe 							       name_buffer);
105010d63b7dSRichard Lowe 				}
105110d63b7dSRichard Lowe 				append_string(string_start,
105210d63b7dSRichard Lowe 					      &name_string,
105310d63b7dSRichard Lowe 					      source_p - string_start);
105410d63b7dSRichard Lowe 				macro_seen_in_string = true;
105510d63b7dSRichard Lowe 			}
105610d63b7dSRichard Lowe 			/* Get more text to read */
105710d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
105810d63b7dSRichard Lowe 			string_start = source_p;
105910d63b7dSRichard Lowe 			source_p--;
106010d63b7dSRichard Lowe 			if (source == NULL) {
106110d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
106210d63b7dSRichard Lowe 			}
106310d63b7dSRichard Lowe 			break;
106410d63b7dSRichard Lowe 		case newline_char:
106510d63b7dSRichard Lowe 			if (paren_count > 0) {
106610d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `(' on line"));
106710d63b7dSRichard Lowe 			}
106810d63b7dSRichard Lowe 			if (brace_count > 0) {
106910d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `{' on line"));
107010d63b7dSRichard Lowe 			}
107110d63b7dSRichard Lowe 			source_p++;
107210d63b7dSRichard Lowe 			/* Enter name */
107310d63b7dSRichard Lowe 			current_names = enter_name(&name_string,
107410d63b7dSRichard Lowe 						   macro_seen_in_string,
107510d63b7dSRichard Lowe 						   string_start,
107610d63b7dSRichard Lowe 						   source_p - 1,
107710d63b7dSRichard Lowe 						   current_names,
107810d63b7dSRichard Lowe 						   &extra_names,
107910d63b7dSRichard Lowe 						   &target_group_seen);
108010d63b7dSRichard Lowe 			first_target = false;
108110d63b7dSRichard Lowe 			if (extra_names == NULL) {
108210d63b7dSRichard Lowe 				extra_names = (Name_vector)
108310d63b7dSRichard Lowe 				  alloca((int) sizeof (Name_vector_rec));
108410d63b7dSRichard Lowe 			}
108510d63b7dSRichard Lowe 			/* Do postprocessing or return error */
108610d63b7dSRichard Lowe 			if (source->fd >= 0) {
108710d63b7dSRichard Lowe 				line_number++;
108810d63b7dSRichard Lowe 			}
108910d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
109010d63b7dSRichard Lowe 		case backslash_char:
109110d63b7dSRichard Lowe 			/* Check if this is a quoting backslash */
109210d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
109310d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
109410d63b7dSRichard Lowe 						       name_buffer);
109510d63b7dSRichard Lowe 				macro_seen_in_string = true;
109610d63b7dSRichard Lowe 			}
109710d63b7dSRichard Lowe 			append_string(string_start,
109810d63b7dSRichard Lowe 				      &name_string,
109910d63b7dSRichard Lowe 				      source_p - string_start);
110010d63b7dSRichard Lowe 			if (*++source_p == (int) nul_char) {
110110d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
110210d63b7dSRichard Lowe 				if (source == NULL) {
110310d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
110410d63b7dSRichard Lowe 				}
110510d63b7dSRichard Lowe 			}
110610d63b7dSRichard Lowe 			if (*source_p == (int) newline_char) {
110710d63b7dSRichard Lowe 				if (source->fd >= 0) {
110810d63b7dSRichard Lowe 					line_number++;
110910d63b7dSRichard Lowe 				}
111010d63b7dSRichard Lowe 				*source_p = (int) space_char;
111110d63b7dSRichard Lowe 				string_start = source_p;
111210d63b7dSRichard Lowe 				goto resume_name_scan;
111310d63b7dSRichard Lowe 			} else {
111410d63b7dSRichard Lowe 				string_start = source_p;
111510d63b7dSRichard Lowe 				break;
111610d63b7dSRichard Lowe 			}
111710d63b7dSRichard Lowe 			break;
111810d63b7dSRichard Lowe 		case numbersign_char:
111910d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
112010d63b7dSRichard Lowe 				break;
112110d63b7dSRichard Lowe 			}
112210d63b7dSRichard Lowe 			fatal_reader(gettext("Unexpected comment seen"));
112310d63b7dSRichard Lowe 		case dollar_char:
112410d63b7dSRichard Lowe 			if (source->already_expanded) {
112510d63b7dSRichard Lowe 				break;
112610d63b7dSRichard Lowe 			}
112710d63b7dSRichard Lowe 			/* Save the identifier so far */
112810d63b7dSRichard Lowe 			if (source_p != string_start) {
112910d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
113010d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
113110d63b7dSRichard Lowe 							       name_buffer);
113210d63b7dSRichard Lowe 				}
113310d63b7dSRichard Lowe 				append_string(string_start,
113410d63b7dSRichard Lowe 					      &name_string,
113510d63b7dSRichard Lowe 					      source_p - string_start);
113610d63b7dSRichard Lowe 				macro_seen_in_string = true;
113710d63b7dSRichard Lowe 			}
113810d63b7dSRichard Lowe 			/* Eval and push the macro */
113910d63b7dSRichard Lowe 			source_p++;
114010d63b7dSRichard Lowe 			UNCACHE_SOURCE();
114110d63b7dSRichard Lowe 			{
114210d63b7dSRichard Lowe 				Source t =
114310d63b7dSRichard Lowe 				  (Source) alloca((int) sizeof (Source_rec));
114410d63b7dSRichard Lowe 				source = push_macro_value(t,
114510d63b7dSRichard Lowe 							  buffer,
114610d63b7dSRichard Lowe 							  sizeof buffer,
114710d63b7dSRichard Lowe 							  source);
114810d63b7dSRichard Lowe 			}
114910d63b7dSRichard Lowe 			CACHE_SOURCE(1);
115010d63b7dSRichard Lowe 			string_start = source_p + 1;
115110d63b7dSRichard Lowe 			break;
115210d63b7dSRichard Lowe 		case parenleft_char:
115310d63b7dSRichard Lowe 			paren_count++;
115410d63b7dSRichard Lowe 			break;
115510d63b7dSRichard Lowe 		case parenright_char:
115610d63b7dSRichard Lowe 			if (--paren_count < 0) {
115710d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `)' on line"));
115810d63b7dSRichard Lowe 			}
115910d63b7dSRichard Lowe 			break;
116010d63b7dSRichard Lowe 		case braceleft_char:
116110d63b7dSRichard Lowe 			brace_count++;
116210d63b7dSRichard Lowe 			break;
116310d63b7dSRichard Lowe 		case braceright_char:
116410d63b7dSRichard Lowe 			if (--brace_count < 0) {
116510d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `}' on line"));
116610d63b7dSRichard Lowe 			}
116710d63b7dSRichard Lowe 			break;
116810d63b7dSRichard Lowe 		case ampersand_char:
116910d63b7dSRichard Lowe 		case greater_char:
117010d63b7dSRichard Lowe 		case bar_char:
117110d63b7dSRichard Lowe 			if (paren_count + brace_count == 0) {
117210d63b7dSRichard Lowe 				source_p++;
117310d63b7dSRichard Lowe 			}
11748e0c8248SAndrew Stormont 			/* FALLTHROUGH */
117510d63b7dSRichard Lowe 		case tab_char:
117610d63b7dSRichard Lowe 		case space_char:
117710d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
117810d63b7dSRichard Lowe 				break;
117910d63b7dSRichard Lowe 			}
118010d63b7dSRichard Lowe 			current_names = enter_name(&name_string,
118110d63b7dSRichard Lowe 						   macro_seen_in_string,
118210d63b7dSRichard Lowe 						   string_start,
118310d63b7dSRichard Lowe 						   source_p,
118410d63b7dSRichard Lowe 						   current_names,
118510d63b7dSRichard Lowe 						   &extra_names,
118610d63b7dSRichard Lowe 						   &target_group_seen);
118710d63b7dSRichard Lowe 			first_target = false;
118810d63b7dSRichard Lowe 			if (extra_names == NULL) {
118910d63b7dSRichard Lowe 				extra_names = (Name_vector)
119010d63b7dSRichard Lowe 				  alloca((int) sizeof (Name_vector_rec));
119110d63b7dSRichard Lowe 			}
119210d63b7dSRichard Lowe 			goto enter_state;
119310d63b7dSRichard Lowe 		case colon_char:
119410d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
119510d63b7dSRichard Lowe 				break;
119610d63b7dSRichard Lowe 			}
119710d63b7dSRichard Lowe 			if (separator == conditional_seen) {
119810d63b7dSRichard Lowe 				break;
119910d63b7dSRichard Lowe 			}
120010d63b7dSRichard Lowe /** POSIX **/
120110d63b7dSRichard Lowe #if 0
120210d63b7dSRichard Lowe 			if(posix) {
120310d63b7dSRichard Lowe 			  emptycount = 0;
120410d63b7dSRichard Lowe 			}
120510d63b7dSRichard Lowe #endif
120610d63b7dSRichard Lowe /** END POSIX **/
120710d63b7dSRichard Lowe 			/* End of the target list. We now start reading */
120810d63b7dSRichard Lowe 			/* dependencies or a conditional assignment */
120910d63b7dSRichard Lowe 			if (separator != none_seen) {
121010d63b7dSRichard Lowe 				fatal_reader(gettext("Extra `:', `::', or `:=' on dependency line"));
121110d63b7dSRichard Lowe 			}
121210d63b7dSRichard Lowe 			/* Enter the last target */
121310d63b7dSRichard Lowe 			if ((string_start != source_p) ||
121410d63b7dSRichard Lowe 			    macro_seen_in_string) {
121510d63b7dSRichard Lowe 				current_names =
121610d63b7dSRichard Lowe 				  enter_name(&name_string,
121710d63b7dSRichard Lowe 					     macro_seen_in_string,
121810d63b7dSRichard Lowe 					     string_start,
121910d63b7dSRichard Lowe 					     source_p,
122010d63b7dSRichard Lowe 					     current_names,
122110d63b7dSRichard Lowe 					     &extra_names,
122210d63b7dSRichard Lowe 					     &target_group_seen);
122310d63b7dSRichard Lowe 				first_target = false;
122410d63b7dSRichard Lowe 				if (extra_names == NULL) {
122510d63b7dSRichard Lowe 					extra_names = (Name_vector)
122610d63b7dSRichard Lowe 					  alloca((int)
122710d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
122810d63b7dSRichard Lowe 				}
122910d63b7dSRichard Lowe 			}
123010d63b7dSRichard Lowe 			/* Check if it is ":" "::" or ":=" */
123110d63b7dSRichard Lowe 		scan_colon_label:
123210d63b7dSRichard Lowe 			switch (*++source_p) {
123310d63b7dSRichard Lowe 			case nul_char:
123410d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
123510d63b7dSRichard Lowe 				source_p--;
123610d63b7dSRichard Lowe 				if (source == NULL) {
123710d63b7dSRichard Lowe 					GOTO_STATE(enter_dependencies_state);
123810d63b7dSRichard Lowe 				}
123910d63b7dSRichard Lowe 				goto scan_colon_label;
124010d63b7dSRichard Lowe 			case equal_char:
124110d63b7dSRichard Lowe 				if(svr4) {
124210d63b7dSRichard Lowe 				  fatal_reader(gettext("syntax error"));
124310d63b7dSRichard Lowe 				}
124410d63b7dSRichard Lowe 				separator = conditional_seen;
124510d63b7dSRichard Lowe 				source_p++;
124610d63b7dSRichard Lowe 				current_names = &depes;
124710d63b7dSRichard Lowe 				GOTO_STATE(scan_name_state);
124810d63b7dSRichard Lowe 			case colon_char:
124910d63b7dSRichard Lowe 				separator = two_colon;
125010d63b7dSRichard Lowe 				source_p++;
125110d63b7dSRichard Lowe 				break;
125210d63b7dSRichard Lowe 			default:
125310d63b7dSRichard Lowe 				separator = one_colon;
125410d63b7dSRichard Lowe 			}
125510d63b7dSRichard Lowe 			current_names = &depes;
125610d63b7dSRichard Lowe 			on_eoln_state = enter_dependencies_state;
125710d63b7dSRichard Lowe 			GOTO_STATE(scan_name_state);
125810d63b7dSRichard Lowe 		case semicolon_char:
125910d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
126010d63b7dSRichard Lowe 				break;
126110d63b7dSRichard Lowe 			}
126210d63b7dSRichard Lowe 			/* End of reading names. Start reading the rule */
126310d63b7dSRichard Lowe 			if ((separator != one_colon) &&
126410d63b7dSRichard Lowe 			    (separator != two_colon)) {
126510d63b7dSRichard Lowe 				fatal_reader(gettext("Unexpected command seen"));
126610d63b7dSRichard Lowe 			}
126710d63b7dSRichard Lowe 			/* Enter the last dependency */
126810d63b7dSRichard Lowe 			if ((string_start != source_p) ||
126910d63b7dSRichard Lowe 			    macro_seen_in_string) {
127010d63b7dSRichard Lowe 				current_names =
127110d63b7dSRichard Lowe 				  enter_name(&name_string,
127210d63b7dSRichard Lowe 					     macro_seen_in_string,
127310d63b7dSRichard Lowe 					     string_start,
127410d63b7dSRichard Lowe 					     source_p,
127510d63b7dSRichard Lowe 					     current_names,
127610d63b7dSRichard Lowe 					     &extra_names,
127710d63b7dSRichard Lowe 					     &target_group_seen);
127810d63b7dSRichard Lowe 				first_target = false;
127910d63b7dSRichard Lowe 				if (extra_names == NULL) {
128010d63b7dSRichard Lowe 					extra_names = (Name_vector)
128110d63b7dSRichard Lowe 					  alloca((int)
128210d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
128310d63b7dSRichard Lowe 				}
128410d63b7dSRichard Lowe 			}
128510d63b7dSRichard Lowe 			source_p++;
128610d63b7dSRichard Lowe 			/* Make sure to enter a rule even if the is */
128710d63b7dSRichard Lowe 			/* no text here */
128810d63b7dSRichard Lowe 			command = command_tail = ALLOC(Cmd_line);
128910d63b7dSRichard Lowe 			command->next = NULL;
129010d63b7dSRichard Lowe 			command->command_line = empty_name;
129110d63b7dSRichard Lowe 			command->make_refd = false;
129210d63b7dSRichard Lowe 			command->ignore_command_dependency = false;
129310d63b7dSRichard Lowe 			command->assign = false;
129410d63b7dSRichard Lowe 			command->ignore_error = false;
129510d63b7dSRichard Lowe 			command->silent = false;
129610d63b7dSRichard Lowe 
129710d63b7dSRichard Lowe 			GOTO_STATE(scan_command_state);
129810d63b7dSRichard Lowe 		case plus_char:
129910d63b7dSRichard Lowe 			/*
130010d63b7dSRichard Lowe 			** following code drops the target separator plus char if it starts
130110d63b7dSRichard Lowe 			** a line.
1302*ae389aa9SAndy Fiddaman 			*/
130310d63b7dSRichard Lowe 			if(first_target && !macro_seen_in_string &&
130410d63b7dSRichard Lowe 					source_p == string_start) {
130510d63b7dSRichard Lowe 				for (; 1; source_p++)
130610d63b7dSRichard Lowe 				switch (GET_CHAR()) {
130710d63b7dSRichard Lowe 				case nul_char:
130810d63b7dSRichard Lowe 					if (source_p != string_start) {
130910d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
131010d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
131110d63b7dSRichard Lowe 									       name_buffer);
131210d63b7dSRichard Lowe 						}
131310d63b7dSRichard Lowe 						append_string(string_start,
131410d63b7dSRichard Lowe 							      &name_string,
131510d63b7dSRichard Lowe 							      source_p - string_start);
131610d63b7dSRichard Lowe 						macro_seen_in_string = true;
131710d63b7dSRichard Lowe 					}
131810d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
131910d63b7dSRichard Lowe 					string_start = source_p;
132010d63b7dSRichard Lowe 					source_p--;
132110d63b7dSRichard Lowe 					if (source == NULL) {
132210d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
132310d63b7dSRichard Lowe 					}
132410d63b7dSRichard Lowe 					break;
132510d63b7dSRichard Lowe 				case plus_char:
132610d63b7dSRichard Lowe 					source_p++;
132710d63b7dSRichard Lowe 					while (*source_p == (int) nul_char) {
132810d63b7dSRichard Lowe 						if (source_p != string_start) {
132910d63b7dSRichard Lowe 							if (!macro_seen_in_string) {
133010d63b7dSRichard Lowe 								INIT_STRING_FROM_STACK(name_string,
133110d63b7dSRichard Lowe 									       name_buffer);
133210d63b7dSRichard Lowe 							}
133310d63b7dSRichard Lowe 							append_string(string_start,
133410d63b7dSRichard Lowe 								      &name_string,
133510d63b7dSRichard Lowe 								      source_p - string_start);
133610d63b7dSRichard Lowe 							macro_seen_in_string = true;
133710d63b7dSRichard Lowe 						}
133810d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
133910d63b7dSRichard Lowe 						string_start = source_p;
134010d63b7dSRichard Lowe 						if (source == NULL) {
134110d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
134210d63b7dSRichard Lowe 						}
134310d63b7dSRichard Lowe 					}
134410d63b7dSRichard Lowe 					if (*source_p == (int) tab_char ||
134510d63b7dSRichard Lowe 							*source_p == (int) space_char) {
134610d63b7dSRichard Lowe 						macro_seen_in_string = false;
134710d63b7dSRichard Lowe 						string_start = source_p + 1;
134810d63b7dSRichard Lowe 					} else {
134910d63b7dSRichard Lowe 						goto resume_name_scan;
135010d63b7dSRichard Lowe 					}
135110d63b7dSRichard Lowe 					break;
135210d63b7dSRichard Lowe 				case tab_char:
135310d63b7dSRichard Lowe 				case space_char:
135410d63b7dSRichard Lowe 					string_start = source_p + 1;
135510d63b7dSRichard Lowe 					break;
135610d63b7dSRichard Lowe 				default:
135710d63b7dSRichard Lowe 					goto resume_name_scan;
135810d63b7dSRichard Lowe 				}
135910d63b7dSRichard Lowe 			}
136010d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
136110d63b7dSRichard Lowe 				break;
136210d63b7dSRichard Lowe 			}
136310d63b7dSRichard Lowe 			/* We found "+=" construct */
136410d63b7dSRichard Lowe 			if (source_p != string_start) {
136510d63b7dSRichard Lowe 				/* "+" is not a break char. */
136610d63b7dSRichard Lowe 				/* Ignore it if it is part of an identifier */
136710d63b7dSRichard Lowe 				source_p++;
136810d63b7dSRichard Lowe 				goto resume_name_scan;
136910d63b7dSRichard Lowe 			}
137010d63b7dSRichard Lowe 			/* Make sure the "+" is followed by a "=" */
137110d63b7dSRichard Lowe 		scan_append:
137210d63b7dSRichard Lowe 			switch (*++source_p) {
137310d63b7dSRichard Lowe 			case nul_char:
137410d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
137510d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
137610d63b7dSRichard Lowe 							       name_buffer);
137710d63b7dSRichard Lowe 				}
137810d63b7dSRichard Lowe 				append_string(string_start,
137910d63b7dSRichard Lowe 					      &name_string,
138010d63b7dSRichard Lowe 					      source_p - string_start);
138110d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
138210d63b7dSRichard Lowe 				source_p--;
138310d63b7dSRichard Lowe 				string_start = source_p;
138410d63b7dSRichard Lowe 				if (source == NULL) {
138510d63b7dSRichard Lowe 					GOTO_STATE(illegal_eoln_state);
138610d63b7dSRichard Lowe 				}
138710d63b7dSRichard Lowe 				goto scan_append;
138810d63b7dSRichard Lowe 			case equal_char:
138910d63b7dSRichard Lowe 				if(!svr4) {
139010d63b7dSRichard Lowe 				  append = true;
139110d63b7dSRichard Lowe 				} else {
139210d63b7dSRichard Lowe 				  fatal_reader(gettext("Must be a separator on rules"));
139310d63b7dSRichard Lowe 				}
139410d63b7dSRichard Lowe 				break;
139510d63b7dSRichard Lowe 			default:
139610d63b7dSRichard Lowe 				/* The "+" just starts a regular name. */
139710d63b7dSRichard Lowe 				/* Start reading that name */
139810d63b7dSRichard Lowe 				goto resume_name_scan;
139910d63b7dSRichard Lowe 			}
140010d63b7dSRichard Lowe 			/* Fall into */
140110d63b7dSRichard Lowe 		case equal_char:
140210d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
140310d63b7dSRichard Lowe 				break;
140410d63b7dSRichard Lowe 			}
140510d63b7dSRichard Lowe 			/* We found macro assignment. */
140610d63b7dSRichard Lowe 			/* Check if it is legal and if it is appending */
140710d63b7dSRichard Lowe 			switch (separator) {
140810d63b7dSRichard Lowe 			case none_seen:
140910d63b7dSRichard Lowe 				separator = equal_seen;
141010d63b7dSRichard Lowe 				on_eoln_state = enter_equal_state;
141110d63b7dSRichard Lowe 				break;
141210d63b7dSRichard Lowe 			case conditional_seen:
141310d63b7dSRichard Lowe 				on_eoln_state = enter_conditional_state;
141410d63b7dSRichard Lowe 				break;
141510d63b7dSRichard Lowe 			default:
141610d63b7dSRichard Lowe 				/* Reader must special check for "MACRO:sh=" */
141710d63b7dSRichard Lowe 				/* notation */
141810d63b7dSRichard Lowe 				if (sh_name == NULL) {
141910d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "sh");
142010d63b7dSRichard Lowe 					sh_name = GETNAME(wcs_buffer, FIND_LENGTH);
142110d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "shell");
142210d63b7dSRichard Lowe 					shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
142310d63b7dSRichard Lowe 				}
142410d63b7dSRichard Lowe 
142510d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
142610d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
142710d63b7dSRichard Lowe 						       name_buffer);
142810d63b7dSRichard Lowe 				}
142910d63b7dSRichard Lowe 				append_string(string_start,
143010d63b7dSRichard Lowe 					      &name_string,
143110d63b7dSRichard Lowe 					      source_p - string_start
143210d63b7dSRichard Lowe 				);
143310d63b7dSRichard Lowe 
143410d63b7dSRichard Lowe 				if ( (((target.used == 1) &&
143510d63b7dSRichard Lowe 				     (depes.used == 1) &&
143610d63b7dSRichard Lowe 				     (depes.names[0] == sh_name)) ||
143710d63b7dSRichard Lowe 				    ((target.used == 1) &&
143810d63b7dSRichard Lowe 				     (depes.used == 0) &&
143910d63b7dSRichard Lowe 				     (separator == one_colon) &&
144010d63b7dSRichard Lowe 				     (GETNAME(name_string.buffer.start,FIND_LENGTH) == sh_name))) &&
144110d63b7dSRichard Lowe 				    (!svr4)) {
144210d63b7dSRichard Lowe 					String_rec	macro_name;
144310d63b7dSRichard Lowe 					wchar_t		buffer[100];
144410d63b7dSRichard Lowe 
144510d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(macro_name,
144610d63b7dSRichard Lowe 							       buffer);
144710d63b7dSRichard Lowe 					APPEND_NAME(target.names[0],
144810d63b7dSRichard Lowe 						      &macro_name,
144910d63b7dSRichard Lowe 						      FIND_LENGTH);
145010d63b7dSRichard Lowe 					append_char((int) colon_char,
145110d63b7dSRichard Lowe 						    &macro_name);
145210d63b7dSRichard Lowe 					APPEND_NAME(sh_name,
145310d63b7dSRichard Lowe 						      &macro_name,
145410d63b7dSRichard Lowe 						      FIND_LENGTH);
145510d63b7dSRichard Lowe 					target.names[0] =
145610d63b7dSRichard Lowe 					  GETNAME(macro_name.buffer.start,
145710d63b7dSRichard Lowe 						  FIND_LENGTH);
145810d63b7dSRichard Lowe 					separator = equal_seen;
145910d63b7dSRichard Lowe 					on_eoln_state = enter_equal_state;
146010d63b7dSRichard Lowe 					break;
146110d63b7dSRichard Lowe 				} else if ( (((target.used == 1) &&
146210d63b7dSRichard Lowe 					    (depes.used == 1) &&
146310d63b7dSRichard Lowe 					    (depes.names[0] == shell_name)) ||
146410d63b7dSRichard Lowe 					   ((target.used == 1) &&
146510d63b7dSRichard Lowe 					    (depes.used == 0) &&
146610d63b7dSRichard Lowe 					    (separator == one_colon) &&
146710d63b7dSRichard Lowe 					    (GETNAME(name_string.buffer.start,FIND_LENGTH) == shell_name))) &&
146810d63b7dSRichard Lowe 					   (!svr4)) {
146910d63b7dSRichard Lowe 					String_rec	macro_name;
147010d63b7dSRichard Lowe 					wchar_t		buffer[100];
147110d63b7dSRichard Lowe 
147210d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(macro_name,
147310d63b7dSRichard Lowe 							       buffer);
147410d63b7dSRichard Lowe 					APPEND_NAME(target.names[0],
147510d63b7dSRichard Lowe 						      &macro_name,
147610d63b7dSRichard Lowe 						      FIND_LENGTH);
147710d63b7dSRichard Lowe 					append_char((int) colon_char,
147810d63b7dSRichard Lowe 						    &macro_name);
147910d63b7dSRichard Lowe 					APPEND_NAME(shell_name,
148010d63b7dSRichard Lowe 						      &macro_name,
148110d63b7dSRichard Lowe 						      FIND_LENGTH);
148210d63b7dSRichard Lowe 					target.names[0] =
148310d63b7dSRichard Lowe 					  GETNAME(macro_name.buffer.start,
148410d63b7dSRichard Lowe 						  FIND_LENGTH);
148510d63b7dSRichard Lowe 					separator = equal_seen;
148610d63b7dSRichard Lowe 					on_eoln_state = enter_equal_state;
148710d63b7dSRichard Lowe 					break;
1488*ae389aa9SAndy Fiddaman 				}
148910d63b7dSRichard Lowe 				if(svr4) {
149010d63b7dSRichard Lowe 				  fatal_reader(gettext("syntax error"));
149110d63b7dSRichard Lowe 				}
149210d63b7dSRichard Lowe 				else {
149310d63b7dSRichard Lowe 				  fatal_reader(gettext("Macro assignment on dependency line"));
149410d63b7dSRichard Lowe 				}
149510d63b7dSRichard Lowe 			}
149610d63b7dSRichard Lowe 			if (append) {
149710d63b7dSRichard Lowe 				source_p--;
149810d63b7dSRichard Lowe 			}
149910d63b7dSRichard Lowe 			/* Enter the macro name */
150010d63b7dSRichard Lowe 			if ((string_start != source_p) ||
150110d63b7dSRichard Lowe 			    macro_seen_in_string) {
150210d63b7dSRichard Lowe 				current_names =
150310d63b7dSRichard Lowe 				  enter_name(&name_string,
150410d63b7dSRichard Lowe 					     macro_seen_in_string,
150510d63b7dSRichard Lowe 					     string_start,
150610d63b7dSRichard Lowe 					     source_p,
150710d63b7dSRichard Lowe 					     current_names,
150810d63b7dSRichard Lowe 					     &extra_names,
150910d63b7dSRichard Lowe 					     &target_group_seen);
151010d63b7dSRichard Lowe 				first_target = false;
151110d63b7dSRichard Lowe 				if (extra_names == NULL) {
151210d63b7dSRichard Lowe 					extra_names = (Name_vector)
151310d63b7dSRichard Lowe 					  alloca((int)
151410d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
151510d63b7dSRichard Lowe 				}
151610d63b7dSRichard Lowe 			}
151710d63b7dSRichard Lowe 			if (append) {
151810d63b7dSRichard Lowe 				source_p++;
151910d63b7dSRichard Lowe 			}
152010d63b7dSRichard Lowe 			macro_value = NULL;
152110d63b7dSRichard Lowe 			source_p++;
152210d63b7dSRichard Lowe 			distance = 0;
152310d63b7dSRichard Lowe 			/* Skip whitespace to the start of the value */
152410d63b7dSRichard Lowe 			macro_seen_in_string = false;
152510d63b7dSRichard Lowe 			for (; 1; source_p++) {
152610d63b7dSRichard Lowe 				switch (GET_CHAR()) {
152710d63b7dSRichard Lowe 				case nul_char:
152810d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
152910d63b7dSRichard Lowe 					source_p--;
153010d63b7dSRichard Lowe 					if (source == NULL) {
153110d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
153210d63b7dSRichard Lowe 					}
153310d63b7dSRichard Lowe 					break;
153410d63b7dSRichard Lowe 				case backslash_char:
153510d63b7dSRichard Lowe 					if (*++source_p == (int) nul_char) {
153610d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
153710d63b7dSRichard Lowe 						if (source == NULL) {
153810d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
153910d63b7dSRichard Lowe 						}
154010d63b7dSRichard Lowe 					}
154110d63b7dSRichard Lowe 					if (*source_p != (int) newline_char) {
154210d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
154310d63b7dSRichard Lowe 							macro_seen_in_string =
154410d63b7dSRichard Lowe 							  true;
154510d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
154610d63b7dSRichard Lowe 									       name_buffer);
154710d63b7dSRichard Lowe 						}
154810d63b7dSRichard Lowe 						append_char((int)
154910d63b7dSRichard Lowe 							    backslash_char,
155010d63b7dSRichard Lowe 							    &name_string);
155110d63b7dSRichard Lowe 						append_char(*source_p,
155210d63b7dSRichard Lowe 							    &name_string);
155310d63b7dSRichard Lowe 						string_start = source_p+1;
155410d63b7dSRichard Lowe 						goto macro_value_start;
155510d63b7dSRichard Lowe 					} else {
155610d63b7dSRichard Lowe                                             if (source->fd >= 0) {
1557*ae389aa9SAndy Fiddaman 						line_number++;
155810d63b7dSRichard Lowe                                             }
155910d63b7dSRichard Lowe                                         }
156010d63b7dSRichard Lowe 					break;
156110d63b7dSRichard Lowe 				case newline_char:
156210d63b7dSRichard Lowe 				case numbersign_char:
156310d63b7dSRichard Lowe 					string_start = source_p;
156410d63b7dSRichard Lowe 					goto macro_value_end;
156510d63b7dSRichard Lowe 				case tab_char:
156610d63b7dSRichard Lowe 				case space_char:
156710d63b7dSRichard Lowe 					break;
156810d63b7dSRichard Lowe 				default:
156910d63b7dSRichard Lowe 					string_start = source_p;
157010d63b7dSRichard Lowe 					goto macro_value_start;
157110d63b7dSRichard Lowe 				}
157210d63b7dSRichard Lowe 			}
157310d63b7dSRichard Lowe 		macro_value_start:
157410d63b7dSRichard Lowe 			/* Find the end of the value */
157510d63b7dSRichard Lowe 			for (; 1; source_p++) {
157610d63b7dSRichard Lowe 				if (distance != 0) {
157710d63b7dSRichard Lowe 					*source_p = *(source_p + distance);
157810d63b7dSRichard Lowe 				}
157910d63b7dSRichard Lowe 				switch (GET_CHAR()) {
158010d63b7dSRichard Lowe 				case nul_char:
158110d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
158210d63b7dSRichard Lowe 						macro_seen_in_string = true;
158310d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
158410d63b7dSRichard Lowe 								       name_buffer);
158510d63b7dSRichard Lowe 					}
158610d63b7dSRichard Lowe 					append_string(string_start,
158710d63b7dSRichard Lowe 						      &name_string,
158810d63b7dSRichard Lowe 						      source_p - string_start);
158910d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
159010d63b7dSRichard Lowe 					string_start = source_p;
159110d63b7dSRichard Lowe 					source_p--;
159210d63b7dSRichard Lowe 					if (source == NULL) {
159310d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
159410d63b7dSRichard Lowe 					}
159510d63b7dSRichard Lowe 					break;
159610d63b7dSRichard Lowe 				case backslash_char:
159710d63b7dSRichard Lowe 					source_p++;
159810d63b7dSRichard Lowe 					if (distance != 0) {
159910d63b7dSRichard Lowe 						*source_p =
160010d63b7dSRichard Lowe 						  *(source_p + distance);
160110d63b7dSRichard Lowe 					}
160210d63b7dSRichard Lowe 					if (*source_p == (int) nul_char) {
160310d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
160410d63b7dSRichard Lowe 							macro_seen_in_string =
160510d63b7dSRichard Lowe 							  true;
160610d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
160710d63b7dSRichard Lowe 									       name_buffer);
160810d63b7dSRichard Lowe 						}
160910d63b7dSRichard Lowe 
161010d63b7dSRichard Lowe /*  BID_1225561 */
161110d63b7dSRichard Lowe 						*(source_p - 1) = (int) space_char;
161210d63b7dSRichard Lowe 						append_string(string_start,
161310d63b7dSRichard Lowe 							      &name_string,
161410d63b7dSRichard Lowe 							      source_p -
161510d63b7dSRichard Lowe 							      string_start - 1);
161610d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
161710d63b7dSRichard Lowe 						string_start = source_p;
161810d63b7dSRichard Lowe 						if (source == NULL) {
161910d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
162010d63b7dSRichard Lowe 						}
162110d63b7dSRichard Lowe 						if (distance != 0) {
162210d63b7dSRichard Lowe 							*source_p =
162310d63b7dSRichard Lowe 							  *(source_p +
162410d63b7dSRichard Lowe 							    distance);
162510d63b7dSRichard Lowe 						}
162610d63b7dSRichard Lowe 						if (*source_p == (int) newline_char) {
162710d63b7dSRichard Lowe 							append_char((int) space_char, &name_string);
162810d63b7dSRichard Lowe 						} else {
162910d63b7dSRichard Lowe 							append_char((int) backslash_char, &name_string);
163010d63b7dSRichard Lowe 						}
163110d63b7dSRichard Lowe /****************/
163210d63b7dSRichard Lowe 					}
163310d63b7dSRichard Lowe 					if (*source_p == (int) newline_char) {
163410d63b7dSRichard Lowe 						source_p--;
163510d63b7dSRichard Lowe 						line_number++;
163610d63b7dSRichard Lowe 						distance++;
163710d63b7dSRichard Lowe 						*source_p = (int) space_char;
163810d63b7dSRichard Lowe 						while ((*(source_p +
163910d63b7dSRichard Lowe 							  distance + 1) ==
164010d63b7dSRichard Lowe 							(int) tab_char) ||
164110d63b7dSRichard Lowe 						       (*(source_p +
164210d63b7dSRichard Lowe 							  distance + 1) ==
164310d63b7dSRichard Lowe 							(int) space_char)) {
164410d63b7dSRichard Lowe 							distance++;
164510d63b7dSRichard Lowe 						}
164610d63b7dSRichard Lowe 					}
164710d63b7dSRichard Lowe 					break;
164810d63b7dSRichard Lowe 				case newline_char:
164910d63b7dSRichard Lowe 				case numbersign_char:
165010d63b7dSRichard Lowe 					goto macro_value_end;
165110d63b7dSRichard Lowe 				}
165210d63b7dSRichard Lowe 			}
165310d63b7dSRichard Lowe 		macro_value_end:
165410d63b7dSRichard Lowe 			/* Complete the value in the string */
165510d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
165610d63b7dSRichard Lowe 				macro_seen_in_string = true;
165710d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
165810d63b7dSRichard Lowe 						       name_buffer);
165910d63b7dSRichard Lowe 			}
166010d63b7dSRichard Lowe 			append_string(string_start,
166110d63b7dSRichard Lowe 				      &name_string,
166210d63b7dSRichard Lowe 				      source_p - string_start);
166310d63b7dSRichard Lowe 			if (name_string.buffer.start != name_string.text.p) {
166410d63b7dSRichard Lowe 					macro_value =
166510d63b7dSRichard Lowe 					  GETNAME(name_string.buffer.start,
166610d63b7dSRichard Lowe 						  FIND_LENGTH);
166710d63b7dSRichard Lowe 				}
166810d63b7dSRichard Lowe 			if (name_string.free_after_use) {
166910d63b7dSRichard Lowe 				retmem(name_string.buffer.start);
167010d63b7dSRichard Lowe 			}
167110d63b7dSRichard Lowe 			for (; distance > 0; distance--) {
167210d63b7dSRichard Lowe 				*source_p++ = (int) space_char;
167310d63b7dSRichard Lowe 			}
167410d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
167510d63b7dSRichard Lowe 		}
167610d63b7dSRichard Lowe 	}
167710d63b7dSRichard Lowe 
167810d63b7dSRichard Lowe /****************************************************************
167910d63b7dSRichard Lowe  *	enter dependencies state
168010d63b7dSRichard Lowe  */
168110d63b7dSRichard Lowe  case enter_dependencies_state:
168210d63b7dSRichard Lowe  enter_dependencies_label:
168310d63b7dSRichard Lowe /* Expects pointer on first non whitespace char after last dependency. (On */
168410d63b7dSRichard Lowe /* next line.) We end up here after having read a "targets : dependencies" */
168510d63b7dSRichard Lowe /* line. The state checks if there is a rule to read and if so dispatches */
168610d63b7dSRichard Lowe /* to scan_command_state scan_command_state reads one rule line and the */
168710d63b7dSRichard Lowe /* returns here */
168810d63b7dSRichard Lowe 
168910d63b7dSRichard Lowe 	/* First check if the first char on the next line is special */
169010d63b7dSRichard Lowe 	switch (GET_CHAR()) {
169110d63b7dSRichard Lowe 	case nul_char:
169210d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
169310d63b7dSRichard Lowe 		if (source == NULL) {
169410d63b7dSRichard Lowe 			break;
169510d63b7dSRichard Lowe 		}
169610d63b7dSRichard Lowe 		goto enter_dependencies_label;
169710d63b7dSRichard Lowe 	case exclam_char:
169810d63b7dSRichard Lowe 		/* The line should be evaluate before it is read */
169910d63b7dSRichard Lowe 		macro_seen_in_string = false;
170010d63b7dSRichard Lowe 		string_start = source_p + 1;
170110d63b7dSRichard Lowe 		for (; 1; source_p++) {
170210d63b7dSRichard Lowe 			switch (GET_CHAR()) {
170310d63b7dSRichard Lowe 			case newline_char:
170410d63b7dSRichard Lowe 				goto eoln_2;
170510d63b7dSRichard Lowe 			case nul_char:
170610d63b7dSRichard Lowe 				if (source->fd > 0) {
170710d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
170810d63b7dSRichard Lowe 						macro_seen_in_string = true;
170910d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
171010d63b7dSRichard Lowe 								       name_buffer);
171110d63b7dSRichard Lowe 					}
171210d63b7dSRichard Lowe 					append_string(string_start,
171310d63b7dSRichard Lowe 						      &name_string,
171410d63b7dSRichard Lowe 						      source_p - string_start);
171510d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
171610d63b7dSRichard Lowe 					string_start = source_p;
171710d63b7dSRichard Lowe 					source_p--;
171810d63b7dSRichard Lowe 					break;
171910d63b7dSRichard Lowe 				}
172010d63b7dSRichard Lowe 			eoln_2:
172110d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
172210d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
172310d63b7dSRichard Lowe 							       name_buffer);
172410d63b7dSRichard Lowe 				}
172510d63b7dSRichard Lowe 				append_string(string_start,
172610d63b7dSRichard Lowe 					      &name_string,
172710d63b7dSRichard Lowe 					      source_p - string_start);
172810d63b7dSRichard Lowe 				extrap = (Source)
172910d63b7dSRichard Lowe 				  alloca((int) sizeof (Source_rec));
173010d63b7dSRichard Lowe 				extrap->string.buffer.start = NULL;
173110d63b7dSRichard Lowe 				extrap->inp_buf =
173210d63b7dSRichard Lowe 				  extrap->inp_buf_ptr =
173310d63b7dSRichard Lowe 				    extrap->inp_buf_end = NULL;
173410d63b7dSRichard Lowe 				extrap->error_converting = false;
173510d63b7dSRichard Lowe 				expand_value(GETNAME(name_string.buffer.start,
173610d63b7dSRichard Lowe 						     FIND_LENGTH),
173710d63b7dSRichard Lowe 					     &extrap->string,
173810d63b7dSRichard Lowe 					     false);
173910d63b7dSRichard Lowe 				if (name_string.free_after_use) {
174010d63b7dSRichard Lowe 					retmem(name_string.buffer.start);
174110d63b7dSRichard Lowe 				}
174210d63b7dSRichard Lowe 				UNCACHE_SOURCE();
174310d63b7dSRichard Lowe 				extrap->string.text.p =
174410d63b7dSRichard Lowe 				  extrap->string.buffer.start;
174510d63b7dSRichard Lowe 				extrap->fd = -1;
174610d63b7dSRichard Lowe 				extrap->previous = source;
174710d63b7dSRichard Lowe 				source = extrap;
174810d63b7dSRichard Lowe 				CACHE_SOURCE(0);
174910d63b7dSRichard Lowe 				goto enter_dependencies_label;
175010d63b7dSRichard Lowe 			}
175110d63b7dSRichard Lowe 		}
175210d63b7dSRichard Lowe 	case dollar_char:
175310d63b7dSRichard Lowe 		if (source->already_expanded) {
175410d63b7dSRichard Lowe 			break;
175510d63b7dSRichard Lowe 		}
175610d63b7dSRichard Lowe 		source_p++;
175710d63b7dSRichard Lowe 		UNCACHE_SOURCE();
175810d63b7dSRichard Lowe 		{
175910d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
176010d63b7dSRichard Lowe 			source = push_macro_value(t,
176110d63b7dSRichard Lowe 						  buffer,
176210d63b7dSRichard Lowe 						  sizeof buffer,
176310d63b7dSRichard Lowe 						  source);
176410d63b7dSRichard Lowe 		}
176510d63b7dSRichard Lowe 		CACHE_SOURCE(0);
176610d63b7dSRichard Lowe 		goto enter_dependencies_label;
176710d63b7dSRichard Lowe 	case numbersign_char:
176810d63b7dSRichard Lowe 		if (makefile_type != reading_makefile) {
176910d63b7dSRichard Lowe 			source_p++;
177010d63b7dSRichard Lowe 			GOTO_STATE(scan_command_state);
177110d63b7dSRichard Lowe 		}
177210d63b7dSRichard Lowe 		for (; 1; source_p++) {
177310d63b7dSRichard Lowe 			switch (GET_CHAR()) {
177410d63b7dSRichard Lowe 			case nul_char:
177510d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
177610d63b7dSRichard Lowe 				if (source == NULL) {
177710d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
177810d63b7dSRichard Lowe 				}
177910d63b7dSRichard Lowe 				if (source->error_converting) {
178010d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
178110d63b7dSRichard Lowe 					source->inp_buf_ptr++;
178210d63b7dSRichard Lowe 				}
178310d63b7dSRichard Lowe 				source_p--;
178410d63b7dSRichard Lowe 				break;
178510d63b7dSRichard Lowe 			case backslash_char:
178610d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
178710d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
178810d63b7dSRichard Lowe 					if (source == NULL) {
178910d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
179010d63b7dSRichard Lowe 					}
179110d63b7dSRichard Lowe 					if (source->error_converting) {
179210d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
179310d63b7dSRichard Lowe 						source->inp_buf_ptr++;
179410d63b7dSRichard Lowe 						source_p--;
179510d63b7dSRichard Lowe 						break;
179610d63b7dSRichard Lowe 					}
179710d63b7dSRichard Lowe 				}
179810d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
179910d63b7dSRichard Lowe 					if (source->fd >= 0) {
180010d63b7dSRichard Lowe 						line_number++;
180110d63b7dSRichard Lowe 					}
180210d63b7dSRichard Lowe 				}
180310d63b7dSRichard Lowe 				break;
180410d63b7dSRichard Lowe 			case newline_char:
180510d63b7dSRichard Lowe 				source_p++;
180610d63b7dSRichard Lowe 				if (source->fd >= 0) {
180710d63b7dSRichard Lowe 					line_number++;
180810d63b7dSRichard Lowe 				}
180910d63b7dSRichard Lowe 				goto enter_dependencies_label;
181010d63b7dSRichard Lowe 			}
181110d63b7dSRichard Lowe 		}
181210d63b7dSRichard Lowe 
181310d63b7dSRichard Lowe 	case tab_char:
181410d63b7dSRichard Lowe 		GOTO_STATE(scan_command_state);
181510d63b7dSRichard Lowe 	}
181610d63b7dSRichard Lowe 
181710d63b7dSRichard Lowe 	/* We read all the command lines for the target/dependency line. */
181810d63b7dSRichard Lowe 	/* Enter the stuff */
1819*ae389aa9SAndy Fiddaman 	enter_target_groups_and_dependencies( &target, &depes, command,
182010d63b7dSRichard Lowe 					     separator, target_group_seen);
182110d63b7dSRichard Lowe 
182210d63b7dSRichard Lowe 	goto start_new_line;
182310d63b7dSRichard Lowe 
182410d63b7dSRichard Lowe /****************************************************************
182510d63b7dSRichard Lowe  *	scan command state
182610d63b7dSRichard Lowe  */
182710d63b7dSRichard Lowe case scan_command_state:
182810d63b7dSRichard Lowe 	/* We need to read one rule line. Do that and return to */
182910d63b7dSRichard Lowe 	/* the enter dependencies state */
183010d63b7dSRichard Lowe 	string_start = source_p;
183110d63b7dSRichard Lowe 	macro_seen_in_string = false;
183210d63b7dSRichard Lowe 	for (; 1; source_p++) {
183310d63b7dSRichard Lowe 		switch (GET_CHAR()) {
183410d63b7dSRichard Lowe 		case backslash_char:
183510d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
183610d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
183710d63b7dSRichard Lowe 						       name_buffer);
183810d63b7dSRichard Lowe 			}
183910d63b7dSRichard Lowe 			append_string(string_start,
184010d63b7dSRichard Lowe 				      &name_string,
184110d63b7dSRichard Lowe 				      source_p - string_start);
184210d63b7dSRichard Lowe 			macro_seen_in_string = true;
184310d63b7dSRichard Lowe 			if (*++source_p == (int) nul_char) {
184410d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
184510d63b7dSRichard Lowe 				if (source == NULL) {
184610d63b7dSRichard Lowe 					string_start = source_p;
184710d63b7dSRichard Lowe 					goto command_newline;
184810d63b7dSRichard Lowe 				}
184910d63b7dSRichard Lowe 			}
185010d63b7dSRichard Lowe 			append_char((int) backslash_char, &name_string);
185110d63b7dSRichard Lowe 			append_char(*source_p, &name_string);
185210d63b7dSRichard Lowe 			if (*source_p == (int) newline_char) {
185310d63b7dSRichard Lowe 				if (source->fd >= 0) {
185410d63b7dSRichard Lowe 					line_number++;
185510d63b7dSRichard Lowe 				}
185610d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
185710d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
185810d63b7dSRichard Lowe 					if (source == NULL) {
185910d63b7dSRichard Lowe 						string_start = source_p;
186010d63b7dSRichard Lowe 						goto command_newline;
186110d63b7dSRichard Lowe 					}
186210d63b7dSRichard Lowe 				}
186310d63b7dSRichard Lowe 				if (*source_p == (int) tab_char) {
186410d63b7dSRichard Lowe 					source_p++;
186510d63b7dSRichard Lowe 				}
186610d63b7dSRichard Lowe 			} else {
186710d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
186810d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
186910d63b7dSRichard Lowe 					if (source == NULL) {
187010d63b7dSRichard Lowe 						string_start = source_p;
187110d63b7dSRichard Lowe 						goto command_newline;
187210d63b7dSRichard Lowe 					}
187310d63b7dSRichard Lowe 				}
187410d63b7dSRichard Lowe 			}
187510d63b7dSRichard Lowe 			string_start = source_p;
187610d63b7dSRichard Lowe 			if ((*source_p == (int) newline_char) ||
187710d63b7dSRichard Lowe 			    (*source_p == (int) backslash_char) ||
187810d63b7dSRichard Lowe 			    (*source_p == (int) nul_char)) {
187910d63b7dSRichard Lowe 				source_p--;
188010d63b7dSRichard Lowe 			}
188110d63b7dSRichard Lowe 			break;
188210d63b7dSRichard Lowe 		case newline_char:
188310d63b7dSRichard Lowe 		command_newline:
188410d63b7dSRichard Lowe 			if ((string_start != source_p) ||
188510d63b7dSRichard Lowe 			    macro_seen_in_string) {
188610d63b7dSRichard Lowe 				if (macro_seen_in_string) {
188710d63b7dSRichard Lowe 					append_string(string_start,
188810d63b7dSRichard Lowe 						      &name_string,
188910d63b7dSRichard Lowe 						      source_p - string_start);
189010d63b7dSRichard Lowe 					string_start =
189110d63b7dSRichard Lowe 					  name_string.buffer.start;
189210d63b7dSRichard Lowe 					string_end = name_string.text.p;
189310d63b7dSRichard Lowe 				} else {
189410d63b7dSRichard Lowe 					string_end = source_p;
189510d63b7dSRichard Lowe 				}
189610d63b7dSRichard Lowe 				while ((*string_start != (int) newline_char) &&
189710d63b7dSRichard Lowe 				       iswspace(*string_start)){
189810d63b7dSRichard Lowe 					string_start++;
189910d63b7dSRichard Lowe 				}
190010d63b7dSRichard Lowe 				if ((string_end > string_start) ||
190110d63b7dSRichard Lowe 				    (makefile_type == reading_statefile)) {
190210d63b7dSRichard Lowe 					if (command_tail == NULL) {
190310d63b7dSRichard Lowe 						command =
190410d63b7dSRichard Lowe 						  command_tail =
190510d63b7dSRichard Lowe 						    ALLOC(Cmd_line);
190610d63b7dSRichard Lowe 					} else {
190710d63b7dSRichard Lowe 						command_tail->next =
190810d63b7dSRichard Lowe 						  ALLOC(Cmd_line);
190910d63b7dSRichard Lowe 						command_tail =
191010d63b7dSRichard Lowe 						  command_tail->next;
191110d63b7dSRichard Lowe 					}
191210d63b7dSRichard Lowe 					command_tail->next = NULL;
191310d63b7dSRichard Lowe 					command_tail->make_refd = false;
191410d63b7dSRichard Lowe 					command_tail->ignore_command_dependency = false;
191510d63b7dSRichard Lowe 					command_tail->assign = false;
191610d63b7dSRichard Lowe 					command_tail->ignore_error = false;
191710d63b7dSRichard Lowe 					command_tail->silent = false;
191810d63b7dSRichard Lowe 					command_tail->command_line =
191910d63b7dSRichard Lowe 					  GETNAME(string_start,
192010d63b7dSRichard Lowe 						  string_end - string_start);
192110d63b7dSRichard Lowe 					if (macro_seen_in_string &&
192210d63b7dSRichard Lowe 					    name_string.free_after_use) {
192310d63b7dSRichard Lowe 						retmem(name_string.
192410d63b7dSRichard Lowe 						       buffer.start);
192510d63b7dSRichard Lowe 					}
192610d63b7dSRichard Lowe 				}
192710d63b7dSRichard Lowe 			}
192810d63b7dSRichard Lowe 			do {
192910d63b7dSRichard Lowe 				if ((source != NULL) && (source->fd >= 0)) {
193010d63b7dSRichard Lowe 					line_number++;
193110d63b7dSRichard Lowe 				}
193210d63b7dSRichard Lowe 				if ((source != NULL) &&
193310d63b7dSRichard Lowe 				    (*++source_p == (int) nul_char)) {
193410d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
193510d63b7dSRichard Lowe 					if (source == NULL) {
193610d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
193710d63b7dSRichard Lowe 					}
193810d63b7dSRichard Lowe 				}
193910d63b7dSRichard Lowe 			} while (*source_p == (int) newline_char);
194010d63b7dSRichard Lowe 
194110d63b7dSRichard Lowe 			GOTO_STATE(enter_dependencies_state);
194210d63b7dSRichard Lowe 		case nul_char:
194310d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
194410d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
194510d63b7dSRichard Lowe 						       name_buffer);
194610d63b7dSRichard Lowe 			}
194710d63b7dSRichard Lowe 			append_string(string_start,
194810d63b7dSRichard Lowe 				      &name_string,
194910d63b7dSRichard Lowe 				      source_p - string_start);
195010d63b7dSRichard Lowe 			macro_seen_in_string = true;
195110d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
195210d63b7dSRichard Lowe 			string_start = source_p;
195310d63b7dSRichard Lowe 			source_p--;
195410d63b7dSRichard Lowe 			if (source == NULL) {
195510d63b7dSRichard Lowe 				GOTO_STATE(enter_dependencies_state);
195610d63b7dSRichard Lowe 			}
195710d63b7dSRichard Lowe 			break;
195810d63b7dSRichard Lowe 		}
195910d63b7dSRichard Lowe 	}
196010d63b7dSRichard Lowe 
196110d63b7dSRichard Lowe /****************************************************************
196210d63b7dSRichard Lowe  *	enter equal state
196310d63b7dSRichard Lowe  */
196410d63b7dSRichard Lowe case enter_equal_state:
196510d63b7dSRichard Lowe 	if (target.used != 1) {
196610d63b7dSRichard Lowe 		GOTO_STATE(poorly_formed_macro_state);
196710d63b7dSRichard Lowe 	}
196810d63b7dSRichard Lowe 	enter_equal(target.names[0], macro_value, append);
196910d63b7dSRichard Lowe 	goto start_new_line;
197010d63b7dSRichard Lowe 
197110d63b7dSRichard Lowe /****************************************************************
197210d63b7dSRichard Lowe  *	enter conditional state
197310d63b7dSRichard Lowe  */
197410d63b7dSRichard Lowe case enter_conditional_state:
197510d63b7dSRichard Lowe 	if (depes.used != 1) {
197610d63b7dSRichard Lowe 		GOTO_STATE(poorly_formed_macro_state);
197710d63b7dSRichard Lowe 	}
197810d63b7dSRichard Lowe 	for (nvp = &target; nvp != NULL; nvp = nvp->next) {
197910d63b7dSRichard Lowe 		for (i = 0; i < nvp->used; i++) {
198010d63b7dSRichard Lowe 			enter_conditional(nvp->names[i],
198110d63b7dSRichard Lowe 					  depes.names[0],
198210d63b7dSRichard Lowe 					  macro_value,
198310d63b7dSRichard Lowe 					  append);
198410d63b7dSRichard Lowe 		}
198510d63b7dSRichard Lowe 	}
198610d63b7dSRichard Lowe 	goto start_new_line;
198710d63b7dSRichard Lowe 
198810d63b7dSRichard Lowe /****************************************************************
198910d63b7dSRichard Lowe  *	Error states
199010d63b7dSRichard Lowe  */
199110d63b7dSRichard Lowe case illegal_bytes_state:
199210d63b7dSRichard Lowe 	fatal_reader(gettext("Invalid byte sequence"));
199310d63b7dSRichard Lowe case illegal_eoln_state:
199410d63b7dSRichard Lowe 	if (line_number > 1) {
199510d63b7dSRichard Lowe 		if (line_started_with_space == (line_number - 1)) {
199610d63b7dSRichard Lowe 			line_number--;
199710d63b7dSRichard Lowe 			fatal_reader(gettext("Unexpected end of line seen\n\t*** missing separator (did you mean TAB instead of 8 spaces?)"));
199810d63b7dSRichard Lowe 		}
199910d63b7dSRichard Lowe 	}
200010d63b7dSRichard Lowe 	fatal_reader(gettext("Unexpected end of line seen"));
200110d63b7dSRichard Lowe case poorly_formed_macro_state:
200210d63b7dSRichard Lowe 	fatal_reader(gettext("Badly formed macro assignment"));
200310d63b7dSRichard Lowe case exit_state:
200410d63b7dSRichard Lowe 	return;
200510d63b7dSRichard Lowe default:
200610d63b7dSRichard Lowe 	fatal_reader(gettext("Internal error. Unknown reader state"));
200710d63b7dSRichard Lowe }
200810d63b7dSRichard Lowe }
200910d63b7dSRichard Lowe 
201010d63b7dSRichard Lowe /*
201110d63b7dSRichard Lowe  *	push_macro_value(bp, buffer, size, source)
201210d63b7dSRichard Lowe  *
201310d63b7dSRichard Lowe  *	Macro and function that evaluates one macro
201410d63b7dSRichard Lowe  *	and makes the reader read from the value of it
201510d63b7dSRichard Lowe  *
201610d63b7dSRichard Lowe  *	Return value:
201710d63b7dSRichard Lowe  *				The source block to read the macro from
201810d63b7dSRichard Lowe  *
201910d63b7dSRichard Lowe  *	Parameters:
202010d63b7dSRichard Lowe  *		bp		The new source block to fill in
202110d63b7dSRichard Lowe  *		buffer		Buffer to read from
202210d63b7dSRichard Lowe  *		size		size of the buffer
202310d63b7dSRichard Lowe  *		source		The old source block
202410d63b7dSRichard Lowe  *
202510d63b7dSRichard Lowe  *	Global variables used:
202610d63b7dSRichard Lowe  */
202710d63b7dSRichard Lowe static Source
202810d63b7dSRichard Lowe push_macro_value(register Source bp, register wchar_t *buffer, int size, register Source source)
202910d63b7dSRichard Lowe {
203010d63b7dSRichard Lowe 	bp->string.buffer.start = bp->string.text.p = buffer;
203110d63b7dSRichard Lowe 	bp->string.text.end = NULL;
203210d63b7dSRichard Lowe 	bp->string.buffer.end = buffer + (size/SIZEOFWCHAR_T);
203310d63b7dSRichard Lowe 	bp->string.free_after_use = false;
203410d63b7dSRichard Lowe 	bp->inp_buf =
203510d63b7dSRichard Lowe 	  bp->inp_buf_ptr =
203610d63b7dSRichard Lowe 	    bp->inp_buf_end = NULL;
203710d63b7dSRichard Lowe 	bp->error_converting = false;
203810d63b7dSRichard Lowe 	expand_macro(source, &bp->string, (wchar_t *) NULL, false);
203910d63b7dSRichard Lowe 	bp->string.text.p = bp->string.buffer.start;
204010d63b7dSRichard Lowe 
204110d63b7dSRichard Lowe 	/* 4209588: 'make' doesn't understand a macro with whitespaces in the head as target.
204210d63b7dSRichard Lowe 	 * strip whitespace from the begining of the macro value
204310d63b7dSRichard Lowe 	 */
204410d63b7dSRichard Lowe 	while (iswspace(*bp->string.text.p)) {
204510d63b7dSRichard Lowe 		bp->string.text.p++;
204610d63b7dSRichard Lowe 	}
204710d63b7dSRichard Lowe 
204810d63b7dSRichard Lowe 	bp->fd = -1;
204910d63b7dSRichard Lowe 	bp->already_expanded = true;
205010d63b7dSRichard Lowe 	bp->previous = source;
205110d63b7dSRichard Lowe 	return bp;
205210d63b7dSRichard Lowe }
205310d63b7dSRichard Lowe 
205410d63b7dSRichard Lowe /*
205510d63b7dSRichard Lowe  *	enter_target_groups_and_dependencies(target, depes, command, separator,
205610d63b7dSRichard Lowe  *					     target_group_seen)
205710d63b7dSRichard Lowe  *
205810d63b7dSRichard Lowe  *	Parameters:
2059*ae389aa9SAndy Fiddaman  *		target		Structure that shows the target(s) on the line
206010d63b7dSRichard Lowe  *				we are currently parsing. This can looks like
206110d63b7dSRichard Lowe  *				target1 .. targetN : dependencies
2062*ae389aa9SAndy Fiddaman  *							commands
206310d63b7dSRichard Lowe  *				or
206410d63b7dSRichard Lowe  *				target1 + .. + targetN : dependencies
206510d63b7dSRichard Lowe  *							 commands
206610d63b7dSRichard Lowe  *		depes		Dependencies
2067*ae389aa9SAndy Fiddaman  *		command		Points to the command(s) to be executed for
206810d63b7dSRichard Lowe  *				this target.
206910d63b7dSRichard Lowe  *		separator	: or :: or :=
207010d63b7dSRichard Lowe  *		target_group_seen	Set if we have target1 + .. + targetN
2071*ae389aa9SAndy Fiddaman  *
2072*ae389aa9SAndy Fiddaman  *
2073*ae389aa9SAndy Fiddaman  *	After reading the command lines for a target, this routine
207410d63b7dSRichard Lowe  *	is called to setup the dependencies and the commands for it.
2075*ae389aa9SAndy Fiddaman  *	If the target is a % pattern or part of a target group, then
2076*ae389aa9SAndy Fiddaman  *	the appropriate routines are called.
207710d63b7dSRichard Lowe  */
2078*ae389aa9SAndy Fiddaman 
207910d63b7dSRichard Lowe void
208010d63b7dSRichard Lowe enter_target_groups_and_dependencies(Name_vector target, Name_vector depes, Cmd_line command, Separator separator, Boolean target_group_seen)
208110d63b7dSRichard Lowe {
208210d63b7dSRichard Lowe 	int			i;
208310d63b7dSRichard Lowe 	Boolean			reset= true;
208410d63b7dSRichard Lowe 	Chain			target_group_member;
208510d63b7dSRichard Lowe 	Percent			percent_ptr;
208610d63b7dSRichard Lowe 
208710d63b7dSRichard Lowe 	for (; target != NULL; target = target->next) {
208810d63b7dSRichard Lowe 		for (i = 0; i < target->used; i++) {
208910d63b7dSRichard Lowe 			if (target->names[i] != NULL) {
209010d63b7dSRichard Lowe 				if (target_group_seen) {
209110d63b7dSRichard Lowe 					target_group_member =
209210d63b7dSRichard Lowe 					  find_target_groups(target, i, reset);
209310d63b7dSRichard Lowe 					if(target_group_member == NULL) {
209410d63b7dSRichard Lowe 						fatal_reader(gettext("Unexpected '+' on dependency line"));
209510d63b7dSRichard Lowe 					}
209610d63b7dSRichard Lowe 				}
209710d63b7dSRichard Lowe 				reset = false;
209810d63b7dSRichard Lowe 
209910d63b7dSRichard Lowe 				/* If we saw it in the makefile it must be
210010d63b7dSRichard Lowe 				 * a file */
210110d63b7dSRichard Lowe 				target->names[i]->stat.is_file = true;
2102*ae389aa9SAndy Fiddaman 				/* Make sure that we use dependencies
210310d63b7dSRichard Lowe 				 * entered for makefiles */
210410d63b7dSRichard Lowe 				target->names[i]->state = build_dont_know;
210510d63b7dSRichard Lowe 
2106*ae389aa9SAndy Fiddaman 				/* If the target is special we delegate
210710d63b7dSRichard Lowe 				 * the processing */
2108*ae389aa9SAndy Fiddaman 				if (target->names[i]->special_reader
210910d63b7dSRichard Lowe 				    != no_special) {
2110*ae389aa9SAndy Fiddaman 					special_reader(target->names[i],
2111*ae389aa9SAndy Fiddaman 						       depes,
211210d63b7dSRichard Lowe 						       command);
2113*ae389aa9SAndy Fiddaman 				}
211410d63b7dSRichard Lowe 				/* Check if this is a "a%b : x%y" type rule */
211510d63b7dSRichard Lowe 				else if (target->names[i]->percent) {
2116*ae389aa9SAndy Fiddaman 					percent_ptr =
2117*ae389aa9SAndy Fiddaman 					  enter_percent(target->names[i],
2118*ae389aa9SAndy Fiddaman 							target->target_group[i],
211910d63b7dSRichard Lowe 							depes, command);
212010d63b7dSRichard Lowe 					if (target_group_seen) {
212110d63b7dSRichard Lowe 						target_group_member->percent_member =
212210d63b7dSRichard Lowe 						  percent_ptr;
212310d63b7dSRichard Lowe 					}
212410d63b7dSRichard Lowe 				} else if (target->names[i]->dollar) {
212510d63b7dSRichard Lowe 					enter_dyntarget(target->names[i]);
212610d63b7dSRichard Lowe 					enter_dependencies
212710d63b7dSRichard Lowe 					  (target->names[i],
212810d63b7dSRichard Lowe 					   target->target_group[i],
2129*ae389aa9SAndy Fiddaman 					   depes,
213010d63b7dSRichard Lowe 					   command,
213110d63b7dSRichard Lowe 					   separator);
213210d63b7dSRichard Lowe 				} else {
213310d63b7dSRichard Lowe 					if (target_group_seen) {
213410d63b7dSRichard Lowe 						target_group_member->percent_member =
213510d63b7dSRichard Lowe 						  NULL;
213610d63b7dSRichard Lowe 					}
2137*ae389aa9SAndy Fiddaman 
213810d63b7dSRichard Lowe 					enter_dependencies
213910d63b7dSRichard Lowe 					  (target->names[i],
214010d63b7dSRichard Lowe 					   target->target_group[i],
2141*ae389aa9SAndy Fiddaman 					   depes,
214210d63b7dSRichard Lowe 					   command,
214310d63b7dSRichard Lowe 					   separator);
214410d63b7dSRichard Lowe 				}
214510d63b7dSRichard Lowe 			}
214610d63b7dSRichard Lowe 		}
214710d63b7dSRichard Lowe 	}
214810d63b7dSRichard Lowe }
2149