static int recompile_files (void) { file *f; putenv (xstrdup ("COMPILER_PATH=")); putenv (xstrdup ("LIBRARY_PATH=")); while ((f = file_pop ()) != NULL) { char *line, *command; FILE *stream = fopen (f->key, "r"); const char *const outname = frob_extension (f->key, ".rnw"); FILE *output = fopen (outname, "w"); while ((line = tfgets (stream)) != NULL) { switch (line[0]) { case 'C': case 'O': maybe_tweak (line, f); } fprintf (output, "%s\n", line); } fclose (stream); fclose (output); rename (outname, f->key); obstack_grow (&temporary_obstack, "cd ", 3); obstack_grow (&temporary_obstack, f->dir, strlen (f->dir)); obstack_grow (&temporary_obstack, "; ", 2); obstack_grow (&temporary_obstack, c_file_name, strlen (c_file_name)); obstack_1grow (&temporary_obstack, ' '); obstack_grow (&temporary_obstack, f->args, strlen (f->args)); obstack_1grow (&temporary_obstack, ' '); command = obstack_copy0 (&temporary_obstack, f->main, strlen (f->main)); if (tlink_verbose) fprintf (stderr, _("collect: recompiling %s\n"), f->main); if (tlink_verbose >= 3) fprintf (stderr, "%s\n", command); if (system (command) != 0) return 0; read_repo_file (f); obstack_free (&temporary_obstack, temporary_firstobj); } return 1; }
static int recompile_files (void) { file *f; putenv (xstrdup ("COMPILER_PATH=")); putenv (xstrdup ("LIBRARY_PATH=")); while ((f = file_pop ()) != NULL) { char *line; const char *p, *q; char **argv; struct obstack arg_stack; FILE *stream = fopen (f->key, "r"); const char *const outname = frob_extension (f->key, ".rnw"); FILE *output = fopen (outname, "w"); while ((line = tfgets (stream)) != NULL) { switch (line[0]) { case 'C': case 'O': maybe_tweak (line, f); } fprintf (output, "%s\n", line); } fclose (stream); fclose (output); rename (outname, f->key); if (!f->args) { error ("repository file `%s' does not contain command-line " "arguments", f->key); return 0; } /* Build a null-terminated argv array suitable for tlink_execute(). Manipulate arguments on the arg_stack while building argv on the temporary_obstack. */ obstack_init (&arg_stack); obstack_ptr_grow (&temporary_obstack, c_file_name); for (p = f->args; *p != '\0'; p = q + 1) { /* Arguments are delimited by single-quotes. Find the opening quote. */ p = strchr (p, '\''); if (!p) goto done; /* Find the closing quote. */ q = strchr (p + 1, '\''); if (!q) goto done; obstack_grow (&arg_stack, p + 1, q - (p + 1)); /* Replace '\'' with '. This is how set_collect_gcc_options encodes a single-quote. */ while (q[1] == '\\' && q[2] == '\'' && q[3] == '\'') { const char *r; r = strchr (q + 4, '\''); if (!r) goto done; obstack_grow (&arg_stack, q + 3, r - (q + 3)); q = r; } obstack_1grow (&arg_stack, '\0'); obstack_ptr_grow (&temporary_obstack, obstack_finish (&arg_stack)); } done: obstack_ptr_grow (&temporary_obstack, f->main); obstack_ptr_grow (&temporary_obstack, NULL); argv = obstack_finish (&temporary_obstack); if (tlink_verbose) fprintf (stderr, _("collect: recompiling %s\n"), f->main); if (chdir (f->dir) != 0 || tlink_execute (c_file_name, argv, NULL) != 0 || chdir (initial_cwd) != 0) return 0; read_repo_file (f); obstack_free (&arg_stack, NULL); obstack_free (&temporary_obstack, temporary_firstobj); } return 1; }