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