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