summaryrefslogtreecommitdiff
path: root/troff/troff.d/devaps/build.c
diff options
context:
space:
mode:
Diffstat (limited to 'troff/troff.d/devaps/build.c')
-rw-r--r--troff/troff.d/devaps/build.c323
1 files changed, 323 insertions, 0 deletions
diff --git a/troff/troff.d/devaps/build.c b/troff/troff.d/devaps/build.c
new file mode 100644
index 0000000000000..ecefacc6db590
--- /dev/null
+++ b/troff/troff.d/devaps/build.c
@@ -0,0 +1,323 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1989 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/* from OpenSolaris "build.c 1.5 05/06/08 SMI" */
+
+/*
+ * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
+ *
+ * Sccsid @(#)build.c 1.4 (gritter) 8/13/05
+ */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#include <stdio.h>
+
+#include "daps.h"
+
+#define LIBDIR "charlib" /* files found in *fontdir/LIBDIR */
+
+
+/*
+ *
+ * These variables are used to save and later restore the post-processor's
+ * environment.
+ *
+ */
+
+
+int ohpos;
+int ovpos;
+int ofont;
+int osize;
+
+int env = 0; /* nonzero if environment is saved */
+
+
+extern int hpos;
+extern int vpos;
+extern int font;
+extern int size;
+
+extern char *fontdir;
+#define devname troff_devname
+extern char devname[];
+extern FILE *tf;
+
+#define oput(n) putc(n, tf)
+
+
+/*****************************************************************************/
+
+
+int
+newfile(
+
+
+ char *name, /* start reading from this file */
+ int size /* may use it to get the file */
+)
+
+{
+
+
+ FILE *fp;
+
+
+ /********************************************************************
+ * *
+ * Used when we want to take the post-processor's input from *
+ * a different file for a while. Added to handle problems with the *
+ * new logos, but it could easily be used to define other special *
+ * characters. *
+ * *
+ ********************************************************************/
+
+
+ if ( env || (fp = charfile(name, size)) == NULL )
+ return(1);
+
+ save_env();
+ nconv(fp);
+ restore_env();
+ fclose(fp);
+
+ return(0);
+
+} /* End of newfile */
+
+
+/*****************************************************************************/
+
+
+FILE *charfile(
+
+
+ char *name, /* start reading from this file */
+ int size /* size of the character to print */
+)
+
+
+{
+
+
+ char path[100]; /* file pathname put here */
+ FILE *fp; /* file pointer for *path */
+
+
+ /********************************************************************
+ * *
+ * First tries to open file *name.size in the right directory, *
+ * and if it can't then it tries *name. Returns the file pointer *
+ * or NULL if either file can't be opened. *
+ * *
+ ********************************************************************/
+
+
+ sprintf(path, "%s/dev%s/%s/%s.%d", fontdir, devname, LIBDIR, name, size);
+
+ if ( (fp = fopen(path, "r")) == NULL ) {
+ sprintf(path, "%s/dev%s/%s/%s", fontdir, devname, LIBDIR, name);
+ fp = fopen(path, "r");
+ } /* End if */
+
+ return(fp);
+
+} /* End of charfile */
+
+
+/*****************************************************************************/
+
+void
+save_env(void)
+
+
+{
+
+
+ /********************************************************************
+ * *
+ * Before we start reading from a different file we'll want *
+ * to save the values of the variables that will be needed to get *
+ * back to where we were. *
+ * *
+ ********************************************************************/
+
+
+ hflush();
+
+ ohpos = hpos;
+ ovpos = vpos;
+ ofont = font;
+ osize = size;
+
+ env = 1;
+
+} /* End of save_env */
+
+
+/*****************************************************************************/
+
+
+void
+restore_env(void)
+
+
+{
+
+
+ /********************************************************************
+ * *
+ * Hopefully does everything needed to get the post-processor *
+ * back to where it was before the input was diverted. *
+ * *
+ ********************************************************************/
+
+
+ hgoto(ohpos);
+ vgoto(ovpos);
+
+ setfont(ofont);
+ setsize(osize);
+
+ env = 0;
+
+} /* End of restore_env */
+
+
+/*****************************************************************************/
+
+
+void
+nconv(
+
+
+ FILE *fp /* new file we're reading from */
+)
+
+
+{
+
+
+ int ch; /* first character of the command */
+ int c, n; /* used in reading chars from *fp */
+ char str[100]; /* don't really need this much room */
+
+
+ /********************************************************************
+ * *
+ * A restricted and slightly modified version of the conv() *
+ * routine found in all of troff's post-processors. It should only *
+ * be used to interpret the special character building files found *
+ * in directory *fontdir/LIBDIR. *
+ * *
+ ********************************************************************/
+
+
+ while ( (ch = getc(fp)) != EOF ) {
+
+ switch ( ch ) {
+
+ case 'w': /* just ignore these guys */
+ case ' ':
+ case '\n':
+ case 0:
+ break;
+
+ case 'c': /* single ASCII character */
+ put1(getc(fp));
+ break;
+
+ case 'C': /* special character */
+ fscanf(fp, "%s", str);
+ put1s(str);
+ break;
+
+ case 'h': /* relative horizontal motion */
+ fscanf(fp, "%d", &n);
+ hmot(n);
+ break;
+
+ case 'v':
+ fscanf(fp, "%d", &n);
+ vmot(n);
+ break;
+
+ case 'x': /* device control - font change only */
+ fscanf(fp, "%s", str);
+ if ( str[0] == 'f' ) {
+ fscanf(fp, "%d %s", &n, str);
+ loadfont(n, str, "");
+ } /* End if */
+ break;
+
+ case 's': /* set point size */
+ fscanf(fp, "%d", &n);
+ setsize(t_size(n));
+ break;
+
+ case 'f': /* use this font */
+ fscanf(fp, "%s", str);
+ setfont(t_font(str));
+ break;
+
+ case 'b':
+ fscanf(fp, "%d", &n);
+ oput(n);
+ break;
+
+ case 'W':
+ fscanf(fp, "%d", &n);
+ putint(n);
+ break;
+
+
+ case '#': /* comment */
+ while ( (c = getc(fp)) != '\n' && c != EOF ) ;
+ break;
+
+ } /* End switch */
+
+ } /* End while */
+
+} /* End of nconv */
+
+
+/*****************************************************************************/
+
+