aboutsummaryrefslogtreecommitdiff
path: root/contrib/groff/src/preproc/html
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2017-06-07 23:00:34 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2017-06-07 23:00:34 +0000
commit738919c0391b99947b758d85f6a8636be1886fbb (patch)
tree6dcdfc8513007dbfe8dd40dfb3d7dfffb49b6651 /contrib/groff/src/preproc/html
parente0e0323354c55335775e3a55b1af0f93967fb412 (diff)
downloadsrc-738919c0391b99947b758d85f6a8636be1886fbb.tar.gz
src-738919c0391b99947b758d85f6a8636be1886fbb.zip
Remove groff from base
All manpages in base are now compatible with mandoc(1), all roff documentation will be relocated in the doc tree. man(1) can now use groff from the ports tree if it needs. Also remove checknr(1) and colcrt(1) which are only useful with groff. Approved by: (no objections on the mailing lists)
Notes
Notes: svn path=/head/; revision=319664
Diffstat (limited to 'contrib/groff/src/preproc/html')
-rw-r--r--contrib/groff/src/preproc/html/Makefile.sub7
-rw-r--r--contrib/groff/src/preproc/html/pre-html.cpp1779
-rw-r--r--contrib/groff/src/preproc/html/pre-html.h37
-rw-r--r--contrib/groff/src/preproc/html/pushback.cpp329
-rw-r--r--contrib/groff/src/preproc/html/pushback.h54
5 files changed, 0 insertions, 2206 deletions
diff --git a/contrib/groff/src/preproc/html/Makefile.sub b/contrib/groff/src/preproc/html/Makefile.sub
deleted file mode 100644
index 0763537a94e6..000000000000
--- a/contrib/groff/src/preproc/html/Makefile.sub
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG=pre-grohtml$(EXEEXT)
-# MAN1=pre-grohtml.n
-MAN1=
-XLIBS=$(LIBGROFF)
-MLIB=$(LIBM)
-OBJS=pre-html.$(OBJEXT) pushback.$(OBJEXT)
-CCSRCS=$(srcdir)/pre-html.cpp $(srcdir)/pushback.cpp
diff --git a/contrib/groff/src/preproc/html/pre-html.cpp b/contrib/groff/src/preproc/html/pre-html.cpp
deleted file mode 100644
index 6f8a46aee0fc..000000000000
--- a/contrib/groff/src/preproc/html/pre-html.cpp
+++ /dev/null
@@ -1,1779 +0,0 @@
-// -*- C++ -*-
-/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
- Written by Gaius Mulley (gaius@glam.ac.uk).
-
-This file is part of groff.
-
-groff is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-groff is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License along
-with groff; see the file COPYING. If not, write to the Free Software
-Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#define PREHTMLC
-
-#include "lib.h"
-
-#include <signal.h>
-#include <ctype.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "errarg.h"
-#include "error.h"
-#include "stringclass.h"
-#include "posix.h"
-#include "defs.h"
-#include "searchpath.h"
-#include "paper.h"
-#include "device.h"
-#include "font.h"
-
-#include <errno.h>
-#include <sys/types.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef _POSIX_VERSION
-# include <sys/wait.h>
-# define PID_T pid_t
-#else /* not _POSIX_VERSION */
-# define PID_T int
-#endif /* not _POSIX_VERSION */
-
-#include <stdarg.h>
-
-#include "nonposix.h"
-
-/* Establish some definitions to facilitate discrimination between
- differing runtime environments. */
-
-#undef MAY_FORK_CHILD_PROCESS
-#undef MAY_SPAWN_ASYNCHRONOUS_CHILD
-
-#if defined(__MSDOS__) || defined(_WIN32)
-
-// Most MS-DOS and Win32 environments will be missing the `fork' capability
-// (some like Cygwin have it, but it is best avoided).
-
-# define MAY_FORK_CHILD_PROCESS 0
-
-// On these systems, we use `spawn...', instead of `fork' ... `exec...'.
-# include <process.h> // for `spawn...'
-# include <fcntl.h> // for attributes of pipes
-
-# if defined(__CYGWIN__) || defined(_UWIN) || defined(_WIN32)
-
-// These Win32 implementations allow parent and `spawn...'ed child to
-// multitask asynchronously.
-
-# define MAY_SPAWN_ASYNCHRONOUS_CHILD 1
-
-# else
-
-// Others may adopt MS-DOS behaviour where parent must sleep,
-// from `spawn...' until child terminates.
-
-# define MAY_SPAWN_ASYNCHRONOUS_CHILD 0
-
-# endif /* not defined __CYGWIN__, _UWIN, or _WIN32 */
-
-# if defined(DEBUGGING) && !defined(DEBUG_FILE_DIR)
-/* When we are building a DEBUGGING version we need to tell pre-grohtml
- where to put intermediate files (the DEBUGGING version will preserve
- these on exit).
-
- On a UNIX host, we might simply use `/tmp', but MS-DOS and Win32 will
- probably not have this on all disk drives, so default to using
- `c:/temp' instead. (Note that user may choose to override this by
- supplying a definition such as
-
- -DDEBUG_FILE_DIR=d:/path/to/debug/files
-
- in the CPPFLAGS to `make'.) */
-
-# define DEBUG_FILE_DIR c:/temp
-# endif
-
-#else /* not __MSDOS__ or _WIN32 */
-
-// For non-Microsoft environments assume UNIX conventions,
-// so `fork' is required and child processes are asynchronous.
-# define MAY_FORK_CHILD_PROCESS 1
-# define MAY_SPAWN_ASYNCHRONOUS_CHILD 1
-
-# if defined(DEBUGGING) && !defined(DEBUG_FILE_DIR)
-/* For a DEBUGGING version, on the UNIX host, we can also usually rely
- on being able to use `/tmp' for temporary file storage. (Note that,
- as in the __MSDOS__ or _WIN32 case above, the user may override this
- by defining
-
- -DDEBUG_FILE_DIR=/path/to/debug/files
-
- in the CPPFLAGS.) */
-
-# define DEBUG_FILE_DIR /tmp
-# endif
-
-#endif /* not __MSDOS__ or _WIN32 */
-
-#ifdef DEBUGGING
-// For a DEBUGGING version, we need some additional macros,
-// to direct the captured debug mode output to appropriately named files
-// in the specified DEBUG_FILE_DIR.
-
-# define DEBUG_TEXT(text) #text
-# define DEBUG_NAME(text) DEBUG_TEXT(text)
-# define DEBUG_FILE(name) DEBUG_NAME(DEBUG_FILE_DIR) "/" name
-#endif
-
-extern "C" const char *Version_string;
-
-#include "pre-html.h"
-#include "pushback.h"
-#include "html-strings.h"
-
-#define DEFAULT_LINE_LENGTH 7 // inches wide
-#define DEFAULT_IMAGE_RES 100 // number of pixels per inch resolution
-#define IMAGE_BOARDER_PIXELS 0
-#define INLINE_LEADER_CHAR '\\'
-
-// Don't use colour names here! Otherwise there is a dependency on
-// a file called `rgb.txt' which maps names to colours.
-#define TRANSPARENT "-background rgb:f/f/f -transparent rgb:f/f/f"
-#define MIN_ALPHA_BITS 0
-#define MAX_ALPHA_BITS 4
-
-#define PAGE_TEMPLATE_SHORT "pg"
-#define PAGE_TEMPLATE_LONG "-page-"
-#define PS_TEMPLATE_SHORT "ps"
-#define PS_TEMPLATE_LONG "-ps-"
-#define REGION_TEMPLATE_SHORT "rg"
-#define REGION_TEMPLATE_LONG "-regions-"
-
-#if 0
-# define DEBUGGING
-#endif
-
-#if !defined(TRUE)
-# define TRUE (1==1)
-#endif
-#if !defined(FALSE)
-# define FALSE (1==0)
-#endif
-
-typedef enum {
- CENTERED, LEFT, RIGHT, INLINE
-} IMAGE_ALIGNMENT;
-
-static int postscriptRes = -1; // postscript resolution,
- // dots per inch
-static int stdoutfd = 1; // output file descriptor -
- // normally 1 but might move
- // -1 means closed
-static char *psFileName = NULL; // name of postscript file
-static char *psPageName = NULL; // name of file containing
- // postscript current page
-static char *regionFileName = NULL; // name of file containing all
- // image regions
-static char *imagePageName = NULL; // name of bitmap image containing
- // current page
-static const char *image_device = "pnmraw";
-static int image_res = DEFAULT_IMAGE_RES;
-static int vertical_offset = 0;
-static char *image_template = NULL; // image template filename
-static char *macroset_template= NULL; // image template passed to troff
- // by -D
-static int troff_arg = 0; // troff arg index
-static char *image_dir = NULL; // user specified image directory
-static int textAlphaBits = MAX_ALPHA_BITS;
-static int graphicAlphaBits = MAX_ALPHA_BITS;
-static char *antiAlias = NULL; // antialias arguments we pass to gs
-static int show_progress = FALSE; // should we display page numbers as
- // they are processed?
-static int currentPageNo = -1; // current image page number
-#if defined(DEBUGGING)
-static int debug = FALSE;
-static char *troffFileName = NULL; // output of pre-html output which
- // is sent to troff -Tps
-static char *htmlFileName = NULL; // output of pre-html output which
- // is sent to troff -Thtml
-#endif
-
-static char *linebuf = NULL; // for scanning devps/DESC
-static int linebufsize = 0;
-static const char *image_gen = NULL; // the `gs' program
-
-const char *const FONT_ENV_VAR = "GROFF_FONT_PATH";
-static search_path font_path(FONT_ENV_VAR, FONTPATH, 0, 0);
-
-
-/*
- * Images are generated via postscript, gs, and the pnm utilities.
- */
-#define IMAGE_DEVICE "-Tps"
-
-
-static int do_file(const char *filename);
-
-
-/*
- * sys_fatal - Write a fatal error message.
- * Taken from src/roff/groff/pipeline.c.
- */
-
-void sys_fatal(const char *s)
-{
- fatal("%1: %2", s, strerror(errno));
-}
-
-/*
- * get_line - Copy a line (w/o newline) from a file to the
- * global line buffer.
- */
-
-int get_line(FILE *f)
-{
- if (f == 0)
- return 0;
- if (linebuf == 0) {
- linebuf = new char[128];
- linebufsize = 128;
- }
- int i = 0;
- // skip leading whitespace
- for (;;) {
- int c = getc(f);
- if (c == EOF)
- return 0;
- if (c != ' ' && c != '\t') {
- ungetc(c, f);
- break;
- }
- }
- for (;;) {
- int c = getc(f);
- if (c == EOF)
- break;
- if (i + 1 >= linebufsize) {
- char *old_linebuf = linebuf;
- linebuf = new char[linebufsize * 2];
- memcpy(linebuf, old_linebuf, linebufsize);
- a_delete old_linebuf;
- linebufsize *= 2;
- }
- linebuf[i++] = c;
- if (c == '\n') {
- i--;
- break;
- }
- }
- linebuf[i] = '\0';
- return 1;
-}
-
-/*
- * get_resolution - Return the postscript resolution from devps/DESC.
- */
-
-static unsigned int get_resolution(void)
-{
- char *pathp;
- FILE *f;
- unsigned int res;
- f = font_path.open_file("devps/DESC", &pathp);
- a_delete pathp;
- if (f == 0)
- fatal("can't open devps/DESC");
- while (get_line(f)) {
- int n = sscanf(linebuf, "res %u", &res);
- if (n >= 1) {
- fclose(f);
- return res;
- }
- }
- fatal("can't find `res' keyword in devps/DESC");
- return 0;
-}
-
-/*
- * html_system - A wrapper for system().
- */
-
-void html_system(const char *s, int redirect_stdout)
-{
- // Redirect standard error to the null device. This is more
- // portable than using "2> /dev/null", since it doesn't require a
- // Unixy shell.
- int save_stderr = dup(2);
- int save_stdout = dup(1);
- int fdnull = open(NULL_DEV, O_WRONLY|O_BINARY, 0666);
- if (save_stderr > 2 && fdnull > 2)
- dup2(fdnull, 2);
- if (redirect_stdout && save_stdout > 1 && fdnull > 1)
- dup2(fdnull, 1);
- if (fdnull >= 0)
- close(fdnull);
- int status = system(s);
- dup2(save_stderr, 2);
- if (redirect_stdout)
- dup2(save_stdout, 1);
- if (status == -1)
- fprintf(stderr, "Calling `%s' failed\n", s);
- else if (status)
- fprintf(stderr, "Calling `%s' returned status %d\n", s, status);
- close(save_stderr);
- close(save_stdout);
-}
-
-/*
- * make_message - Create a string via malloc and place the result of the
- * va args into string. Finally the new string is returned.
- * Taken from man page of printf(3).
- */
-
-char *make_message(const char *fmt, ...)
-{
- /* Guess we need no more than 100 bytes. */
- int n, size = 100;
- char *p;
- char *np;
- va_list ap;
- if ((p = (char *)malloc(size)) == NULL)
- return NULL;
- while (1) {
- /* Try to print in the allocated space. */
- va_start(ap, fmt);
- n = vsnprintf(p, size, fmt, ap);
- va_end(ap);
- /* If that worked, return the string. */
- if (n > -1 && n < size - 1) { /* glibc 2.1 and pre-ANSI C 99 */
- if (size > n + 1) {
- np = strsave(p);
- free(p);
- return np;
- }
- return p;
- }
- /* Else try again with more space. */
- else /* glibc 2.0 */
- size *= 2; /* twice the old size */
- if ((np = (char *)realloc(p, size)) == NULL) {
- free(p); /* realloc failed, free old, p. */
- return NULL;
- }
- p = np; /* use realloc'ed, p */
- }
-}
-
-/*
- * the class and methods for retaining ascii text
- */
-
-struct char_block {
- enum { SIZE = 256 };
- char buffer[SIZE];
- int used;
- char_block *next;
-
- char_block();
-};
-
-/*
- * char_block - Constructor. Set the, used, and, next, fields to zero.
- */
-
-char_block::char_block()
-: used(0), next(0)
-{
- for (int i = 0; i < SIZE; i++)
- buffer[i] = 0;
-}
-
-class char_buffer {
-public:
- char_buffer();
- ~char_buffer();
- int read_file(FILE *fp);
- int do_html(int argc, char *argv[]);
- int do_image(int argc, char *argv[]);
- void emit_troff_output(int device_format_selector);
- void write_upto_newline(char_block **t, int *i, int is_html);
- int can_see(char_block **t, int *i, const char *string);
- int skip_spaces(char_block **t, int *i);
- void skip_until_newline(char_block **t, int *i);
-private:
- char_block *head;
- char_block *tail;
- int run_output_filter(int device_format_selector, int argc, char *argv[]);
-};
-
-/*
- * char_buffer - Constructor.
- */
-
-char_buffer::char_buffer()
-: head(0), tail(0)
-{
-}
-
-/*
- * char_buffer - Destructor. Throw away the whole buffer list.
- */
-
-char_buffer::~char_buffer()
-{
- while (head != NULL) {
- char_block *temp = head;
- head = head->next;
- delete temp;
- }
-}
-
-/*
- * read_file - Read in a complete file, fp, placing the contents inside
- * char_blocks.
- */
-
-int char_buffer::read_file(FILE *fp)
-{
- int n;
- while (!feof(fp)) {
- if (tail == NULL) {
- tail = new char_block;
- head = tail;
- }
- else {
- if (tail->used == char_block::SIZE) {
- tail->next = new char_block;
- tail = tail->next;
- }
- }
- // at this point we have a tail which is ready for the next SIZE
- // bytes of the file
- n = fread(tail->buffer, sizeof(char), char_block::SIZE-tail->used, fp);
- if (n <= 0)
- // error
- return 0;
- else
- tail->used += n * sizeof(char);
- }
- return 1;
-}
-
-/*
- * writeNbytes - Write n bytes to stdout.
- */
-
-static void writeNbytes(const char *s, int l)
-{
- int n = 0;
- int r;
-
- while (n < l) {
- r = write(stdoutfd, s, l - n);
- if (r < 0)
- sys_fatal("write");
- n += r;
- s += r;
- }
-}
-
-/*
- * writeString - Write a string to stdout.
- */
-
-static void writeString(const char *s)
-{
- writeNbytes(s, strlen(s));
-}
-
-/*
- * makeFileName - Create the image filename template
- * and the macroset image template.
- */
-
-static void makeFileName(void)
-{
- if ((image_dir != NULL) && (strchr(image_dir, '%') != NULL)) {
- error("cannot use a `%%' within the image directory name");
- exit(1);
- }
-
- if ((image_template != NULL) && (strchr(image_template, '%') != NULL)) {
- error("cannot use a `%%' within the image template");
- exit(1);
- }
-
- if (image_dir == NULL)
- image_dir = (char *)"";
- else if (strlen(image_dir) > 0
- && image_dir[strlen(image_dir) - 1] != '/') {
- image_dir = make_message("%s/", image_dir);
- if (image_dir == NULL)
- sys_fatal("make_message");
- }
-
- if (image_template == NULL)
- macroset_template = make_message("%sgrohtml-%d", image_dir,
- (int)getpid());
- else
- macroset_template = make_message("%s%s", image_dir, image_template);
-
- if (macroset_template == NULL)
- sys_fatal("make_message");
-
- image_template =
- (char *)malloc(strlen("-%d") + strlen(macroset_template) + 1);
- if (image_template == NULL)
- sys_fatal("malloc");
- strcpy(image_template, macroset_template);
- strcat(image_template, "-%d");
-}
-
-/*
- * setupAntiAlias - Set up the antialias string, used when we call gs.
- */
-
-static void setupAntiAlias(void)
-{
- if (textAlphaBits == 0 && graphicAlphaBits == 0)
- antiAlias = make_message(" ");
- else if (textAlphaBits == 0)
- antiAlias = make_message("-dGraphicsAlphaBits=%d ", graphicAlphaBits);
- else if (graphicAlphaBits == 0)
- antiAlias = make_message("-dTextAlphaBits=%d ", textAlphaBits);
- else
- antiAlias = make_message("-dTextAlphaBits=%d -dGraphicsAlphaBits=%d ",
- textAlphaBits, graphicAlphaBits);
-}
-
-/*
- * checkImageDir - Check whether the image directory is available.
- */
-
-static void checkImageDir(void)
-{
- if (image_dir != NULL && strcmp(image_dir, "") != 0)
- if (!(mkdir(image_dir, 0777) == 0 || errno == EEXIST)) {
- error("cannot create directory `%1'", image_dir);
- exit(1);
- }
-}
-
-/*
- * write_end_image - End the image. Write out the image extents if we
- * are using -Tps.
- */
-
-static void write_end_image(int is_html)
-{
- /*
- * if we are producing html then these
- * emit image name and enable output
- * else
- * we are producing images
- * in which case these generate image
- * boundaries
- */
- writeString("\\O[4]\\O[2]");
- if (is_html)
- writeString("\\O[1]");
- else
- writeString("\\O[0]");
-}
-
-/*
- * write_start_image - Write troff code which will:
- *
- * (i) disable html output for the following image
- * (ii) reset the max/min x/y registers during postscript
- * rendering.
- */
-
-static void write_start_image(IMAGE_ALIGNMENT pos, int is_html)
-{
- writeString("\\O[5");
- switch (pos) {
- case INLINE:
- writeString("i");
- break;
- case LEFT:
- writeString("l");
- break;
- case RIGHT:
- writeString("r");
- break;
- case CENTERED:
- default:
- writeString("c");
- break;
- }
- writeString(image_template);
- writeString(".png]");
- if (is_html)
- writeString("\\O[0]\\O[3]");
- else
- // reset min/max registers
- writeString("\\O[1]\\O[3]");
-}
-
-/*
- * write_upto_newline - Write the contents of the buffer until a newline
- * is seen. Check for HTML_IMAGE_INLINE_BEGIN and
- * HTML_IMAGE_INLINE_END; process them if they are
- * present.
- */
-
-void char_buffer::write_upto_newline(char_block **t, int *i, int is_html)
-{
- int j = *i;
-
- if (*t) {
- while (j < (*t)->used
- && (*t)->buffer[j] != '\n'
- && (*t)->buffer[j] != INLINE_LEADER_CHAR)
- j++;
- if (j < (*t)->used
- && (*t)->buffer[j] == '\n')
- j++;
- writeNbytes((*t)->buffer + (*i), j - (*i));
- if ((*t)->buffer[j] == INLINE_LEADER_CHAR) {
- if (can_see(t, &j, HTML_IMAGE_INLINE_BEGIN))
- write_start_image(INLINE, is_html);
- else if (can_see(t, &j, HTML_IMAGE_INLINE_END))
- write_end_image(is_html);
- else {
- if (j < (*t)->used) {
- *i = j;
- j++;
- writeNbytes((*t)->buffer + (*i), j - (*i));
- }
- }
- }
- if (j == (*t)->used) {
- *i = 0;
- *t = (*t)->next;
- if (*t && (*t)->buffer[j - 1] != '\n')
- write_upto_newline(t, i, is_html);
- }
- else
- // newline was seen
- *i = j;
- }
-}
-
-/*
- * can_see - Return TRUE if we can see string in t->buffer[i] onwards.
- */
-
-int char_buffer::can_see(char_block **t, int *i, const char *str)
-{
- int j = 0;
- int l = strlen(str);
- int k = *i;
- char_block *s = *t;
-
- while (s) {
- while (k < s->used && j < l && s->buffer[k] == str[j]) {
- j++;
- k++;
- }
- if (j == l) {
- *i = k;
- *t = s;
- return TRUE;
- }
- else if (k < s->used && s->buffer[k] != str[j])
- return( FALSE );
- s = s->next;
- k = 0;
- }
- return FALSE;
-}
-
-/*
- * skip_spaces - Return TRUE if we have not run out of data.
- * Consume spaces also.
- */
-
-int char_buffer::skip_spaces(char_block **t, int *i)
-{
- char_block *s = *t;
- int k = *i;
-
- while (s) {
- while (k < s->used && isspace(s->buffer[k]))
- k++;
- if (k == s->used) {
- k = 0;
- s = s->next;
- }
- else {
- *i = k;
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/*
- * skip_until_newline - Skip all characters until a newline is seen.
- * The newline is not consumed.
- */
-
-void char_buffer::skip_until_newline(char_block **t, int *i)
-{
- int j = *i;
-
- if (*t) {
- while (j < (*t)->used && (*t)->buffer[j] != '\n')
- j++;
- if (j == (*t)->used) {
- *i = 0;
- *t = (*t)->next;
- skip_until_newline(t, i);
- }
- else
- // newline was seen
- *i = j;
- }
-}
-
-#define DEVICE_FORMAT(filter) (filter == HTML_OUTPUT_FILTER)
-#define HTML_OUTPUT_FILTER 0
-#define IMAGE_OUTPUT_FILTER 1
-#define OUTPUT_STREAM(name) creat((name), S_IWUSR | S_IRUSR)
-#define PS_OUTPUT_STREAM OUTPUT_STREAM(psFileName)
-#define REGION_OUTPUT_STREAM OUTPUT_STREAM(regionFileName)
-
-/*
- * emit_troff_output - Write formatted buffer content to the troff
- * post-processor data pipeline.
- */
-
-void char_buffer::emit_troff_output(int device_format_selector)
-{
- // Handle output for BOTH html and image device formats
- // if `device_format_selector' is passed as
- //
- // HTML_FORMAT(HTML_OUTPUT_FILTER)
- // Buffer data is written to the output stream
- // with template image names translated to actual image names.
- //
- // HTML_FORMAT(IMAGE_OUTPUT_FILTER)
- // Buffer data is written to the output stream
- // with no translation, for image file creation in the post-processor.
-
- int idx = 0;
- char_block *element = head;
-
- while (element != NULL)
- write_upto_newline(&element, &idx, device_format_selector);
-
-#if 0
- if (close(stdoutfd) < 0)
- sys_fatal ("close");
-
- // now we grab fd=1 so that the next pipe cannot use fd=1
- if (stdoutfd == 1) {
- if (dup(2) != stdoutfd)
- sys_fatal ("dup failed to use fd=1");
- }
-#endif /* 0 */
-}
-
-/*
- * The image class remembers the position of all images in the
- * postscript file and assigns names for each image.
- */
-
-struct imageItem {
- imageItem *next;
- int X1;
- int Y1;
- int X2;
- int Y2;
- char *imageName;
- int resolution;
- int maxx;
- int pageNo;
-
- imageItem(int x1, int y1, int x2, int y2,
- int page, int res, int max_width, char *name);
- ~imageItem();
-};
-
-/*
- * imageItem - Constructor.
- */
-
-imageItem::imageItem(int x1, int y1, int x2, int y2,
- int page, int res, int max_width, char *name)
-{
- X1 = x1;
- Y1 = y1;
- X2 = x2;
- Y2 = y2;
- pageNo = page;
- resolution = res;
- maxx = max_width;
- imageName = name;
- next = NULL;
-}
-
-/*
- * imageItem - Destructor.
- */
-
-imageItem::~imageItem()
-{
- if (imageName)
- free(imageName);
-}
-
-/*
- * imageList - A class containing a list of imageItems.
- */
-
-class imageList {
-private:
- imageItem *head;
- imageItem *tail;
- int count;
-public:
- imageList();
- ~imageList();
- void add(int x1, int y1, int x2, int y2,
- int page, int res, int maxx, char *name);
- void createImages(void);
- int createPage(int pageno);
- void createImage(imageItem *i);
- int getMaxX(int pageno);
-};
-
-/*
- * imageList - Constructor.
- */
-
-imageList::imageList()
-: head(0), tail(0), count(0)
-{
-}
-
-/*
- * imageList - Destructor.
- */
-
-imageList::~imageList()
-{
- while (head != NULL) {
- imageItem *i = head;
- head = head->next;
- delete i;
- }
-}
-
-/*
- * createPage - Create one image of, page pageno, from the postscript file.
- */
-
-int imageList::createPage(int pageno)
-{
- char *s;
-
- if (currentPageNo == pageno)
- return 0;
-
- if (currentPageNo >= 1) {
- /*
- * We need to unlink the files which change each time a new page is
- * processed. The final unlink is done by xtmpfile when pre-grohtml
- * exits.
- */
- unlink(imagePageName);
- unlink(psPageName);
- }
-
- if (show_progress) {
- fprintf(stderr, "[%d] ", pageno);
- fflush(stderr);
- }
-
-#if defined(DEBUGGING)
- if (debug)
- fprintf(stderr, "creating page %d\n", pageno);
-#endif
-
- s = make_message("psselect -q -p%d %s %s\n",
- pageno, psFileName, psPageName);
-
- if (s == NULL)
- sys_fatal("make_message");
-#if defined(DEBUGGING)
- if (debug) {
- fwrite(s, sizeof(char), strlen(s), stderr);
- fflush(stderr);
- }
-#endif
- html_system(s, 1);
-
- s = make_message("echo showpage | "
- "%s%s -q -dBATCH -dSAFER "
- "-dDEVICEHEIGHTPOINTS=792 "
- "-dDEVICEWIDTHPOINTS=%d -dFIXEDMEDIA=true "
- "-sDEVICE=%s -r%d %s "
- "-sOutputFile=%s %s -\n",
- image_gen,
- EXE_EXT,
- (getMaxX(pageno) * image_res) / postscriptRes,
- image_device,
- image_res,
- antiAlias,
- imagePageName,
- psPageName);
- if (s == NULL)
- sys_fatal("make_message");
-#if defined(DEBUGGING)
- if (debug) {
- fwrite(s, sizeof(char), strlen(s), stderr);
- fflush(stderr);
- }
-#endif
- html_system(s, 1);
- free(s);
- currentPageNo = pageno;
- return 0;
-}
-
-/*
- * min - Return the minimum of two numbers.
- */
-
-int min(int x, int y)
-{
- if (x < y)
- return x;
- else
- return y;
-}
-
-/*
- * max - Return the maximum of two numbers.
- */
-
-int max(int x, int y)
-{
- if (x > y)
- return x;
- else
- return y;
-}
-
-/*
- * getMaxX - Return the largest right-hand position for any image
- * on, pageno.
- */
-
-int imageList::getMaxX(int pageno)
-{
- imageItem *h = head;
- int x = postscriptRes * DEFAULT_LINE_LENGTH;
-
- while (h != NULL) {
- if (h->pageNo == pageno)
- x = max(h->X2, x);
- h = h->next;
- }
- return x;
-}
-
-/*
- * createImage - Generate a minimal png file from the set of page images.
- */
-
-void imageList::createImage(imageItem *i)
-{
- if (i->X1 != -1) {
- char *s;
- int x1 = max(min(i->X1, i->X2) * image_res / postscriptRes
- - IMAGE_BOARDER_PIXELS,
- 0);
- int y1 = max(image_res * vertical_offset / 72
- + min(i->Y1, i->Y2) * image_res / postscriptRes
- - IMAGE_BOARDER_PIXELS,
- 0);
- int x2 = max(i->X1, i->X2) * image_res / postscriptRes
- + IMAGE_BOARDER_PIXELS;
- int y2 = image_res * vertical_offset / 72
- + max(i->Y1, i->Y2) * image_res / postscriptRes
- + 1 + IMAGE_BOARDER_PIXELS;
- if (createPage(i->pageNo) == 0) {
- s = make_message("pnmcut%s %d %d %d %d < %s "
- "| pnmcrop -quiet | pnmtopng%s %s > %s\n",
- EXE_EXT,
- x1, y1, x2 - x1 + 1, y2 - y1 + 1,
- imagePageName,
- EXE_EXT,
- TRANSPARENT,
- i->imageName);
- if (s == NULL)
- sys_fatal("make_message");
-
-#if defined(DEBUGGING)
- if (debug) {
- fprintf(stderr, s);
- fflush(stderr);
- }
-#endif
- html_system(s, 0);
- free(s);
- }
- else {
- fprintf(stderr, "failed to generate image of page %d\n", i->pageNo);
- fflush(stderr);
- }
-#if defined(DEBUGGING)
- }
- else {
- if (debug) {
- fprintf(stderr, "ignoring image as x1 coord is -1\n");
- fflush(stderr);
- }
-#endif
- }
-}
-
-/*
- * add - Add an image description to the imageList.
- */
-
-void imageList::add(int x1, int y1, int x2, int y2,
- int page, int res, int maxx, char *name)
-{
- imageItem *i = new imageItem(x1, y1, x2, y2, page, res, maxx, name);
-
- if (head == NULL) {
- head = i;
- tail = i;
- }
- else {
- tail->next = i;
- tail = i;
- }
-}
-
-/*
- * createImages - For each image descriptor on the imageList,
- * create the actual image.
- */
-
-void imageList::createImages(void)
-{
- imageItem *h = head;
-
- while (h != NULL) {
- createImage(h);
- h = h->next;
- }
-}
-
-static imageList listOfImages; // List of images defined by the region file.
-
-/*
- * generateImages - Parse the region file and generate images
- * from the postscript file. The region file
- * contains the x1,y1--x2,y2 extents of each
- * image.
- */
-
-static void generateImages(char *region_file_name)
-{
- pushBackBuffer *f=new pushBackBuffer(region_file_name);
-
- while (f->putPB(f->getPB()) != eof) {
- if (f->isString("grohtml-info:page")) {
- int page = f->readInt();
- int x1 = f->readInt();
- int y1 = f->readInt();
- int x2 = f->readInt();
- int y2 = f->readInt();
- int maxx = f->readInt();
- char *name = f->readString();
- int res = postscriptRes;
- listOfImages.add(x1, y1, x2, y2, page, res, maxx, name);
- while (f->putPB(f->getPB()) != '\n'
- && f->putPB(f->getPB()) != eof)
- (void)f->getPB();
- if (f->putPB(f->getPB()) == '\n')
- (void)f->getPB();
- }
- else {
- /* Write any error messages out to the user. */
- fputc(f->getPB(), stderr);
- }
- }
-
- listOfImages.createImages();
- if (show_progress) {
- fprintf(stderr, "done\n");
- fflush(stderr);
- }
- delete f;
-}
-
-/*
- * set_redirection - Set up I/O Redirection for handle, was, to refer to
- * stream on handle, willbe.
- */
-
-static void set_redirection(int was, int willbe)
-{
- // Nothing to do if `was' and `willbe' already have same handle.
- if (was != willbe) {
- // Otherwise attempt the specified redirection.
- if (dup2 (willbe, was) < 0) {
- // Redirection failed, so issue diagnostic and bail out.
- fprintf(stderr, "failed to replace fd=%d with %d\n", was, willbe);
- if (willbe == STDOUT_FILENO)
- fprintf(stderr,
- "likely that stdout should be opened before %d\n", was);
- sys_fatal("dup2");
- }
-
- // When redirection has been successfully completed assume redundant
- // handle `willbe' is no longer required, so close it.
- if (close(willbe) < 0)
- // Issue diagnostic if `close' fails.
- sys_fatal("close");
- }
-}
-
-/*
- * save_and_redirect - Get duplicate handle for stream, was, then
- * redirect, was, to refer to, willbe.
- */
-
-static int save_and_redirect(int was, int willbe)
-{
- if (was == willbe)
- // No redirection specified so don't do anything but silently bailing out.
- return (was);
-
- // Proceeding with redirection so first save and verify our duplicate
- // handle for `was'.
- int saved = dup(was);
- if (saved < 0) {
- fprintf(stderr, "unable to get duplicate handle for %d\n", was);
- sys_fatal("dup");
- }
-
- // Duplicate handle safely established so complete redirection.
- set_redirection(was, willbe);
-
- // Finally return the saved duplicate descriptor for the
- // original `was' stream.
- return saved;
-}
-
-/*
- * alterDeviceTo - If, toImage, is set
- * the argument list is altered to include
- * IMAGE_DEVICE and we invoke groff rather than troff.
- * Else
- * set -Thtml and groff.
- */
-
-static void alterDeviceTo(int argc, char *argv[], int toImage)
-{
- int i = 0;
-
- if (toImage) {
- while (i < argc) {
- if (strcmp(argv[i], "-Thtml") == 0)
- argv[i] = (char *)IMAGE_DEVICE;
- i++;
- }
- argv[troff_arg] = (char *)"groff"; /* rather than troff */
- }
- else {
- while (i < argc) {
- if (strcmp(argv[i], IMAGE_DEVICE) == 0)
- argv[i] = (char *)"-Thtml";
- i++;
- }
- argv[troff_arg] = (char *)"groff"; /* use groff -Z */
- }
-}
-
-/*
- * addZ - Append -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");
-
- if (argc > 0) {
- new_argv[i] = argv[i];
- i++;
- }
- new_argv[i] = (char *)"-Z";
- while (i < argc) {
- new_argv[i + 1] = argv[i];
- i++;
- }
- argc++;
- new_argv[argc] = NULL;
- return new_argv;
-}
-
-/*
- * addRegDef - Append a defined register or string onto the command
- * list for troff.
- */
-
-char **addRegDef(int argc, char *argv[], const char *numReg)
-{
- char **new_argv = (char **)malloc((argc + 2) * sizeof(char *));
- int i = 0;
-
- if (new_argv == NULL)
- sys_fatal("malloc");
-
- while (i < argc) {
- new_argv[i] = argv[i];
- i++;
- }
- new_argv[argc] = strsave(numReg);
- argc++;
- new_argv[argc] = NULL;
- return new_argv;
-}
-
-/*
- * dump_args - Display the argument list.
- */
-
-void dump_args(int argc, char *argv[])
-{
- fprintf(stderr, " %d arguments:", argc);
- for (int i = 0; i < argc; i++)
- fprintf(stderr, " %s", argv[i]);
- fprintf(stderr, "\n");
-}
-
-int char_buffer::run_output_filter(int filter, int /* argc */, char **argv)
-{
- int pipedes[2];
- PID_T child_pid;
- int status;
-
- if (pipe(pipedes) < 0)
- sys_fatal("pipe");
-
-#if MAY_FORK_CHILD_PROCESS
- // This is the UNIX process model. To invoke our post-processor,
- // we must `fork' the current process.
-
- if ((child_pid = fork()) < 0)
- sys_fatal("fork");
-
- else if (child_pid == 0) {
- // This is the child process fork. We redirect its `stdin' stream
- // to read data emerging from our pipe. There is no point in saving,
- // since we won't be able to restore later!
-
- set_redirection(STDIN_FILENO, pipedes[0]);
-
- // The parent process will be writing this data, so we should release
- // the child's writeable handle on the pipe, since we have no use for it.
-
- if (close(pipedes[1]) < 0)
- sys_fatal("close");
-
- // The IMAGE_OUTPUT_FILTER needs special output redirection...
-
- if (filter == IMAGE_OUTPUT_FILTER) {
- // with BOTH `stdout' AND `stderr' diverted to files.
-
- set_redirection(STDOUT_FILENO, PS_OUTPUT_STREAM);
- set_redirection(STDERR_FILENO, REGION_OUTPUT_STREAM);
- }
-
- // Now we are ready to launch the output filter.
-
- execvp(argv[0], argv);
-
- // If we get to here then the `exec...' request for the output filter
- // failed. Diagnose it and bail out.
-
- error("couldn't exec %1: %2", argv[0], strerror(errno), ((char *)0));
- fflush(stderr); // just in case error() didn't
- exit(1);
- }
-
- else {
- // This is the parent process fork. We will be writing data to the
- // filter pipeline, and the child will be reading it. We have no further
- // use for our read handle on the pipe, and should close it.
-
- if (close(pipedes[0]) < 0)
- sys_fatal("close");
-
- // Now we redirect the `stdout' stream to the inlet end of the pipe,
- // and push out the appropiately formatted data to the filter.
-
- pipedes[1] = save_and_redirect(STDOUT_FILENO, pipedes[1]);
- emit_troff_output(DEVICE_FORMAT(filter));
-
- // After emitting all the data we close our connection to the inlet
- // end of the pipe so the child process will detect end of data.
-
- set_redirection(STDOUT_FILENO, pipedes[1]);
-
- // Finally, we must wait for the child process to complete.
-
- if (WAIT(&status, child_pid, _WAIT_CHILD) != child_pid)
- sys_fatal("wait");
- }
-
-#elif MAY_SPAWN_ASYNCHRONOUS_CHILD
-
- // We do not have `fork', (or we prefer not to use it),
- // but asynchronous processes are allowed, passing data through pipes.
- // This should be ok for most Win32 systems and is preferred to `fork'
- // for starting child processes under Cygwin.
-
- // Before we start the post-processor we bind its inherited `stdin'
- // stream to the readable end of our pipe, saving our own `stdin' stream
- // in `pipedes[0]'.
-
- pipedes[0] = save_and_redirect(STDIN_FILENO, pipedes[0]);
-
- // for the Win32 model,
- // we need special provision for saving BOTH `stdout' and `stderr'.
-
- int saved_stdout = dup(STDOUT_FILENO);
- int saved_stderr = STDERR_FILENO;
-
- // The IMAGE_OUTPUT_FILTER needs special output redirection...
-
- if (filter == IMAGE_OUTPUT_FILTER) {
- // with BOTH `stdout' AND `stderr' diverted to files while saving a
- // duplicate handle for `stderr'.
-
- set_redirection(STDOUT_FILENO, PS_OUTPUT_STREAM);
- saved_stderr = save_and_redirect(STDERR_FILENO, REGION_OUTPUT_STREAM);
- }
-
- // We then use an asynchronous spawn request to start the post-processor.
-
- if ((child_pid = spawnvp(_P_NOWAIT, argv[0], argv)) < 0) {
- // Should the spawn request fail we issue a diagnostic and bail out.
-
- error("cannot spawn %1: %2", argv[0], strerror(errno), ((char *)0));
- exit(1);
- }
-
- // Once the post-processor has been started we revert our `stdin'
- // to its original saved source, which also closes the readable handle
- // for the pipe.
-
- set_redirection(STDIN_FILENO, pipedes[0]);
-
- // if we redirected `stderr', for use by the image post-processor,
- // then we also need to reinstate its original assignment.
-
- if (filter == IMAGE_OUTPUT_FILTER)
- set_redirection(STDERR_FILENO, saved_stderr);
-
- // Now we redirect the `stdout' stream to the inlet end of the pipe,
- // and push out the appropiately formatted data to the filter.
-
- set_redirection(STDOUT_FILENO, pipedes[1]);
- emit_troff_output(DEVICE_FORMAT(filter));
-
- // After emitting all the data we close our connection to the inlet
- // end of the pipe so the child process will detect end of data.
-
- set_redirection(STDOUT_FILENO, saved_stdout);
-
- // And finally, we must wait for the child process to complete.
-
- if (WAIT(&status, child_pid, _WAIT_CHILD) != child_pid)
- sys_fatal("wait");
-
-#else /* can't do asynchronous pipes! */
-
- // TODO: code to support an MS-DOS style process model
- // should go here
-
-#endif /* MAY_FORK_CHILD_PROCESS or MAY_SPAWN_ASYNCHRONOUS_CHILD */
-
- return 0;
-}
-
-/*
- * do_html - Set the troff number htmlflip and
- * write out the buffer to troff -Thtml.
- */
-
-int char_buffer::do_html(int argc, char *argv[])
-{
- string s;
-
- alterDeviceTo(argc, argv, 0);
- argv += troff_arg; // skip all arguments up to groff
- argc -= troff_arg;
- argv = addZ(argc, argv);
- argc++;
-
- s = "-dwww-image-template=";
- s += macroset_template; // do not combine these statements,
- // otherwise they will not work
- s += '\0'; // the trailing `\0' is ignored
- argv = addRegDef(argc, argv, s.contents());
- argc++;
-
-#if defined(DEBUGGING)
-# define HTML_DEBUG_STREAM OUTPUT_STREAM(htmlFileName)
- // slight security risk so only enabled if compiled with defined(DEBUGGING)
- if (debug) {
- int saved_stdout = save_and_redirect(STDOUT_FILENO, HTML_DEBUG_STREAM);
- emit_troff_output(DEVICE_FORMAT(HTML_OUTPUT_FILTER));
- set_redirection(STDOUT_FILENO, saved_stdout);
- }
-#endif
-
- return run_output_filter(HTML_OUTPUT_FILTER, argc, argv);
-}
-
-/*
- * do_image - Write out the buffer to troff -Tps.
- */
-
-int char_buffer::do_image(int argc, char *argv[])
-{
- string s;
-
- alterDeviceTo(argc, argv, 1);
- argv += troff_arg; // skip all arguments up to troff/groff
- argc -= troff_arg;
- argv = addRegDef(argc, argv, "-rps4html=1");
- argc++;
-
- s = "-dwww-image-template=";
- s += macroset_template;
- s += '\0';
- argv = addRegDef(argc, argv, s.contents());
- argc++;
-
- // override local settings and produce a page size letter postscript file
- argv = addRegDef(argc, argv, "-P-pletter");
- argc++;
-
-#if defined(DEBUGGING)
-# define IMAGE_DEBUG_STREAM OUTPUT_STREAM(troffFileName)
- // slight security risk so only enabled if compiled with defined(DEBUGGING)
- if (debug) {
- int saved_stdout = save_and_redirect(STDOUT_FILENO, IMAGE_DEBUG_STREAM);
- emit_troff_output(DEVICE_FORMAT(IMAGE_OUTPUT_FILTER));
- set_redirection(STDOUT_FILENO, saved_stdout);
- }
-#endif
-
- return run_output_filter(IMAGE_OUTPUT_FILTER, argc, argv);
-}
-
-static char_buffer inputFile;
-
-/*
- * usage - Emit usage arguments.
- */
-
-static void usage(FILE *stream)
-{
- fprintf(stream,
- "usage: %s troffname [-Iimage_name] [-Dimage_directory]\n"
- " [-P-o vertical_image_offset] [-P-i image_resolution]\n"
- " [troff flags]\n",
- program_name);
- fprintf(stream,
- " vertical_image_offset (default %d/72 of an inch)\n",
- vertical_offset);
- fprintf(stream,
- " image_resolution (default %d) pixels per inch\n",
- image_res);
- fprintf(stream,
- " image_name is the name of the stem for all images\n"
- " (default is grohtml-<pid>)\n");
- fprintf(stream,
- " place all png files into image_directory\n");
-}
-
-/*
- * scanArguments - Scan for all arguments including -P-i, -P-o, -P-D,
- * and -P-I. Return the argument index of the first
- * non-option.
- */
-
-static int scanArguments(int argc, char **argv)
-{
- const char *command_prefix = getenv("GROFF_COMMAND_PREFIX");
- if (!command_prefix)
- command_prefix = PROG_PREFIX;
- char *troff_name = new char[strlen(command_prefix) + strlen("troff") + 1];
- strcpy(troff_name, command_prefix);
- strcat(troff_name, "troff");
- int c, i;
- static const struct option long_options[] = {
- { "help", no_argument, 0, CHAR_MAX + 1 },
- { "version", no_argument, 0, 'v' },
- { NULL, 0, 0, 0 }
- };
- while ((c = getopt_long(argc, argv, "+a:bdD:F:g:hi:I:j:lno:prs:S:v",
- long_options, NULL))
- != EOF)
- switch(c) {
- case 'a':
- textAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)),
- MAX_ALPHA_BITS);
- if (textAlphaBits == 3) {
- error("cannot use 3 bits of antialiasing information");
- exit(1);
- }
- break;
- case 'b':
- // handled by post-grohtml (set background color to white)
- break;
- case 'd':
-#if defined(DEBUGGING)
- debug = TRUE;
-#endif
- break;
- case 'D':
- image_dir = optarg;
- break;
- case 'F':
- font_path.command_line_dir(optarg);
- break;
- case 'g':
- graphicAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)),
- MAX_ALPHA_BITS);
- if (graphicAlphaBits == 3) {
- error("cannot use 3 bits of antialiasing information");
- exit(1);
- }
- break;
- case 'h':
- // handled by post-grohtml
- break;
- case 'i':
- image_res = atoi(optarg);
- break;
- case 'I':
- image_template = optarg;
- break;
- case 'j':
- // handled by post-grohtml (set job name for multiple file output)
- break;
- case 'l':
- // handled by post-grohtml (no automatic section links)
- break;
- case 'n':
- // handled by post-grohtml (generate simple heading anchors)
- break;
- case 'o':
- vertical_offset = atoi(optarg);
- break;
- case 'p':
- show_progress = TRUE;
- break;
- case 'r':
- // handled by post-grohtml (no header and footer lines)
- break;
- case 's':
- // handled by post-grohtml (use font size n as the html base font size)
- break;
- case 'S':
- // handled by post-grohtml (set file split level)
- break;
- case 'v':
- printf("GNU pre-grohtml (groff) version %s\n", Version_string);
- exit(0);
- case CHAR_MAX + 1: // --help
- usage(stdout);
- exit(0);
- break;
- case '?':
- usage(stderr);
- exit(1);
- break;
- default:
- break;
- }
-
- i = optind;
- while (i < argc) {
- if (strcmp(argv[i], troff_name) == 0)
- troff_arg = i;
- else if (argv[i][0] != '-')
- return i;
- i++;
- }
- a_delete troff_name;
-
- return argc;
-}
-
-/*
- * makeTempFiles - Name the temporary files.
- */
-
-static int makeTempFiles(void)
-{
-#if defined(DEBUGGING)
- psFileName = DEBUG_FILE("prehtml-ps");
- regionFileName = DEBUG_FILE("prehtml-region");
- imagePageName = DEBUG_FILE("prehtml-page");
- psPageName = DEBUG_FILE("prehtml-psn");
- troffFileName = DEBUG_FILE("prehtml-troff");
- htmlFileName = DEBUG_FILE("prehtml-html");
-#else /* not DEBUGGING */
- FILE *f;
-
- /* psPageName contains a single page of postscript */
- f = xtmpfile(&psPageName,
- PS_TEMPLATE_LONG, PS_TEMPLATE_SHORT,
- TRUE);
- if (f == NULL) {
- sys_fatal("xtmpfile");
- return -1;
- }
- fclose(f);
-
- /* imagePageName contains a bitmap image of the single postscript page */
- f = xtmpfile(&imagePageName,
- PAGE_TEMPLATE_LONG, PAGE_TEMPLATE_SHORT,
- TRUE);
- if (f == NULL) {
- sys_fatal("xtmpfile");
- return -1;
- }
- fclose(f);
-
- /* psFileName contains a postscript file of the complete document */
- f = xtmpfile(&psFileName,
- PS_TEMPLATE_LONG, PS_TEMPLATE_SHORT,
- TRUE);
- if (f == NULL) {
- sys_fatal("xtmpfile");
- return -1;
- }
- fclose(f);
-
- /* regionFileName contains a list of the images and their boxed coordinates */
- f = xtmpfile(&regionFileName,
- REGION_TEMPLATE_LONG, REGION_TEMPLATE_SHORT,
- TRUE);
- if (f == NULL) {
- sys_fatal("xtmpfile");
- return -1;
- }
- fclose(f);
-
-#endif /* not DEBUGGING */
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- program_name = argv[0];
- int i;
- int found = 0;
- int ok = 1;
-
-#ifdef CAPTURE_MODE
- FILE *dump;
- fprintf(stderr, "%s: invoked with %d arguments ...\n", argv[0], argc);
- for (i = 0; i < argc; i++)
- fprintf(stderr, "%2d: %s\n", i, argv[i]);
- if ((dump = fopen(DEBUG_FILE("pre-html-data"), "wb")) != NULL) {
- while((i = fgetc(stdin)) >= 0)
- fputc(i, dump);
- fclose(dump);
- }
- exit(1);
-#endif /* CAPTURE_MODE */
- device = "html";
- if (!font::load_desc())
- fatal("cannot find devhtml/DESC exiting");
- image_gen = font::image_generator;
- if (image_gen == NULL || (strcmp(image_gen, "") == 0))
- fatal("devhtml/DESC must set the image_generator field, exiting");
- postscriptRes = get_resolution();
- i = scanArguments(argc, argv);
- setupAntiAlias();
- checkImageDir();
- makeFileName();
- while (i < argc) {
- if (argv[i][0] != '-') {
- /* found source file */
- ok = do_file(argv[i]);
- if (!ok)
- return 0;
- found = 1;
- }
- i++;
- }
-
- if (!found)
- do_file("-");
- if (makeTempFiles())
- return 1;
- ok = inputFile.do_image(argc, argv);
- if (ok == 0) {
- generateImages(regionFileName);
- ok = inputFile.do_html(argc, argv);
- }
- return ok;
-}
-
-static int do_file(const char *filename)
-{
- FILE *fp;
-
- current_filename = filename;
- if (strcmp(filename, "-") == 0)
- fp = stdin;
- else {
- fp = fopen(filename, "r");
- if (fp == 0) {
- error("can't open `%1': %2", filename, strerror(errno));
- return 0;
- }
- }
-
- if (inputFile.read_file(fp)) {
- // XXX
- }
-
- if (fp != stdin)
- fclose(fp);
- current_filename = NULL;
- return 1;
-}
diff --git a/contrib/groff/src/preproc/html/pre-html.h b/contrib/groff/src/preproc/html/pre-html.h
deleted file mode 100644
index 3eedb21c72bb..000000000000
--- a/contrib/groff/src/preproc/html/pre-html.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// -*- C++ -*-
-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
- Written by Gaius Mulley (gaius@glam.ac.uk).
-
-This file is part of groff.
-
-groff is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-groff is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License along
-with groff; see the file COPYING. If not, write to the Free Software
-Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
-
-/*
- * defines functions implemented within pre-html.c
- */
-
-#if !defined(PREHTMLH)
-# define PREHTMLH
-# if defined(PREHTMLC)
-# define EXTERN
-# else
-# define EXTERN extern
-# endif
-
-
-extern void sys_fatal (const char *s);
-
-#undef EXTERN
-#endif
diff --git a/contrib/groff/src/preproc/html/pushback.cpp b/contrib/groff/src/preproc/html/pushback.cpp
deleted file mode 100644
index b71558783508..000000000000
--- a/contrib/groff/src/preproc/html/pushback.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-// -*- C++ -*-
-/* Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
- Written by Gaius Mulley (gaius@glam.ac.uk).
-
-This file is part of groff.
-
-groff is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-groff is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License along
-with groff; see the file COPYING. If not, write to the Free Software
-Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#include "lib.h"
-
-#include <signal.h>
-#include <ctype.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "errarg.h"
-#include "error.h"
-#include "stringclass.h"
-#include "posix.h"
-#include "nonposix.h"
-
-#include <errno.h>
-#include <sys/types.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "pushback.h"
-#include "pre-html.h"
-
-#if !defined(TRUE)
-# define TRUE (1==1)
-#endif
-
-#if !defined(FALSE)
-# define FALSE (1==0)
-#endif
-
-# define ERROR(X) (void)(fprintf(stderr, "%s:%d error %s\n", __FILE__, __LINE__, X) && \
- (fflush(stderr)) && localexit(1))
-
-
-#define MAXPUSHBACKSTACK 4096 /* maximum number of character that can be pushed back */
-
-
-/*
- * constructor for pushBackBuffer
- */
-
-pushBackBuffer::pushBackBuffer (char *filename)
-{
- charStack = (char *)malloc(MAXPUSHBACKSTACK);
- if (charStack == 0) {
- sys_fatal("malloc");
- }
- stackPtr = 0; /* index to push back stack */
- debug = 0;
- verbose = 0;
- eofFound = FALSE;
- lineNo = 1;
- if (strcmp(filename, "") != 0) {
- stdIn = dup(0);
- close(0);
- if (open(filename, O_RDONLY) != 0) {
- sys_fatal("when trying to open file");
- } else {
- fileName = filename;
- }
- }
-}
-
-pushBackBuffer::~pushBackBuffer ()
-{
- if (charStack != 0) {
- free(charStack);
- }
- close(0);
- /* restore stdin in file descriptor 0 */
- dup(stdIn);
- close(stdIn);
-}
-
-/*
- * localexit - wraps exit with a return code to aid the ERROR macro.
- */
-
-int localexit (int i)
-{
- exit(i);
- return( 1 );
-}
-
-/*
- * getPB - returns a character, possibly a pushed back character.
- */
-
-char pushBackBuffer::getPB (void)
-{
- if (stackPtr>0) {
- stackPtr--;
- return( charStack[stackPtr] );
- } else {
- char ch;
-
- if (read(0, &ch, 1) == 1) {
- if (verbose) {
- printf("%c", ch);
- }
- if (ch == '\n') {
- lineNo++;
- }
- return( ch );
- } else {
- eofFound = TRUE;
- return( eof );
- }
- }
-}
-
-/*
- * putPB - pushes a character onto the push back stack.
- * The same character is returned.
- */
-
-char pushBackBuffer::putPB (char ch)
-{
- if (stackPtr<MAXPUSHBACKSTACK) {
- charStack[stackPtr] = ch ;
- stackPtr++;
- } else {
- ERROR("max push back stack exceeded, increase MAXPUSHBACKSTACK constant");
- }
- return( ch );
-}
-
-/*
- * isWhite - returns TRUE if a white character is found. This character is NOT consumed.
- */
-
-static int isWhite (char ch)
-{
- return( (ch==' ') || (ch == '\t') || (ch == '\n') );
-}
-
-/*
- * skipToNewline - skips characters until a newline is seen.
- */
-
-void pushBackBuffer::skipToNewline (void)
-{
- while ((putPB(getPB()) != '\n') && (! eofFound)) {
- getPB();
- }
-}
-
-/*
- * skipUntilToken - skips until a token is seen
- */
-
-void pushBackBuffer::skipUntilToken (void)
-{
- char ch;
-
- while ((isWhite(putPB(getPB())) || (putPB(getPB()) == '#')) && (! eofFound)) {
- ch = getPB();
- if (ch == '#') {
- skipToNewline();
- }
- }
-}
-
-/*
- * isString - returns TRUE if the string, s, matches the pushed back string.
- * if TRUE is returned then this string is consumed, otherwise it is
- * left alone.
- */
-
-int pushBackBuffer::isString (const char *s)
-{
- int length=strlen(s);
- int i=0;
-
- while ((i<length) && (putPB(getPB())==s[i])) {
- if (getPB() != s[i]) {
- ERROR("assert failed");
- }
- i++;
- }
- if (i==length) {
- return( TRUE );
- } else {
- i--;
- while (i>=0) {
- if (putPB(s[i]) != s[i]) {
- ERROR("assert failed");
- }
- i--;
- }
- }
- return( FALSE );
-}
-
-/*
- * isDigit - returns TRUE if the character, ch, is a digit.
- */
-
-static int isDigit (char ch)
-{
- return( ((ch>='0') && (ch<='9')) );
-}
-
-/*
- * isHexDigit - returns TRUE if the character, ch, is a hex digit.
- */
-
-#if 0
-static int isHexDigit (char ch)
-{
- return( (isDigit(ch)) || ((ch>='a') && (ch<='f')) );
-}
-#endif
-
-/*
- * readInt - returns an integer from the input stream.
- */
-
-int pushBackBuffer::readInt (void)
-{
- int c =0;
- int i =0;
- int s =1;
- char ch=getPB();
-
- while (isWhite(ch)) {
- ch=getPB();
- }
- // now read integer
-
- if (ch == '-') {
- s = -1;
- ch = getPB();
- }
- while (isDigit(ch)) {
- i *= 10;
- if ((ch>='0') && (ch<='9')) {
- i += (int)(ch-'0');
- }
- ch = getPB();
- c++;
- }
- if (ch != putPB(ch)) {
- ERROR("assert failed");
- }
- return( i*s );
-}
-
-/*
- * convertToFloat - converts integers, a and b into a.b
- */
-
-static double convertToFloat (int a, int b)
-{
- int c=10;
- double f;
-
- while (b>c) {
- c *= 10;
- }
- f = ((double)a) + (((double)b)/((double)c));
- return( f );
-}
-
-/*
- * readNumber - returns a float representing the word just read.
- */
-
-double pushBackBuffer::readNumber (void)
-{
- int i;
- char ch;
-
- i = readInt();
- if ((ch = getPB()) == '.') {
- return convertToFloat(i, readInt());
- }
- putPB(ch);
- return (double)i;
-}
-
-/*
- * readString - reads a string terminated by white space
- * and returns a malloced area of memory containing
- * a copy of the characters.
- */
-
-char *pushBackBuffer::readString (void)
-{
- char buffer[MAXPUSHBACKSTACK];
- char *str = 0;
- int i=0;
- char ch=getPB();
-
- while (isWhite(ch)) {
- ch=getPB();
- }
- while ((i < MAXPUSHBACKSTACK) && (! isWhite(ch)) && (! eofFound)) {
- buffer[i] = ch;
- i++;
- ch = getPB();
- }
- if (i < MAXPUSHBACKSTACK) {
- buffer[i] = (char)0;
- str = (char *)malloc(strlen(buffer)+1);
- strcpy(str, buffer);
- }
- return( str );
-}
diff --git a/contrib/groff/src/preproc/html/pushback.h b/contrib/groff/src/preproc/html/pushback.h
deleted file mode 100644
index 3fddad66f11d..000000000000
--- a/contrib/groff/src/preproc/html/pushback.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// -*- C -*-
-/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
- Written by Gaius Mulley (gaius@glam.ac.uk).
-
-This file is part of groff.
-
-groff is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
-version.
-
-groff is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License along
-with groff; see the file COPYING. If not, write to the Free Software
-Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
-
-
-#define eof (char)-1
-
-
-/*
- * defines the class and methods implemented within pushback.cpp
- */
-
-class pushBackBuffer
-{
- private:
- char *charStack;
- int stackPtr; /* index to push back stack */
- int debug;
- int verbose;
- int eofFound;
- char *fileName;
- int lineNo;
- int stdIn;
-
- public:
- pushBackBuffer (char *);
- ~ pushBackBuffer ();
- char getPB (void);
- char putPB (char ch);
- void skipUntilToken (void);
- void skipToNewline (void);
- double readNumber (void);
- int readInt (void);
- char *readString (void);
- int isString (const char *string);
-};
-
-