diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/libgroff/tmpfile.cc | 54 | ||||
-rw-r--r-- | src/preproc/html/pre-html.cc | 59 | ||||
-rw-r--r-- | src/roff/groff/groff.cc | 2 |
3 files changed, 60 insertions, 55 deletions
diff --git a/src/libs/libgroff/tmpfile.cc b/src/libs/libgroff/tmpfile.cc index 27550994..4a53a06b 100644 --- a/src/libs/libgroff/tmpfile.cc +++ b/src/libs/libgroff/tmpfile.cc @@ -117,43 +117,41 @@ char *xtmptemplate(const char *postfix_long, const char *postfix_short) // The trick with unlinking the temporary file while it is still in // use is not portable, it will fail on MS-DOS and most MS-Windows // filesystems. So it cannot be used on non-Posix systems. -// Instead, we maintain a list of files to be deleted on exit, and -// register an atexit function that will remove them all in one go. +// Instead, we maintain a list of files to be deleted on exit. // This should be portable to all platforms. -static struct xtmpfile_list { - struct xtmpfile_list *next; - char fname[1]; -} *xtmpfiles_to_delete; +struct xtmpfile_list { + const char *fname; + xtmpfile_list *next; + xtmpfile_list(const char *fn) : fname(fn), next(0) {} +}; -static void remove_tmp_files() +xtmpfile_list *xtmpfiles_to_delete = 0; + +struct xtmpfile_list_init { + ~xtmpfile_list_init(); +} _xtmpfile_list_init; + +xtmpfile_list_init::~xtmpfile_list_init() { - struct xtmpfile_list *p = xtmpfiles_to_delete; - - while (p) { - if (unlink(p->fname) < 0) - error("cannot unlink `%1': %2", p->fname, strerror(errno)); - struct xtmpfile_list *old = p; - p = p->next; - free(old); + xtmpfile_list *x = xtmpfiles_to_delete; + while (x != 0) { + if (unlink(x->fname) < 0) + error("cannot unlink `%1': %2", x->fname, strerror(errno)); + xtmpfile_list *tmp = x; + x = x->next; + a_delete tmp->fname; + delete tmp; } } static void add_tmp_file(const char *name) { - if (xtmpfiles_to_delete == NULL) - atexit(remove_tmp_files); - - struct xtmpfile_list *p - = (struct xtmpfile_list *)malloc(sizeof(struct xtmpfile_list) - + strlen (name)); - if (p == NULL) { - error("cannot unlink `%1': %2", name, strerror(errno)); - return; - } - p->next = xtmpfiles_to_delete; - strcpy(p->fname, name); - xtmpfiles_to_delete = p; + char *s = new char[strlen(name)]; + strcpy(s, name); + xtmpfile_list *x = new xtmpfile_list(s); + x->next = xtmpfiles_to_delete; + xtmpfiles_to_delete = x; } // Open a temporary file and with fatal error on failure. diff --git a/src/preproc/html/pre-html.cc b/src/preproc/html/pre-html.cc index dcb234f4..dd9ee0af 100644 --- a/src/preproc/html/pre-html.cc +++ b/src/preproc/html/pre-html.cc @@ -72,6 +72,7 @@ extern "C" const char *Version_string; #define PS_TEMPLATE_LONG "-ps-" #define REGION_TEMPLATE_SHORT "rg" #define REGION_TEMPLATE_LONG "-regions-" +#define TROFF_COMMAND "troff" #if 0 # define DEBUGGING @@ -101,8 +102,6 @@ static int image_res = DEFAULT_IMAGE_RES; static int vertical_offset= DEFAULT_VERTICAL_OFFSET; static char *image_template = NULL; // image template filename static int troff_arg = 0; // troff arg index -static char *command_prefix = NULL; // optional prefix for some installations. -static char *troff_command = NULL; static char *image_dir = NULL; // user specified image directory #if defined(DEBUGGING) static int debug = FALSE; @@ -1119,7 +1118,7 @@ static void waitForChild (PID_T pid) * alterDeviceTo - if toImage is set then the arg list is altered to include * IMAGE_DEVICE and we invoke groff rather than troff. * else - * set -Thtml and troff + * set -Thtml and groff */ static void alterDeviceTo (int argc, char *argv[], int toImage) @@ -1141,11 +1140,37 @@ static void alterDeviceTo (int argc, char *argv[], int toImage) } i++; } - argv[troff_arg] = troff_command; /* use troff */ + argv[troff_arg] = "groff"; /* use groff -Z */ } } /* + * addZ - appends -Z onto the command list for groff. + */ + +char **addZ (int argc, char *argv[]) +{ + char **new_argv = (char **)malloc((argc+2)*sizeof(char *)); + int i=0; + + if (new_argv == NULL) + sys_fatal("malloc"); + + while (i<troff_arg) { + new_argv[i] = argv[i]; + i++; + } + new_argv[i] = "-Z"; + while (i<argc) { + new_argv[i+1] = argv[i]; + i++; + } + argc++; + new_argv[argc] = NULL; + return( new_argv ); +} + +/* * do_html - sets the troff number htmlflip and * writes out the buffer to troff -Thtml */ @@ -1159,8 +1184,10 @@ int char_buffer::do_html(int argc, char *argv[]) sys_fatal("pipe"); alterDeviceTo(argc, argv, 0); - argv += troff_arg; // skip all arguments up to troff/groff + argv += troff_arg; // skip all arguments up to groff argc -= troff_arg; + argv = addZ(argc, argv); + argc++; #if defined(DEBUG_HTML) write_file_html(); @@ -1327,7 +1354,7 @@ int scanArguments (int argc, char **argv) || (strcmp(argv[i], "-?") == 0)) { usage(stdout); exit(0); - } else if (strcmp(argv[i], troff_command) == 0) { + } else if (strcmp(argv[i], TROFF_COMMAND) == 0) { /* remember troff argument number */ troff_arg = i; #if defined(DEBUGGING) @@ -1391,25 +1418,6 @@ static void removeTempFiles (void) #endif } -/* - * findPrefix - finds the optional prefix to the groff utilities. - * It also builds the 'troff' executable name. - */ - -static void findPrefix (void) -{ - command_prefix = getenv("GROFF_COMMAND_PREFIX"); - if (!command_prefix) - command_prefix = PROG_PREFIX; - troff_command = (char *)malloc(strlen("troff")+strlen(command_prefix)+1); - if (troff_command == NULL) - sys_fatal("malloc"); - - strcpy(troff_command, command_prefix); - strcat(troff_command, "troff"); -} - - int main(int argc, char **argv) { program_name = argv[0]; @@ -1417,7 +1425,6 @@ int main(int argc, char **argv) int found=0; int ok=1; - findPrefix(); i = scanArguments(argc, argv); checkImageDir(); makeFileName(); diff --git a/src/roff/groff/groff.cc b/src/roff/groff/groff.cc index 7e95c33e..6e45edfa 100644 --- a/src/roff/groff/groff.cc +++ b/src/roff/groff/groff.cc @@ -281,7 +281,7 @@ int main(int argc, char **argv) if (!postdriver) fatal("no `postpro' command in DESC file for device `%1'", device); - if (predriver) { + if (predriver && !zflag) { commands[TROFF_INDEX].insert_arg(commands[TROFF_INDEX].get_name()); const char *p = Pargs.contents(); const char *end = p + Pargs.length(); |