xref: /titanic_53/usr/src/cmd/make/bin/read.cc (revision 10d63b7db37a83b39c7f511cf9426c9d03ea0760)
1*10d63b7dSRichard Lowe /*
2*10d63b7dSRichard Lowe  * CDDL HEADER START
3*10d63b7dSRichard Lowe  *
4*10d63b7dSRichard Lowe  * The contents of this file are subject to the terms of the
5*10d63b7dSRichard Lowe  * Common Development and Distribution License (the "License").
6*10d63b7dSRichard Lowe  * You may not use this file except in compliance with the License.
7*10d63b7dSRichard Lowe  *
8*10d63b7dSRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10d63b7dSRichard Lowe  * or http://www.opensolaris.org/os/licensing.
10*10d63b7dSRichard Lowe  * See the License for the specific language governing permissions
11*10d63b7dSRichard Lowe  * and limitations under the License.
12*10d63b7dSRichard Lowe  *
13*10d63b7dSRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
14*10d63b7dSRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10d63b7dSRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
16*10d63b7dSRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
17*10d63b7dSRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10d63b7dSRichard Lowe  *
19*10d63b7dSRichard Lowe  * CDDL HEADER END
20*10d63b7dSRichard Lowe  */
21*10d63b7dSRichard Lowe /*
22*10d63b7dSRichard Lowe  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23*10d63b7dSRichard Lowe  * Use is subject to license terms.
24*10d63b7dSRichard Lowe  */
25*10d63b7dSRichard Lowe 
26*10d63b7dSRichard Lowe /*
27*10d63b7dSRichard Lowe  *	read.c
28*10d63b7dSRichard Lowe  *
29*10d63b7dSRichard Lowe  *	This file contains the makefile reader.
30*10d63b7dSRichard Lowe  */
31*10d63b7dSRichard Lowe 
32*10d63b7dSRichard Lowe /*
33*10d63b7dSRichard Lowe  * Included files
34*10d63b7dSRichard Lowe  */
35*10d63b7dSRichard Lowe #include <alloca.h>		/* alloca() */
36*10d63b7dSRichard Lowe #include <errno.h>		/* errno */
37*10d63b7dSRichard Lowe #include <fcntl.h>		/* fcntl() */
38*10d63b7dSRichard Lowe #include <mk/defs.h>
39*10d63b7dSRichard Lowe #include <mksh/macro.h>		/* expand_value(), expand_macro() */
40*10d63b7dSRichard Lowe #include <mksh/misc.h>		/* getmem() */
41*10d63b7dSRichard Lowe #include <mksh/read.h>		/* get_next_block_fn() */
42*10d63b7dSRichard Lowe #include <sys/uio.h>		/* read() */
43*10d63b7dSRichard Lowe #include <unistd.h>		/* read(), unlink() */
44*10d63b7dSRichard Lowe #include <libintl.h>
45*10d63b7dSRichard Lowe 
46*10d63b7dSRichard Lowe 
47*10d63b7dSRichard Lowe /*
48*10d63b7dSRichard Lowe  * typedefs & structs
49*10d63b7dSRichard Lowe  */
50*10d63b7dSRichard Lowe 
51*10d63b7dSRichard Lowe /*
52*10d63b7dSRichard Lowe  * Static variables
53*10d63b7dSRichard Lowe  */
54*10d63b7dSRichard Lowe 
55*10d63b7dSRichard Lowe static int line_started_with_space=0; // Used to diagnose spaces instead of tabs
56*10d63b7dSRichard Lowe 
57*10d63b7dSRichard Lowe /*
58*10d63b7dSRichard Lowe  * File table of contents
59*10d63b7dSRichard Lowe  */
60*10d63b7dSRichard Lowe static	void		parse_makefile(register Name true_makefile_name, register Source source);
61*10d63b7dSRichard Lowe static	Source		push_macro_value(register Source bp, register wchar_t *buffer, int size, register Source source);
62*10d63b7dSRichard Lowe extern  void 		enter_target_groups_and_dependencies(Name_vector target, Name_vector depes, Cmd_line command, Separator separator, Boolean target_group_seen);
63*10d63b7dSRichard Lowe extern	Name		normalize_name(register wchar_t *name_string, register int length);
64*10d63b7dSRichard Lowe 
65*10d63b7dSRichard Lowe /*
66*10d63b7dSRichard Lowe  *	read_simple_file(makefile_name, chase_path, doname_it,
67*10d63b7dSRichard Lowe  *		 complain, must_exist, report_file, lock_makefile)
68*10d63b7dSRichard Lowe  *
69*10d63b7dSRichard Lowe  *	Make the makefile and setup to read it. Actually read it if it is stdio
70*10d63b7dSRichard Lowe  *
71*10d63b7dSRichard Lowe  *	Return value:
72*10d63b7dSRichard Lowe  *				false if the read failed
73*10d63b7dSRichard Lowe  *
74*10d63b7dSRichard Lowe  *	Parameters:
75*10d63b7dSRichard Lowe  *		makefile_name	Name of the file to read
76*10d63b7dSRichard Lowe  *		chase_path	Use the makefile path when opening file
77*10d63b7dSRichard Lowe  *		doname_it	Call doname() to build the file first
78*10d63b7dSRichard Lowe  *		complain	Print message if doname/open fails
79*10d63b7dSRichard Lowe  *		must_exist	Generate fatal if file is missing
80*10d63b7dSRichard Lowe  *		report_file	Report file when running -P
81*10d63b7dSRichard Lowe  *		lock_makefile	Lock the makefile when reading
82*10d63b7dSRichard Lowe  *
83*10d63b7dSRichard Lowe  *	Static variables used:
84*10d63b7dSRichard Lowe  *
85*10d63b7dSRichard Lowe  *	Global variables used:
86*10d63b7dSRichard Lowe  *		do_not_exec_rule Is -n on?
87*10d63b7dSRichard Lowe  *		file_being_read	Set to the name of the new file
88*10d63b7dSRichard Lowe  *		line_number	The number of the current makefile line
89*10d63b7dSRichard Lowe  *		makefiles_used	A list of all makefiles used, appended to
90*10d63b7dSRichard Lowe  */
91*10d63b7dSRichard Lowe 
92*10d63b7dSRichard Lowe 
93*10d63b7dSRichard Lowe Boolean
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)94*10d63b7dSRichard 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)
95*10d63b7dSRichard Lowe {
96*10d63b7dSRichard Lowe 	static short		max_include_depth;
97*10d63b7dSRichard Lowe 	register Property	makefile = maybe_append_prop(makefile_name,
98*10d63b7dSRichard Lowe 							     makefile_prop);
99*10d63b7dSRichard Lowe 	Boolean			forget_after_parse = false;
100*10d63b7dSRichard Lowe 	static pathpt		makefile_path;
101*10d63b7dSRichard Lowe 	register int		n;
102*10d63b7dSRichard Lowe 	char			*path;
103*10d63b7dSRichard Lowe 	register Source		source = ALLOC(Source);
104*10d63b7dSRichard Lowe 	Property		orig_makefile = makefile;
105*10d63b7dSRichard Lowe 	Dependency		*dpp;
106*10d63b7dSRichard Lowe 	Dependency		dp;
107*10d63b7dSRichard Lowe 	register int		length;
108*10d63b7dSRichard Lowe 	wchar_t			*previous_file_being_read = file_being_read;
109*10d63b7dSRichard Lowe 	int			previous_line_number = line_number;
110*10d63b7dSRichard Lowe 	wchar_t			previous_current_makefile[MAXPATHLEN];
111*10d63b7dSRichard Lowe 	Makefile_type		save_makefile_type;
112*10d63b7dSRichard Lowe 	Name 			normalized_makefile_name;
113*10d63b7dSRichard Lowe 	register wchar_t        *string_start;
114*10d63b7dSRichard Lowe 	register wchar_t        *string_end;
115*10d63b7dSRichard Lowe 
116*10d63b7dSRichard Lowe 
117*10d63b7dSRichard Lowe 
118*10d63b7dSRichard Lowe 	wchar_t * wcb = get_wstring(makefile_name->string_mb);
119*10d63b7dSRichard Lowe 
120*10d63b7dSRichard Lowe 	if (max_include_depth++ >= 40) {
121*10d63b7dSRichard Lowe 		fatal(gettext("Too many nested include statements"));
122*10d63b7dSRichard Lowe 	}
123*10d63b7dSRichard Lowe 	if (makefile->body.makefile.contents != NULL) {
124*10d63b7dSRichard Lowe 		retmem(makefile->body.makefile.contents);
125*10d63b7dSRichard Lowe 	}
126*10d63b7dSRichard Lowe 	source->inp_buf =
127*10d63b7dSRichard Lowe 	  source->inp_buf_ptr =
128*10d63b7dSRichard Lowe 	    source->inp_buf_end = NULL;
129*10d63b7dSRichard Lowe 	source->error_converting = false;
130*10d63b7dSRichard Lowe 	makefile->body.makefile.contents = NULL;
131*10d63b7dSRichard Lowe 	makefile->body.makefile.size = 0;
132*10d63b7dSRichard Lowe 	if ((makefile_name->hash.length != 1) ||
133*10d63b7dSRichard Lowe 	    (wcb[0] != (int) hyphen_char)) {
134*10d63b7dSRichard Lowe 		if ((makefile->body.makefile.contents == NULL) &&
135*10d63b7dSRichard Lowe 		    (doname_it)) {
136*10d63b7dSRichard Lowe 			if (makefile_path == NULL) {
137*10d63b7dSRichard Lowe 				char *pfx = make_install_prefix();
138*10d63b7dSRichard Lowe 				char *path;
139*10d63b7dSRichard Lowe 
140*10d63b7dSRichard Lowe 				add_dir_to_path(".",
141*10d63b7dSRichard Lowe 						&makefile_path,
142*10d63b7dSRichard Lowe 						-1);
143*10d63b7dSRichard Lowe 
144*10d63b7dSRichard Lowe 				// As regularly installed
145*10d63b7dSRichard Lowe 				asprintf(&path, "%s/../share/lib/make", pfx);
146*10d63b7dSRichard Lowe 				add_dir_to_path(path, &makefile_path, -1);
147*10d63b7dSRichard Lowe 				free(path);
148*10d63b7dSRichard Lowe 
149*10d63b7dSRichard Lowe 				// Tools build
150*10d63b7dSRichard Lowe 				asprintf(&path, "%s/../../share/", pfx);
151*10d63b7dSRichard Lowe 				add_dir_to_path(path, &makefile_path, -1);
152*10d63b7dSRichard Lowe 				free(path);
153*10d63b7dSRichard Lowe 
154*10d63b7dSRichard Lowe 				add_dir_to_path("/usr/share/lib/make",
155*10d63b7dSRichard Lowe 						&makefile_path,
156*10d63b7dSRichard Lowe 						-1);
157*10d63b7dSRichard Lowe 				add_dir_to_path("/etc/default",
158*10d63b7dSRichard Lowe 						&makefile_path,
159*10d63b7dSRichard Lowe 						-1);
160*10d63b7dSRichard Lowe 
161*10d63b7dSRichard Lowe 				free(pfx);
162*10d63b7dSRichard Lowe 			}
163*10d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
164*10d63b7dSRichard Lowe 			makefile_type = reading_nothing;
165*10d63b7dSRichard Lowe 			if (doname(makefile_name, true, false) == build_dont_know) {
166*10d63b7dSRichard Lowe 				/* Try normalized filename */
167*10d63b7dSRichard Lowe 				string_start=get_wstring(makefile_name->string_mb);
168*10d63b7dSRichard Lowe 				for (string_end=string_start+1; *string_end != L'\0'; string_end++);
169*10d63b7dSRichard Lowe 				normalized_makefile_name=normalize_name(string_start, string_end - string_start);
170*10d63b7dSRichard Lowe 				if ((strcmp(makefile_name->string_mb, normalized_makefile_name->string_mb) == 0) ||
171*10d63b7dSRichard Lowe 					(doname(normalized_makefile_name, true, false) == build_dont_know)) {
172*10d63b7dSRichard Lowe 					n = access_vroot(makefile_name->string_mb,
173*10d63b7dSRichard Lowe 						 4,
174*10d63b7dSRichard Lowe 						 chase_path ?
175*10d63b7dSRichard Lowe 						 makefile_path : NULL,
176*10d63b7dSRichard Lowe 						 VROOT_DEFAULT);
177*10d63b7dSRichard Lowe 					if (n == 0) {
178*10d63b7dSRichard Lowe 						get_vroot_path((char **) NULL,
179*10d63b7dSRichard Lowe 						       &path,
180*10d63b7dSRichard Lowe 						       (char **) NULL);
181*10d63b7dSRichard Lowe 						if ((path[0] == (int) period_char) &&
182*10d63b7dSRichard Lowe 						    (path[1] == (int) slash_char)) {
183*10d63b7dSRichard Lowe 							path += 2;
184*10d63b7dSRichard Lowe 						}
185*10d63b7dSRichard Lowe 						MBSTOWCS(wcs_buffer, path);
186*10d63b7dSRichard Lowe 						makefile_name = GETNAME(wcs_buffer,
187*10d63b7dSRichard Lowe 								FIND_LENGTH);
188*10d63b7dSRichard Lowe 					}
189*10d63b7dSRichard Lowe 				}
190*10d63b7dSRichard Lowe 				retmem(string_start);
191*10d63b7dSRichard Lowe 				/*
192*10d63b7dSRichard Lowe 				 * Commented out: retmem_mb(normalized_makefile_name->string_mb);
193*10d63b7dSRichard Lowe 				 * We have to return this memory, but it seems to trigger a bug
194*10d63b7dSRichard Lowe 				 * in dmake or in Sun C++ 5.7 compiler (it works ok if this code
195*10d63b7dSRichard Lowe 				 * is compiled using Sun C++ 5.6).
196*10d63b7dSRichard Lowe 				 */
197*10d63b7dSRichard Lowe 				// retmem_mb(normalized_makefile_name->string_mb);
198*10d63b7dSRichard Lowe 			}
199*10d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
200*10d63b7dSRichard Lowe 		}
201*10d63b7dSRichard Lowe 		source->string.free_after_use = false;
202*10d63b7dSRichard Lowe 		source->previous = NULL;
203*10d63b7dSRichard Lowe 		source->already_expanded = false;
204*10d63b7dSRichard Lowe 		/* Lock the file for read, but not when -n. */
205*10d63b7dSRichard Lowe 		if (lock_makefile &&
206*10d63b7dSRichard Lowe 		    !do_not_exec_rule) {
207*10d63b7dSRichard Lowe 
208*10d63b7dSRichard Lowe 			 make_state_lockfile = getmem(strlen(make_state->string_mb) + strlen(".lock") + 1);
209*10d63b7dSRichard Lowe 			 (void) sprintf(make_state_lockfile,
210*10d63b7dSRichard Lowe 						"%s.lock",
211*10d63b7dSRichard Lowe 						make_state->string_mb);
212*10d63b7dSRichard Lowe 			(void) file_lock(make_state->string_mb,
213*10d63b7dSRichard Lowe 					 make_state_lockfile,
214*10d63b7dSRichard Lowe 					 (int *) &make_state_locked,
215*10d63b7dSRichard Lowe 					 0);
216*10d63b7dSRichard Lowe 			if(!make_state_locked) {
217*10d63b7dSRichard Lowe 				printf("-- NO LOCKING for read\n");
218*10d63b7dSRichard Lowe 				retmem_mb(make_state_lockfile);
219*10d63b7dSRichard Lowe 				make_state_lockfile = 0;
220*10d63b7dSRichard Lowe 				return failed;
221*10d63b7dSRichard Lowe 			}
222*10d63b7dSRichard Lowe 		}
223*10d63b7dSRichard Lowe 		if (makefile->body.makefile.contents == NULL) {
224*10d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
225*10d63b7dSRichard Lowe 			makefile_type = reading_nothing;
226*10d63b7dSRichard Lowe 			if ((doname_it) &&
227*10d63b7dSRichard Lowe 			    (doname(makefile_name, true, false) == build_failed)) {
228*10d63b7dSRichard Lowe 				if (complain) {
229*10d63b7dSRichard Lowe 					(void) fprintf(stderr,
230*10d63b7dSRichard Lowe 						       gettext("%s: Couldn't make `%s'\n"),
231*10d63b7dSRichard Lowe 						       getprogname(),
232*10d63b7dSRichard Lowe 						       makefile_name->string_mb);
233*10d63b7dSRichard Lowe 				}
234*10d63b7dSRichard Lowe 				max_include_depth--;
235*10d63b7dSRichard Lowe 				makefile_type = save_makefile_type;
236*10d63b7dSRichard Lowe 				return failed;
237*10d63b7dSRichard Lowe 			}
238*10d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
239*10d63b7dSRichard Lowe 			//
240*10d63b7dSRichard Lowe 			// Before calling exists() make sure that we have the right timestamp
241*10d63b7dSRichard Lowe 			//
242*10d63b7dSRichard Lowe 			makefile_name->stat.time = file_no_time;
243*10d63b7dSRichard Lowe 
244*10d63b7dSRichard Lowe 			if (exists(makefile_name) == file_doesnt_exist) {
245*10d63b7dSRichard Lowe 				if (complain ||
246*10d63b7dSRichard Lowe 				    (makefile_name->stat.stat_errno != ENOENT)) {
247*10d63b7dSRichard Lowe 					if (must_exist) {
248*10d63b7dSRichard Lowe 						fatal(gettext("Can't find `%s': %s"),
249*10d63b7dSRichard Lowe 						      makefile_name->string_mb,
250*10d63b7dSRichard Lowe 						      errmsg(makefile_name->
251*10d63b7dSRichard Lowe 							     stat.stat_errno));
252*10d63b7dSRichard Lowe 					} else {
253*10d63b7dSRichard Lowe 						warning(gettext("Can't find `%s': %s"),
254*10d63b7dSRichard Lowe 							makefile_name->string_mb,
255*10d63b7dSRichard Lowe 							errmsg(makefile_name->
256*10d63b7dSRichard Lowe 							       stat.stat_errno));
257*10d63b7dSRichard Lowe 					}
258*10d63b7dSRichard Lowe 				}
259*10d63b7dSRichard Lowe 				max_include_depth--;
260*10d63b7dSRichard Lowe 				if(make_state_locked && (make_state_lockfile != NULL)) {
261*10d63b7dSRichard Lowe 					(void) unlink(make_state_lockfile);
262*10d63b7dSRichard Lowe 					retmem_mb(make_state_lockfile);
263*10d63b7dSRichard Lowe 					make_state_lockfile = NULL;
264*10d63b7dSRichard Lowe 					make_state_locked = false;
265*10d63b7dSRichard Lowe 				}
266*10d63b7dSRichard Lowe 				retmem(wcb);
267*10d63b7dSRichard Lowe 				retmem_mb((char *)source);
268*10d63b7dSRichard Lowe 				return failed;
269*10d63b7dSRichard Lowe 			}
270*10d63b7dSRichard Lowe 			/*
271*10d63b7dSRichard Lowe 			 * These values are the size and bytes of
272*10d63b7dSRichard Lowe 			 * the MULTI-BYTE makefile.
273*10d63b7dSRichard Lowe 			 */
274*10d63b7dSRichard Lowe 			orig_makefile->body.makefile.size =
275*10d63b7dSRichard Lowe 			  makefile->body.makefile.size =
276*10d63b7dSRichard Lowe 			    source->bytes_left_in_file =
277*10d63b7dSRichard Lowe 			      makefile_name->stat.size;
278*10d63b7dSRichard Lowe 			if (report_file) {
279*10d63b7dSRichard Lowe 				for (dpp = &makefiles_used;
280*10d63b7dSRichard Lowe 				     *dpp != NULL;
281*10d63b7dSRichard Lowe 				     dpp = &(*dpp)->next);
282*10d63b7dSRichard Lowe 				dp = ALLOC(Dependency);
283*10d63b7dSRichard Lowe 				dp->next = NULL;
284*10d63b7dSRichard Lowe 				dp->name = makefile_name;
285*10d63b7dSRichard Lowe 				dp->automatic = false;
286*10d63b7dSRichard Lowe 				dp->stale = false;
287*10d63b7dSRichard Lowe 				dp->built = false;
288*10d63b7dSRichard Lowe 				*dpp = dp;
289*10d63b7dSRichard Lowe 			}
290*10d63b7dSRichard Lowe 			source->fd = open_vroot(makefile_name->string_mb,
291*10d63b7dSRichard Lowe 						O_RDONLY,
292*10d63b7dSRichard Lowe 						0,
293*10d63b7dSRichard Lowe 						NULL,
294*10d63b7dSRichard Lowe 						VROOT_DEFAULT);
295*10d63b7dSRichard Lowe 			if (source->fd < 0) {
296*10d63b7dSRichard Lowe 				if (complain || (errno != ENOENT)) {
297*10d63b7dSRichard Lowe 					if (must_exist) {
298*10d63b7dSRichard Lowe 						fatal(gettext("Can't open `%s': %s"),
299*10d63b7dSRichard Lowe 						      makefile_name->string_mb,
300*10d63b7dSRichard Lowe 						      errmsg(errno));
301*10d63b7dSRichard Lowe 					} else {
302*10d63b7dSRichard Lowe 						warning(gettext("Can't open `%s': %s"),
303*10d63b7dSRichard Lowe 							makefile_name->string_mb,
304*10d63b7dSRichard Lowe 							errmsg(errno));
305*10d63b7dSRichard Lowe 					}
306*10d63b7dSRichard Lowe 				}
307*10d63b7dSRichard Lowe 				max_include_depth--;
308*10d63b7dSRichard Lowe 				return failed;
309*10d63b7dSRichard Lowe 			}
310*10d63b7dSRichard Lowe 			(void) fcntl(source->fd, F_SETFD, 1);
311*10d63b7dSRichard Lowe 			orig_makefile->body.makefile.contents =
312*10d63b7dSRichard Lowe 			  makefile->body.makefile.contents =
313*10d63b7dSRichard Lowe 			    source->string.text.p =
314*10d63b7dSRichard Lowe 			      source->string.buffer.start =
315*10d63b7dSRichard Lowe 				ALLOC_WC((int) (makefile_name->stat.size + 2));
316*10d63b7dSRichard Lowe 			if (makefile_type == reading_cpp_file) {
317*10d63b7dSRichard Lowe 				forget_after_parse = true;
318*10d63b7dSRichard Lowe 			}
319*10d63b7dSRichard Lowe 			source->string.text.end = source->string.text.p;
320*10d63b7dSRichard Lowe 			source->string.buffer.end =
321*10d63b7dSRichard Lowe 			  source->string.text.p + makefile_name->stat.size;
322*10d63b7dSRichard Lowe 		} else {
323*10d63b7dSRichard Lowe 			/* Do we ever reach here? */
324*10d63b7dSRichard Lowe 			source->fd = -1;
325*10d63b7dSRichard Lowe 			source->string.text.p =
326*10d63b7dSRichard Lowe 			  source->string.buffer.start =
327*10d63b7dSRichard Lowe 			    makefile->body.makefile.contents;
328*10d63b7dSRichard Lowe 			source->string.text.end =
329*10d63b7dSRichard Lowe 			  source->string.buffer.end =
330*10d63b7dSRichard Lowe 			    source->string.text.p + makefile->body.makefile.size;
331*10d63b7dSRichard Lowe 			source->bytes_left_in_file =
332*10d63b7dSRichard Lowe 			  makefile->body.makefile.size;
333*10d63b7dSRichard Lowe 		}
334*10d63b7dSRichard Lowe 		file_being_read = wcb;
335*10d63b7dSRichard Lowe 	} else {
336*10d63b7dSRichard Lowe 		char		*stdin_text_p;
337*10d63b7dSRichard Lowe 		char		*stdin_text_end;
338*10d63b7dSRichard Lowe 		char		*stdin_buffer_start;
339*10d63b7dSRichard Lowe 		char		*stdin_buffer_end;
340*10d63b7dSRichard Lowe 		char		*p_mb;
341*10d63b7dSRichard Lowe 		int		num_mb_chars;
342*10d63b7dSRichard Lowe 		size_t		num_wc_chars;
343*10d63b7dSRichard Lowe 
344*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "Standard in");
345*10d63b7dSRichard Lowe 		makefile_name = GETNAME(wcs_buffer, FIND_LENGTH);
346*10d63b7dSRichard Lowe 		/*
347*10d63b7dSRichard Lowe 		 * Memory to read standard in, then convert it
348*10d63b7dSRichard Lowe 		 * to wide char strings.
349*10d63b7dSRichard Lowe 		 */
350*10d63b7dSRichard Lowe 		stdin_buffer_start =
351*10d63b7dSRichard Lowe 		  stdin_text_p = getmem(length = 1024);
352*10d63b7dSRichard Lowe 		stdin_buffer_end = stdin_text_p + length;
353*10d63b7dSRichard Lowe 		MBSTOWCS(wcs_buffer, "standard input");
354*10d63b7dSRichard Lowe 		file_being_read = (wchar_t *) wcsdup(wcs_buffer);
355*10d63b7dSRichard Lowe 		line_number = 0;
356*10d63b7dSRichard Lowe 		while ((n = read(fileno(stdin),
357*10d63b7dSRichard Lowe 				 stdin_text_p,
358*10d63b7dSRichard Lowe 				 length)) > 0) {
359*10d63b7dSRichard Lowe 			length -= n;
360*10d63b7dSRichard Lowe 			stdin_text_p += n;
361*10d63b7dSRichard Lowe 			if (length == 0) {
362*10d63b7dSRichard Lowe 				p_mb = getmem(length = 1024 +
363*10d63b7dSRichard Lowe 					      (stdin_buffer_end -
364*10d63b7dSRichard Lowe 					       stdin_buffer_start));
365*10d63b7dSRichard Lowe 				(void) strncpy(p_mb,
366*10d63b7dSRichard Lowe 					       stdin_buffer_start,
367*10d63b7dSRichard Lowe 					       (stdin_buffer_end -
368*10d63b7dSRichard Lowe 					        stdin_buffer_start));
369*10d63b7dSRichard Lowe 				retmem_mb(stdin_buffer_start);
370*10d63b7dSRichard Lowe 				stdin_text_p = p_mb +
371*10d63b7dSRichard Lowe 				  (stdin_buffer_end - stdin_buffer_start);
372*10d63b7dSRichard Lowe 				stdin_buffer_start = p_mb;
373*10d63b7dSRichard Lowe 				stdin_buffer_end =
374*10d63b7dSRichard Lowe 				  stdin_buffer_start + length;
375*10d63b7dSRichard Lowe 				length = 1024;
376*10d63b7dSRichard Lowe 			}
377*10d63b7dSRichard Lowe 		}
378*10d63b7dSRichard Lowe 		if (n < 0) {
379*10d63b7dSRichard Lowe 			fatal(gettext("Error reading standard input: %s"),
380*10d63b7dSRichard Lowe 			      errmsg(errno));
381*10d63b7dSRichard Lowe 		}
382*10d63b7dSRichard Lowe 		stdin_text_p = stdin_buffer_start;
383*10d63b7dSRichard Lowe 		stdin_text_end = stdin_buffer_end - length;
384*10d63b7dSRichard Lowe 		num_mb_chars = stdin_text_end - stdin_text_p;
385*10d63b7dSRichard Lowe 
386*10d63b7dSRichard Lowe 		/*
387*10d63b7dSRichard Lowe 		 * Now, convert the sequence of multibyte chars into
388*10d63b7dSRichard Lowe 		 * a sequence of corresponding wide character codes.
389*10d63b7dSRichard Lowe 		 */
390*10d63b7dSRichard Lowe 		source->string.free_after_use = false;
391*10d63b7dSRichard Lowe 		source->previous = NULL;
392*10d63b7dSRichard Lowe 		source->bytes_left_in_file = 0;
393*10d63b7dSRichard Lowe 		source->fd = -1;
394*10d63b7dSRichard Lowe 		source->already_expanded = false;
395*10d63b7dSRichard Lowe 		source->string.buffer.start =
396*10d63b7dSRichard Lowe 		  source->string.text.p = ALLOC_WC(num_mb_chars + 1);
397*10d63b7dSRichard Lowe 		source->string.buffer.end =
398*10d63b7dSRichard Lowe 		    source->string.text.p + num_mb_chars;
399*10d63b7dSRichard Lowe 		num_wc_chars = mbstowcs(source->string.text.p,
400*10d63b7dSRichard Lowe 					stdin_text_p,
401*10d63b7dSRichard Lowe 					num_mb_chars);
402*10d63b7dSRichard Lowe 		if ((int) num_wc_chars >= 0) {
403*10d63b7dSRichard Lowe 			source->string.text.end =
404*10d63b7dSRichard Lowe 			  source->string.text.p + num_wc_chars;
405*10d63b7dSRichard Lowe 		}
406*10d63b7dSRichard Lowe 		(void) retmem_mb(stdin_text_p);
407*10d63b7dSRichard Lowe 	}
408*10d63b7dSRichard Lowe 	line_number = 1;
409*10d63b7dSRichard Lowe 	if (trace_reader) {
410*10d63b7dSRichard Lowe 		(void) printf(gettext(">>>>>>>>>>>>>>>> Reading makefile %s\n"),
411*10d63b7dSRichard Lowe 			      makefile_name->string_mb);
412*10d63b7dSRichard Lowe 	}
413*10d63b7dSRichard Lowe 	parse_makefile(makefile_name, source);
414*10d63b7dSRichard Lowe 	if (trace_reader) {
415*10d63b7dSRichard Lowe 		(void) printf(gettext(">>>>>>>>>>>>>>>> End of makefile %s\n"),
416*10d63b7dSRichard Lowe 			      makefile_name->string_mb);
417*10d63b7dSRichard Lowe 	}
418*10d63b7dSRichard Lowe 	if(file_being_read) {
419*10d63b7dSRichard Lowe 		retmem(file_being_read);
420*10d63b7dSRichard Lowe 	}
421*10d63b7dSRichard Lowe 	file_being_read = previous_file_being_read;
422*10d63b7dSRichard Lowe 	line_number = previous_line_number;
423*10d63b7dSRichard Lowe 	makefile_type = reading_nothing;
424*10d63b7dSRichard Lowe 	max_include_depth--;
425*10d63b7dSRichard Lowe 	if (make_state_locked) {
426*10d63b7dSRichard Lowe 		/* Unlock .make.state. */
427*10d63b7dSRichard Lowe 		unlink(make_state_lockfile);
428*10d63b7dSRichard Lowe 		make_state_locked = false;
429*10d63b7dSRichard Lowe 		retmem_mb(make_state_lockfile);
430*10d63b7dSRichard Lowe 	}
431*10d63b7dSRichard Lowe 	if (forget_after_parse) {
432*10d63b7dSRichard Lowe 		retmem(makefile->body.makefile.contents);
433*10d63b7dSRichard Lowe 		makefile->body.makefile.contents = NULL;
434*10d63b7dSRichard Lowe 	}
435*10d63b7dSRichard Lowe 	retmem_mb((char *)source);
436*10d63b7dSRichard Lowe 	return succeeded;
437*10d63b7dSRichard Lowe }
438*10d63b7dSRichard Lowe 
439*10d63b7dSRichard Lowe /*
440*10d63b7dSRichard Lowe  *	parse_makefile(true_makefile_name, source)
441*10d63b7dSRichard Lowe  *
442*10d63b7dSRichard Lowe  *	Strings are read from Sources.
443*10d63b7dSRichard Lowe  *	When macros are found, their values are represented by a
444*10d63b7dSRichard Lowe  *	Source that is pushed on a stack. At end of string
445*10d63b7dSRichard Lowe  *	(that is returned from GET_CHAR() as 0), the block is popped.
446*10d63b7dSRichard Lowe  *
447*10d63b7dSRichard Lowe  *	Parameters:
448*10d63b7dSRichard Lowe  *		true_makefile_name	The name of makefile we are parsing
449*10d63b7dSRichard Lowe  *		source			The source block to read from
450*10d63b7dSRichard Lowe  *
451*10d63b7dSRichard Lowe  *	Global variables used:
452*10d63b7dSRichard Lowe  *		do_not_exec_rule Is -n on?
453*10d63b7dSRichard Lowe  *		line_number	The number of the current makefile line
454*10d63b7dSRichard Lowe  *		makefile_type	What kind of makefile are we reading?
455*10d63b7dSRichard Lowe  *		empty_name	The Name ""
456*10d63b7dSRichard Lowe  */
457*10d63b7dSRichard Lowe static void
parse_makefile(register Name true_makefile_name,register Source source)458*10d63b7dSRichard Lowe parse_makefile(register Name true_makefile_name, register Source source)
459*10d63b7dSRichard Lowe {
460*10d63b7dSRichard Lowe /*
461*10d63b7dSRichard Lowe 	char			mb_buffer[MB_LEN_MAX];
462*10d63b7dSRichard Lowe  */
463*10d63b7dSRichard Lowe 	register wchar_t	*source_p;
464*10d63b7dSRichard Lowe 	register wchar_t	*source_end;
465*10d63b7dSRichard Lowe 	register wchar_t	*string_start;
466*10d63b7dSRichard Lowe 	wchar_t			*string_end;
467*10d63b7dSRichard Lowe 	register Boolean	macro_seen_in_string;
468*10d63b7dSRichard Lowe 	Boolean			append;
469*10d63b7dSRichard Lowe 	String_rec		name_string;
470*10d63b7dSRichard Lowe 	wchar_t			name_buffer[STRING_BUFFER_LENGTH];
471*10d63b7dSRichard Lowe 	register int		distance;
472*10d63b7dSRichard Lowe 	register int		paren_count;
473*10d63b7dSRichard Lowe 	int			brace_count;
474*10d63b7dSRichard Lowe 	int			char_number;
475*10d63b7dSRichard Lowe 	Cmd_line		command;
476*10d63b7dSRichard Lowe 	Cmd_line		command_tail;
477*10d63b7dSRichard Lowe 	Name			macro_value;
478*10d63b7dSRichard Lowe 
479*10d63b7dSRichard Lowe 	Name_vector_rec		target;
480*10d63b7dSRichard Lowe 	Name_vector_rec		depes;
481*10d63b7dSRichard Lowe 	Name_vector_rec		extra_name_vector;
482*10d63b7dSRichard Lowe 	Name_vector		current_names;
483*10d63b7dSRichard Lowe 	Name_vector		extra_names = &extra_name_vector;
484*10d63b7dSRichard Lowe 	Name_vector		nvp;
485*10d63b7dSRichard Lowe 	Boolean			target_group_seen;
486*10d63b7dSRichard Lowe 
487*10d63b7dSRichard Lowe 	register Reader_state   state;
488*10d63b7dSRichard Lowe 	register Reader_state   on_eoln_state;
489*10d63b7dSRichard Lowe 	register Separator	separator;
490*10d63b7dSRichard Lowe 
491*10d63b7dSRichard Lowe 	wchar_t                 buffer[4 * STRING_BUFFER_LENGTH];
492*10d63b7dSRichard Lowe 	Source			extrap;
493*10d63b7dSRichard Lowe 
494*10d63b7dSRichard Lowe 	Boolean                 save_do_not_exec_rule = do_not_exec_rule;
495*10d63b7dSRichard Lowe 	Name                    makefile_name;
496*10d63b7dSRichard Lowe 
497*10d63b7dSRichard Lowe 	static Name		sh_name;
498*10d63b7dSRichard Lowe 	static Name		shell_name;
499*10d63b7dSRichard Lowe 	int			i;
500*10d63b7dSRichard Lowe 
501*10d63b7dSRichard Lowe 	static wchar_t		include_space[10];
502*10d63b7dSRichard Lowe 	static wchar_t		include_tab[10];
503*10d63b7dSRichard Lowe 	int			tmp_bytes_left_in_string;
504*10d63b7dSRichard Lowe 	Boolean			tmp_maybe_include = false;
505*10d63b7dSRichard Lowe 	int    			emptycount = 0;
506*10d63b7dSRichard Lowe 	Boolean			first_target;
507*10d63b7dSRichard Lowe 
508*10d63b7dSRichard Lowe 	String_rec		include_name;
509*10d63b7dSRichard Lowe 	wchar_t			include_buffer[STRING_BUFFER_LENGTH];
510*10d63b7dSRichard Lowe 
511*10d63b7dSRichard Lowe 	target.next = depes.next = NULL;
512*10d63b7dSRichard Lowe 	/* Move some values from their struct to register declared locals */
513*10d63b7dSRichard Lowe 	CACHE_SOURCE(0);
514*10d63b7dSRichard Lowe 
515*10d63b7dSRichard Lowe  start_new_line:
516*10d63b7dSRichard Lowe 	/*
517*10d63b7dSRichard Lowe 	 * Read whitespace on old line. Leave pointer on first char on
518*10d63b7dSRichard Lowe 	 * next line.
519*10d63b7dSRichard Lowe 	 */
520*10d63b7dSRichard Lowe 	first_target = true;
521*10d63b7dSRichard Lowe 	on_eoln_state = exit_state;
522*10d63b7dSRichard Lowe /*
523*10d63b7dSRichard Lowe 	for (WCTOMB(mb_buffer, GET_CHAR());
524*10d63b7dSRichard Lowe 	     1;
525*10d63b7dSRichard Lowe 	     source_p++, WCTOMB(mb_buffer, GET_CHAR()))
526*10d63b7dSRichard Lowe 		switch (mb_buffer[0]) {
527*10d63b7dSRichard Lowe  */
528*10d63b7dSRichard Lowe 	for (char_number=0; 1; source_p++,char_number++) switch (GET_CHAR()) {
529*10d63b7dSRichard Lowe 	case nul_char:
530*10d63b7dSRichard Lowe 		/* End of this string. Pop it and return to the previous one */
531*10d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
532*10d63b7dSRichard Lowe 		source_p--;
533*10d63b7dSRichard Lowe 		if (source == NULL) {
534*10d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
535*10d63b7dSRichard Lowe 		}
536*10d63b7dSRichard Lowe 		break;
537*10d63b7dSRichard Lowe 	case newline_char:
538*10d63b7dSRichard Lowe 	end_of_line:
539*10d63b7dSRichard Lowe 		source_p++;
540*10d63b7dSRichard Lowe 		if (source->fd >= 0) {
541*10d63b7dSRichard Lowe 			line_number++;
542*10d63b7dSRichard Lowe 		}
543*10d63b7dSRichard Lowe 		switch (GET_CHAR()) {
544*10d63b7dSRichard Lowe 		case nul_char:
545*10d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
546*10d63b7dSRichard Lowe 			if (source == NULL) {
547*10d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
548*10d63b7dSRichard Lowe 			}
549*10d63b7dSRichard Lowe 			/* Go back to the top of this loop */
550*10d63b7dSRichard Lowe 			goto start_new_line;
551*10d63b7dSRichard Lowe 		case newline_char:
552*10d63b7dSRichard Lowe 		case numbersign_char:
553*10d63b7dSRichard Lowe 		case dollar_char:
554*10d63b7dSRichard Lowe 		case space_char:
555*10d63b7dSRichard Lowe 		case tab_char:
556*10d63b7dSRichard Lowe 			/*
557*10d63b7dSRichard Lowe 			 * Go back to the top of this loop since the
558*10d63b7dSRichard Lowe 			 * new line does not start with a regular char.
559*10d63b7dSRichard Lowe 			 */
560*10d63b7dSRichard Lowe 			goto start_new_line;
561*10d63b7dSRichard Lowe 		default:
562*10d63b7dSRichard Lowe 			/* We found the first proper char on the new line */
563*10d63b7dSRichard Lowe 			goto start_new_line_no_skip;
564*10d63b7dSRichard Lowe 		}
565*10d63b7dSRichard Lowe 	case space_char:
566*10d63b7dSRichard Lowe 		if (char_number == 0)
567*10d63b7dSRichard Lowe 			line_started_with_space=line_number;
568*10d63b7dSRichard Lowe 	case tab_char:
569*10d63b7dSRichard Lowe 		/* Whitespace. Just keep going in this loop */
570*10d63b7dSRichard Lowe 		break;
571*10d63b7dSRichard Lowe 	case numbersign_char:
572*10d63b7dSRichard Lowe 		/* Comment. Skip over it */
573*10d63b7dSRichard Lowe 		for (; 1; source_p++) {
574*10d63b7dSRichard Lowe 			switch (GET_CHAR()) {
575*10d63b7dSRichard Lowe 			case nul_char:
576*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
577*10d63b7dSRichard Lowe 				if (source == NULL) {
578*10d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
579*10d63b7dSRichard Lowe 				}
580*10d63b7dSRichard Lowe 				if (source->error_converting) {
581*10d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
582*10d63b7dSRichard Lowe 					source->inp_buf_ptr++;
583*10d63b7dSRichard Lowe 				}
584*10d63b7dSRichard Lowe 				source_p--;
585*10d63b7dSRichard Lowe 				break;
586*10d63b7dSRichard Lowe 			case backslash_char:
587*10d63b7dSRichard Lowe 				/* Comments can be continued */
588*10d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
589*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
590*10d63b7dSRichard Lowe 					if (source == NULL) {
591*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
592*10d63b7dSRichard Lowe 					}
593*10d63b7dSRichard Lowe 					if (source->error_converting) {
594*10d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
595*10d63b7dSRichard Lowe 						source->inp_buf_ptr++;
596*10d63b7dSRichard Lowe 						source_p--;
597*10d63b7dSRichard Lowe 						break;
598*10d63b7dSRichard Lowe 					}
599*10d63b7dSRichard Lowe 				}
600*10d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
601*10d63b7dSRichard Lowe 					if (source->fd >= 0) {
602*10d63b7dSRichard Lowe 						line_number++;
603*10d63b7dSRichard Lowe 					}
604*10d63b7dSRichard Lowe 				}
605*10d63b7dSRichard Lowe 				break;
606*10d63b7dSRichard Lowe 			case newline_char:
607*10d63b7dSRichard Lowe 				/*
608*10d63b7dSRichard Lowe 				 * After we skip the comment we go to
609*10d63b7dSRichard Lowe 				 * the end of line handler since end of
610*10d63b7dSRichard Lowe 				 * line terminates comments.
611*10d63b7dSRichard Lowe 				 */
612*10d63b7dSRichard Lowe 				goto end_of_line;
613*10d63b7dSRichard Lowe 			}
614*10d63b7dSRichard Lowe 		}
615*10d63b7dSRichard Lowe 	case dollar_char:
616*10d63b7dSRichard Lowe 		/* Macro reference */
617*10d63b7dSRichard Lowe 		if (source->already_expanded) {
618*10d63b7dSRichard Lowe 			/*
619*10d63b7dSRichard Lowe 			 * If we are reading from the expansion of a
620*10d63b7dSRichard Lowe 			 * macro we already expanded everything enough.
621*10d63b7dSRichard Lowe 			 */
622*10d63b7dSRichard Lowe 			goto start_new_line_no_skip;
623*10d63b7dSRichard Lowe 		}
624*10d63b7dSRichard Lowe 		/*
625*10d63b7dSRichard Lowe 		 * Expand the value and push the Source on the stack of
626*10d63b7dSRichard Lowe 		 * things being read.
627*10d63b7dSRichard Lowe 		 */
628*10d63b7dSRichard Lowe 		source_p++;
629*10d63b7dSRichard Lowe 		UNCACHE_SOURCE();
630*10d63b7dSRichard Lowe 		{
631*10d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
632*10d63b7dSRichard Lowe 			source = push_macro_value(t,
633*10d63b7dSRichard Lowe 						  buffer,
634*10d63b7dSRichard Lowe 						  sizeof buffer,
635*10d63b7dSRichard Lowe 						  source);
636*10d63b7dSRichard Lowe 		}
637*10d63b7dSRichard Lowe 		CACHE_SOURCE(1);
638*10d63b7dSRichard Lowe 		break;
639*10d63b7dSRichard Lowe 	default:
640*10d63b7dSRichard Lowe 		/* We found the first proper char on the new line */
641*10d63b7dSRichard Lowe 		goto start_new_line_no_skip;
642*10d63b7dSRichard Lowe 	}
643*10d63b7dSRichard Lowe 
644*10d63b7dSRichard Lowe 	/*
645*10d63b7dSRichard Lowe 	 * We found the first normal char (one that starts an identifier)
646*10d63b7dSRichard Lowe 	 * on the newline.
647*10d63b7dSRichard Lowe 	 */
648*10d63b7dSRichard Lowe start_new_line_no_skip:
649*10d63b7dSRichard Lowe 	/* Inspect that first char to see if it maybe is special anyway */
650*10d63b7dSRichard Lowe 	switch (GET_CHAR()) {
651*10d63b7dSRichard Lowe 	case nul_char:
652*10d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
653*10d63b7dSRichard Lowe 		if (source == NULL) {
654*10d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
655*10d63b7dSRichard Lowe 		}
656*10d63b7dSRichard Lowe 		goto start_new_line_no_skip;
657*10d63b7dSRichard Lowe 	case newline_char:
658*10d63b7dSRichard Lowe 		/* Just in case */
659*10d63b7dSRichard Lowe 		goto start_new_line;
660*10d63b7dSRichard Lowe 	case exclam_char:
661*10d63b7dSRichard Lowe 		/* Evaluate the line before it is read */
662*10d63b7dSRichard Lowe 		string_start = source_p + 1;
663*10d63b7dSRichard Lowe 		macro_seen_in_string = false;
664*10d63b7dSRichard Lowe 		/* Stuff the line in a string so we can eval it. */
665*10d63b7dSRichard Lowe 		for (; 1; source_p++) {
666*10d63b7dSRichard Lowe 			switch (GET_CHAR()) {
667*10d63b7dSRichard Lowe 			case newline_char:
668*10d63b7dSRichard Lowe 				goto eoln_1;
669*10d63b7dSRichard Lowe 			case nul_char:
670*10d63b7dSRichard Lowe 				if (source->fd > 0) {
671*10d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
672*10d63b7dSRichard Lowe 						macro_seen_in_string = true;
673*10d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(
674*10d63b7dSRichard Lowe 						      name_string, name_buffer);
675*10d63b7dSRichard Lowe 					}
676*10d63b7dSRichard Lowe 					append_string(string_start,
677*10d63b7dSRichard Lowe 						      &name_string,
678*10d63b7dSRichard Lowe 						      source_p - string_start);
679*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
680*10d63b7dSRichard Lowe 					string_start = source_p;
681*10d63b7dSRichard Lowe 					source_p--;
682*10d63b7dSRichard Lowe 					break;
683*10d63b7dSRichard Lowe 				}
684*10d63b7dSRichard Lowe 			eoln_1:
685*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
686*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
687*10d63b7dSRichard Lowe 							       name_buffer);
688*10d63b7dSRichard Lowe 				}
689*10d63b7dSRichard Lowe 				append_string(string_start,
690*10d63b7dSRichard Lowe 					      &name_string,
691*10d63b7dSRichard Lowe 					      source_p - string_start);
692*10d63b7dSRichard Lowe 				extrap = (Source)
693*10d63b7dSRichard Lowe 				  alloca((int) sizeof (Source_rec));
694*10d63b7dSRichard Lowe 				extrap->string.buffer.start = NULL;
695*10d63b7dSRichard Lowe 				extrap->inp_buf =
696*10d63b7dSRichard Lowe 				  extrap->inp_buf_ptr =
697*10d63b7dSRichard Lowe 				    extrap->inp_buf_end = NULL;
698*10d63b7dSRichard Lowe 				extrap->error_converting = false;
699*10d63b7dSRichard Lowe 				if (*source_p == (int) nul_char) {
700*10d63b7dSRichard Lowe 					source_p++;
701*10d63b7dSRichard Lowe 				}
702*10d63b7dSRichard Lowe 				/* Eval the macro */
703*10d63b7dSRichard Lowe 				expand_value(GETNAME(name_string.buffer.start,
704*10d63b7dSRichard Lowe 						     FIND_LENGTH),
705*10d63b7dSRichard Lowe 					     &extrap->string,
706*10d63b7dSRichard Lowe 					     false);
707*10d63b7dSRichard Lowe 				if (name_string.free_after_use) {
708*10d63b7dSRichard Lowe 					retmem(name_string.buffer.start);
709*10d63b7dSRichard Lowe 				}
710*10d63b7dSRichard Lowe 				UNCACHE_SOURCE();
711*10d63b7dSRichard Lowe 				extrap->string.text.p =
712*10d63b7dSRichard Lowe 				  extrap->string.buffer.start;
713*10d63b7dSRichard Lowe 				extrap->fd = -1;
714*10d63b7dSRichard Lowe 				/* And push the value */
715*10d63b7dSRichard Lowe 				extrap->previous = source;
716*10d63b7dSRichard Lowe 				source = extrap;
717*10d63b7dSRichard Lowe 				CACHE_SOURCE(0);
718*10d63b7dSRichard Lowe 				goto line_evald;
719*10d63b7dSRichard Lowe 			}
720*10d63b7dSRichard Lowe 		}
721*10d63b7dSRichard Lowe 	default:
722*10d63b7dSRichard Lowe 		goto line_evald;
723*10d63b7dSRichard Lowe 	}
724*10d63b7dSRichard Lowe 
725*10d63b7dSRichard Lowe 	/* We now have a line we can start reading */
726*10d63b7dSRichard Lowe  line_evald:
727*10d63b7dSRichard Lowe 	if (source == NULL) {
728*10d63b7dSRichard Lowe 		GOTO_STATE(exit_state);
729*10d63b7dSRichard Lowe 	}
730*10d63b7dSRichard Lowe 	/* Check if this is an include command */
731*10d63b7dSRichard Lowe 	if ((makefile_type == reading_makefile) &&
732*10d63b7dSRichard Lowe 	    !source->already_expanded) {
733*10d63b7dSRichard Lowe 	    if (include_space[0] == (int) nul_char) {
734*10d63b7dSRichard Lowe 		MBSTOWCS(include_space, "include ");
735*10d63b7dSRichard Lowe 		MBSTOWCS(include_tab, "include\t");
736*10d63b7dSRichard Lowe 	    }
737*10d63b7dSRichard Lowe 	    if ((IS_WEQUALN(source_p, include_space, 8)) ||
738*10d63b7dSRichard Lowe 		(IS_WEQUALN(source_p, include_tab, 8))) {
739*10d63b7dSRichard Lowe 		source_p += 7;
740*10d63b7dSRichard Lowe 		if (iswspace(*source_p)) {
741*10d63b7dSRichard Lowe 			Makefile_type save_makefile_type;
742*10d63b7dSRichard Lowe 			wchar_t		*name_start;
743*10d63b7dSRichard Lowe 			int		name_length;
744*10d63b7dSRichard Lowe 
745*10d63b7dSRichard Lowe 			/*
746*10d63b7dSRichard Lowe 			 * Yes, this is an include.
747*10d63b7dSRichard Lowe 			 * Skip spaces to get to the filename.
748*10d63b7dSRichard Lowe 			 */
749*10d63b7dSRichard Lowe 			while (iswspace(*source_p) ||
750*10d63b7dSRichard Lowe 			       (*source_p == (int) nul_char)) {
751*10d63b7dSRichard Lowe 				switch (GET_CHAR()) {
752*10d63b7dSRichard Lowe 				case nul_char:
753*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
754*10d63b7dSRichard Lowe 					if (source == NULL) {
755*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
756*10d63b7dSRichard Lowe 					}
757*10d63b7dSRichard Lowe 					break;
758*10d63b7dSRichard Lowe 
759*10d63b7dSRichard Lowe 				default:
760*10d63b7dSRichard Lowe 					source_p++;
761*10d63b7dSRichard Lowe 					break;
762*10d63b7dSRichard Lowe 				}
763*10d63b7dSRichard Lowe 			}
764*10d63b7dSRichard Lowe 
765*10d63b7dSRichard Lowe 			string_start = source_p;
766*10d63b7dSRichard Lowe 			/* Find the end of the filename */
767*10d63b7dSRichard Lowe 			macro_seen_in_string = false;
768*10d63b7dSRichard Lowe 			while (!iswspace(*source_p) ||
769*10d63b7dSRichard Lowe 			       (*source_p == (int) nul_char)) {
770*10d63b7dSRichard Lowe 				switch (GET_CHAR()) {
771*10d63b7dSRichard Lowe 				case nul_char:
772*10d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
773*10d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
774*10d63b7dSRichard Lowe 								       name_buffer);
775*10d63b7dSRichard Lowe 					}
776*10d63b7dSRichard Lowe 					append_string(string_start,
777*10d63b7dSRichard Lowe 						      &name_string,
778*10d63b7dSRichard Lowe 						      source_p - string_start);
779*10d63b7dSRichard Lowe 					macro_seen_in_string = true;
780*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
781*10d63b7dSRichard Lowe 					string_start = source_p;
782*10d63b7dSRichard Lowe 					if (source == NULL) {
783*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
784*10d63b7dSRichard Lowe 					}
785*10d63b7dSRichard Lowe 					break;
786*10d63b7dSRichard Lowe 
787*10d63b7dSRichard Lowe 				default:
788*10d63b7dSRichard Lowe 					source_p++;
789*10d63b7dSRichard Lowe 					break;
790*10d63b7dSRichard Lowe 				}
791*10d63b7dSRichard Lowe 			}
792*10d63b7dSRichard Lowe 
793*10d63b7dSRichard Lowe 			source->string.text.p = source_p;
794*10d63b7dSRichard Lowe 			if (macro_seen_in_string) {
795*10d63b7dSRichard Lowe 				append_string(string_start,
796*10d63b7dSRichard Lowe 					      &name_string,
797*10d63b7dSRichard Lowe 					      source_p - string_start);
798*10d63b7dSRichard Lowe 				name_start = name_string.buffer.start;
799*10d63b7dSRichard Lowe 				name_length = name_string.text.p - name_start;
800*10d63b7dSRichard Lowe 			} else {
801*10d63b7dSRichard Lowe 				name_start = string_start;
802*10d63b7dSRichard Lowe 				name_length = source_p - string_start;
803*10d63b7dSRichard Lowe 			}
804*10d63b7dSRichard Lowe 
805*10d63b7dSRichard Lowe 			/* Strip "./" from the head of the name */
806*10d63b7dSRichard Lowe 			if ((name_start[0] == (int) period_char) &&
807*10d63b7dSRichard Lowe 	    		   (name_start[1] == (int) slash_char)) {
808*10d63b7dSRichard Lowe 				name_start += 2;
809*10d63b7dSRichard Lowe 				name_length -= 2;
810*10d63b7dSRichard Lowe 			}
811*10d63b7dSRichard Lowe 			/* if include file name is surrounded by double quotes */
812*10d63b7dSRichard Lowe 			if ((name_start[0] == (int) doublequote_char) &&
813*10d63b7dSRichard Lowe 			    (name_start[name_length - 1] == (int) doublequote_char)) {
814*10d63b7dSRichard Lowe 			    	name_start += 1;
815*10d63b7dSRichard Lowe 			    	name_length -= 2;
816*10d63b7dSRichard Lowe 
817*10d63b7dSRichard Lowe 			    	/* if name does not begin with a slash char */
818*10d63b7dSRichard Lowe 			    	if (name_start[0] != (int) slash_char) {
819*10d63b7dSRichard Lowe 					if ((name_start[0] == (int) period_char) &&
820*10d63b7dSRichard Lowe 					    (name_start[1] == (int) slash_char)) {
821*10d63b7dSRichard Lowe 						name_start += 2;
822*10d63b7dSRichard Lowe 						name_length -= 2;
823*10d63b7dSRichard Lowe 					}
824*10d63b7dSRichard Lowe 
825*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(include_name, include_buffer);
826*10d63b7dSRichard Lowe 					APPEND_NAME(true_makefile_name,
827*10d63b7dSRichard Lowe 						      &include_name,
828*10d63b7dSRichard Lowe 						      true_makefile_name->hash.length);
829*10d63b7dSRichard Lowe 
830*10d63b7dSRichard Lowe 					wchar_t *slash = wcsrchr(include_name.buffer.start, (int) slash_char);
831*10d63b7dSRichard Lowe 					if (slash != NULL) {
832*10d63b7dSRichard Lowe 						include_name.text.p = slash + 1;
833*10d63b7dSRichard Lowe 						append_string(name_start,
834*10d63b7dSRichard Lowe 							      &include_name,
835*10d63b7dSRichard Lowe 							      name_length);
836*10d63b7dSRichard Lowe 
837*10d63b7dSRichard Lowe 						name_start = include_name.buffer.start;
838*10d63b7dSRichard Lowe 						name_length = include_name.text.p - name_start;
839*10d63b7dSRichard Lowe 					}
840*10d63b7dSRichard Lowe 				}
841*10d63b7dSRichard Lowe 			}
842*10d63b7dSRichard Lowe 
843*10d63b7dSRichard Lowe 			/* Even when we run -n we want to create makefiles */
844*10d63b7dSRichard Lowe 			do_not_exec_rule = false;
845*10d63b7dSRichard Lowe 			makefile_name = GETNAME(name_start, name_length);
846*10d63b7dSRichard Lowe 			if (makefile_name->dollar) {
847*10d63b7dSRichard Lowe 				String_rec	destination;
848*10d63b7dSRichard Lowe 				wchar_t		buffer[STRING_BUFFER_LENGTH];
849*10d63b7dSRichard Lowe 				wchar_t		*p;
850*10d63b7dSRichard Lowe 				wchar_t		*q;
851*10d63b7dSRichard Lowe 
852*10d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(destination, buffer);
853*10d63b7dSRichard Lowe 				expand_value(makefile_name,
854*10d63b7dSRichard Lowe 					     &destination,
855*10d63b7dSRichard Lowe 					     false);
856*10d63b7dSRichard Lowe 				for (p = destination.buffer.start;
857*10d63b7dSRichard Lowe 				     (*p != (int) nul_char) && iswspace(*p);
858*10d63b7dSRichard Lowe 				     p++);
859*10d63b7dSRichard Lowe 				for (q = p;
860*10d63b7dSRichard Lowe 				     (*q != (int) nul_char) && !iswspace(*q);
861*10d63b7dSRichard Lowe 				     q++);
862*10d63b7dSRichard Lowe 				makefile_name = GETNAME(p, q-p);
863*10d63b7dSRichard Lowe 				if (destination.free_after_use) {
864*10d63b7dSRichard Lowe 					retmem(destination.buffer.start);
865*10d63b7dSRichard Lowe 				}
866*10d63b7dSRichard Lowe 			}
867*10d63b7dSRichard Lowe 			source_p++;
868*10d63b7dSRichard Lowe 			UNCACHE_SOURCE();
869*10d63b7dSRichard Lowe 			/* Read the file */
870*10d63b7dSRichard Lowe 			save_makefile_type = makefile_type;
871*10d63b7dSRichard Lowe 			if (read_simple_file(makefile_name,
872*10d63b7dSRichard Lowe 					     true,
873*10d63b7dSRichard Lowe 					     true,
874*10d63b7dSRichard Lowe 					     true,
875*10d63b7dSRichard Lowe 					     false,
876*10d63b7dSRichard Lowe 					     true,
877*10d63b7dSRichard Lowe 					     false) == failed) {
878*10d63b7dSRichard Lowe 				fatal_reader(gettext("Read of include file `%s' failed"),
879*10d63b7dSRichard Lowe 					     makefile_name->string_mb);
880*10d63b7dSRichard Lowe 			}
881*10d63b7dSRichard Lowe 			makefile_type = save_makefile_type;
882*10d63b7dSRichard Lowe 			do_not_exec_rule = save_do_not_exec_rule;
883*10d63b7dSRichard Lowe 			CACHE_SOURCE(0);
884*10d63b7dSRichard Lowe 			goto start_new_line;
885*10d63b7dSRichard Lowe 		} else {
886*10d63b7dSRichard Lowe 			source_p -= 7;
887*10d63b7dSRichard Lowe 		}
888*10d63b7dSRichard Lowe 	    } else {
889*10d63b7dSRichard Lowe 		/* Check if the word include was split across 8K boundary. */
890*10d63b7dSRichard Lowe 
891*10d63b7dSRichard Lowe 		tmp_bytes_left_in_string = source->string.text.end - source_p;
892*10d63b7dSRichard Lowe 		if (tmp_bytes_left_in_string < 8) {
893*10d63b7dSRichard Lowe 			tmp_maybe_include = false;
894*10d63b7dSRichard Lowe 			if (IS_WEQUALN(source_p,
895*10d63b7dSRichard Lowe 				       include_space,
896*10d63b7dSRichard Lowe 				       tmp_bytes_left_in_string)) {
897*10d63b7dSRichard Lowe 				tmp_maybe_include = true;
898*10d63b7dSRichard Lowe 			}
899*10d63b7dSRichard Lowe 			if (tmp_maybe_include) {
900*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
901*10d63b7dSRichard Lowe 				tmp_maybe_include = false;
902*10d63b7dSRichard Lowe 				goto line_evald;
903*10d63b7dSRichard Lowe 			}
904*10d63b7dSRichard Lowe 		}
905*10d63b7dSRichard Lowe 	    }
906*10d63b7dSRichard Lowe 	}
907*10d63b7dSRichard Lowe 
908*10d63b7dSRichard Lowe 	/* Reset the status in preparation for the new line */
909*10d63b7dSRichard Lowe 	for (nvp = &target; nvp != NULL; nvp = nvp->next) {
910*10d63b7dSRichard Lowe 		nvp->used = 0;
911*10d63b7dSRichard Lowe 	}
912*10d63b7dSRichard Lowe 	for (nvp = &depes; nvp != NULL; nvp = nvp->next) {
913*10d63b7dSRichard Lowe 		nvp->used = 0;
914*10d63b7dSRichard Lowe 	}
915*10d63b7dSRichard Lowe 	target_group_seen = false;
916*10d63b7dSRichard Lowe 	command = command_tail = NULL;
917*10d63b7dSRichard Lowe 	macro_value = NULL;
918*10d63b7dSRichard Lowe 	append = false;
919*10d63b7dSRichard Lowe 	current_names = &target;
920*10d63b7dSRichard Lowe 	SET_STATE(scan_name_state);
921*10d63b7dSRichard Lowe 	on_eoln_state = illegal_eoln_state;
922*10d63b7dSRichard Lowe 	separator = none_seen;
923*10d63b7dSRichard Lowe 
924*10d63b7dSRichard Lowe 	/* The state machine starts here */
925*10d63b7dSRichard Lowe  enter_state:
926*10d63b7dSRichard Lowe 	while (1) switch (state) {
927*10d63b7dSRichard Lowe 
928*10d63b7dSRichard Lowe /****************************************************************
929*10d63b7dSRichard Lowe  *	Scan name state
930*10d63b7dSRichard Lowe  */
931*10d63b7dSRichard Lowe case scan_name_state:
932*10d63b7dSRichard Lowe 	/* Scan an identifier. We skip over chars until we find a break char */
933*10d63b7dSRichard Lowe 	/* First skip white space. */
934*10d63b7dSRichard Lowe 	for (; 1; source_p++) switch (GET_CHAR()) {
935*10d63b7dSRichard Lowe 	case nul_char:
936*10d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
937*10d63b7dSRichard Lowe 		source_p--;
938*10d63b7dSRichard Lowe 		if (source == NULL) {
939*10d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
940*10d63b7dSRichard Lowe 		}
941*10d63b7dSRichard Lowe 		break;
942*10d63b7dSRichard Lowe 	case newline_char:
943*10d63b7dSRichard Lowe 		/* We found the end of the line. */
944*10d63b7dSRichard Lowe 		/* Do postprocessing or return error */
945*10d63b7dSRichard Lowe 		source_p++;
946*10d63b7dSRichard Lowe 		if (source->fd >= 0) {
947*10d63b7dSRichard Lowe 			line_number++;
948*10d63b7dSRichard Lowe 		}
949*10d63b7dSRichard Lowe 		GOTO_STATE(on_eoln_state);
950*10d63b7dSRichard Lowe 	case backslash_char:
951*10d63b7dSRichard Lowe 		/* Continuation */
952*10d63b7dSRichard Lowe 		if (*++source_p == (int) nul_char) {
953*10d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
954*10d63b7dSRichard Lowe 			if (source == NULL) {
955*10d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
956*10d63b7dSRichard Lowe 			}
957*10d63b7dSRichard Lowe 		}
958*10d63b7dSRichard Lowe 		if (*source_p == (int) newline_char) {
959*10d63b7dSRichard Lowe 			if (source->fd >= 0) {
960*10d63b7dSRichard Lowe 				line_number++;
961*10d63b7dSRichard Lowe 			}
962*10d63b7dSRichard Lowe 		} else {
963*10d63b7dSRichard Lowe 			source_p--;
964*10d63b7dSRichard Lowe 		}
965*10d63b7dSRichard Lowe 		break;
966*10d63b7dSRichard Lowe 	case tab_char:
967*10d63b7dSRichard Lowe 	case space_char:
968*10d63b7dSRichard Lowe 		/* Whitespace is skipped */
969*10d63b7dSRichard Lowe 		break;
970*10d63b7dSRichard Lowe 	case numbersign_char:
971*10d63b7dSRichard Lowe 		/* Comment. Skip over it */
972*10d63b7dSRichard Lowe 		for (; 1; source_p++) {
973*10d63b7dSRichard Lowe 			switch (GET_CHAR()) {
974*10d63b7dSRichard Lowe 			case nul_char:
975*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
976*10d63b7dSRichard Lowe 				if (source == NULL) {
977*10d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
978*10d63b7dSRichard Lowe 				}
979*10d63b7dSRichard Lowe 				if (source->error_converting) {
980*10d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
981*10d63b7dSRichard Lowe 					source->inp_buf_ptr++;
982*10d63b7dSRichard Lowe 				}
983*10d63b7dSRichard Lowe 				source_p--;
984*10d63b7dSRichard Lowe 				break;
985*10d63b7dSRichard Lowe 			case backslash_char:
986*10d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
987*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
988*10d63b7dSRichard Lowe 					if (source == NULL) {
989*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
990*10d63b7dSRichard Lowe 					}
991*10d63b7dSRichard Lowe 					if (source->error_converting) {
992*10d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
993*10d63b7dSRichard Lowe 						source->inp_buf_ptr++;
994*10d63b7dSRichard Lowe 						source_p--;
995*10d63b7dSRichard Lowe 						break;
996*10d63b7dSRichard Lowe 					}
997*10d63b7dSRichard Lowe 				}
998*10d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
999*10d63b7dSRichard Lowe 					if (source->fd >= 0) {
1000*10d63b7dSRichard Lowe 						line_number++;
1001*10d63b7dSRichard Lowe 					}
1002*10d63b7dSRichard Lowe 				}
1003*10d63b7dSRichard Lowe 				break;
1004*10d63b7dSRichard Lowe 			case newline_char:
1005*10d63b7dSRichard Lowe 				source_p++;
1006*10d63b7dSRichard Lowe 				if (source->fd >= 0) {
1007*10d63b7dSRichard Lowe 					line_number++;
1008*10d63b7dSRichard Lowe 				}
1009*10d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
1010*10d63b7dSRichard Lowe 			}
1011*10d63b7dSRichard Lowe 		}
1012*10d63b7dSRichard Lowe 	case dollar_char:
1013*10d63b7dSRichard Lowe 		/* Macro reference. Expand and push value */
1014*10d63b7dSRichard Lowe 		if (source->already_expanded) {
1015*10d63b7dSRichard Lowe 			goto scan_name;
1016*10d63b7dSRichard Lowe 		}
1017*10d63b7dSRichard Lowe 		source_p++;
1018*10d63b7dSRichard Lowe 		UNCACHE_SOURCE();
1019*10d63b7dSRichard Lowe 		{
1020*10d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
1021*10d63b7dSRichard Lowe 			source = push_macro_value(t,
1022*10d63b7dSRichard Lowe 						  buffer,
1023*10d63b7dSRichard Lowe 						  sizeof buffer,
1024*10d63b7dSRichard Lowe 						  source);
1025*10d63b7dSRichard Lowe 		}
1026*10d63b7dSRichard Lowe 		CACHE_SOURCE(1);
1027*10d63b7dSRichard Lowe 		break;
1028*10d63b7dSRichard Lowe 	default:
1029*10d63b7dSRichard Lowe 		/* End of white space */
1030*10d63b7dSRichard Lowe 		goto scan_name;
1031*10d63b7dSRichard Lowe 	}
1032*10d63b7dSRichard Lowe 
1033*10d63b7dSRichard Lowe 	/* First proper identifier character */
1034*10d63b7dSRichard Lowe  scan_name:
1035*10d63b7dSRichard Lowe 
1036*10d63b7dSRichard Lowe 	string_start = source_p;
1037*10d63b7dSRichard Lowe 	paren_count = brace_count = 0;
1038*10d63b7dSRichard Lowe 	macro_seen_in_string = false;
1039*10d63b7dSRichard Lowe 	resume_name_scan:
1040*10d63b7dSRichard Lowe 	for (; 1; source_p++) {
1041*10d63b7dSRichard Lowe 		switch (GET_CHAR()) {
1042*10d63b7dSRichard Lowe 		case nul_char:
1043*10d63b7dSRichard Lowe 			/* Save what we have seen so far of the identifier */
1044*10d63b7dSRichard Lowe 			if (source_p != string_start) {
1045*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
1046*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
1047*10d63b7dSRichard Lowe 							       name_buffer);
1048*10d63b7dSRichard Lowe 				}
1049*10d63b7dSRichard Lowe 				append_string(string_start,
1050*10d63b7dSRichard Lowe 					      &name_string,
1051*10d63b7dSRichard Lowe 					      source_p - string_start);
1052*10d63b7dSRichard Lowe 				macro_seen_in_string = true;
1053*10d63b7dSRichard Lowe 			}
1054*10d63b7dSRichard Lowe 			/* Get more text to read */
1055*10d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
1056*10d63b7dSRichard Lowe 			string_start = source_p;
1057*10d63b7dSRichard Lowe 			source_p--;
1058*10d63b7dSRichard Lowe 			if (source == NULL) {
1059*10d63b7dSRichard Lowe 				GOTO_STATE(on_eoln_state);
1060*10d63b7dSRichard Lowe 			}
1061*10d63b7dSRichard Lowe 			break;
1062*10d63b7dSRichard Lowe 		case newline_char:
1063*10d63b7dSRichard Lowe 			if (paren_count > 0) {
1064*10d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `(' on line"));
1065*10d63b7dSRichard Lowe 			}
1066*10d63b7dSRichard Lowe 			if (brace_count > 0) {
1067*10d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `{' on line"));
1068*10d63b7dSRichard Lowe 			}
1069*10d63b7dSRichard Lowe 			source_p++;
1070*10d63b7dSRichard Lowe 			/* Enter name */
1071*10d63b7dSRichard Lowe 			current_names = enter_name(&name_string,
1072*10d63b7dSRichard Lowe 						   macro_seen_in_string,
1073*10d63b7dSRichard Lowe 						   string_start,
1074*10d63b7dSRichard Lowe 						   source_p - 1,
1075*10d63b7dSRichard Lowe 						   current_names,
1076*10d63b7dSRichard Lowe 						   &extra_names,
1077*10d63b7dSRichard Lowe 						   &target_group_seen);
1078*10d63b7dSRichard Lowe 			first_target = false;
1079*10d63b7dSRichard Lowe 			if (extra_names == NULL) {
1080*10d63b7dSRichard Lowe 				extra_names = (Name_vector)
1081*10d63b7dSRichard Lowe 				  alloca((int) sizeof (Name_vector_rec));
1082*10d63b7dSRichard Lowe 			}
1083*10d63b7dSRichard Lowe 			/* Do postprocessing or return error */
1084*10d63b7dSRichard Lowe 			if (source->fd >= 0) {
1085*10d63b7dSRichard Lowe 				line_number++;
1086*10d63b7dSRichard Lowe 			}
1087*10d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
1088*10d63b7dSRichard Lowe 		case backslash_char:
1089*10d63b7dSRichard Lowe 			/* Check if this is a quoting backslash */
1090*10d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
1091*10d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
1092*10d63b7dSRichard Lowe 						       name_buffer);
1093*10d63b7dSRichard Lowe 				macro_seen_in_string = true;
1094*10d63b7dSRichard Lowe 			}
1095*10d63b7dSRichard Lowe 			append_string(string_start,
1096*10d63b7dSRichard Lowe 				      &name_string,
1097*10d63b7dSRichard Lowe 				      source_p - string_start);
1098*10d63b7dSRichard Lowe 			if (*++source_p == (int) nul_char) {
1099*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
1100*10d63b7dSRichard Lowe 				if (source == NULL) {
1101*10d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
1102*10d63b7dSRichard Lowe 				}
1103*10d63b7dSRichard Lowe 			}
1104*10d63b7dSRichard Lowe 			if (*source_p == (int) newline_char) {
1105*10d63b7dSRichard Lowe 				if (source->fd >= 0) {
1106*10d63b7dSRichard Lowe 					line_number++;
1107*10d63b7dSRichard Lowe 				}
1108*10d63b7dSRichard Lowe 				*source_p = (int) space_char;
1109*10d63b7dSRichard Lowe 				string_start = source_p;
1110*10d63b7dSRichard Lowe 				goto resume_name_scan;
1111*10d63b7dSRichard Lowe 			} else {
1112*10d63b7dSRichard Lowe 				string_start = source_p;
1113*10d63b7dSRichard Lowe 				break;
1114*10d63b7dSRichard Lowe 			}
1115*10d63b7dSRichard Lowe 			break;
1116*10d63b7dSRichard Lowe 		case numbersign_char:
1117*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1118*10d63b7dSRichard Lowe 				break;
1119*10d63b7dSRichard Lowe 			}
1120*10d63b7dSRichard Lowe 			fatal_reader(gettext("Unexpected comment seen"));
1121*10d63b7dSRichard Lowe 		case dollar_char:
1122*10d63b7dSRichard Lowe 			if (source->already_expanded) {
1123*10d63b7dSRichard Lowe 				break;
1124*10d63b7dSRichard Lowe 			}
1125*10d63b7dSRichard Lowe 			/* Save the identifier so far */
1126*10d63b7dSRichard Lowe 			if (source_p != string_start) {
1127*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
1128*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
1129*10d63b7dSRichard Lowe 							       name_buffer);
1130*10d63b7dSRichard Lowe 				}
1131*10d63b7dSRichard Lowe 				append_string(string_start,
1132*10d63b7dSRichard Lowe 					      &name_string,
1133*10d63b7dSRichard Lowe 					      source_p - string_start);
1134*10d63b7dSRichard Lowe 				macro_seen_in_string = true;
1135*10d63b7dSRichard Lowe 			}
1136*10d63b7dSRichard Lowe 			/* Eval and push the macro */
1137*10d63b7dSRichard Lowe 			source_p++;
1138*10d63b7dSRichard Lowe 			UNCACHE_SOURCE();
1139*10d63b7dSRichard Lowe 			{
1140*10d63b7dSRichard Lowe 				Source t =
1141*10d63b7dSRichard Lowe 				  (Source) alloca((int) sizeof (Source_rec));
1142*10d63b7dSRichard Lowe 				source = push_macro_value(t,
1143*10d63b7dSRichard Lowe 							  buffer,
1144*10d63b7dSRichard Lowe 							  sizeof buffer,
1145*10d63b7dSRichard Lowe 							  source);
1146*10d63b7dSRichard Lowe 			}
1147*10d63b7dSRichard Lowe 			CACHE_SOURCE(1);
1148*10d63b7dSRichard Lowe 			string_start = source_p + 1;
1149*10d63b7dSRichard Lowe 			break;
1150*10d63b7dSRichard Lowe 		case parenleft_char:
1151*10d63b7dSRichard Lowe 			paren_count++;
1152*10d63b7dSRichard Lowe 			break;
1153*10d63b7dSRichard Lowe 		case parenright_char:
1154*10d63b7dSRichard Lowe 			if (--paren_count < 0) {
1155*10d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `)' on line"));
1156*10d63b7dSRichard Lowe 			}
1157*10d63b7dSRichard Lowe 			break;
1158*10d63b7dSRichard Lowe 		case braceleft_char:
1159*10d63b7dSRichard Lowe 			brace_count++;
1160*10d63b7dSRichard Lowe 			break;
1161*10d63b7dSRichard Lowe 		case braceright_char:
1162*10d63b7dSRichard Lowe 			if (--brace_count < 0) {
1163*10d63b7dSRichard Lowe 				fatal_reader(gettext("Unmatched `}' on line"));
1164*10d63b7dSRichard Lowe 			}
1165*10d63b7dSRichard Lowe 			break;
1166*10d63b7dSRichard Lowe 		case ampersand_char:
1167*10d63b7dSRichard Lowe 		case greater_char:
1168*10d63b7dSRichard Lowe 		case bar_char:
1169*10d63b7dSRichard Lowe 			if (paren_count + brace_count == 0) {
1170*10d63b7dSRichard Lowe 				source_p++;
1171*10d63b7dSRichard Lowe 			}
1172*10d63b7dSRichard Lowe 			/* Fall into */
1173*10d63b7dSRichard Lowe 		case tab_char:
1174*10d63b7dSRichard Lowe 		case space_char:
1175*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1176*10d63b7dSRichard Lowe 				break;
1177*10d63b7dSRichard Lowe 			}
1178*10d63b7dSRichard Lowe 			current_names = enter_name(&name_string,
1179*10d63b7dSRichard Lowe 						   macro_seen_in_string,
1180*10d63b7dSRichard Lowe 						   string_start,
1181*10d63b7dSRichard Lowe 						   source_p,
1182*10d63b7dSRichard Lowe 						   current_names,
1183*10d63b7dSRichard Lowe 						   &extra_names,
1184*10d63b7dSRichard Lowe 						   &target_group_seen);
1185*10d63b7dSRichard Lowe 			first_target = false;
1186*10d63b7dSRichard Lowe 			if (extra_names == NULL) {
1187*10d63b7dSRichard Lowe 				extra_names = (Name_vector)
1188*10d63b7dSRichard Lowe 				  alloca((int) sizeof (Name_vector_rec));
1189*10d63b7dSRichard Lowe 			}
1190*10d63b7dSRichard Lowe 			goto enter_state;
1191*10d63b7dSRichard Lowe 		case colon_char:
1192*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1193*10d63b7dSRichard Lowe 				break;
1194*10d63b7dSRichard Lowe 			}
1195*10d63b7dSRichard Lowe 			if (separator == conditional_seen) {
1196*10d63b7dSRichard Lowe 				break;
1197*10d63b7dSRichard Lowe 			}
1198*10d63b7dSRichard Lowe /** POSIX **/
1199*10d63b7dSRichard Lowe #if 0
1200*10d63b7dSRichard Lowe 			if(posix) {
1201*10d63b7dSRichard Lowe 			  emptycount = 0;
1202*10d63b7dSRichard Lowe 			}
1203*10d63b7dSRichard Lowe #endif
1204*10d63b7dSRichard Lowe /** END POSIX **/
1205*10d63b7dSRichard Lowe 			/* End of the target list. We now start reading */
1206*10d63b7dSRichard Lowe 			/* dependencies or a conditional assignment */
1207*10d63b7dSRichard Lowe 			if (separator != none_seen) {
1208*10d63b7dSRichard Lowe 				fatal_reader(gettext("Extra `:', `::', or `:=' on dependency line"));
1209*10d63b7dSRichard Lowe 			}
1210*10d63b7dSRichard Lowe 			/* Enter the last target */
1211*10d63b7dSRichard Lowe 			if ((string_start != source_p) ||
1212*10d63b7dSRichard Lowe 			    macro_seen_in_string) {
1213*10d63b7dSRichard Lowe 				current_names =
1214*10d63b7dSRichard Lowe 				  enter_name(&name_string,
1215*10d63b7dSRichard Lowe 					     macro_seen_in_string,
1216*10d63b7dSRichard Lowe 					     string_start,
1217*10d63b7dSRichard Lowe 					     source_p,
1218*10d63b7dSRichard Lowe 					     current_names,
1219*10d63b7dSRichard Lowe 					     &extra_names,
1220*10d63b7dSRichard Lowe 					     &target_group_seen);
1221*10d63b7dSRichard Lowe 				first_target = false;
1222*10d63b7dSRichard Lowe 				if (extra_names == NULL) {
1223*10d63b7dSRichard Lowe 					extra_names = (Name_vector)
1224*10d63b7dSRichard Lowe 					  alloca((int)
1225*10d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
1226*10d63b7dSRichard Lowe 				}
1227*10d63b7dSRichard Lowe 			}
1228*10d63b7dSRichard Lowe 			/* Check if it is ":" "::" or ":=" */
1229*10d63b7dSRichard Lowe 		scan_colon_label:
1230*10d63b7dSRichard Lowe 			switch (*++source_p) {
1231*10d63b7dSRichard Lowe 			case nul_char:
1232*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
1233*10d63b7dSRichard Lowe 				source_p--;
1234*10d63b7dSRichard Lowe 				if (source == NULL) {
1235*10d63b7dSRichard Lowe 					GOTO_STATE(enter_dependencies_state);
1236*10d63b7dSRichard Lowe 				}
1237*10d63b7dSRichard Lowe 				goto scan_colon_label;
1238*10d63b7dSRichard Lowe 			case equal_char:
1239*10d63b7dSRichard Lowe 				if(svr4) {
1240*10d63b7dSRichard Lowe 				  fatal_reader(gettext("syntax error"));
1241*10d63b7dSRichard Lowe 				}
1242*10d63b7dSRichard Lowe 				separator = conditional_seen;
1243*10d63b7dSRichard Lowe 				source_p++;
1244*10d63b7dSRichard Lowe 				current_names = &depes;
1245*10d63b7dSRichard Lowe 				GOTO_STATE(scan_name_state);
1246*10d63b7dSRichard Lowe 			case colon_char:
1247*10d63b7dSRichard Lowe 				separator = two_colon;
1248*10d63b7dSRichard Lowe 				source_p++;
1249*10d63b7dSRichard Lowe 				break;
1250*10d63b7dSRichard Lowe 			default:
1251*10d63b7dSRichard Lowe 				separator = one_colon;
1252*10d63b7dSRichard Lowe 			}
1253*10d63b7dSRichard Lowe 			current_names = &depes;
1254*10d63b7dSRichard Lowe 			on_eoln_state = enter_dependencies_state;
1255*10d63b7dSRichard Lowe 			GOTO_STATE(scan_name_state);
1256*10d63b7dSRichard Lowe 		case semicolon_char:
1257*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1258*10d63b7dSRichard Lowe 				break;
1259*10d63b7dSRichard Lowe 			}
1260*10d63b7dSRichard Lowe 			/* End of reading names. Start reading the rule */
1261*10d63b7dSRichard Lowe 			if ((separator != one_colon) &&
1262*10d63b7dSRichard Lowe 			    (separator != two_colon)) {
1263*10d63b7dSRichard Lowe 				fatal_reader(gettext("Unexpected command seen"));
1264*10d63b7dSRichard Lowe 			}
1265*10d63b7dSRichard Lowe 			/* Enter the last dependency */
1266*10d63b7dSRichard Lowe 			if ((string_start != source_p) ||
1267*10d63b7dSRichard Lowe 			    macro_seen_in_string) {
1268*10d63b7dSRichard Lowe 				current_names =
1269*10d63b7dSRichard Lowe 				  enter_name(&name_string,
1270*10d63b7dSRichard Lowe 					     macro_seen_in_string,
1271*10d63b7dSRichard Lowe 					     string_start,
1272*10d63b7dSRichard Lowe 					     source_p,
1273*10d63b7dSRichard Lowe 					     current_names,
1274*10d63b7dSRichard Lowe 					     &extra_names,
1275*10d63b7dSRichard Lowe 					     &target_group_seen);
1276*10d63b7dSRichard Lowe 				first_target = false;
1277*10d63b7dSRichard Lowe 				if (extra_names == NULL) {
1278*10d63b7dSRichard Lowe 					extra_names = (Name_vector)
1279*10d63b7dSRichard Lowe 					  alloca((int)
1280*10d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
1281*10d63b7dSRichard Lowe 				}
1282*10d63b7dSRichard Lowe 			}
1283*10d63b7dSRichard Lowe 			source_p++;
1284*10d63b7dSRichard Lowe 			/* Make sure to enter a rule even if the is */
1285*10d63b7dSRichard Lowe 			/* no text here */
1286*10d63b7dSRichard Lowe 			command = command_tail = ALLOC(Cmd_line);
1287*10d63b7dSRichard Lowe 			command->next = NULL;
1288*10d63b7dSRichard Lowe 			command->command_line = empty_name;
1289*10d63b7dSRichard Lowe 			command->make_refd = false;
1290*10d63b7dSRichard Lowe 			command->ignore_command_dependency = false;
1291*10d63b7dSRichard Lowe 			command->assign = false;
1292*10d63b7dSRichard Lowe 			command->ignore_error = false;
1293*10d63b7dSRichard Lowe 			command->silent = false;
1294*10d63b7dSRichard Lowe 
1295*10d63b7dSRichard Lowe 			GOTO_STATE(scan_command_state);
1296*10d63b7dSRichard Lowe 		case plus_char:
1297*10d63b7dSRichard Lowe 			/*
1298*10d63b7dSRichard Lowe 			** following code drops the target separator plus char if it starts
1299*10d63b7dSRichard Lowe 			** a line.
1300*10d63b7dSRichard Lowe 			*/
1301*10d63b7dSRichard Lowe 			if(first_target && !macro_seen_in_string &&
1302*10d63b7dSRichard Lowe 					source_p == string_start) {
1303*10d63b7dSRichard Lowe 				for (; 1; source_p++)
1304*10d63b7dSRichard Lowe 				switch (GET_CHAR()) {
1305*10d63b7dSRichard Lowe 				case nul_char:
1306*10d63b7dSRichard Lowe 					if (source_p != string_start) {
1307*10d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
1308*10d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
1309*10d63b7dSRichard Lowe 									       name_buffer);
1310*10d63b7dSRichard Lowe 						}
1311*10d63b7dSRichard Lowe 						append_string(string_start,
1312*10d63b7dSRichard Lowe 							      &name_string,
1313*10d63b7dSRichard Lowe 							      source_p - string_start);
1314*10d63b7dSRichard Lowe 						macro_seen_in_string = true;
1315*10d63b7dSRichard Lowe 					}
1316*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1317*10d63b7dSRichard Lowe 					string_start = source_p;
1318*10d63b7dSRichard Lowe 					source_p--;
1319*10d63b7dSRichard Lowe 					if (source == NULL) {
1320*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
1321*10d63b7dSRichard Lowe 					}
1322*10d63b7dSRichard Lowe 					break;
1323*10d63b7dSRichard Lowe 				case plus_char:
1324*10d63b7dSRichard Lowe 					source_p++;
1325*10d63b7dSRichard Lowe 					while (*source_p == (int) nul_char) {
1326*10d63b7dSRichard Lowe 						if (source_p != string_start) {
1327*10d63b7dSRichard Lowe 							if (!macro_seen_in_string) {
1328*10d63b7dSRichard Lowe 								INIT_STRING_FROM_STACK(name_string,
1329*10d63b7dSRichard Lowe 									       name_buffer);
1330*10d63b7dSRichard Lowe 							}
1331*10d63b7dSRichard Lowe 							append_string(string_start,
1332*10d63b7dSRichard Lowe 								      &name_string,
1333*10d63b7dSRichard Lowe 								      source_p - string_start);
1334*10d63b7dSRichard Lowe 							macro_seen_in_string = true;
1335*10d63b7dSRichard Lowe 						}
1336*10d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
1337*10d63b7dSRichard Lowe 						string_start = source_p;
1338*10d63b7dSRichard Lowe 						if (source == NULL) {
1339*10d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
1340*10d63b7dSRichard Lowe 						}
1341*10d63b7dSRichard Lowe 					}
1342*10d63b7dSRichard Lowe 					if (*source_p == (int) tab_char ||
1343*10d63b7dSRichard Lowe 							*source_p == (int) space_char) {
1344*10d63b7dSRichard Lowe 						macro_seen_in_string = false;
1345*10d63b7dSRichard Lowe 						string_start = source_p + 1;
1346*10d63b7dSRichard Lowe 					} else {
1347*10d63b7dSRichard Lowe 						goto resume_name_scan;
1348*10d63b7dSRichard Lowe 					}
1349*10d63b7dSRichard Lowe 					break;
1350*10d63b7dSRichard Lowe 				case tab_char:
1351*10d63b7dSRichard Lowe 				case space_char:
1352*10d63b7dSRichard Lowe 					string_start = source_p + 1;
1353*10d63b7dSRichard Lowe 					break;
1354*10d63b7dSRichard Lowe 				default:
1355*10d63b7dSRichard Lowe 					goto resume_name_scan;
1356*10d63b7dSRichard Lowe 				}
1357*10d63b7dSRichard Lowe 			}
1358*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1359*10d63b7dSRichard Lowe 				break;
1360*10d63b7dSRichard Lowe 			}
1361*10d63b7dSRichard Lowe 			/* We found "+=" construct */
1362*10d63b7dSRichard Lowe 			if (source_p != string_start) {
1363*10d63b7dSRichard Lowe 				/* "+" is not a break char. */
1364*10d63b7dSRichard Lowe 				/* Ignore it if it is part of an identifier */
1365*10d63b7dSRichard Lowe 				source_p++;
1366*10d63b7dSRichard Lowe 				goto resume_name_scan;
1367*10d63b7dSRichard Lowe 			}
1368*10d63b7dSRichard Lowe 			/* Make sure the "+" is followed by a "=" */
1369*10d63b7dSRichard Lowe 		scan_append:
1370*10d63b7dSRichard Lowe 			switch (*++source_p) {
1371*10d63b7dSRichard Lowe 			case nul_char:
1372*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
1373*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
1374*10d63b7dSRichard Lowe 							       name_buffer);
1375*10d63b7dSRichard Lowe 				}
1376*10d63b7dSRichard Lowe 				append_string(string_start,
1377*10d63b7dSRichard Lowe 					      &name_string,
1378*10d63b7dSRichard Lowe 					      source_p - string_start);
1379*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
1380*10d63b7dSRichard Lowe 				source_p--;
1381*10d63b7dSRichard Lowe 				string_start = source_p;
1382*10d63b7dSRichard Lowe 				if (source == NULL) {
1383*10d63b7dSRichard Lowe 					GOTO_STATE(illegal_eoln_state);
1384*10d63b7dSRichard Lowe 				}
1385*10d63b7dSRichard Lowe 				goto scan_append;
1386*10d63b7dSRichard Lowe 			case equal_char:
1387*10d63b7dSRichard Lowe 				if(!svr4) {
1388*10d63b7dSRichard Lowe 				  append = true;
1389*10d63b7dSRichard Lowe 				} else {
1390*10d63b7dSRichard Lowe 				  fatal_reader(gettext("Must be a separator on rules"));
1391*10d63b7dSRichard Lowe 				}
1392*10d63b7dSRichard Lowe 				break;
1393*10d63b7dSRichard Lowe 			default:
1394*10d63b7dSRichard Lowe 				/* The "+" just starts a regular name. */
1395*10d63b7dSRichard Lowe 				/* Start reading that name */
1396*10d63b7dSRichard Lowe 				goto resume_name_scan;
1397*10d63b7dSRichard Lowe 			}
1398*10d63b7dSRichard Lowe 			/* Fall into */
1399*10d63b7dSRichard Lowe 		case equal_char:
1400*10d63b7dSRichard Lowe 			if (paren_count + brace_count > 0) {
1401*10d63b7dSRichard Lowe 				break;
1402*10d63b7dSRichard Lowe 			}
1403*10d63b7dSRichard Lowe 			/* We found macro assignment. */
1404*10d63b7dSRichard Lowe 			/* Check if it is legal and if it is appending */
1405*10d63b7dSRichard Lowe 			switch (separator) {
1406*10d63b7dSRichard Lowe 			case none_seen:
1407*10d63b7dSRichard Lowe 				separator = equal_seen;
1408*10d63b7dSRichard Lowe 				on_eoln_state = enter_equal_state;
1409*10d63b7dSRichard Lowe 				break;
1410*10d63b7dSRichard Lowe 			case conditional_seen:
1411*10d63b7dSRichard Lowe 				on_eoln_state = enter_conditional_state;
1412*10d63b7dSRichard Lowe 				break;
1413*10d63b7dSRichard Lowe 			default:
1414*10d63b7dSRichard Lowe 				/* Reader must special check for "MACRO:sh=" */
1415*10d63b7dSRichard Lowe 				/* notation */
1416*10d63b7dSRichard Lowe 				if (sh_name == NULL) {
1417*10d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "sh");
1418*10d63b7dSRichard Lowe 					sh_name = GETNAME(wcs_buffer, FIND_LENGTH);
1419*10d63b7dSRichard Lowe 					MBSTOWCS(wcs_buffer, "shell");
1420*10d63b7dSRichard Lowe 					shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
1421*10d63b7dSRichard Lowe 				}
1422*10d63b7dSRichard Lowe 
1423*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
1424*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
1425*10d63b7dSRichard Lowe 						       name_buffer);
1426*10d63b7dSRichard Lowe 				}
1427*10d63b7dSRichard Lowe 				append_string(string_start,
1428*10d63b7dSRichard Lowe 					      &name_string,
1429*10d63b7dSRichard Lowe 					      source_p - string_start
1430*10d63b7dSRichard Lowe 				);
1431*10d63b7dSRichard Lowe 
1432*10d63b7dSRichard Lowe 				if ( (((target.used == 1) &&
1433*10d63b7dSRichard Lowe 				     (depes.used == 1) &&
1434*10d63b7dSRichard Lowe 				     (depes.names[0] == sh_name)) ||
1435*10d63b7dSRichard Lowe 				    ((target.used == 1) &&
1436*10d63b7dSRichard Lowe 				     (depes.used == 0) &&
1437*10d63b7dSRichard Lowe 				     (separator == one_colon) &&
1438*10d63b7dSRichard Lowe 				     (GETNAME(name_string.buffer.start,FIND_LENGTH) == sh_name))) &&
1439*10d63b7dSRichard Lowe 				    (!svr4)) {
1440*10d63b7dSRichard Lowe 					String_rec	macro_name;
1441*10d63b7dSRichard Lowe 					wchar_t		buffer[100];
1442*10d63b7dSRichard Lowe 
1443*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(macro_name,
1444*10d63b7dSRichard Lowe 							       buffer);
1445*10d63b7dSRichard Lowe 					APPEND_NAME(target.names[0],
1446*10d63b7dSRichard Lowe 						      &macro_name,
1447*10d63b7dSRichard Lowe 						      FIND_LENGTH);
1448*10d63b7dSRichard Lowe 					append_char((int) colon_char,
1449*10d63b7dSRichard Lowe 						    &macro_name);
1450*10d63b7dSRichard Lowe 					APPEND_NAME(sh_name,
1451*10d63b7dSRichard Lowe 						      &macro_name,
1452*10d63b7dSRichard Lowe 						      FIND_LENGTH);
1453*10d63b7dSRichard Lowe 					target.names[0] =
1454*10d63b7dSRichard Lowe 					  GETNAME(macro_name.buffer.start,
1455*10d63b7dSRichard Lowe 						  FIND_LENGTH);
1456*10d63b7dSRichard Lowe 					separator = equal_seen;
1457*10d63b7dSRichard Lowe 					on_eoln_state = enter_equal_state;
1458*10d63b7dSRichard Lowe 					break;
1459*10d63b7dSRichard Lowe 				} else if ( (((target.used == 1) &&
1460*10d63b7dSRichard Lowe 					    (depes.used == 1) &&
1461*10d63b7dSRichard Lowe 					    (depes.names[0] == shell_name)) ||
1462*10d63b7dSRichard Lowe 					   ((target.used == 1) &&
1463*10d63b7dSRichard Lowe 					    (depes.used == 0) &&
1464*10d63b7dSRichard Lowe 					    (separator == one_colon) &&
1465*10d63b7dSRichard Lowe 					    (GETNAME(name_string.buffer.start,FIND_LENGTH) == shell_name))) &&
1466*10d63b7dSRichard Lowe 					   (!svr4)) {
1467*10d63b7dSRichard Lowe 					String_rec	macro_name;
1468*10d63b7dSRichard Lowe 					wchar_t		buffer[100];
1469*10d63b7dSRichard Lowe 
1470*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(macro_name,
1471*10d63b7dSRichard Lowe 							       buffer);
1472*10d63b7dSRichard Lowe 					APPEND_NAME(target.names[0],
1473*10d63b7dSRichard Lowe 						      &macro_name,
1474*10d63b7dSRichard Lowe 						      FIND_LENGTH);
1475*10d63b7dSRichard Lowe 					append_char((int) colon_char,
1476*10d63b7dSRichard Lowe 						    &macro_name);
1477*10d63b7dSRichard Lowe 					APPEND_NAME(shell_name,
1478*10d63b7dSRichard Lowe 						      &macro_name,
1479*10d63b7dSRichard Lowe 						      FIND_LENGTH);
1480*10d63b7dSRichard Lowe 					target.names[0] =
1481*10d63b7dSRichard Lowe 					  GETNAME(macro_name.buffer.start,
1482*10d63b7dSRichard Lowe 						  FIND_LENGTH);
1483*10d63b7dSRichard Lowe 					separator = equal_seen;
1484*10d63b7dSRichard Lowe 					on_eoln_state = enter_equal_state;
1485*10d63b7dSRichard Lowe 					break;
1486*10d63b7dSRichard Lowe 				}
1487*10d63b7dSRichard Lowe 				if(svr4) {
1488*10d63b7dSRichard Lowe 				  fatal_reader(gettext("syntax error"));
1489*10d63b7dSRichard Lowe 				}
1490*10d63b7dSRichard Lowe 				else {
1491*10d63b7dSRichard Lowe 				  fatal_reader(gettext("Macro assignment on dependency line"));
1492*10d63b7dSRichard Lowe 				}
1493*10d63b7dSRichard Lowe 			}
1494*10d63b7dSRichard Lowe 			if (append) {
1495*10d63b7dSRichard Lowe 				source_p--;
1496*10d63b7dSRichard Lowe 			}
1497*10d63b7dSRichard Lowe 			/* Enter the macro name */
1498*10d63b7dSRichard Lowe 			if ((string_start != source_p) ||
1499*10d63b7dSRichard Lowe 			    macro_seen_in_string) {
1500*10d63b7dSRichard Lowe 				current_names =
1501*10d63b7dSRichard Lowe 				  enter_name(&name_string,
1502*10d63b7dSRichard Lowe 					     macro_seen_in_string,
1503*10d63b7dSRichard Lowe 					     string_start,
1504*10d63b7dSRichard Lowe 					     source_p,
1505*10d63b7dSRichard Lowe 					     current_names,
1506*10d63b7dSRichard Lowe 					     &extra_names,
1507*10d63b7dSRichard Lowe 					     &target_group_seen);
1508*10d63b7dSRichard Lowe 				first_target = false;
1509*10d63b7dSRichard Lowe 				if (extra_names == NULL) {
1510*10d63b7dSRichard Lowe 					extra_names = (Name_vector)
1511*10d63b7dSRichard Lowe 					  alloca((int)
1512*10d63b7dSRichard Lowe 						 sizeof (Name_vector_rec));
1513*10d63b7dSRichard Lowe 				}
1514*10d63b7dSRichard Lowe 			}
1515*10d63b7dSRichard Lowe 			if (append) {
1516*10d63b7dSRichard Lowe 				source_p++;
1517*10d63b7dSRichard Lowe 			}
1518*10d63b7dSRichard Lowe 			macro_value = NULL;
1519*10d63b7dSRichard Lowe 			source_p++;
1520*10d63b7dSRichard Lowe 			distance = 0;
1521*10d63b7dSRichard Lowe 			/* Skip whitespace to the start of the value */
1522*10d63b7dSRichard Lowe 			macro_seen_in_string = false;
1523*10d63b7dSRichard Lowe 			for (; 1; source_p++) {
1524*10d63b7dSRichard Lowe 				switch (GET_CHAR()) {
1525*10d63b7dSRichard Lowe 				case nul_char:
1526*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1527*10d63b7dSRichard Lowe 					source_p--;
1528*10d63b7dSRichard Lowe 					if (source == NULL) {
1529*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
1530*10d63b7dSRichard Lowe 					}
1531*10d63b7dSRichard Lowe 					break;
1532*10d63b7dSRichard Lowe 				case backslash_char:
1533*10d63b7dSRichard Lowe 					if (*++source_p == (int) nul_char) {
1534*10d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
1535*10d63b7dSRichard Lowe 						if (source == NULL) {
1536*10d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
1537*10d63b7dSRichard Lowe 						}
1538*10d63b7dSRichard Lowe 					}
1539*10d63b7dSRichard Lowe 					if (*source_p != (int) newline_char) {
1540*10d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
1541*10d63b7dSRichard Lowe 							macro_seen_in_string =
1542*10d63b7dSRichard Lowe 							  true;
1543*10d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
1544*10d63b7dSRichard Lowe 									       name_buffer);
1545*10d63b7dSRichard Lowe 						}
1546*10d63b7dSRichard Lowe 						append_char((int)
1547*10d63b7dSRichard Lowe 							    backslash_char,
1548*10d63b7dSRichard Lowe 							    &name_string);
1549*10d63b7dSRichard Lowe 						append_char(*source_p,
1550*10d63b7dSRichard Lowe 							    &name_string);
1551*10d63b7dSRichard Lowe 						string_start = source_p+1;
1552*10d63b7dSRichard Lowe 						goto macro_value_start;
1553*10d63b7dSRichard Lowe 					} else {
1554*10d63b7dSRichard Lowe                                             if (source->fd >= 0) {
1555*10d63b7dSRichard Lowe                                             	line_number++;
1556*10d63b7dSRichard Lowe                                             }
1557*10d63b7dSRichard Lowe                                         }
1558*10d63b7dSRichard Lowe 					break;
1559*10d63b7dSRichard Lowe 				case newline_char:
1560*10d63b7dSRichard Lowe 				case numbersign_char:
1561*10d63b7dSRichard Lowe 					string_start = source_p;
1562*10d63b7dSRichard Lowe 					goto macro_value_end;
1563*10d63b7dSRichard Lowe 				case tab_char:
1564*10d63b7dSRichard Lowe 				case space_char:
1565*10d63b7dSRichard Lowe 					break;
1566*10d63b7dSRichard Lowe 				default:
1567*10d63b7dSRichard Lowe 					string_start = source_p;
1568*10d63b7dSRichard Lowe 					goto macro_value_start;
1569*10d63b7dSRichard Lowe 				}
1570*10d63b7dSRichard Lowe 			}
1571*10d63b7dSRichard Lowe 		macro_value_start:
1572*10d63b7dSRichard Lowe 			/* Find the end of the value */
1573*10d63b7dSRichard Lowe 			for (; 1; source_p++) {
1574*10d63b7dSRichard Lowe 				if (distance != 0) {
1575*10d63b7dSRichard Lowe 					*source_p = *(source_p + distance);
1576*10d63b7dSRichard Lowe 				}
1577*10d63b7dSRichard Lowe 				switch (GET_CHAR()) {
1578*10d63b7dSRichard Lowe 				case nul_char:
1579*10d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
1580*10d63b7dSRichard Lowe 						macro_seen_in_string = true;
1581*10d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
1582*10d63b7dSRichard Lowe 								       name_buffer);
1583*10d63b7dSRichard Lowe 					}
1584*10d63b7dSRichard Lowe 					append_string(string_start,
1585*10d63b7dSRichard Lowe 						      &name_string,
1586*10d63b7dSRichard Lowe 						      source_p - string_start);
1587*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1588*10d63b7dSRichard Lowe 					string_start = source_p;
1589*10d63b7dSRichard Lowe 					source_p--;
1590*10d63b7dSRichard Lowe 					if (source == NULL) {
1591*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
1592*10d63b7dSRichard Lowe 					}
1593*10d63b7dSRichard Lowe 					break;
1594*10d63b7dSRichard Lowe 				case backslash_char:
1595*10d63b7dSRichard Lowe 					source_p++;
1596*10d63b7dSRichard Lowe 					if (distance != 0) {
1597*10d63b7dSRichard Lowe 						*source_p =
1598*10d63b7dSRichard Lowe 						  *(source_p + distance);
1599*10d63b7dSRichard Lowe 					}
1600*10d63b7dSRichard Lowe 					if (*source_p == (int) nul_char) {
1601*10d63b7dSRichard Lowe 						if (!macro_seen_in_string) {
1602*10d63b7dSRichard Lowe 							macro_seen_in_string =
1603*10d63b7dSRichard Lowe 							  true;
1604*10d63b7dSRichard Lowe 							INIT_STRING_FROM_STACK(name_string,
1605*10d63b7dSRichard Lowe 									       name_buffer);
1606*10d63b7dSRichard Lowe 						}
1607*10d63b7dSRichard Lowe 
1608*10d63b7dSRichard Lowe /*  BID_1225561 */
1609*10d63b7dSRichard Lowe 						*(source_p - 1) = (int) space_char;
1610*10d63b7dSRichard Lowe 						append_string(string_start,
1611*10d63b7dSRichard Lowe 							      &name_string,
1612*10d63b7dSRichard Lowe 							      source_p -
1613*10d63b7dSRichard Lowe 							      string_start - 1);
1614*10d63b7dSRichard Lowe 						GET_NEXT_BLOCK(source);
1615*10d63b7dSRichard Lowe 						string_start = source_p;
1616*10d63b7dSRichard Lowe 						if (source == NULL) {
1617*10d63b7dSRichard Lowe 							GOTO_STATE(on_eoln_state);
1618*10d63b7dSRichard Lowe 						}
1619*10d63b7dSRichard Lowe 						if (distance != 0) {
1620*10d63b7dSRichard Lowe 							*source_p =
1621*10d63b7dSRichard Lowe 							  *(source_p +
1622*10d63b7dSRichard Lowe 							    distance);
1623*10d63b7dSRichard Lowe 						}
1624*10d63b7dSRichard Lowe 						if (*source_p == (int) newline_char) {
1625*10d63b7dSRichard Lowe 							append_char((int) space_char, &name_string);
1626*10d63b7dSRichard Lowe 						} else {
1627*10d63b7dSRichard Lowe 							append_char((int) backslash_char, &name_string);
1628*10d63b7dSRichard Lowe 						}
1629*10d63b7dSRichard Lowe /****************/
1630*10d63b7dSRichard Lowe 					}
1631*10d63b7dSRichard Lowe 					if (*source_p == (int) newline_char) {
1632*10d63b7dSRichard Lowe 						source_p--;
1633*10d63b7dSRichard Lowe 						line_number++;
1634*10d63b7dSRichard Lowe 						distance++;
1635*10d63b7dSRichard Lowe 						*source_p = (int) space_char;
1636*10d63b7dSRichard Lowe 						while ((*(source_p +
1637*10d63b7dSRichard Lowe 							  distance + 1) ==
1638*10d63b7dSRichard Lowe 							(int) tab_char) ||
1639*10d63b7dSRichard Lowe 						       (*(source_p +
1640*10d63b7dSRichard Lowe 							  distance + 1) ==
1641*10d63b7dSRichard Lowe 							(int) space_char)) {
1642*10d63b7dSRichard Lowe 							distance++;
1643*10d63b7dSRichard Lowe 						}
1644*10d63b7dSRichard Lowe 					}
1645*10d63b7dSRichard Lowe 					break;
1646*10d63b7dSRichard Lowe 				case newline_char:
1647*10d63b7dSRichard Lowe 				case numbersign_char:
1648*10d63b7dSRichard Lowe 					goto macro_value_end;
1649*10d63b7dSRichard Lowe 				}
1650*10d63b7dSRichard Lowe 			}
1651*10d63b7dSRichard Lowe 		macro_value_end:
1652*10d63b7dSRichard Lowe 			/* Complete the value in the string */
1653*10d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
1654*10d63b7dSRichard Lowe 				macro_seen_in_string = true;
1655*10d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
1656*10d63b7dSRichard Lowe 						       name_buffer);
1657*10d63b7dSRichard Lowe 			}
1658*10d63b7dSRichard Lowe 			append_string(string_start,
1659*10d63b7dSRichard Lowe 				      &name_string,
1660*10d63b7dSRichard Lowe 				      source_p - string_start);
1661*10d63b7dSRichard Lowe 			if (name_string.buffer.start != name_string.text.p) {
1662*10d63b7dSRichard Lowe 					macro_value =
1663*10d63b7dSRichard Lowe 					  GETNAME(name_string.buffer.start,
1664*10d63b7dSRichard Lowe 						  FIND_LENGTH);
1665*10d63b7dSRichard Lowe 				}
1666*10d63b7dSRichard Lowe 			if (name_string.free_after_use) {
1667*10d63b7dSRichard Lowe 				retmem(name_string.buffer.start);
1668*10d63b7dSRichard Lowe 			}
1669*10d63b7dSRichard Lowe 			for (; distance > 0; distance--) {
1670*10d63b7dSRichard Lowe 				*source_p++ = (int) space_char;
1671*10d63b7dSRichard Lowe 			}
1672*10d63b7dSRichard Lowe 			GOTO_STATE(on_eoln_state);
1673*10d63b7dSRichard Lowe 		}
1674*10d63b7dSRichard Lowe 	}
1675*10d63b7dSRichard Lowe 
1676*10d63b7dSRichard Lowe /****************************************************************
1677*10d63b7dSRichard Lowe  *	enter dependencies state
1678*10d63b7dSRichard Lowe  */
1679*10d63b7dSRichard Lowe  case enter_dependencies_state:
1680*10d63b7dSRichard Lowe  enter_dependencies_label:
1681*10d63b7dSRichard Lowe /* Expects pointer on first non whitespace char after last dependency. (On */
1682*10d63b7dSRichard Lowe /* next line.) We end up here after having read a "targets : dependencies" */
1683*10d63b7dSRichard Lowe /* line. The state checks if there is a rule to read and if so dispatches */
1684*10d63b7dSRichard Lowe /* to scan_command_state scan_command_state reads one rule line and the */
1685*10d63b7dSRichard Lowe /* returns here */
1686*10d63b7dSRichard Lowe 
1687*10d63b7dSRichard Lowe 	/* First check if the first char on the next line is special */
1688*10d63b7dSRichard Lowe 	switch (GET_CHAR()) {
1689*10d63b7dSRichard Lowe 	case nul_char:
1690*10d63b7dSRichard Lowe 		GET_NEXT_BLOCK(source);
1691*10d63b7dSRichard Lowe 		if (source == NULL) {
1692*10d63b7dSRichard Lowe 			break;
1693*10d63b7dSRichard Lowe 		}
1694*10d63b7dSRichard Lowe 		goto enter_dependencies_label;
1695*10d63b7dSRichard Lowe 	case exclam_char:
1696*10d63b7dSRichard Lowe 		/* The line should be evaluate before it is read */
1697*10d63b7dSRichard Lowe 		macro_seen_in_string = false;
1698*10d63b7dSRichard Lowe 		string_start = source_p + 1;
1699*10d63b7dSRichard Lowe 		for (; 1; source_p++) {
1700*10d63b7dSRichard Lowe 			switch (GET_CHAR()) {
1701*10d63b7dSRichard Lowe 			case newline_char:
1702*10d63b7dSRichard Lowe 				goto eoln_2;
1703*10d63b7dSRichard Lowe 			case nul_char:
1704*10d63b7dSRichard Lowe 				if (source->fd > 0) {
1705*10d63b7dSRichard Lowe 					if (!macro_seen_in_string) {
1706*10d63b7dSRichard Lowe 						macro_seen_in_string = true;
1707*10d63b7dSRichard Lowe 						INIT_STRING_FROM_STACK(name_string,
1708*10d63b7dSRichard Lowe 								       name_buffer);
1709*10d63b7dSRichard Lowe 					}
1710*10d63b7dSRichard Lowe 					append_string(string_start,
1711*10d63b7dSRichard Lowe 						      &name_string,
1712*10d63b7dSRichard Lowe 						      source_p - string_start);
1713*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1714*10d63b7dSRichard Lowe 					string_start = source_p;
1715*10d63b7dSRichard Lowe 					source_p--;
1716*10d63b7dSRichard Lowe 					break;
1717*10d63b7dSRichard Lowe 				}
1718*10d63b7dSRichard Lowe 			eoln_2:
1719*10d63b7dSRichard Lowe 				if (!macro_seen_in_string) {
1720*10d63b7dSRichard Lowe 					INIT_STRING_FROM_STACK(name_string,
1721*10d63b7dSRichard Lowe 							       name_buffer);
1722*10d63b7dSRichard Lowe 				}
1723*10d63b7dSRichard Lowe 				append_string(string_start,
1724*10d63b7dSRichard Lowe 					      &name_string,
1725*10d63b7dSRichard Lowe 					      source_p - string_start);
1726*10d63b7dSRichard Lowe 				extrap = (Source)
1727*10d63b7dSRichard Lowe 				  alloca((int) sizeof (Source_rec));
1728*10d63b7dSRichard Lowe 				extrap->string.buffer.start = NULL;
1729*10d63b7dSRichard Lowe 				extrap->inp_buf =
1730*10d63b7dSRichard Lowe 				  extrap->inp_buf_ptr =
1731*10d63b7dSRichard Lowe 				    extrap->inp_buf_end = NULL;
1732*10d63b7dSRichard Lowe 				extrap->error_converting = false;
1733*10d63b7dSRichard Lowe 				expand_value(GETNAME(name_string.buffer.start,
1734*10d63b7dSRichard Lowe 						     FIND_LENGTH),
1735*10d63b7dSRichard Lowe 					     &extrap->string,
1736*10d63b7dSRichard Lowe 					     false);
1737*10d63b7dSRichard Lowe 				if (name_string.free_after_use) {
1738*10d63b7dSRichard Lowe 					retmem(name_string.buffer.start);
1739*10d63b7dSRichard Lowe 				}
1740*10d63b7dSRichard Lowe 				UNCACHE_SOURCE();
1741*10d63b7dSRichard Lowe 				extrap->string.text.p =
1742*10d63b7dSRichard Lowe 				  extrap->string.buffer.start;
1743*10d63b7dSRichard Lowe 				extrap->fd = -1;
1744*10d63b7dSRichard Lowe 				extrap->previous = source;
1745*10d63b7dSRichard Lowe 				source = extrap;
1746*10d63b7dSRichard Lowe 				CACHE_SOURCE(0);
1747*10d63b7dSRichard Lowe 				goto enter_dependencies_label;
1748*10d63b7dSRichard Lowe 			}
1749*10d63b7dSRichard Lowe 		}
1750*10d63b7dSRichard Lowe 	case dollar_char:
1751*10d63b7dSRichard Lowe 		if (source->already_expanded) {
1752*10d63b7dSRichard Lowe 			break;
1753*10d63b7dSRichard Lowe 		}
1754*10d63b7dSRichard Lowe 		source_p++;
1755*10d63b7dSRichard Lowe 		UNCACHE_SOURCE();
1756*10d63b7dSRichard Lowe 		{
1757*10d63b7dSRichard Lowe 			Source t = (Source) alloca((int) sizeof (Source_rec));
1758*10d63b7dSRichard Lowe 			source = push_macro_value(t,
1759*10d63b7dSRichard Lowe 						  buffer,
1760*10d63b7dSRichard Lowe 						  sizeof buffer,
1761*10d63b7dSRichard Lowe 						  source);
1762*10d63b7dSRichard Lowe 		}
1763*10d63b7dSRichard Lowe 		CACHE_SOURCE(0);
1764*10d63b7dSRichard Lowe 		goto enter_dependencies_label;
1765*10d63b7dSRichard Lowe 	case numbersign_char:
1766*10d63b7dSRichard Lowe 		if (makefile_type != reading_makefile) {
1767*10d63b7dSRichard Lowe 			source_p++;
1768*10d63b7dSRichard Lowe 			GOTO_STATE(scan_command_state);
1769*10d63b7dSRichard Lowe 		}
1770*10d63b7dSRichard Lowe 		for (; 1; source_p++) {
1771*10d63b7dSRichard Lowe 			switch (GET_CHAR()) {
1772*10d63b7dSRichard Lowe 			case nul_char:
1773*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK_NOCHK(source);
1774*10d63b7dSRichard Lowe 				if (source == NULL) {
1775*10d63b7dSRichard Lowe 					GOTO_STATE(on_eoln_state);
1776*10d63b7dSRichard Lowe 				}
1777*10d63b7dSRichard Lowe 				if (source->error_converting) {
1778*10d63b7dSRichard Lowe 				// Illegal byte sequence - skip its first byte
1779*10d63b7dSRichard Lowe 					source->inp_buf_ptr++;
1780*10d63b7dSRichard Lowe 				}
1781*10d63b7dSRichard Lowe 				source_p--;
1782*10d63b7dSRichard Lowe 				break;
1783*10d63b7dSRichard Lowe 			case backslash_char:
1784*10d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
1785*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK_NOCHK(source);
1786*10d63b7dSRichard Lowe 					if (source == NULL) {
1787*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
1788*10d63b7dSRichard Lowe 					}
1789*10d63b7dSRichard Lowe 					if (source->error_converting) {
1790*10d63b7dSRichard Lowe 					// Illegal byte sequence - skip its first byte
1791*10d63b7dSRichard Lowe 						source->inp_buf_ptr++;
1792*10d63b7dSRichard Lowe 						source_p--;
1793*10d63b7dSRichard Lowe 						break;
1794*10d63b7dSRichard Lowe 					}
1795*10d63b7dSRichard Lowe 				}
1796*10d63b7dSRichard Lowe 				if(*source_p == (int) newline_char) {
1797*10d63b7dSRichard Lowe 					if (source->fd >= 0) {
1798*10d63b7dSRichard Lowe 						line_number++;
1799*10d63b7dSRichard Lowe 					}
1800*10d63b7dSRichard Lowe 				}
1801*10d63b7dSRichard Lowe 				break;
1802*10d63b7dSRichard Lowe 			case newline_char:
1803*10d63b7dSRichard Lowe 				source_p++;
1804*10d63b7dSRichard Lowe 				if (source->fd >= 0) {
1805*10d63b7dSRichard Lowe 					line_number++;
1806*10d63b7dSRichard Lowe 				}
1807*10d63b7dSRichard Lowe 				goto enter_dependencies_label;
1808*10d63b7dSRichard Lowe 			}
1809*10d63b7dSRichard Lowe 		}
1810*10d63b7dSRichard Lowe 
1811*10d63b7dSRichard Lowe 	case tab_char:
1812*10d63b7dSRichard Lowe 		GOTO_STATE(scan_command_state);
1813*10d63b7dSRichard Lowe 	}
1814*10d63b7dSRichard Lowe 
1815*10d63b7dSRichard Lowe 	/* We read all the command lines for the target/dependency line. */
1816*10d63b7dSRichard Lowe 	/* Enter the stuff */
1817*10d63b7dSRichard Lowe 	enter_target_groups_and_dependencies( &target, &depes, command,
1818*10d63b7dSRichard Lowe 					     separator, target_group_seen);
1819*10d63b7dSRichard Lowe 
1820*10d63b7dSRichard Lowe 	goto start_new_line;
1821*10d63b7dSRichard Lowe 
1822*10d63b7dSRichard Lowe /****************************************************************
1823*10d63b7dSRichard Lowe  *	scan command state
1824*10d63b7dSRichard Lowe  */
1825*10d63b7dSRichard Lowe case scan_command_state:
1826*10d63b7dSRichard Lowe 	/* We need to read one rule line. Do that and return to */
1827*10d63b7dSRichard Lowe 	/* the enter dependencies state */
1828*10d63b7dSRichard Lowe 	string_start = source_p;
1829*10d63b7dSRichard Lowe 	macro_seen_in_string = false;
1830*10d63b7dSRichard Lowe 	for (; 1; source_p++) {
1831*10d63b7dSRichard Lowe 		switch (GET_CHAR()) {
1832*10d63b7dSRichard Lowe 		case backslash_char:
1833*10d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
1834*10d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
1835*10d63b7dSRichard Lowe 						       name_buffer);
1836*10d63b7dSRichard Lowe 			}
1837*10d63b7dSRichard Lowe 			append_string(string_start,
1838*10d63b7dSRichard Lowe 				      &name_string,
1839*10d63b7dSRichard Lowe 				      source_p - string_start);
1840*10d63b7dSRichard Lowe 			macro_seen_in_string = true;
1841*10d63b7dSRichard Lowe 			if (*++source_p == (int) nul_char) {
1842*10d63b7dSRichard Lowe 				GET_NEXT_BLOCK(source);
1843*10d63b7dSRichard Lowe 				if (source == NULL) {
1844*10d63b7dSRichard Lowe 					string_start = source_p;
1845*10d63b7dSRichard Lowe 					goto command_newline;
1846*10d63b7dSRichard Lowe 				}
1847*10d63b7dSRichard Lowe 			}
1848*10d63b7dSRichard Lowe 			append_char((int) backslash_char, &name_string);
1849*10d63b7dSRichard Lowe 			append_char(*source_p, &name_string);
1850*10d63b7dSRichard Lowe 			if (*source_p == (int) newline_char) {
1851*10d63b7dSRichard Lowe 				if (source->fd >= 0) {
1852*10d63b7dSRichard Lowe 					line_number++;
1853*10d63b7dSRichard Lowe 				}
1854*10d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
1855*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1856*10d63b7dSRichard Lowe 					if (source == NULL) {
1857*10d63b7dSRichard Lowe 						string_start = source_p;
1858*10d63b7dSRichard Lowe 						goto command_newline;
1859*10d63b7dSRichard Lowe 					}
1860*10d63b7dSRichard Lowe 				}
1861*10d63b7dSRichard Lowe 				if (*source_p == (int) tab_char) {
1862*10d63b7dSRichard Lowe 					source_p++;
1863*10d63b7dSRichard Lowe 				}
1864*10d63b7dSRichard Lowe 			} else {
1865*10d63b7dSRichard Lowe 				if (*++source_p == (int) nul_char) {
1866*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1867*10d63b7dSRichard Lowe 					if (source == NULL) {
1868*10d63b7dSRichard Lowe 						string_start = source_p;
1869*10d63b7dSRichard Lowe 						goto command_newline;
1870*10d63b7dSRichard Lowe 					}
1871*10d63b7dSRichard Lowe 				}
1872*10d63b7dSRichard Lowe 			}
1873*10d63b7dSRichard Lowe 			string_start = source_p;
1874*10d63b7dSRichard Lowe 			if ((*source_p == (int) newline_char) ||
1875*10d63b7dSRichard Lowe 			    (*source_p == (int) backslash_char) ||
1876*10d63b7dSRichard Lowe 			    (*source_p == (int) nul_char)) {
1877*10d63b7dSRichard Lowe 				source_p--;
1878*10d63b7dSRichard Lowe 			}
1879*10d63b7dSRichard Lowe 			break;
1880*10d63b7dSRichard Lowe 		case newline_char:
1881*10d63b7dSRichard Lowe 		command_newline:
1882*10d63b7dSRichard Lowe 			if ((string_start != source_p) ||
1883*10d63b7dSRichard Lowe 			    macro_seen_in_string) {
1884*10d63b7dSRichard Lowe 				if (macro_seen_in_string) {
1885*10d63b7dSRichard Lowe 					append_string(string_start,
1886*10d63b7dSRichard Lowe 						      &name_string,
1887*10d63b7dSRichard Lowe 						      source_p - string_start);
1888*10d63b7dSRichard Lowe 					string_start =
1889*10d63b7dSRichard Lowe 					  name_string.buffer.start;
1890*10d63b7dSRichard Lowe 					string_end = name_string.text.p;
1891*10d63b7dSRichard Lowe 				} else {
1892*10d63b7dSRichard Lowe 					string_end = source_p;
1893*10d63b7dSRichard Lowe 				}
1894*10d63b7dSRichard Lowe 				while ((*string_start != (int) newline_char) &&
1895*10d63b7dSRichard Lowe 				       iswspace(*string_start)){
1896*10d63b7dSRichard Lowe 					string_start++;
1897*10d63b7dSRichard Lowe 				}
1898*10d63b7dSRichard Lowe 				if ((string_end > string_start) ||
1899*10d63b7dSRichard Lowe 				    (makefile_type == reading_statefile)) {
1900*10d63b7dSRichard Lowe 					if (command_tail == NULL) {
1901*10d63b7dSRichard Lowe 						command =
1902*10d63b7dSRichard Lowe 						  command_tail =
1903*10d63b7dSRichard Lowe 						    ALLOC(Cmd_line);
1904*10d63b7dSRichard Lowe 					} else {
1905*10d63b7dSRichard Lowe 						command_tail->next =
1906*10d63b7dSRichard Lowe 						  ALLOC(Cmd_line);
1907*10d63b7dSRichard Lowe 						command_tail =
1908*10d63b7dSRichard Lowe 						  command_tail->next;
1909*10d63b7dSRichard Lowe 					}
1910*10d63b7dSRichard Lowe 					command_tail->next = NULL;
1911*10d63b7dSRichard Lowe 					command_tail->make_refd = false;
1912*10d63b7dSRichard Lowe 					command_tail->ignore_command_dependency = false;
1913*10d63b7dSRichard Lowe 					command_tail->assign = false;
1914*10d63b7dSRichard Lowe 					command_tail->ignore_error = false;
1915*10d63b7dSRichard Lowe 					command_tail->silent = false;
1916*10d63b7dSRichard Lowe 					command_tail->command_line =
1917*10d63b7dSRichard Lowe 					  GETNAME(string_start,
1918*10d63b7dSRichard Lowe 						  string_end - string_start);
1919*10d63b7dSRichard Lowe 					if (macro_seen_in_string &&
1920*10d63b7dSRichard Lowe 					    name_string.free_after_use) {
1921*10d63b7dSRichard Lowe 						retmem(name_string.
1922*10d63b7dSRichard Lowe 						       buffer.start);
1923*10d63b7dSRichard Lowe 					}
1924*10d63b7dSRichard Lowe 				}
1925*10d63b7dSRichard Lowe 			}
1926*10d63b7dSRichard Lowe 			do {
1927*10d63b7dSRichard Lowe 				if ((source != NULL) && (source->fd >= 0)) {
1928*10d63b7dSRichard Lowe 					line_number++;
1929*10d63b7dSRichard Lowe 				}
1930*10d63b7dSRichard Lowe 				if ((source != NULL) &&
1931*10d63b7dSRichard Lowe 				    (*++source_p == (int) nul_char)) {
1932*10d63b7dSRichard Lowe 					GET_NEXT_BLOCK(source);
1933*10d63b7dSRichard Lowe 					if (source == NULL) {
1934*10d63b7dSRichard Lowe 						GOTO_STATE(on_eoln_state);
1935*10d63b7dSRichard Lowe 					}
1936*10d63b7dSRichard Lowe 				}
1937*10d63b7dSRichard Lowe 			} while (*source_p == (int) newline_char);
1938*10d63b7dSRichard Lowe 
1939*10d63b7dSRichard Lowe 			GOTO_STATE(enter_dependencies_state);
1940*10d63b7dSRichard Lowe 		case nul_char:
1941*10d63b7dSRichard Lowe 			if (!macro_seen_in_string) {
1942*10d63b7dSRichard Lowe 				INIT_STRING_FROM_STACK(name_string,
1943*10d63b7dSRichard Lowe 						       name_buffer);
1944*10d63b7dSRichard Lowe 			}
1945*10d63b7dSRichard Lowe 			append_string(string_start,
1946*10d63b7dSRichard Lowe 				      &name_string,
1947*10d63b7dSRichard Lowe 				      source_p - string_start);
1948*10d63b7dSRichard Lowe 			macro_seen_in_string = true;
1949*10d63b7dSRichard Lowe 			GET_NEXT_BLOCK(source);
1950*10d63b7dSRichard Lowe 			string_start = source_p;
1951*10d63b7dSRichard Lowe 			source_p--;
1952*10d63b7dSRichard Lowe 			if (source == NULL) {
1953*10d63b7dSRichard Lowe 				GOTO_STATE(enter_dependencies_state);
1954*10d63b7dSRichard Lowe 			}
1955*10d63b7dSRichard Lowe 			break;
1956*10d63b7dSRichard Lowe 		}
1957*10d63b7dSRichard Lowe 	}
1958*10d63b7dSRichard Lowe 
1959*10d63b7dSRichard Lowe /****************************************************************
1960*10d63b7dSRichard Lowe  *	enter equal state
1961*10d63b7dSRichard Lowe  */
1962*10d63b7dSRichard Lowe case enter_equal_state:
1963*10d63b7dSRichard Lowe 	if (target.used != 1) {
1964*10d63b7dSRichard Lowe 		GOTO_STATE(poorly_formed_macro_state);
1965*10d63b7dSRichard Lowe 	}
1966*10d63b7dSRichard Lowe 	enter_equal(target.names[0], macro_value, append);
1967*10d63b7dSRichard Lowe 	goto start_new_line;
1968*10d63b7dSRichard Lowe 
1969*10d63b7dSRichard Lowe /****************************************************************
1970*10d63b7dSRichard Lowe  *	enter conditional state
1971*10d63b7dSRichard Lowe  */
1972*10d63b7dSRichard Lowe case enter_conditional_state:
1973*10d63b7dSRichard Lowe 	if (depes.used != 1) {
1974*10d63b7dSRichard Lowe 		GOTO_STATE(poorly_formed_macro_state);
1975*10d63b7dSRichard Lowe 	}
1976*10d63b7dSRichard Lowe 	for (nvp = &target; nvp != NULL; nvp = nvp->next) {
1977*10d63b7dSRichard Lowe 		for (i = 0; i < nvp->used; i++) {
1978*10d63b7dSRichard Lowe 			enter_conditional(nvp->names[i],
1979*10d63b7dSRichard Lowe 					  depes.names[0],
1980*10d63b7dSRichard Lowe 					  macro_value,
1981*10d63b7dSRichard Lowe 					  append);
1982*10d63b7dSRichard Lowe 		}
1983*10d63b7dSRichard Lowe 	}
1984*10d63b7dSRichard Lowe 	goto start_new_line;
1985*10d63b7dSRichard Lowe 
1986*10d63b7dSRichard Lowe /****************************************************************
1987*10d63b7dSRichard Lowe  *	Error states
1988*10d63b7dSRichard Lowe  */
1989*10d63b7dSRichard Lowe case illegal_bytes_state:
1990*10d63b7dSRichard Lowe 	fatal_reader(gettext("Invalid byte sequence"));
1991*10d63b7dSRichard Lowe case illegal_eoln_state:
1992*10d63b7dSRichard Lowe 	if (line_number > 1) {
1993*10d63b7dSRichard Lowe 		if (line_started_with_space == (line_number - 1)) {
1994*10d63b7dSRichard Lowe 			line_number--;
1995*10d63b7dSRichard Lowe 			fatal_reader(gettext("Unexpected end of line seen\n\t*** missing separator (did you mean TAB instead of 8 spaces?)"));
1996*10d63b7dSRichard Lowe 		}
1997*10d63b7dSRichard Lowe 	}
1998*10d63b7dSRichard Lowe 	fatal_reader(gettext("Unexpected end of line seen"));
1999*10d63b7dSRichard Lowe case poorly_formed_macro_state:
2000*10d63b7dSRichard Lowe 	fatal_reader(gettext("Badly formed macro assignment"));
2001*10d63b7dSRichard Lowe case exit_state:
2002*10d63b7dSRichard Lowe 	return;
2003*10d63b7dSRichard Lowe default:
2004*10d63b7dSRichard Lowe 	fatal_reader(gettext("Internal error. Unknown reader state"));
2005*10d63b7dSRichard Lowe }
2006*10d63b7dSRichard Lowe }
2007*10d63b7dSRichard Lowe 
2008*10d63b7dSRichard Lowe /*
2009*10d63b7dSRichard Lowe  *	push_macro_value(bp, buffer, size, source)
2010*10d63b7dSRichard Lowe  *
2011*10d63b7dSRichard Lowe  *	Macro and function that evaluates one macro
2012*10d63b7dSRichard Lowe  *	and makes the reader read from the value of it
2013*10d63b7dSRichard Lowe  *
2014*10d63b7dSRichard Lowe  *	Return value:
2015*10d63b7dSRichard Lowe  *				The source block to read the macro from
2016*10d63b7dSRichard Lowe  *
2017*10d63b7dSRichard Lowe  *	Parameters:
2018*10d63b7dSRichard Lowe  *		bp		The new source block to fill in
2019*10d63b7dSRichard Lowe  *		buffer		Buffer to read from
2020*10d63b7dSRichard Lowe  *		size		size of the buffer
2021*10d63b7dSRichard Lowe  *		source		The old source block
2022*10d63b7dSRichard Lowe  *
2023*10d63b7dSRichard Lowe  *	Global variables used:
2024*10d63b7dSRichard Lowe  */
2025*10d63b7dSRichard Lowe static Source
push_macro_value(register Source bp,register wchar_t * buffer,int size,register Source source)2026*10d63b7dSRichard Lowe push_macro_value(register Source bp, register wchar_t *buffer, int size, register Source source)
2027*10d63b7dSRichard Lowe {
2028*10d63b7dSRichard Lowe 	bp->string.buffer.start = bp->string.text.p = buffer;
2029*10d63b7dSRichard Lowe 	bp->string.text.end = NULL;
2030*10d63b7dSRichard Lowe 	bp->string.buffer.end = buffer + (size/SIZEOFWCHAR_T);
2031*10d63b7dSRichard Lowe 	bp->string.free_after_use = false;
2032*10d63b7dSRichard Lowe 	bp->inp_buf =
2033*10d63b7dSRichard Lowe 	  bp->inp_buf_ptr =
2034*10d63b7dSRichard Lowe 	    bp->inp_buf_end = NULL;
2035*10d63b7dSRichard Lowe 	bp->error_converting = false;
2036*10d63b7dSRichard Lowe 	expand_macro(source, &bp->string, (wchar_t *) NULL, false);
2037*10d63b7dSRichard Lowe 	bp->string.text.p = bp->string.buffer.start;
2038*10d63b7dSRichard Lowe 
2039*10d63b7dSRichard Lowe 	/* 4209588: 'make' doesn't understand a macro with whitespaces in the head as target.
2040*10d63b7dSRichard Lowe 	 * strip whitespace from the begining of the macro value
2041*10d63b7dSRichard Lowe 	 */
2042*10d63b7dSRichard Lowe 	while (iswspace(*bp->string.text.p)) {
2043*10d63b7dSRichard Lowe 		bp->string.text.p++;
2044*10d63b7dSRichard Lowe 	}
2045*10d63b7dSRichard Lowe 
2046*10d63b7dSRichard Lowe 	bp->fd = -1;
2047*10d63b7dSRichard Lowe 	bp->already_expanded = true;
2048*10d63b7dSRichard Lowe 	bp->previous = source;
2049*10d63b7dSRichard Lowe 	return bp;
2050*10d63b7dSRichard Lowe }
2051*10d63b7dSRichard Lowe 
2052*10d63b7dSRichard Lowe /*
2053*10d63b7dSRichard Lowe  *	enter_target_groups_and_dependencies(target, depes, command, separator,
2054*10d63b7dSRichard Lowe  *					     target_group_seen)
2055*10d63b7dSRichard Lowe  *
2056*10d63b7dSRichard Lowe  *	Parameters:
2057*10d63b7dSRichard Lowe  *		target 		Structure that shows the target(s) on the line
2058*10d63b7dSRichard Lowe  *				we are currently parsing. This can looks like
2059*10d63b7dSRichard Lowe  *				target1 .. targetN : dependencies
2060*10d63b7dSRichard Lowe  *						  	commands
2061*10d63b7dSRichard Lowe  *				or
2062*10d63b7dSRichard Lowe  *				target1 + .. + targetN : dependencies
2063*10d63b7dSRichard Lowe  *							 commands
2064*10d63b7dSRichard Lowe  *		depes		Dependencies
2065*10d63b7dSRichard Lowe  *		command		Points to the command(s) to be executed for
2066*10d63b7dSRichard Lowe  *				this target.
2067*10d63b7dSRichard Lowe  *		separator	: or :: or :=
2068*10d63b7dSRichard Lowe  *		target_group_seen	Set if we have target1 + .. + targetN
2069*10d63b7dSRichard Lowe  *
2070*10d63b7dSRichard Lowe  *
2071*10d63b7dSRichard Lowe  * 	After reading the command lines for a target, this routine
2072*10d63b7dSRichard Lowe  *	is called to setup the dependencies and the commands for it.
2073*10d63b7dSRichard Lowe  * 	If the target is a % pattern or part of a target group, then
2074*10d63b7dSRichard Lowe  *  	the appropriate routines are called.
2075*10d63b7dSRichard Lowe  */
2076*10d63b7dSRichard Lowe 
2077*10d63b7dSRichard Lowe void
enter_target_groups_and_dependencies(Name_vector target,Name_vector depes,Cmd_line command,Separator separator,Boolean target_group_seen)2078*10d63b7dSRichard Lowe enter_target_groups_and_dependencies(Name_vector target, Name_vector depes, Cmd_line command, Separator separator, Boolean target_group_seen)
2079*10d63b7dSRichard Lowe {
2080*10d63b7dSRichard Lowe 	int			i;
2081*10d63b7dSRichard Lowe 	Boolean			reset= true;
2082*10d63b7dSRichard Lowe 	Chain			target_group_member;
2083*10d63b7dSRichard Lowe 	Percent			percent_ptr;
2084*10d63b7dSRichard Lowe 
2085*10d63b7dSRichard Lowe 	for (; target != NULL; target = target->next) {
2086*10d63b7dSRichard Lowe 		for (i = 0; i < target->used; i++) {
2087*10d63b7dSRichard Lowe 			if (target->names[i] != NULL) {
2088*10d63b7dSRichard Lowe 				if (target_group_seen) {
2089*10d63b7dSRichard Lowe 					target_group_member =
2090*10d63b7dSRichard Lowe 					  find_target_groups(target, i, reset);
2091*10d63b7dSRichard Lowe 					if(target_group_member == NULL) {
2092*10d63b7dSRichard Lowe 						fatal_reader(gettext("Unexpected '+' on dependency line"));
2093*10d63b7dSRichard Lowe 					}
2094*10d63b7dSRichard Lowe 				}
2095*10d63b7dSRichard Lowe 				reset = false;
2096*10d63b7dSRichard Lowe 
2097*10d63b7dSRichard Lowe 				/* If we saw it in the makefile it must be
2098*10d63b7dSRichard Lowe 				 * a file */
2099*10d63b7dSRichard Lowe 				target->names[i]->stat.is_file = true;
2100*10d63b7dSRichard Lowe 				/* Make sure that we use dependencies
2101*10d63b7dSRichard Lowe 				 * entered for makefiles */
2102*10d63b7dSRichard Lowe 				target->names[i]->state = build_dont_know;
2103*10d63b7dSRichard Lowe 
2104*10d63b7dSRichard Lowe 				/* If the target is special we delegate
2105*10d63b7dSRichard Lowe 				 * the processing */
2106*10d63b7dSRichard Lowe 				if (target->names[i]->special_reader
2107*10d63b7dSRichard Lowe 				    != no_special) {
2108*10d63b7dSRichard Lowe 					special_reader(target->names[i],
2109*10d63b7dSRichard Lowe 						       depes,
2110*10d63b7dSRichard Lowe 						       command);
2111*10d63b7dSRichard Lowe 				}
2112*10d63b7dSRichard Lowe 				/* Check if this is a "a%b : x%y" type rule */
2113*10d63b7dSRichard Lowe 				else if (target->names[i]->percent) {
2114*10d63b7dSRichard Lowe 					percent_ptr =
2115*10d63b7dSRichard Lowe 					  enter_percent(target->names[i],
2116*10d63b7dSRichard Lowe 							target->target_group[i],
2117*10d63b7dSRichard Lowe 							depes, command);
2118*10d63b7dSRichard Lowe 					if (target_group_seen) {
2119*10d63b7dSRichard Lowe 						target_group_member->percent_member =
2120*10d63b7dSRichard Lowe 						  percent_ptr;
2121*10d63b7dSRichard Lowe 					}
2122*10d63b7dSRichard Lowe 				} else if (target->names[i]->dollar) {
2123*10d63b7dSRichard Lowe 					enter_dyntarget(target->names[i]);
2124*10d63b7dSRichard Lowe 					enter_dependencies
2125*10d63b7dSRichard Lowe 					  (target->names[i],
2126*10d63b7dSRichard Lowe 					   target->target_group[i],
2127*10d63b7dSRichard Lowe 					   depes,
2128*10d63b7dSRichard Lowe 					   command,
2129*10d63b7dSRichard Lowe 					   separator);
2130*10d63b7dSRichard Lowe 				} else {
2131*10d63b7dSRichard Lowe 					if (target_group_seen) {
2132*10d63b7dSRichard Lowe 						target_group_member->percent_member =
2133*10d63b7dSRichard Lowe 						  NULL;
2134*10d63b7dSRichard Lowe 					}
2135*10d63b7dSRichard Lowe 
2136*10d63b7dSRichard Lowe 					enter_dependencies
2137*10d63b7dSRichard Lowe 					  (target->names[i],
2138*10d63b7dSRichard Lowe 					   target->target_group[i],
2139*10d63b7dSRichard Lowe 					   depes,
2140*10d63b7dSRichard Lowe 					   command,
2141*10d63b7dSRichard Lowe 					   separator);
2142*10d63b7dSRichard Lowe 				}
2143*10d63b7dSRichard Lowe 			}
2144*10d63b7dSRichard Lowe 		}
2145*10d63b7dSRichard Lowe 	}
2146*10d63b7dSRichard Lowe }
2147*10d63b7dSRichard Lowe 
2148*10d63b7dSRichard Lowe 
2149