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