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 2005 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 * misc.cc
28*10d63b7dSRichard Lowe *
29*10d63b7dSRichard Lowe * This file contains various unclassified routines. Some main groups:
30*10d63b7dSRichard Lowe * getname
31*10d63b7dSRichard Lowe * Memory allocation
32*10d63b7dSRichard Lowe * String handling
33*10d63b7dSRichard Lowe * Property handling
34*10d63b7dSRichard Lowe * Error message handling
35*10d63b7dSRichard Lowe * Make internal state dumping
36*10d63b7dSRichard Lowe * main routine support
37*10d63b7dSRichard Lowe */
38*10d63b7dSRichard Lowe
39*10d63b7dSRichard Lowe /*
40*10d63b7dSRichard Lowe * Included files
41*10d63b7dSRichard Lowe */
42*10d63b7dSRichard Lowe #include <errno.h>
43*10d63b7dSRichard Lowe #include <mk/defs.h>
44*10d63b7dSRichard Lowe #include <mksh/macro.h> /* SETVAR() */
45*10d63b7dSRichard Lowe #include <mksh/misc.h> /* enable_interrupt() */
46*10d63b7dSRichard Lowe #include <stdarg.h> /* va_list, va_start(), va_end() */
47*10d63b7dSRichard Lowe #include <vroot/report.h> /* SUNPRO_DEPENDENCIES */
48*10d63b7dSRichard Lowe #include <libintl.h>
49*10d63b7dSRichard Lowe
50*10d63b7dSRichard Lowe extern void job_adjust_fini();
51*10d63b7dSRichard Lowe
52*10d63b7dSRichard Lowe /*
53*10d63b7dSRichard Lowe * Defined macros
54*10d63b7dSRichard Lowe */
55*10d63b7dSRichard Lowe
56*10d63b7dSRichard Lowe /*
57*10d63b7dSRichard Lowe * typedefs & structs
58*10d63b7dSRichard Lowe */
59*10d63b7dSRichard Lowe
60*10d63b7dSRichard Lowe /*
61*10d63b7dSRichard Lowe * Static variables
62*10d63b7dSRichard Lowe */
63*10d63b7dSRichard Lowe
64*10d63b7dSRichard Lowe /*
65*10d63b7dSRichard Lowe * File table of contents
66*10d63b7dSRichard Lowe */
67*10d63b7dSRichard Lowe static void print_rule(register Name target);
68*10d63b7dSRichard Lowe static void print_target_n_deps(register Name target);
69*10d63b7dSRichard Lowe
70*10d63b7dSRichard Lowe /*****************************************
71*10d63b7dSRichard Lowe *
72*10d63b7dSRichard Lowe * getname
73*10d63b7dSRichard Lowe */
74*10d63b7dSRichard Lowe
75*10d63b7dSRichard Lowe /*****************************************
76*10d63b7dSRichard Lowe *
77*10d63b7dSRichard Lowe * Memory allocation
78*10d63b7dSRichard Lowe */
79*10d63b7dSRichard Lowe
80*10d63b7dSRichard Lowe /*
81*10d63b7dSRichard Lowe * free_chain()
82*10d63b7dSRichard Lowe *
83*10d63b7dSRichard Lowe * frees a chain of Name_vector's
84*10d63b7dSRichard Lowe *
85*10d63b7dSRichard Lowe * Parameters:
86*10d63b7dSRichard Lowe * ptr Pointer to the first element in the chain
87*10d63b7dSRichard Lowe * to be freed.
88*10d63b7dSRichard Lowe *
89*10d63b7dSRichard Lowe * Global variables used:
90*10d63b7dSRichard Lowe */
91*10d63b7dSRichard Lowe void
free_chain(Name_vector ptr)92*10d63b7dSRichard Lowe free_chain(Name_vector ptr)
93*10d63b7dSRichard Lowe {
94*10d63b7dSRichard Lowe if (ptr != NULL) {
95*10d63b7dSRichard Lowe if (ptr->next != NULL) {
96*10d63b7dSRichard Lowe free_chain(ptr->next);
97*10d63b7dSRichard Lowe }
98*10d63b7dSRichard Lowe free((char *) ptr);
99*10d63b7dSRichard Lowe }
100*10d63b7dSRichard Lowe }
101*10d63b7dSRichard Lowe
102*10d63b7dSRichard Lowe /*****************************************
103*10d63b7dSRichard Lowe *
104*10d63b7dSRichard Lowe * String manipulation
105*10d63b7dSRichard Lowe */
106*10d63b7dSRichard Lowe
107*10d63b7dSRichard Lowe /*****************************************
108*10d63b7dSRichard Lowe *
109*10d63b7dSRichard Lowe * Nameblock property handling
110*10d63b7dSRichard Lowe */
111*10d63b7dSRichard Lowe
112*10d63b7dSRichard Lowe /*****************************************
113*10d63b7dSRichard Lowe *
114*10d63b7dSRichard Lowe * Error message handling
115*10d63b7dSRichard Lowe */
116*10d63b7dSRichard Lowe
117*10d63b7dSRichard Lowe /*
118*10d63b7dSRichard Lowe * fatal(format, args...)
119*10d63b7dSRichard Lowe *
120*10d63b7dSRichard Lowe * Print a message and die
121*10d63b7dSRichard Lowe *
122*10d63b7dSRichard Lowe * Parameters:
123*10d63b7dSRichard Lowe * format printf type format string
124*10d63b7dSRichard Lowe * args Arguments to match the format
125*10d63b7dSRichard Lowe *
126*10d63b7dSRichard Lowe * Global variables used:
127*10d63b7dSRichard Lowe * fatal_in_progress Indicates if this is a recursive call
128*10d63b7dSRichard Lowe * parallel_process_cnt Do we need to wait for anything?
129*10d63b7dSRichard Lowe * report_pwd Should we report the current path?
130*10d63b7dSRichard Lowe */
131*10d63b7dSRichard Lowe /*VARARGS*/
132*10d63b7dSRichard Lowe void
fatal(const char * message,...)133*10d63b7dSRichard Lowe fatal(const char *message, ...)
134*10d63b7dSRichard Lowe {
135*10d63b7dSRichard Lowe va_list args;
136*10d63b7dSRichard Lowe
137*10d63b7dSRichard Lowe va_start(args, message);
138*10d63b7dSRichard Lowe (void) fflush(stdout);
139*10d63b7dSRichard Lowe (void) fprintf(stderr, gettext("%s: Fatal error: "), getprogname());
140*10d63b7dSRichard Lowe (void) vfprintf(stderr, message, args);
141*10d63b7dSRichard Lowe (void) fprintf(stderr, "\n");
142*10d63b7dSRichard Lowe va_end(args);
143*10d63b7dSRichard Lowe if (report_pwd) {
144*10d63b7dSRichard Lowe (void) fprintf(stderr,
145*10d63b7dSRichard Lowe gettext("Current working directory %s\n"),
146*10d63b7dSRichard Lowe get_current_path());
147*10d63b7dSRichard Lowe }
148*10d63b7dSRichard Lowe (void) fflush(stderr);
149*10d63b7dSRichard Lowe if (fatal_in_progress) {
150*10d63b7dSRichard Lowe exit_status = 1;
151*10d63b7dSRichard Lowe exit(1);
152*10d63b7dSRichard Lowe }
153*10d63b7dSRichard Lowe fatal_in_progress = true;
154*10d63b7dSRichard Lowe /* Let all parallel children finish */
155*10d63b7dSRichard Lowe if ((dmake_mode_type == parallel_mode) &&
156*10d63b7dSRichard Lowe (parallel_process_cnt > 0)) {
157*10d63b7dSRichard Lowe (void) fprintf(stderr,
158*10d63b7dSRichard Lowe gettext("Waiting for %d %s to finish\n"),
159*10d63b7dSRichard Lowe parallel_process_cnt,
160*10d63b7dSRichard Lowe parallel_process_cnt == 1 ?
161*10d63b7dSRichard Lowe gettext("job") : gettext("jobs"));
162*10d63b7dSRichard Lowe (void) fflush(stderr);
163*10d63b7dSRichard Lowe }
164*10d63b7dSRichard Lowe
165*10d63b7dSRichard Lowe while (parallel_process_cnt > 0) {
166*10d63b7dSRichard Lowe await_parallel(true);
167*10d63b7dSRichard Lowe finish_children(false);
168*10d63b7dSRichard Lowe }
169*10d63b7dSRichard Lowe
170*10d63b7dSRichard Lowe job_adjust_fini();
171*10d63b7dSRichard Lowe
172*10d63b7dSRichard Lowe exit_status = 1;
173*10d63b7dSRichard Lowe exit(1);
174*10d63b7dSRichard Lowe }
175*10d63b7dSRichard Lowe
176*10d63b7dSRichard Lowe /*
177*10d63b7dSRichard Lowe * warning(format, args...)
178*10d63b7dSRichard Lowe *
179*10d63b7dSRichard Lowe * Print a message and continue.
180*10d63b7dSRichard Lowe *
181*10d63b7dSRichard Lowe * Parameters:
182*10d63b7dSRichard Lowe * format printf type format string
183*10d63b7dSRichard Lowe * args Arguments to match the format
184*10d63b7dSRichard Lowe *
185*10d63b7dSRichard Lowe * Global variables used:
186*10d63b7dSRichard Lowe * report_pwd Should we report the current path?
187*10d63b7dSRichard Lowe */
188*10d63b7dSRichard Lowe /*VARARGS*/
189*10d63b7dSRichard Lowe void
warning(char * message,...)190*10d63b7dSRichard Lowe warning(char * message, ...)
191*10d63b7dSRichard Lowe {
192*10d63b7dSRichard Lowe va_list args;
193*10d63b7dSRichard Lowe
194*10d63b7dSRichard Lowe va_start(args, message);
195*10d63b7dSRichard Lowe (void) fflush(stdout);
196*10d63b7dSRichard Lowe (void) fprintf(stderr, gettext("%s: Warning: "), getprogname());
197*10d63b7dSRichard Lowe (void) vfprintf(stderr, message, args);
198*10d63b7dSRichard Lowe (void) fprintf(stderr, "\n");
199*10d63b7dSRichard Lowe va_end(args);
200*10d63b7dSRichard Lowe if (report_pwd) {
201*10d63b7dSRichard Lowe (void) fprintf(stderr,
202*10d63b7dSRichard Lowe gettext("Current working directory %s\n"),
203*10d63b7dSRichard Lowe get_current_path());
204*10d63b7dSRichard Lowe }
205*10d63b7dSRichard Lowe (void) fflush(stderr);
206*10d63b7dSRichard Lowe }
207*10d63b7dSRichard Lowe
208*10d63b7dSRichard Lowe /*
209*10d63b7dSRichard Lowe * time_to_string(time)
210*10d63b7dSRichard Lowe *
211*10d63b7dSRichard Lowe * Take a numeric time value and produce
212*10d63b7dSRichard Lowe * a proper string representation.
213*10d63b7dSRichard Lowe *
214*10d63b7dSRichard Lowe * Return value:
215*10d63b7dSRichard Lowe * The string representation of the time
216*10d63b7dSRichard Lowe *
217*10d63b7dSRichard Lowe * Parameters:
218*10d63b7dSRichard Lowe * time The time we need to translate
219*10d63b7dSRichard Lowe *
220*10d63b7dSRichard Lowe * Global variables used:
221*10d63b7dSRichard Lowe */
222*10d63b7dSRichard Lowe char *
time_to_string(const timestruc_t & time)223*10d63b7dSRichard Lowe time_to_string(const timestruc_t &time)
224*10d63b7dSRichard Lowe {
225*10d63b7dSRichard Lowe struct tm *tm;
226*10d63b7dSRichard Lowe char buf[128];
227*10d63b7dSRichard Lowe
228*10d63b7dSRichard Lowe if (time == file_doesnt_exist) {
229*10d63b7dSRichard Lowe return gettext("File does not exist");
230*10d63b7dSRichard Lowe }
231*10d63b7dSRichard Lowe if (time == file_max_time) {
232*10d63b7dSRichard Lowe return gettext("Younger than any file");
233*10d63b7dSRichard Lowe }
234*10d63b7dSRichard Lowe tm = localtime(&time.tv_sec);
235*10d63b7dSRichard Lowe strftime(buf, sizeof (buf), "%c %Z", tm);
236*10d63b7dSRichard Lowe buf[127] = (int) nul_char;
237*10d63b7dSRichard Lowe return strdup(buf);
238*10d63b7dSRichard Lowe }
239*10d63b7dSRichard Lowe
240*10d63b7dSRichard Lowe /*
241*10d63b7dSRichard Lowe * get_current_path()
242*10d63b7dSRichard Lowe *
243*10d63b7dSRichard Lowe * Stuff current_path with the current path if it isnt there already.
244*10d63b7dSRichard Lowe *
245*10d63b7dSRichard Lowe * Parameters:
246*10d63b7dSRichard Lowe *
247*10d63b7dSRichard Lowe * Global variables used:
248*10d63b7dSRichard Lowe */
249*10d63b7dSRichard Lowe char *
get_current_path(void)250*10d63b7dSRichard Lowe get_current_path(void)
251*10d63b7dSRichard Lowe {
252*10d63b7dSRichard Lowe char pwd[(MAXPATHLEN * MB_LEN_MAX)];
253*10d63b7dSRichard Lowe static char *current_path;
254*10d63b7dSRichard Lowe
255*10d63b7dSRichard Lowe if (current_path == NULL) {
256*10d63b7dSRichard Lowe getcwd(pwd, sizeof(pwd));
257*10d63b7dSRichard Lowe if (pwd[0] == (int) nul_char) {
258*10d63b7dSRichard Lowe pwd[0] = (int) slash_char;
259*10d63b7dSRichard Lowe pwd[1] = (int) nul_char;
260*10d63b7dSRichard Lowe }
261*10d63b7dSRichard Lowe current_path = strdup(pwd);
262*10d63b7dSRichard Lowe }
263*10d63b7dSRichard Lowe return current_path;
264*10d63b7dSRichard Lowe }
265*10d63b7dSRichard Lowe
266*10d63b7dSRichard Lowe /*****************************************
267*10d63b7dSRichard Lowe *
268*10d63b7dSRichard Lowe * Make internal state dumping
269*10d63b7dSRichard Lowe *
270*10d63b7dSRichard Lowe * This is a set of routines for dumping the internal make state
271*10d63b7dSRichard Lowe * Used for the -p option
272*10d63b7dSRichard Lowe */
273*10d63b7dSRichard Lowe
274*10d63b7dSRichard Lowe /*
275*10d63b7dSRichard Lowe * dump_make_state()
276*10d63b7dSRichard Lowe *
277*10d63b7dSRichard Lowe * Dump make's internal state to stdout
278*10d63b7dSRichard Lowe *
279*10d63b7dSRichard Lowe * Parameters:
280*10d63b7dSRichard Lowe *
281*10d63b7dSRichard Lowe * Global variables used:
282*10d63b7dSRichard Lowe * svr4 Was ".SVR4" seen in makefile?
283*10d63b7dSRichard Lowe * svr4_name The Name ".SVR4", printed
284*10d63b7dSRichard Lowe * posix Was ".POSIX" seen in makefile?
285*10d63b7dSRichard Lowe * posix_name The Name ".POSIX", printed
286*10d63b7dSRichard Lowe * default_rule Points to the .DEFAULT rule
287*10d63b7dSRichard Lowe * default_rule_name The Name ".DEFAULT", printed
288*10d63b7dSRichard Lowe * default_target_to_build The first target to print
289*10d63b7dSRichard Lowe * dot_keep_state The Name ".KEEP_STATE", printed
290*10d63b7dSRichard Lowe * dot_keep_state_file The Name ".KEEP_STATE_FILE", printed
291*10d63b7dSRichard Lowe * hashtab The make hash table for Name blocks
292*10d63b7dSRichard Lowe * ignore_errors Was ".IGNORE" seen in makefile?
293*10d63b7dSRichard Lowe * ignore_name The Name ".IGNORE", printed
294*10d63b7dSRichard Lowe * keep_state Was ".KEEP_STATE" seen in makefile?
295*10d63b7dSRichard Lowe * percent_list The list of % rules
296*10d63b7dSRichard Lowe * precious The Name ".PRECIOUS", printed
297*10d63b7dSRichard Lowe * sccs_get_name The Name ".SCCS_GET", printed
298*10d63b7dSRichard Lowe * sccs_get_posix_name The Name ".SCCS_GET_POSIX", printed
299*10d63b7dSRichard Lowe * get_name The Name ".GET", printed
300*10d63b7dSRichard Lowe * get_posix_name The Name ".GET_POSIX", printed
301*10d63b7dSRichard Lowe * sccs_get_rule Points to the ".SCCS_GET" rule
302*10d63b7dSRichard Lowe * silent Was ".SILENT" seen in makefile?
303*10d63b7dSRichard Lowe * silent_name The Name ".SILENT", printed
304*10d63b7dSRichard Lowe * suffixes The suffix list from ".SUFFIXES"
305*10d63b7dSRichard Lowe * suffixes_name The Name ".SUFFIX", printed
306*10d63b7dSRichard Lowe */
307*10d63b7dSRichard Lowe void
dump_make_state(void)308*10d63b7dSRichard Lowe dump_make_state(void)
309*10d63b7dSRichard Lowe {
310*10d63b7dSRichard Lowe Name_set::iterator p, e;
311*10d63b7dSRichard Lowe register Property prop;
312*10d63b7dSRichard Lowe register Dependency dep;
313*10d63b7dSRichard Lowe register Cmd_line rule;
314*10d63b7dSRichard Lowe Percent percent, percent_depe;
315*10d63b7dSRichard Lowe
316*10d63b7dSRichard Lowe /* Default target */
317*10d63b7dSRichard Lowe if (default_target_to_build != NULL) {
318*10d63b7dSRichard Lowe print_rule(default_target_to_build);
319*10d63b7dSRichard Lowe }
320*10d63b7dSRichard Lowe (void) printf("\n");
321*10d63b7dSRichard Lowe
322*10d63b7dSRichard Lowe /* .POSIX */
323*10d63b7dSRichard Lowe if (posix) {
324*10d63b7dSRichard Lowe (void) printf("%s:\n", posix_name->string_mb);
325*10d63b7dSRichard Lowe }
326*10d63b7dSRichard Lowe
327*10d63b7dSRichard Lowe /* .DEFAULT */
328*10d63b7dSRichard Lowe if (default_rule != NULL) {
329*10d63b7dSRichard Lowe (void) printf("%s:\n", default_rule_name->string_mb);
330*10d63b7dSRichard Lowe for (rule = default_rule; rule != NULL; rule = rule->next) {
331*10d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
332*10d63b7dSRichard Lowe }
333*10d63b7dSRichard Lowe }
334*10d63b7dSRichard Lowe
335*10d63b7dSRichard Lowe /* .IGNORE */
336*10d63b7dSRichard Lowe if (ignore_errors) {
337*10d63b7dSRichard Lowe (void) printf("%s:\n", ignore_name->string_mb);
338*10d63b7dSRichard Lowe }
339*10d63b7dSRichard Lowe
340*10d63b7dSRichard Lowe /* .KEEP_STATE: */
341*10d63b7dSRichard Lowe if (keep_state) {
342*10d63b7dSRichard Lowe (void) printf("%s:\n\n", dot_keep_state->string_mb);
343*10d63b7dSRichard Lowe }
344*10d63b7dSRichard Lowe
345*10d63b7dSRichard Lowe /* .PRECIOUS */
346*10d63b7dSRichard Lowe (void) printf("%s:", precious->string_mb);
347*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
348*10d63b7dSRichard Lowe if ((p->stat.is_precious) || (all_precious)) {
349*10d63b7dSRichard Lowe (void) printf(" %s", p->string_mb);
350*10d63b7dSRichard Lowe }
351*10d63b7dSRichard Lowe }
352*10d63b7dSRichard Lowe (void) printf("\n");
353*10d63b7dSRichard Lowe
354*10d63b7dSRichard Lowe /* .SCCS_GET */
355*10d63b7dSRichard Lowe if (sccs_get_rule != NULL) {
356*10d63b7dSRichard Lowe (void) printf("%s:\n", sccs_get_name->string_mb);
357*10d63b7dSRichard Lowe for (rule = sccs_get_rule; rule != NULL; rule = rule->next) {
358*10d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
359*10d63b7dSRichard Lowe }
360*10d63b7dSRichard Lowe }
361*10d63b7dSRichard Lowe
362*10d63b7dSRichard Lowe /* .SILENT */
363*10d63b7dSRichard Lowe if (silent) {
364*10d63b7dSRichard Lowe (void) printf("%s:\n", silent_name->string_mb);
365*10d63b7dSRichard Lowe }
366*10d63b7dSRichard Lowe
367*10d63b7dSRichard Lowe /* .SUFFIXES: */
368*10d63b7dSRichard Lowe (void) printf("%s:", suffixes_name->string_mb);
369*10d63b7dSRichard Lowe for (dep = suffixes; dep != NULL; dep = dep->next) {
370*10d63b7dSRichard Lowe (void) printf(" %s", dep->name->string_mb);
371*10d63b7dSRichard Lowe build_suffix_list(dep->name);
372*10d63b7dSRichard Lowe }
373*10d63b7dSRichard Lowe (void) printf("\n\n");
374*10d63b7dSRichard Lowe
375*10d63b7dSRichard Lowe /* % rules */
376*10d63b7dSRichard Lowe for (percent = percent_list;
377*10d63b7dSRichard Lowe percent != NULL;
378*10d63b7dSRichard Lowe percent = percent->next) {
379*10d63b7dSRichard Lowe (void) printf("%s:",
380*10d63b7dSRichard Lowe percent->name->string_mb);
381*10d63b7dSRichard Lowe
382*10d63b7dSRichard Lowe for (percent_depe = percent->dependencies;
383*10d63b7dSRichard Lowe percent_depe != NULL;
384*10d63b7dSRichard Lowe percent_depe = percent_depe->next) {
385*10d63b7dSRichard Lowe (void) printf(" %s", percent_depe->name->string_mb);
386*10d63b7dSRichard Lowe }
387*10d63b7dSRichard Lowe
388*10d63b7dSRichard Lowe (void) printf("\n");
389*10d63b7dSRichard Lowe
390*10d63b7dSRichard Lowe for (rule = percent->command_template;
391*10d63b7dSRichard Lowe rule != NULL;
392*10d63b7dSRichard Lowe rule = rule->next) {
393*10d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
394*10d63b7dSRichard Lowe }
395*10d63b7dSRichard Lowe }
396*10d63b7dSRichard Lowe
397*10d63b7dSRichard Lowe /* Suffix rules */
398*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
399*10d63b7dSRichard Lowe Wstring wcb(p);
400*10d63b7dSRichard Lowe if (wcb.get_string()[0] == (int) period_char) {
401*10d63b7dSRichard Lowe print_rule(p);
402*10d63b7dSRichard Lowe }
403*10d63b7dSRichard Lowe }
404*10d63b7dSRichard Lowe
405*10d63b7dSRichard Lowe /* Macro assignments */
406*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
407*10d63b7dSRichard Lowe if (((prop = get_prop(p->prop, macro_prop)) != NULL) &&
408*10d63b7dSRichard Lowe (prop->body.macro.value != NULL)) {
409*10d63b7dSRichard Lowe (void) printf("%s", p->string_mb);
410*10d63b7dSRichard Lowe print_value(prop->body.macro.value,
411*10d63b7dSRichard Lowe (Daemon) prop->body.macro.daemon);
412*10d63b7dSRichard Lowe }
413*10d63b7dSRichard Lowe }
414*10d63b7dSRichard Lowe (void) printf("\n");
415*10d63b7dSRichard Lowe
416*10d63b7dSRichard Lowe /* Conditional macro assignments */
417*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
418*10d63b7dSRichard Lowe for (prop = get_prop(p->prop, conditional_prop);
419*10d63b7dSRichard Lowe prop != NULL;
420*10d63b7dSRichard Lowe prop = get_prop(prop->next, conditional_prop)) {
421*10d63b7dSRichard Lowe (void) printf("%s := %s",
422*10d63b7dSRichard Lowe p->string_mb,
423*10d63b7dSRichard Lowe prop->body.conditional.name->
424*10d63b7dSRichard Lowe string_mb);
425*10d63b7dSRichard Lowe if (prop->body.conditional.append) {
426*10d63b7dSRichard Lowe printf(" +");
427*10d63b7dSRichard Lowe }
428*10d63b7dSRichard Lowe else {
429*10d63b7dSRichard Lowe printf(" ");
430*10d63b7dSRichard Lowe }
431*10d63b7dSRichard Lowe print_value(prop->body.conditional.value,
432*10d63b7dSRichard Lowe no_daemon);
433*10d63b7dSRichard Lowe }
434*10d63b7dSRichard Lowe }
435*10d63b7dSRichard Lowe (void) printf("\n");
436*10d63b7dSRichard Lowe
437*10d63b7dSRichard Lowe /* All other dependencies */
438*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
439*10d63b7dSRichard Lowe if (p->colons != no_colon) {
440*10d63b7dSRichard Lowe print_rule(p);
441*10d63b7dSRichard Lowe }
442*10d63b7dSRichard Lowe }
443*10d63b7dSRichard Lowe (void) printf("\n");
444*10d63b7dSRichard Lowe }
445*10d63b7dSRichard Lowe
446*10d63b7dSRichard Lowe /*
447*10d63b7dSRichard Lowe * print_rule(target)
448*10d63b7dSRichard Lowe *
449*10d63b7dSRichard Lowe * Print the rule for one target
450*10d63b7dSRichard Lowe *
451*10d63b7dSRichard Lowe * Parameters:
452*10d63b7dSRichard Lowe * target Target we print rule for
453*10d63b7dSRichard Lowe *
454*10d63b7dSRichard Lowe * Global variables used:
455*10d63b7dSRichard Lowe */
456*10d63b7dSRichard Lowe static void
print_rule(register Name target)457*10d63b7dSRichard Lowe print_rule(register Name target)
458*10d63b7dSRichard Lowe {
459*10d63b7dSRichard Lowe register Cmd_line rule;
460*10d63b7dSRichard Lowe register Property line;
461*10d63b7dSRichard Lowe register Dependency dependency;
462*10d63b7dSRichard Lowe
463*10d63b7dSRichard Lowe if (target->dependency_printed ||
464*10d63b7dSRichard Lowe ((line = get_prop(target->prop, line_prop)) == NULL) ||
465*10d63b7dSRichard Lowe ((line->body.line.command_template == NULL) &&
466*10d63b7dSRichard Lowe (line->body.line.dependencies == NULL))) {
467*10d63b7dSRichard Lowe return;
468*10d63b7dSRichard Lowe }
469*10d63b7dSRichard Lowe target->dependency_printed = true;
470*10d63b7dSRichard Lowe
471*10d63b7dSRichard Lowe (void) printf("%s:", target->string_mb);
472*10d63b7dSRichard Lowe
473*10d63b7dSRichard Lowe for (dependency = line->body.line.dependencies;
474*10d63b7dSRichard Lowe dependency != NULL;
475*10d63b7dSRichard Lowe dependency = dependency->next) {
476*10d63b7dSRichard Lowe (void) printf(" %s", dependency->name->string_mb);
477*10d63b7dSRichard Lowe }
478*10d63b7dSRichard Lowe
479*10d63b7dSRichard Lowe (void) printf("\n");
480*10d63b7dSRichard Lowe
481*10d63b7dSRichard Lowe for (rule = line->body.line.command_template;
482*10d63b7dSRichard Lowe rule != NULL;
483*10d63b7dSRichard Lowe rule = rule->next) {
484*10d63b7dSRichard Lowe (void) printf("\t%s\n", rule->command_line->string_mb);
485*10d63b7dSRichard Lowe }
486*10d63b7dSRichard Lowe }
487*10d63b7dSRichard Lowe
488*10d63b7dSRichard Lowe void
dump_target_list(void)489*10d63b7dSRichard Lowe dump_target_list(void)
490*10d63b7dSRichard Lowe {
491*10d63b7dSRichard Lowe Name_set::iterator p, e;
492*10d63b7dSRichard Lowe Wstring str;
493*10d63b7dSRichard Lowe
494*10d63b7dSRichard Lowe for (p = hashtab.begin(), e = hashtab.end(); p != e; p++) {
495*10d63b7dSRichard Lowe str.init(p);
496*10d63b7dSRichard Lowe wchar_t * wcb = str.get_string();
497*10d63b7dSRichard Lowe if ((p->colons != no_colon) &&
498*10d63b7dSRichard Lowe ((wcb[0] != (int) period_char) ||
499*10d63b7dSRichard Lowe ((wcb[0] == (int) period_char) &&
500*10d63b7dSRichard Lowe (wcschr(wcb, (int) slash_char))))) {
501*10d63b7dSRichard Lowe print_target_n_deps(p);
502*10d63b7dSRichard Lowe }
503*10d63b7dSRichard Lowe }
504*10d63b7dSRichard Lowe }
505*10d63b7dSRichard Lowe
506*10d63b7dSRichard Lowe static void
print_target_n_deps(register Name target)507*10d63b7dSRichard Lowe print_target_n_deps(register Name target)
508*10d63b7dSRichard Lowe {
509*10d63b7dSRichard Lowe register Cmd_line rule;
510*10d63b7dSRichard Lowe register Property line;
511*10d63b7dSRichard Lowe register Dependency dependency;
512*10d63b7dSRichard Lowe
513*10d63b7dSRichard Lowe if (target->dependency_printed) {
514*10d63b7dSRichard Lowe return;
515*10d63b7dSRichard Lowe }
516*10d63b7dSRichard Lowe target->dependency_printed = true;
517*10d63b7dSRichard Lowe
518*10d63b7dSRichard Lowe (void) printf("%s\n", target->string_mb);
519*10d63b7dSRichard Lowe
520*10d63b7dSRichard Lowe if ((line = get_prop(target->prop, line_prop)) == NULL) {
521*10d63b7dSRichard Lowe return;
522*10d63b7dSRichard Lowe }
523*10d63b7dSRichard Lowe for (dependency = line->body.line.dependencies;
524*10d63b7dSRichard Lowe dependency != NULL;
525*10d63b7dSRichard Lowe dependency = dependency->next) {
526*10d63b7dSRichard Lowe if (!dependency->automatic) {
527*10d63b7dSRichard Lowe print_target_n_deps(dependency->name);
528*10d63b7dSRichard Lowe }
529*10d63b7dSRichard Lowe }
530*10d63b7dSRichard Lowe }
531*10d63b7dSRichard Lowe
532*10d63b7dSRichard Lowe /*****************************************
533*10d63b7dSRichard Lowe *
534*10d63b7dSRichard Lowe * main() support
535*10d63b7dSRichard Lowe */
536*10d63b7dSRichard Lowe
537*10d63b7dSRichard Lowe /*
538*10d63b7dSRichard Lowe * load_cached_names()
539*10d63b7dSRichard Lowe *
540*10d63b7dSRichard Lowe * Load the vector of cached names
541*10d63b7dSRichard Lowe *
542*10d63b7dSRichard Lowe * Parameters:
543*10d63b7dSRichard Lowe *
544*10d63b7dSRichard Lowe * Global variables used:
545*10d63b7dSRichard Lowe * Many many pointers to Name blocks.
546*10d63b7dSRichard Lowe */
547*10d63b7dSRichard Lowe void
load_cached_names(void)548*10d63b7dSRichard Lowe load_cached_names(void)
549*10d63b7dSRichard Lowe {
550*10d63b7dSRichard Lowe char *cp;
551*10d63b7dSRichard Lowe Name dollar;
552*10d63b7dSRichard Lowe
553*10d63b7dSRichard Lowe /* Load the cached_names struct */
554*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".BUILT_LAST_MAKE_RUN");
555*10d63b7dSRichard Lowe built_last_make_run = GETNAME(wcs_buffer, FIND_LENGTH);
556*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "@");
557*10d63b7dSRichard Lowe c_at = GETNAME(wcs_buffer, FIND_LENGTH);
558*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, " *conditionals* ");
559*10d63b7dSRichard Lowe conditionals = GETNAME(wcs_buffer, FIND_LENGTH);
560*10d63b7dSRichard Lowe /*
561*10d63b7dSRichard Lowe * A version of make was released with NSE 1.0 that used
562*10d63b7dSRichard Lowe * VERSION-1.1 but this version is identical to VERSION-1.0.
563*10d63b7dSRichard Lowe * The version mismatch code makes a special case for this
564*10d63b7dSRichard Lowe * situation. If the version number is changed from 1.0
565*10d63b7dSRichard Lowe * it should go to 1.2.
566*10d63b7dSRichard Lowe */
567*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VERSION-1.0");
568*10d63b7dSRichard Lowe current_make_version = GETNAME(wcs_buffer, FIND_LENGTH);
569*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SVR4");
570*10d63b7dSRichard Lowe svr4_name = GETNAME(wcs_buffer, FIND_LENGTH);
571*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".POSIX");
572*10d63b7dSRichard Lowe posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
573*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".DEFAULT");
574*10d63b7dSRichard Lowe default_rule_name = GETNAME(wcs_buffer, FIND_LENGTH);
575*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "$");
576*10d63b7dSRichard Lowe dollar = GETNAME(wcs_buffer, FIND_LENGTH);
577*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".DONE");
578*10d63b7dSRichard Lowe done = GETNAME(wcs_buffer, FIND_LENGTH);
579*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".");
580*10d63b7dSRichard Lowe dot = GETNAME(wcs_buffer, FIND_LENGTH);
581*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".KEEP_STATE");
582*10d63b7dSRichard Lowe dot_keep_state = GETNAME(wcs_buffer, FIND_LENGTH);
583*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".KEEP_STATE_FILE");
584*10d63b7dSRichard Lowe dot_keep_state_file = GETNAME(wcs_buffer, FIND_LENGTH);
585*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "");
586*10d63b7dSRichard Lowe empty_name = GETNAME(wcs_buffer, FIND_LENGTH);
587*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, " FORCE");
588*10d63b7dSRichard Lowe force = GETNAME(wcs_buffer, FIND_LENGTH);
589*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "HOST_ARCH");
590*10d63b7dSRichard Lowe host_arch = GETNAME(wcs_buffer, FIND_LENGTH);
591*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "HOST_MACH");
592*10d63b7dSRichard Lowe host_mach = GETNAME(wcs_buffer, FIND_LENGTH);
593*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".IGNORE");
594*10d63b7dSRichard Lowe ignore_name = GETNAME(wcs_buffer, FIND_LENGTH);
595*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".INIT");
596*10d63b7dSRichard Lowe init = GETNAME(wcs_buffer, FIND_LENGTH);
597*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".LOCAL");
598*10d63b7dSRichard Lowe localhost_name = GETNAME(wcs_buffer, FIND_LENGTH);
599*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".make.state");
600*10d63b7dSRichard Lowe make_state = GETNAME(wcs_buffer, FIND_LENGTH);
601*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "MAKEFLAGS");
602*10d63b7dSRichard Lowe makeflags = GETNAME(wcs_buffer, FIND_LENGTH);
603*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".MAKE_VERSION");
604*10d63b7dSRichard Lowe make_version = GETNAME(wcs_buffer, FIND_LENGTH);
605*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".NO_PARALLEL");
606*10d63b7dSRichard Lowe no_parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
607*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".NOT_AUTO");
608*10d63b7dSRichard Lowe not_auto = GETNAME(wcs_buffer, FIND_LENGTH);
609*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".PARALLEL");
610*10d63b7dSRichard Lowe parallel_name = GETNAME(wcs_buffer, FIND_LENGTH);
611*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "PATH");
612*10d63b7dSRichard Lowe path_name = GETNAME(wcs_buffer, FIND_LENGTH);
613*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "+");
614*10d63b7dSRichard Lowe plus = GETNAME(wcs_buffer, FIND_LENGTH);
615*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".PRECIOUS");
616*10d63b7dSRichard Lowe precious = GETNAME(wcs_buffer, FIND_LENGTH);
617*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "?");
618*10d63b7dSRichard Lowe query = GETNAME(wcs_buffer, FIND_LENGTH);
619*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "^");
620*10d63b7dSRichard Lowe hat = GETNAME(wcs_buffer, FIND_LENGTH);
621*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".RECURSIVE");
622*10d63b7dSRichard Lowe recursive_name = GETNAME(wcs_buffer, FIND_LENGTH);
623*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SCCS_GET");
624*10d63b7dSRichard Lowe sccs_get_name = GETNAME(wcs_buffer, FIND_LENGTH);
625*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SCCS_GET_POSIX");
626*10d63b7dSRichard Lowe sccs_get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
627*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".GET");
628*10d63b7dSRichard Lowe get_name = GETNAME(wcs_buffer, FIND_LENGTH);
629*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".GET_POSIX");
630*10d63b7dSRichard Lowe get_posix_name = GETNAME(wcs_buffer, FIND_LENGTH);
631*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "SHELL");
632*10d63b7dSRichard Lowe shell_name = GETNAME(wcs_buffer, FIND_LENGTH);
633*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SILENT");
634*10d63b7dSRichard Lowe silent_name = GETNAME(wcs_buffer, FIND_LENGTH);
635*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".SUFFIXES");
636*10d63b7dSRichard Lowe suffixes_name = GETNAME(wcs_buffer, FIND_LENGTH);
637*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, SUNPRO_DEPENDENCIES);
638*10d63b7dSRichard Lowe sunpro_dependencies = GETNAME(wcs_buffer, FIND_LENGTH);
639*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "TARGET_ARCH");
640*10d63b7dSRichard Lowe target_arch = GETNAME(wcs_buffer, FIND_LENGTH);
641*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "TARGET_MACH");
642*10d63b7dSRichard Lowe target_mach = GETNAME(wcs_buffer, FIND_LENGTH);
643*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VIRTUAL_ROOT");
644*10d63b7dSRichard Lowe virtual_root = GETNAME(wcs_buffer, FIND_LENGTH);
645*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "VPATH");
646*10d63b7dSRichard Lowe vpath_name = GETNAME(wcs_buffer, FIND_LENGTH);
647*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, ".WAIT");
648*10d63b7dSRichard Lowe wait_name = GETNAME(wcs_buffer, FIND_LENGTH);
649*10d63b7dSRichard Lowe
650*10d63b7dSRichard Lowe wait_name->state = build_ok;
651*10d63b7dSRichard Lowe
652*10d63b7dSRichard Lowe /* Mark special targets so that the reader treats them properly */
653*10d63b7dSRichard Lowe svr4_name->special_reader = svr4_special;
654*10d63b7dSRichard Lowe posix_name->special_reader = posix_special;
655*10d63b7dSRichard Lowe built_last_make_run->special_reader = built_last_make_run_special;
656*10d63b7dSRichard Lowe default_rule_name->special_reader = default_special;
657*10d63b7dSRichard Lowe dot_keep_state->special_reader = keep_state_special;
658*10d63b7dSRichard Lowe dot_keep_state_file->special_reader = keep_state_file_special;
659*10d63b7dSRichard Lowe ignore_name->special_reader = ignore_special;
660*10d63b7dSRichard Lowe make_version->special_reader = make_version_special;
661*10d63b7dSRichard Lowe no_parallel_name->special_reader = no_parallel_special;
662*10d63b7dSRichard Lowe parallel_name->special_reader = parallel_special;
663*10d63b7dSRichard Lowe localhost_name->special_reader = localhost_special;
664*10d63b7dSRichard Lowe precious->special_reader = precious_special;
665*10d63b7dSRichard Lowe sccs_get_name->special_reader = sccs_get_special;
666*10d63b7dSRichard Lowe sccs_get_posix_name->special_reader = sccs_get_posix_special;
667*10d63b7dSRichard Lowe get_name->special_reader = get_special;
668*10d63b7dSRichard Lowe get_posix_name->special_reader = get_posix_special;
669*10d63b7dSRichard Lowe silent_name->special_reader = silent_special;
670*10d63b7dSRichard Lowe suffixes_name->special_reader = suffixes_special;
671*10d63b7dSRichard Lowe
672*10d63b7dSRichard Lowe /* The value of $$ is $ */
673*10d63b7dSRichard Lowe (void) SETVAR(dollar, dollar, false);
674*10d63b7dSRichard Lowe dollar->dollar = false;
675*10d63b7dSRichard Lowe
676*10d63b7dSRichard Lowe /* Set the value of $(SHELL) */
677*10d63b7dSRichard Lowe if (posix) {
678*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "/usr/xpg4/bin/sh");
679*10d63b7dSRichard Lowe } else {
680*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, "/bin/sh");
681*10d63b7dSRichard Lowe }
682*10d63b7dSRichard Lowe (void) SETVAR(shell_name, GETNAME(wcs_buffer, FIND_LENGTH), false);
683*10d63b7dSRichard Lowe
684*10d63b7dSRichard Lowe /*
685*10d63b7dSRichard Lowe * Use " FORCE" to simulate a FRC dependency for :: type
686*10d63b7dSRichard Lowe * targets with no dependencies.
687*10d63b7dSRichard Lowe */
688*10d63b7dSRichard Lowe (void) append_prop(force, line_prop);
689*10d63b7dSRichard Lowe force->stat.time = file_max_time;
690*10d63b7dSRichard Lowe
691*10d63b7dSRichard Lowe /* Make sure VPATH is defined before current dir is read */
692*10d63b7dSRichard Lowe if ((cp = getenv(vpath_name->string_mb)) != NULL) {
693*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, cp);
694*10d63b7dSRichard Lowe (void) SETVAR(vpath_name,
695*10d63b7dSRichard Lowe GETNAME(wcs_buffer, FIND_LENGTH),
696*10d63b7dSRichard Lowe false);
697*10d63b7dSRichard Lowe }
698*10d63b7dSRichard Lowe
699*10d63b7dSRichard Lowe /* Check if there is NO PATH variable. If not we construct one. */
700*10d63b7dSRichard Lowe if (getenv(path_name->string_mb) == NULL) {
701*10d63b7dSRichard Lowe vroot_path = NULL;
702*10d63b7dSRichard Lowe add_dir_to_path(".", &vroot_path, -1);
703*10d63b7dSRichard Lowe add_dir_to_path("/bin", &vroot_path, -1);
704*10d63b7dSRichard Lowe add_dir_to_path("/usr/bin", &vroot_path, -1);
705*10d63b7dSRichard Lowe }
706*10d63b7dSRichard Lowe }
707*10d63b7dSRichard Lowe
708*10d63b7dSRichard Lowe /*
709*10d63b7dSRichard Lowe * iterate on list of conditional macros in np, and place them in
710*10d63b7dSRichard Lowe * a String_rec starting with, and separated by the '$' character.
711*10d63b7dSRichard Lowe */
712*10d63b7dSRichard Lowe void
cond_macros_into_string(Name np,String_rec * buffer)713*10d63b7dSRichard Lowe cond_macros_into_string(Name np, String_rec *buffer)
714*10d63b7dSRichard Lowe {
715*10d63b7dSRichard Lowe Macro_list macro_list;
716*10d63b7dSRichard Lowe
717*10d63b7dSRichard Lowe /*
718*10d63b7dSRichard Lowe * Put the version number at the start of the string
719*10d63b7dSRichard Lowe */
720*10d63b7dSRichard Lowe MBSTOWCS(wcs_buffer, DEPINFO_FMT_VERSION);
721*10d63b7dSRichard Lowe append_string(wcs_buffer, buffer, FIND_LENGTH);
722*10d63b7dSRichard Lowe /*
723*10d63b7dSRichard Lowe * Add the rest of the conditional macros to the buffer
724*10d63b7dSRichard Lowe */
725*10d63b7dSRichard Lowe if (np->depends_on_conditional){
726*10d63b7dSRichard Lowe for (macro_list = np->conditional_macro_list;
727*10d63b7dSRichard Lowe macro_list != NULL; macro_list = macro_list->next){
728*10d63b7dSRichard Lowe append_string(macro_list->macro_name, buffer,
729*10d63b7dSRichard Lowe FIND_LENGTH);
730*10d63b7dSRichard Lowe append_char((int) equal_char, buffer);
731*10d63b7dSRichard Lowe append_string(macro_list->value, buffer, FIND_LENGTH);
732*10d63b7dSRichard Lowe append_char((int) dollar_char, buffer);
733*10d63b7dSRichard Lowe }
734*10d63b7dSRichard Lowe }
735*10d63b7dSRichard Lowe }
736*10d63b7dSRichard Lowe
737